ググるとPXEブートしてネットワークインストールの情報はたくさんあるけど、DVDブートからAutoinstallする情報はみあたらなかったのでお試し(というか自動インストールというとkickstartしか知らずDebian/Ubuntu系ってどうするんだろう、という状態でしたw)。
PXEブートするためのTFTPサーバーの設定とかその辺不要なので、簡易的に自動インストールしたい場合に構成を小さくできる。
PXE/TFTPのかわりにAutoinstallを使うためのオプション指定を起動時に手入力する、というもの。
ただし、Autoinstallするためのuser-data
ファイルを配布するためのwebサーバーは別途用意する。
kickstartインストールでDVDブートして起動オプションでinst.ks=http://kickstart.example.org/path/to/install.cfg
を追加してインストールするのと同じ要領。
構成図
こんな感じ。あとwebサーバーへ疎通の際のIP割り当てのためのDHCPも必要(ブロードバンドルータとかのやつでOK)
今回の環境はESXi上のVMでAutoinstallをお試し。インストールメディアをドライブにセットし、普通に起動する方式。
user-dataファイルの用意
Autoinstallにおいて、kickstartインストールにおけるcfgファイルに相当するのがuser-data
ファイル。
このファイルの一番簡単(当社比)な入手方法は「手動で一度OSインストールを行い、その時のインストールパラメタが記録されたファイルを使う」で、一度Ubuntuをインストールすると/var/log/installer/autoinstall-user-data
にファイルが作成される。RHEL系の/root/anaconda-ks.cfg
と似たような感じだと思う。多分。
このファイルをuser-data
というファイル名で用意する。
ホスト名と初期アカウント
autoinstall: identity: hostname: ホスト名 password: ハッシュ化されたパスワード realname: 本名 username: ユーザー名
パスワードは手動インストールした時のものと同じであれば変更不要。
再設定する場合、パスワードはmkpasswd
などを使って生成可能。
[zaki@cloud-dev2 ~]$ mkpasswd -m sha512crypt パスワード: # ここにパスワード入力 $6$XUQvm3zdFpKdbqjw$nhFPnzTKbdq2IMV1eAyL9edKpNUcaKjn3RxcX/z3FUicMPnJ6iDto.VGELgrM8k/NY8IZIAEAyykpI42Sn7.p0
ストレージ設定
ここは正直ちょっとよくわからなかった…ので、ひたすらトライアンドエラー。
BIOSの場合とUEFIの場合で微妙に異なるみたい。(/boot
と/boot/efi
とか)
以下は、ディスクは1つで、BIOS使用・/boot
に2GB・/
に残り全てのパーティションを割り当てる設定(size: -1
)。/
はLVMを使用する。
/boot
と/
以外にbios_grub
フラグが設定されたブート領域(GRUBをインストールする領域)も必要。
(以下は1GB割り当ててるけど、多分そんなに要らない…気がする)
手動インストールしたときのuser-data
はその時のディスクサイズの数値が入っているので、そこを修正してしまえばほぼ良さそう。
構文としては、まず定義した内容のid
を、次の定義でdevice
やvolume
で参照してるように見える。あとパーティションは順番にnumber: N
で1から連番振ってある。
インストールがうまくいったときの内容は以下の通り。
storage: config: - ptable: gpt path: /dev/sda wipe: superblock preserve: false name: '' grub_device: true type: disk id: disk-sda # disk - device: disk-sda size: 1G flag: bios_grub number: 1 preserve: false grub_device: false type: partition id: partition-0 # ここまでgrub領域 #1 - device: disk-sda size: 2G wipe: superblock flag: boot number: 2 preserve: false grub_device: false type: partition id: partition-1 - fstype: ext4 volume: partition-1 preserve: false type: format id: format-0 ## ここまで/boot用 #2 - device: disk-sda size: -1 wipe: superblock flag: '' number: 3 preserve: false grub_device: false type: partition id: partition-2 - name: ubuntu-vg devices: - partition-2 preserve: false type: lvm_volgroup id: lvm_volgroup-0 - name: ubuntu-lv volgroup: lvm_volgroup-0 size: -1 wipe: superblock preserve: false type: lvm_partition id: lvm_partition-0 - fstype: ext4 volume: lvm_partition-0 preserve: false type: format id: format-1 ## ここまで/(ルート)用・LVM設定 #3
「残り全ての領域を割り当てる」ためのsize: -1
指定は、最後のパーティションにしか設定できないので注意(インストール時に以下エラーで失敗する)
subiquity/Filesystem/apply_autoinstall_config: Partition(device=..., size=-1, wipe=..., ...) has negative size but is not final partition of Disk ...
meta-dataとvendor-dataファイル
user-data
と同じディレクトリに、meta-data
とvendor-data
ファイルを作成しておく。
中身は不要で、空ファイルで良い。
meta-data
は無いとインストールに失敗する。
vendor-data
は無くても大丈夫だったが、リクエストがきて404になるログが何度も来て時間と処理が無駄なので、これも空ファイルを作っておく。
touch meta-data vendor-data
webで公開
ここは適当なwebサーバーで。なければコンテナなどで。
Dockerのhttpd
コンテナであれば、user-data
, meta-data
, vendor-data
の3ファイルのあるディレクトリで以下実行。
docker run -d -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs httpd
3つのファイルにリモートからHTTPアクセスできればOK
(3ファイルを同じディレクトリに配置する)
DVDブートと自動インストール
PXEブート(ネットワークブート)を使って起動パラメタを渡さない方法を使うので、DVDからブートするところは手動インストールと同じ。
Autoinstallの指定を入力するため、この画面でe
を押下し、コマンドの編集モードを開く。
ここで以下のように入力。
(実はここも相当トライアルアンドエラーした結果…笑)
linux /casper/vmlinuz ---
となっている個所の---
の手前に次の内容を入力する。
autoinstall ip=dhcp ds=nocloud-net\;s=http://<user-dataファイルを公開しているURL>
ちなみにURLは別にドキュメントルートである必要はなく、http://192.168.0.250/path/to/ubuntu/autoinstall/
とか、ファイルのある場所を指定する。(この場合、http://192.168.0.250/path/to/ubuntu/autoinstall/meta-data
とhttp://192.168.0.250/path/to/ubuntu/autoinstall/user-data
にアクセスできればOK)
これでCtrl-x
を押下すれば指定のパラメタで起動し、user-data
の内容に従ってAutoinstallが始まる。
あとはしばらく放置しておけばインストールが完了し、コンソールはログイン画面に遷移する。手元の環境だと15minくらい。
初回のみコンソール画面でロケールやSSH公開鍵設定が行われるのでそのログが表示される。
(Appendix) user-dataファイル例
今回インストールに使ったuser-data
ファイル全文(一部マスク済み)は以下。
あとで気付いたけどロケールがJPじゃなかったw
#cloud-config autoinstall: apt: disable_components: [] geoip: true preserve_sources_list: false primary: - arches: - amd64 - i386 uri: http://jp.archive.ubuntu.com/ubuntu - arches: - default uri: http://ports.ubuntu.com/ubuntu-ports drivers: install: false identity: hostname: cloud-dev3 password: ... realname: zaki username: zaki kernel: package: linux-generic keyboard: layout: jp toggle: null variant: '' locale: en_US.UTF-8 network: ethernets: ens192: addresses: - 192.168.0.132/24 gateway4: 192.168.0.1 nameservers: addresses: - 192.168.0.19 search: [] version: 2 ssh: allow-pw: true authorized-keys: - 'ssh-rsa ...' - 'ssh-rsa ...' install-server: true storage: config: - ptable: gpt path: /dev/sda wipe: superblock preserve: false name: '' grub_device: true type: disk id: disk-sda - device: disk-sda # .. 前述の通りなので以下省略 .. updates: security version: 1
参考サイト
- Storage — curtin 22.1 documentation
- Automated server install reference | Ubuntu
- Ubuntu 20.04をAutoInstallで自動インストールしてみた - Qiita
- Ubuntu AutoinstallでOSインストール自動化 / 開発者向けブログ・イベント | GMO Developers
- Ubuntu 20.04 autoinstallation – 手当たり次第に書くんだ
- Ubuntu16.04のインストールではまったこと | ニンジンジュースのブログ
PXE使う構成は2003年頃に自分で書いたページもあったり。。当時は外付けCD-ROMドライブを購入する余裕がなかった(笑)
[ネットワークインストール・マルチブート] Libretto L5 / Debian