Linux ディストリビューションの一つ、Ubuntu の最新の LTS 版 20.04(Focal Fossa)がリリースされました。
最近は、いろいろなOSを素早く利用するために、CentOS なら kickstart といった自動インストールする仕組みを利用して、OS を導入しています。
Ubuntu 18.04 以前のインストール
従来、Debian ベースの Preseed を用いて自動でインストールする仕組みが提供されていました。
インストーラで聞かれるすべての質問を答えるような形で、 個人的には、直感的ではないと感じていました。
例えば、下記。
インストーラでよくある、パスワードの再入力を自動化しています。
d-i passwd/root-password password hogehoge
d-i passwd/root-password-again password hogehoge
Ubuntu 20.04 で導入された Autoinstall
新しく YAML 形式の自動インストール機能が利用可能になりました。
- 第615回 サーバー版インストーラーに導入された自動インストール機能:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
- Automated Server Installs | Ubuntu
Preseed のような名称があるのか確認したのですがよく分からず、ここでは Autoinstall と呼びます。
cloud-init と同様に、user-data という YAML ファイルをインストーラに読み込ませます。
user-data の作成
詳細は後ほど説明しますが、試行錯誤の結果この user-data を使用します。
#cloud-config
autoinstall:
version: 1
identity:
hostname: ubuntu-vm
username: yasu
password: "$6$以下略"
ssh:
install-server: yes
authorized-keys:
- "ssh-ed25519 以下略"
allow-pw: true
packages:
- language-pack-ja
keyboard:
layout: jp
refresh-installer:
update: yes
late-commands:
- "mkdir -p /target/root/.ssh/"
- "echo 'ssh-ed25519 以下略' >> /target/root/.ssh/authorized_keys"
- chroot /target /bin/sh -c "apt-get -y upgrade"
user-data:
disable_root: false
Preseed よりかなりシンプルになりました。
自動インストールの実施
user-data の渡し方として、下記があります。
- PXE インストール
- インストール ISO でブートオプションで URL 指定
- インストール ISO と user-data の ISO をマウント
一般的な家庭用ネットワークなので、PXE はできず、ブートオプションで URL を指定する方法を検討したのですが
autoinstall ds=nocloud-net;s=http://(Apache IP)
のように、起動オプションで渡しても、自動インストールが走らず、Apache のアクセスログを見ても来ている様子はありませんでした。
そこで、user-data の ISO をマウントすることにしました。
まずは、ボリュームラベルが「cidata」となる ISO を作成します。
Amazon Linux 2 をローカルで実行するときと同様の手順で作成可能です。
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data
あとは、VMware なり、VirtualBox なりで、
- ubuntu-20.04-live-server-amd64.iso
- seed.iso
の順でマウントして仮想マシンを起動させます
そのままだと、しばらく読み込んだ後に本当に自動インストールするか yes / no で聞かれます。
起動オプションに「autoinstall」を追記するとこの質問をスキップできます。
試行錯誤を繰り返す場合、autoinstall を追記したものをインストール ISO として用意しておくと便利かもしれません。
また、シリアルポートが用意できる環境なら、「console=ttyS1,9600」と書いておくとファイルに書き出されるのでデバッグは楽になるかもしれません。

ただ、日本語キーボードの問題で = が打てないので、これをやる場合にはインストール ISO も作成した方が良いかと思います。
動作しない点
下記は設定したものの動作を確認できませんでした。
identity username, password などのユーザー作成
サンプルにも記載されている下記の部分です。
identity:
username: yasu
password: "$6$以下略"
ssh:
authorized-keys:
- "ssh-ed25519 以下略"
yasu というユーザーを作成するように指定するも無視され、実際は ubuntu というユーザーが作成されています。
root@ubuntu-vm:~# ll /home/
total 12
drwxr-xr-x 3 root root 4096 Apr 26 02:33 ./
drwxr-xr-x 20 root root 4096 Apr 26 02:33 ../
drwxr-xr-x 3 ubuntu ubuntu 4096 Apr 26 02:33 ubuntu/
パスワードも、authorized-keys も設定されていないのでログイン不可能です。
root@ubuntu-vm:~# grep ubuntu /etc/shadow
ubuntu:!:18378:0:99999:7:::
今回は、late-commands で root ユーザーに authorized_keys を流し込んで無理矢理ログインしました。
ubuntu ユーザーを使う場合も、ここを工夫するしかなさそうです。
late-commands:
- "mkdir -p /target/root/.ssh/"
- "echo 'ssh-ed25519 以下略' >> /target/root/.ssh/authorized_keys"
地域の設定
日本語を利用、タイムゾーンも JST を設定しています。
locale: ja_JP.UTF-8
user-data:
timezone: "Asia/Tokyo"
しかし、反映されず・・・
root@ubuntu-vm:~# localectl
System Locale: LANG=C.UTF-8
VC Keymap: n/a
X11 Layout: jp
X11 Model: pc105
root@ubuntu-vm:~# timedatectl status | grep zone
Time zone: Etc/UTC (UTC, +0000)
キーボードだけは反映されているようです。
keyboard:
layout: jp
まとめ
Autoinstall YAML により従来は手作業、もしくは煩雑な Preseed で自動インストールしていた作業を簡単に自動化できることを確認しました。
wget, curl, git などは明示的に指定しなくてもインストールされていました。
また、VMware のゲストの場合、open-vm-tools もインストールされていました。
Preseed でインストールした Ubuntu 18.04 ではこれらは明示的にインストールしていたのでとても良いです。
ユーザー設定、言語設定といったリファレンスに書かれているものも、正常に動作しない部分もありこれからといった印象がありますが、コマンドを流し込むことも可能なので、工夫次第でなんとかなりそうです。