LoginSignup
3
3

Amazon Linux 2 をローカル仮想マシンで実行したくてSeed.isoをWindowsで作った「だけ」

Last updated at Posted at 2021-04-14

目的

Amazon Linux 2 を 個人PCのローカル仮想マシンで実行するときに、
ISOファイルを自作する必要があります。
このISOファイルの作成で困ったので、ドキュメントとして残します。

これを読めば、あなたも今日からローカルAL2!
AWSを使い慣れていてAmazon Linuxをローカルでも使いたいなというときに便利です。

Amazon Linux 2 をオンプレミスで!

これです。

AWSでお世話になっている、Amazon Linux をオンプレミスでも活用してハッピーになりましょう。

モチベーション

最近のCPUだとWSL2ベースのDockerが使えるので、VirtualBoxでAmazonLinuxするよりもハッピーになれます。
そう、Development Environment On Docker On WSL2 On Windows 10 です。

しかし今回は、VirtualBoxで動作検証をしています。
そもそもWindows10ProでWSL2のDockerを使って開発しようと考えていましたが、
古いCPUで仮想化機能が物理レベルで足りなくてできませんでした。

そこで、**Development Environment On Docker On AL2 On VirtualBox On Windows 10 をしよう!!**と、
「簡単に出来るのならAWSの従量課金を節約しよう」と、そういうわけです。

isoが作れない

上記の公式ガイドで概要は理解できるし、とても丁寧に書かれていて助かります。
ところが、Windowsで作業していると「isoの作成」という壁が立ちはだかるのです。

(※WSL使えばいいじゃん)

そもそもisoって?

isoというのは、CD/DVDにデータを書き込むためのイメージファイルです。
拡張子が、isoでもimgでも中身は同じです。
ここまでは良いでしょう。しかし、問題はこの先です。

じゃあ作ってみよう

Linux系 ではこうやります。

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

Unix系ではこうです。

hdiutil makehybrid -o seed.iso -hfs -joliet -iso -default-volume-name cidata seedconfig/

え?Windowsは?

うっせぇわ

Windowsにgenisoimagehdiutilmkisofs?そんなもの無いと見せつけてやる!
image.png

最新の流行は当然のIaC
コンテナの状態もKibabaでチェック
GitでPullしてDockerでRun
最近じゃ当然のツールです

はぁ!?うっせぇうっせぇうっせぇわ
一切合切ペンギンな
あなたじゃわからないかもね?

という歌詞があるとかないとか。

解決方法

CDRTFEを使います。

このGUIソフトにCUIがあり、mkisofsが含まれます。これを使いましょう。

公式サイトからインストーラーをダウンロードして使うか、
Chocolateyを使ってインストールします。

Chocolateyの場合のインストールコマンドです。

choco install cdrtfe -y

インストールが終わると、

C:\Program Files (x86)\cdrtfe\tools\scripts\cmdshell.cmdというバッチファイルがあります。
これをダブルクリックしてWindowsシェルを起動します。このバッチファイルが何をしているかというと、cygwinmkisofsが使えるように環境変数Pathを一時的に設定してくれています。環境変数は立ち上がったシェルを閉じたら元に戻ります。

立ち上がったシェルでmkisofsコマンドを実行してみます。

mkisofs: Missing pathspec.
Usage: mkisofs [options] [-find] file... [find expression]

Use mkisofs -help
to get a list all of valid options.

Use mkisofs -find -help
to get a list of all valid -find options.

Most important Options:
        -posix-H                Follow sylinks encountered on command line

コマンドのヘルプが表示されましたね。
このまま、cduser-datameta-dataがあるディレクトリに移動します。
user-datameta-dataの書き方はAWSのドキュメントを参考にしてください。

cd "Path_To_SeedConfigurationDirectory_Include_TextFiles"

先ほどのAWSドキュメントから下記のコマンドをコピーしてきます。

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

それを先頭のコマンド名を書き換えて使います。
genisoimagemkisofsはコマンドオプションの互換性があるそうです。ソースが同じなのかもですね。

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

その結果、seed.isoファイルが生成されます。その時のログです。

Total translation table size: 0
Total rockridge attributes bytes: 363
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 10000
183 extents written (0 MB)

seed.isoを仮想マシンに入れよう

さて、生成したseed.isoを仮想マシンに入れてみてください。
仮想マシンが立ち上がって、下記のようなプロンプトが表示されたら成功です。

amazonlinux login:

もしかして、下記のように表示されましたか?

localhost login:

localhostの部分がmeta-dataファイルのlocal-hostname: amazonlinux.onpremと対応しています。
ファイルの内容が間違っているか、ファイルが読み込めていないかのどちらかだと思われます。

DNS設定

今回は仮想マシンをブリッジ接続にして、静的IPを設定しました。
DNSも固定IPです。meta-dataファイルにはnetwork-interfacesの設定はありますが、
DNSの設定項目が見つかりません。cloud-init Documentationに書き換え方の詳細がありますが、私では見つかりませんでした。DNSに接続できないとインターネットゲートウェイに行けないのでyumとかできません。詰みです。

同一LAN内のPC例

  • IPv4 : 192.168.0.1/24
  • Gateway : 192.168.0.254
  • DNS1 : 203.0.113.0
  • DNS2 : 203.0.113.1

仮想マシンの設定

./meta-data
local-hostname: amazonlinux.onprem
# eth0 is the default network interface enabled in the image. You can configure

# eth0 is the default network interface enabled in the image. You can configure

network-interfaces: |
  iface eth0 inet static
  address 192.168.0.2
  network 192.168.0.0
  netmask 255.255.255.0
  broadcast 192.168.0.255
  gateway 192.168.0.254
./user-data
# cloud-config

# cloud-config

users:
# A user by the name `ec2-user` is created in the image by default.

  - default
chpasswd:
  list: |
    ec2-user:amazonamazonamazonamazonamazonamazonamazonamazonamazonamazonamazonamazon
# In the above line, do not add any spaces after 'ec2-user:'.

# In the above line, do not add any spaces after 'ec2-user:'.

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

SSH設定

sshdの設定ファイルを編集してみます。

sudo nano -l /etc/ssh/sshd_config

今回は65行目あたりにあったパスワード認証設定を有効化しました。

- PasswordAuthentication no
+ PasswordAuthentication yes
sudo service sshd restart

上記のsshd設定ファイルの編集を省くには、seed.isoを作成するときのmeta-dataに1行追加します。

ssh_pwauth: True

仮想マシンを稼働させているホストから接続してみます。

ssh ec2-user@192.168.0.2

途中でつまづいたところ

  • YAMLの定義ではインデントにタブが無いためエラーになる。

やっぱり止めた

いろいろ頑張ったのですが、やめます。ネットワーク設定ができないからです。

stages.py[ERROR]: Unable to render networking. Network config is likely broken: No available network renderers found. Searched through list: ['eni', 'sysconfig', 'netplan']
更に調査した結果としては、将来のリリースに期待するしかなさそうです。応急処置として手動設定するしかないですね。

というわけで、cloud-initで自動設定するのが難しいことが分かりました。
ただし、cloud-initのドキュメントを読み込めば解決できる可能性も残っています。
とはいえ、当初の目的が「簡単に・節約」だった以上はOUTです。

オンプレAmazonLinux君にはご退場いただきます。
今までありがとうございました。

まとめ

WSL2を使おう。Dockerを使おう。k8sを使おう。

Excelsior!

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3