ローカル PC の Windows で Hyper-V の Amazon Linux 2 を作成したので残します。
Amazon Linux 2 の学習や、環境構築のリハーサルなど、費用を掛けずに試せるのは便利だと思います。
環境
- 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 は通ると思いますが、他のツールでは同様のエラーが発生し、個別に対応が必要で面倒かもしれません。
コメント