Hyper-V で Amazon Linux 2 の仮想マシンを作る

ローカル PC の Windows で Hyper-V の Amazon Linux 2 を作成したので残します。
Amazon Linux 2 の学習や、環境構築のリハーサルなど、費用を掛けずに試せるのは便利だと思います。

ひと目でわかるHyper-V Windows Server 2022版 (Amazon)

環境

  • Windows 11 Pro 21H2
    Hyper-V はインストール済み。Hyper-V マネージャー バージョン 10.0.22000.1
  • Amazon Linux 2 LTS 2.0.20220426.0 x86_64

seed.iso の作成

公式にある通りですが、実際にやった内容を残します。
作成にあたって、ネットワーク設定の為に予め自身の Windows 環境を確認します。
PowerShell やコマンドプロンプトから以下のコマンドを実行します。

ipconfig /all

Hyper-V で作成する仮想マシンのネットワークに “Default Switch” を選択するので、その記載がある箇所を見つけます。自分の場合は次の内容でした。(一部改変あり)

イーサネット アダプター vEthernet (Default Switch):

   接続固有の DNS サフィックス . . . . .: 
   説明. . . . . . . . . . . . . . . . .: Hyper-V Virtual Ethernet Adapter
   物理アドレス. . . . . . . . . . . . .: 00-00-00-00-00-00
   DHCP 有効 . . . . . . . . . . . . . .: いいえ
   自動構成有効. . . . . . . . . . . . .: はい
   リンクローカル IPv6 アドレス. . . . .: 0000::0000:0000:0000:0000%00(優先) 
   IPv4 アドレス . . . . . . . . . . . .: 192.168.224.1(優先) 
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .: 
   DHCPv6 IAID . . . . . . . . . . . . .: 000000000
   DHCPv6 クライアント DUID. . . . . . .: 00-00-00-00-00-00-00-00-00-00-00-00-00-00
   NetBIOS over TCP/IP . . . . . . . . .: 有効

必要になる部分は、

  • IPv4 アドレス (192.168.244.1)
  • サブネット マスク (225.225.240.0)

です。

meta-data ファイルの作成

公式の例の必要な箇所を書き換え、以下の文字コード UTF-8 のテキストファイルを作成しました。

local-hostname: kumasvr
# 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.224.11
  network 192.168.224.0
  netmask 255.255.240.0
  broadcast 192.168.255.255
  gateway 192.168.224.1
  • local-hostname:ホスト名を適当に kumasvr と設定
  • address:192.168.244.1 と同じセグメントのアドレスとして適当に 192.168.244.11 を設定
  • network:上記の「IPv4 アドレス」に「サブネット マスク」でマスクした値の 192.168.224.0 を設定
  • netmask:上記の「サブネット マスク」の値を設定
  • broadcast:network の値の下位ビットを立てて 192.168.255.255 を設定
  • gateway:上記の「IPv4 アドレス」の 192.168.224.1 を設定

user-data ファイルの作成

公式の例から ec2-user のパスワードを書き換えたぐらいです。
ブート起動時の cloud-init によるネットワーク設定の適用を無効にし、最初の起動時のネットワーク設定を保持する為の記述も使っています。

#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:hogehoge
# 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

WSL2 で seed.iso の作成

iso イメージを作成する為に、WSL2 で Ubuntu を使いました。
公式にある「Linux の場合は、genisoimage などのツールを〜」で iso イメージを作成する為です。
WSL2 は 管理者権限のある PowerShell からコマンドでインストールしました。
管理者権限のある PowerShell は、Windows アイコンの右クリックから「Windows ターミナル(管理者)」で起動します。

PowerShell が起動したら、以下のコマンドを実行します。

wsl --install

WSL2 がインストールされたら、指示に従ってユーザーアカウントの作成とそのパスワードを入力します。
自分の環境では、Ubuntu 20.04 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64) が動くようになりました。

Ubuntu のターミナルから以下のコマンドで genisoimage をインストールします。

sudo apt install genisoimage

Ubuntu 上に meta-data ファイルと user-data ファイルを置きます。
エクスプローラー で Ubuntu のユーザーディレクトリ(/home/kuma)にコピーしました。

