patorashのブログ

方向性はまだない

Hyper-VでAmazon Linux 2を入れる

勉強のために仮想環境を準備しようと思い、Hyper-VAmazon Linux 2をインストールしてみたのでその備忘録を記します。

目次

イメージをダウンロード

まずは、Amazon Linux 2のイメージをダウンロードします。ダウンロード方法はAWSのページに書いてありますが、色々な仮想化プラットフォームの形式で公開されています。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-2-virtual-machine.html#amazon-linux-2-virtual-machine-prepare

今回は、Hyper-Vのイメージをダウンロードしました。

cdn.amazonlinux.com

seed.iso 起動ディスクを作成する

次に、seed.isoを作ります。これは、Amazon Linux 2が起動したときに自動で設定される項目を定義しておくisoイメージになります。

作り方は先ほどのAWSのサイトに書いてありますが、ここにも書いておきます。ざっくりとした手順は以下の通り。

  1. seedconfigという名前のディレクトリを作成し、そこに移動
  2. meta-data設定ファイルを作成する
  3. user-data設定ファイルを作成する
  4. コマンドでseed.isoファイルを作成する

meta-dataの設定を行う

meta-dataは、ネットワークの設定を記入します。Hyper-Vで動かす場合は、仮想スイッチと同じネットワーク上に作らないといけないので、仮想スイッチのネットワークを調べましょう。

ネットワークの設定を調べる

仮想スイッチのネットワークですが、コントロールパネルのネットワークとインターネット、ネットワーク接続で確認することができます。今回は、前に作ったVagrantで利用するために固定IPを設定した仮想スイッチのネットワークを使います。Default SwitchのネットワークはPCが再起動するたびにコロコロ変わっていたので、とりあえず今回は使いません。なんか固定する方法もあるらしいけれど。

f:id:patorash:20200117073241p:plain

矢印の仮想ネットワーク上で右クリックをして、プロパティを表示します。

そして、インターネット プロトコル バージョン 4を選択して、プロパティを表示。 f:id:patorash:20200117073759p:plain

固定IPが振ってありました。192.168.100.1/24にしていることが、これで確認できました。 f:id:patorash:20200117073955p:plain

DNS設定が抜けていたので、後で家のルーターIPアドレスを指定しておきました。ここは各自のネットワークに合わせてください。

f:id:patorash:20200118094219p:plain

meta-dataを記入する

local-hostnameは適当に。私の場合はPostgreSQLの勉強用で作ろうとしていたので、postgres.primaryにしました。

network-interfacesは、先ほど確認した仮想スイッチと同じネットワークである192.168.100.0/24に属するように書きます。/24サブネットマスクのことで、255.255.255.0と同義です。gatewayに先ほどの仮想スイッチのIPを指定します。addressに、192.168.100.10を設定しました。

local-hostname: postgres.primary
# eth0 is the default network interface enabled in the image. You can configure static network settings with an entry like the following.
network-interfaces: |
  auto eth0
  iface eth0 inet static
  address 192.168.100.10
  network 192.168.100.0
  netmask 255.255.255.0
  broadcast 192.168.100.255
  gateway 192.168.100.1

user-dataの設定を行う

次に、user-dataを設定します。これはAWSのほうで書かれていた通りに。defaultにしておくと、ec2-userが作られます。個別にユーザーを作成したい人は、usersのところで新しくユーザ名を追記すればいいかと思います。パスワードは自分で設定してください。

また、ローカル環境なので、Cloud-initが1度しか実行されないようにしておきました。

#cloud-config
#vim:syntax=yaml
users:
# A user by the name `ec2-user` is created in the image by default.
  - default
chpasswd:
  list: |
    ec2-user: ***********
# In the above line, do not add any spaces after 'ec2-user:'.

# NOTE: Cloud-init applies network settings on every boot by default. To retain network settings from first
boot, add following ‘write_files’ section:
write_files:
  - path: /etc/cloud/cloud.cfg.d/80_disable_network_after_firstboot.cfg
    content: |
      # Disable network configuration after first boot
      network:
        config: disabled

seed.isoファイルの生成

WSL経由で、seed.isoファイルを生成します。WSLにUbuntuを入れてあるので、そちらからコマンドを入力しました。 seedconfigディレクトリに移動後、次のコマンドを実行します。

$ genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

これで、seed.isoイメージができました。

VMを作成する

ここからがAWSのサイトに書かれていなくて困ったところです。

イメージの移動

まず、ダウンロードしたHyper-Vのイメージを解凍して、Hyper-Vのイメージが置かれるディレクトリ(C:\Users\Public\Documents\Hyper-V\Virtual hard disks)に移動させました。先ほど作ったseed.isoファイルも同様に移動させました。

これは必要なことではありませんが、VMのイメージがどこにあるのかわかりやすくするためです。

