勉強のために仮想環境を準備しようと思い、Hyper-VでAmazon Linux 2をインストールしてみたのでその備忘録を記します。
目次
イメージをダウンロード
まずは、Amazon Linux 2のイメージをダウンロードします。ダウンロード方法はAWSのページに書いてありますが、色々な仮想化プラットフォームの形式で公開されています。
今回は、Hyper-Vのイメージをダウンロードしました。
seed.iso 起動ディスクを作成する
次に、seed.isoを作ります。これは、Amazon Linux 2が起動したときに自動で設定される項目を定義しておくisoイメージになります。
作り方は先ほどのAWSのサイトに書いてありますが、ここにも書いておきます。ざっくりとした手順は以下の通り。
seedconfig
という名前のディレクトリを作成し、そこに移動meta-data
設定ファイルを作成するuser-data
設定ファイルを作成する- コマンドで
seed.iso
ファイルを作成する
meta-dataの設定を行う
meta-data
は、ネットワークの設定を記入します。Hyper-Vで動かす場合は、仮想スイッチと同じネットワーク上に作らないといけないので、仮想スイッチのネットワークを調べましょう。
ネットワークの設定を調べる
仮想スイッチのネットワークですが、コントロールパネルのネットワークとインターネット、ネットワーク接続で確認することができます。今回は、前に作ったVagrantで利用するために固定IPを設定した仮想スイッチのネットワークを使います。Default SwitchのネットワークはPCが再起動するたびにコロコロ変わっていたので、とりあえず今回は使いません。なんか固定する方法もあるらしいけれど。
矢印の仮想ネットワーク上で右クリックをして、プロパティを表示します。
そして、インターネット プロトコル バージョン 4を選択して、プロパティを表示。
固定IPが振ってありました。192.168.100.1/24
にしていることが、これで確認できました。
DNS設定が抜けていたので、後で家のルーターのIPアドレスを指定しておきました。ここは各自のネットワークに合わせてください。
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マネージャを起動します。検索から探すとすぐに見つかります。
仮想マシンの作成
仮想マシンの新規作成を選びます。
ウィザードが出てくるので、名前はお好きなものを。とりあえずAamzon Linux 2としました。
世代の指定ですが、第1世代を選びます。これは、AWSで公開されているHyper-Vのイメージが第1世代だからです。
メモリの割り当ては適当に。私は1024MBにしました。
ネットワークの構成は、先ほど参照した仮想スイッチを指定します。
仮想ハードディスクの接続は、最初にダウンロードしたHyper-Vのイメージを指定します。「既存の仮想ハードディスクを使用する」を選択し、さきほど移動させたHyper-Vのイメージを指定しましょう。
あとは、確認して、完了を押してウィザードを終了します。
ブートの設定
次に、作成した仮想マシンのブート設定を行います。これは、先ほど作成したseed.isoファイル経由で起動させるための設定です。
先ほど作った仮想マシンを選択し、右クリックして設定を選びます。
次に、IDEコントローラーを選択し、メディアにイメージファイルを指定し、先ほど作ったseed.isoを設定します。設定が終わったらOKを押します。
仮想環境を起動する
では、起動してみましょう。
Hyper-VマネージャのAmazon Linux 2上で右クリックして起動を選択します。その後、接続を選択します。
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からSSHでVMに接続します。
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です。
まとめ
WindowsでAmazon Linux 2を使えるようにするまでを書きました。Hyper-Vだとなかなか情報が見つかりにくい印象がありますが、これで勉強が捗りそうです。