Ubuntu のターミナルから、公式通り以下のコマンドを実行して seed.iso を作成します。

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

作成した seed.iso ファイルがエクスプローラーからも確認できます。
見当たらない場合は、表示を最新にする為に F5 キーを押します。

仮想マシンの作成と起動

Amazon Linux 2 VM イメージのダウンロード

公式のリンクから Microsoft Hyper-V の Amazon Linux 2 VM イメージをダウンロードしました。
https://cdn.amazonlinux.com/os-images/2.0.20220426.0/hyperv/ の amzn2-hyperv-2.0.20220426.0-x86_64.xfs.gpt.vhdx.zip でした。

Hyper-V で Amazon Linux 2 VM を作成して起動

C:¥VM に以下のファイルを置きました。

  • Amazon Linux 2 VM イメージの zip ファイルを解凍して取り出した VM イメージ
  • 作成した seed.iso ファイル

「Hyper-V マネージャー」を起動し、「操作」パネルの「新規」-「仮想マシン」をクリックし、「仮想マシンの新規作成ウィザード」を開きます。
ウィザードは、以下の通り進めました。

仮想マシンの名前を入力。適当に「kumasvr」と設定。

デフォルトのまま「第1世代」。

メモリの割り当てもデフォルトのまま。

ネットワークの構成では「Default Switch」を選択。

※ 2023/01/28 追記
 ゲスト OS を固定 IP アドレスにする今回の様な場合、
 "Default Switch" は不向きでした。
 仮想スイッチを作成した投稿の方を採用してください。
 "Default Switch" は IP アドレスが変わるので、
 ホスト OS の再起動などで外部ネットワークに繋がらなくなります。

仮想ハードディスクの接続は「既存の仮想ハードディスクを使用する」にし、C:¥VM に配置した VM イメージを指定。

完了。

作成した仮想マシンの DVD ドライブに seed.iso を設定します。
「Hyper-V マネージャー」で作成した kumasvr を選択し、「操作」パネルの kumasvr の「設定」を選択します。
「IDE コントローラー 1」-「DVD ドライブ」の「メディア」で「イメージファイル」を選択し、seed.iso を指定したら「OK」で閉じます。

仮想マシンが作成できたので、起動します。
「Hyper-V マネージャー」で kumasvr を選択し、「操作」パネルの kumasvr の「接続」を選択します。
仮想マシンの接続のウインドウが開くので「起動」をクリックします。

Amazon Linux 2 の初期設定

Amazon Linux 2 が起動したら、ec2-user でログインして幾つか設定します。

ロケールとタイムゾーンの設定

デフォルトだと、キーボード配列が英語で入力が辛いので、日本語配列にしました。

sudo localectl set-keymap jp106
sudo localectl set-locale LANG=ja_JP.utf8
sudo timedatectl set-timezone Asia/Tokyo

ネームサーバーの設定

/etc/resolv.conf にネームサーバーを追加します。
IP アドレスは “Default Switch” の IPv4 アドレスを指定します。

nameserver 192.168.224.1

パッケージのアップデート

以下のコマンドを実行してパッケージをアップデートしました。
プロキシ環境下で上手く行かない場合は、後述の補足を参照ください。

sudo yum update

Windows から Amazon Linux 2 に公開鍵認証で ssh 接続

秘密鍵と公開鍵の作成

PowerShell で以下のコマンドを実行します。
パスフレーズは無しで作成しました。

ssh-keygen -t ecdsa

鍵ファイルは C:¥Users¥(ユーザー名)¥.ssh ディレクトリに作成される以下の2つです。
・id_ecdsa
・id_ecdsa.pub

公開鍵を Amazon Linux 2 に格納

一旦、パスワード認証による SSH 接続を有効にし、公開鍵を格納したらパスワード認証を無効にします。
Hyper-V で接続したウインドウからはクリップボードが使えず作業が辛い為、SSH 接続したい為です。

パスワード認証による SSH 接続の有効化

Amazon Linux 2 の /etc/ssh/sshd_config ファイルを編集してパスワード認証を有効にします。
以下のように vi を起動して編集しました。