仮想環境の構築

次に、Hyper-Vマネージャを起動します。検索から探すとすぐに見つかります。

f:id:patorash:20200117081427p:plain

仮想マシンの作成

仮想マシンの新規作成を選びます。

f:id:patorash:20200117081626p:plain

ウィザードが出てくるので、名前はお好きなものを。とりあえずAamzon Linux 2としました。

f:id:patorash:20200117081754p:plain

世代の指定ですが、第1世代を選びます。これは、AWSで公開されているHyper-Vのイメージが第1世代だからです。

f:id:patorash:20200117081920p:plain

メモリの割り当ては適当に。私は1024MBにしました。

ネットワークの構成は、先ほど参照した仮想スイッチを指定します。

f:id:patorash:20200117082157p:plain

仮想ハードディスクの接続は、最初にダウンロードしたHyper-Vのイメージを指定します。「既存の仮想ハードディスクを使用する」を選択し、さきほど移動させたHyper-Vのイメージを指定しましょう。

f:id:patorash:20200117082432p:plain

あとは、確認して、完了を押してウィザードを終了します。

f:id:patorash:20200117082605p:plain

ブートの設定

次に、作成した仮想マシンのブート設定を行います。これは、先ほど作成したseed.isoファイル経由で起動させるための設定です。

先ほど作った仮想マシンを選択し、右クリックして設定を選びます。

f:id:patorash:20200117082940p:plain

次に、IDEコントローラーを選択し、メディアにイメージファイルを指定し、先ほど作ったseed.isoを設定します。設定が終わったらOKを押します。

f:id:patorash:20200117083241p:plain

仮想環境を起動する

では、起動してみましょう。

Hyper-VマネージャのAmazon Linux 2上で右クリックして起動を選択します。その後、接続を選択します。

f:id:patorash:20200118092525p:plain

ecs-userでログインするところまで確認できました。

sudo yum updateを実行してみたところ、アップデートパッケージも取得できたので、ネットワークの設定もOKなようです。

これで、家庭でAmazon Linux 2を試せる環境ができました。しかし、まだネットワーク経由で接続できません。Hyper-Vの接続を使うのは表示も小さいし面倒過ぎます。SSHできるようにしましょう。以降、Hyper-Vに入れたAmazon Linux 2のことをVMと書きます。

SSHで接続できるように設定する

一時的にパスワード認証を許可

まず、VM上でsshd_configを編集して、一時的にパスワード認証を許可します。これは、ホストOSとゲストOSでクリップボードが共有できないため、公開鍵を追加するのが困難だったためです。 sudo vi /etc/ssh/sshd_configで編集します。コマンドモードで、/Passwordと打ってEnterを押すと、該当の箇所が検索できるでしょう。

# コメントアウトを外す
PasswordAuthentication yes

これで保存し、sshdを再起動します。

sudo systemctl restart sshd.service

SSHでパスワードで接続できるようになりました。

Windows側でSSHの設定を追加する

公開鍵・秘密鍵の作成

PowerShellで、以下の通りに入力します。

ssh-keygen.exe -t ecdsa

これで、~/.ssh/id_ecdsa~/.ssh/id_ecdsa.pubが出来上がります。

公開鍵をVMに設定する

PowerShellからSSHVMに接続します。

ssh.exe ec2-user@192.168.100.10

パスワード認証で接続後、VM側の~/.ssh/authorized_keysに、さきほど作った公開鍵 id_ecdsa.pub の内容を追加します。コピー&ペーストしてください。

終わったら、SSHを切ります。

SSHのConfigを設定する

WindowsからVMにホスト名で接続できるようにするため、設定しておきます。ここで、ユーザ名と秘密鍵の指定を行います。ホスト名は vm_al2_primaryとしました。ここはお好きにどうぞ。

Host vm_al2_primary
  HostName 192.168.100.10
  User ec2-user
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "~/.ssh/id_ecdsa"
  IdentitiesOnly yes
  LogLevel FATAL
公開鍵接続できるかチェック

では、試します。

ssh.exe vm_al2_primary

これで、接続できたらOKです。

パスワード認証を無効にする

先ほどと逆のことを行います。 VMで、sudo vi /etc/ssh/sshd_configで編集します。コマンドモードで、/Passwordと打ってEnterを押すと、該当の箇所が検索できるでしょう。

# コメントアウトする
# PasswordAuthentication yes

これで保存し、sshdを再起動します。

sudo systemctl restart sshd.service
パスワードで認証できないことを確認する

PowerShellで、SSHを試してみます。

ssh.exe ec2-user@192.168.100.10

接続拒否されたら、OKです。

まとめ

WindowsAmazon Linux 2を使えるようにするまでを書きました。Hyper-Vだとなかなか情報が見つかりにくい印象がありますが、これで勉強が捗りそうです。