sudo vi /etc/ssh/sshd_config

PasswordAuthentication の no を yes に変更して保存し、vi を終了します。

PasswordAuthentication yes

sshd を再起動して設定を反映します。

sudo systemctl restart sshd

公開鍵の格納

Windows から Amazon Linux 2 に scp で公開鍵をコピーします。
PowerShell で以下を実行します。パスワードを聞かれるので入力します。

scp C:¥Users¥(ユーザー名)¥.ssh¥id_ecdsa.pub ec2-user@192.168.224.11:~/

Amazon Linux 2 に SSH 接続し、パスワードを入力します。

ssh ec2-user@192.168.224.11

公開鍵を /home/ec2-user/.ssh/authorized_keys ファイルに反映します。
中身はテキストなので、作成した公開鍵の id_ecdsa.pub ファイルの内容が追記できれば OK です。

cat id_ecdsa.pub>>~/.ssh/authorized_keys

パスワード認証による SSH 接続の無効化

有効化で実施した内容を戻します。
sshd_config の PasswordAuthentication を no に戻して sshd を再起動します。

以上です。後はあれこれ Amazon Linux 2 を試してみましょう。

補足:プロキシ環境下のPCで動かすときの設定

プロキシ環境下の Windows PC で、仮想マシンの Amazon Linux 2 側が外部のネットワークに接続できない場合、幾つか設定を行います。
設定するのは仮想マシンの Amazon Linux 2 側です。

プロキシの設定

環境変数 http_proxy、https_proxy にプロキシを設定します。
プロキシが http://proxy.example.com のポート 8080 だとしたら、

export http_proxy=http://proxy.example.com:8080
export https_proxy=http://proxy.example.com:8080

を実行します。
ただ、毎回実行するのは面倒だし、どのユーザーにも反映されるように /etc/profile の末尾に追記しました。
また、sudo でも設定が効くように、visudo で設定ファイルを編集します。

sudo visudo

“Defaults env_keep += ” が複数行記載されている箇所があるので、続けて次を追記します。

Defaults env_keep += "http_proxy https_proxy" 

/etc/profile と visudo を設定後、Amazon Linux 2 を再起動し、

sudo printenv

で対象の環境変数が設定できていることを確認します。

外部のコンテンツが取得できるか確認

プロキシとネームサーバーを設定したら、外部のコンテンツが取得できるか確認します。
試しに curl で google を指定してみます。

curl https://google.com

成功なら sudo yum update も行けるか確認します。
エラーで “SSL certificate problem: unable to get local issuer certificate” なら、次を行います。

SSL 証明書の問題を解消

Windows 側でローカル発行者証明書を「信頼されたルート証明機関」に登録済みでも、Amazon Linux 2 側は分からないので追加します。
ローカル発行者証明書のファイルが無くても、必要なローカル発行者証明書が分かるなら Windows 側で管理している「信頼されたルート証明書」の中から、エクスポートして得ることができます。
が、ここではローカル発行者証明書のファイルは既にあるものとして進めます。
場合によっては後述の SSL の確認をしない設定を参考にしてください。

ローカル発行者証明書を追加する

追加できる証明書の形式は DER か PEM です。
手元の証明書が ProxyRootCertificate.cer(Base 64 のテキストファイル)なので、Amazon Linux 2 にコピーし、変換してから追加します。

openssl x509 -in ProxyRootCertificate.cer -out ProxyRootCertificate.pem -outform pem
sudo cp ProxyRootCertificate.pem /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

追加できたら再度 curl で外部コンテンツを取得できるか確認し、良ければ sudo yum update します。

SSL の確認をしない yum

エラーが解消できない場合、お勧めはしませんが SSL の確認を止めることも可能です。
/etc/yum.repos.d/amzn2-core.repo に、SSL の確認をさせない為に sslverify=0 を追加します。

[amzn2-core]
(省略)
sslverify=0

[amzn2-core-source]
(省略)
sslverify=0

[amzn2-core-debuginfo]
(省略)
sslverify=0

これで yum は通ると思いますが、他のツールでは同様のエラーが発生し、個別に対応が必要で面倒かもしれません。

コメント