PreseedによるUbuntu Server自動インストール / early_command で実行可能な内容の調査メモ

Kickstartの%pre と Preseedのearly_command

事前設定ファイルを用いて、OS自動インストールをする仕組みとして、

が利用できます。

その設定ファイル内でコマンド・スクリプト実行を記述することができます。
そのなかでもパーティショニング前のスクリプト実行を定義する記述は下記になります。

  %pre-%end セクション

  preseed/early_command : preseed読み込み後できるだけ早いタイミングで実行

  partman/early_command : パーティショニング直前に実行

このタイミングでのコマンド実行が活躍するシーンの例としては、

  • 動的なパーティショニング定義を設定しておくことができる
  • 物理筐体のRAIDコントローラ対応のCLIを導入/実行する手法でのRAID構成を自動化できる

などが挙げられます。

 

early_commandで実行可能なコマンドの確認方法

Kickstartの%pre-%endセクションについては下記の RedHatのドキュメントに実行可能なコマンドのリストが記述されていました。標準的なコマンド一式が実行可能です。


一方Preseedのearly_commandについては、ドキュメントを確認したものの、なかなか実行可能なコマンドに言及している記述を見つけることができませんでした。

という経緯から調査していたので、ここに確認した情報を書き留めておきます。

 

① debian-installerの処理順序の確認

Debian Installerの内部処理については下記のドキュメントに纏められています。

 

debian-installerではパーティショナ起動前の処理では、メモリ上にロードしているのはdebian-installerの追加コンポーネントぐらいなので、early_commandで実行可能なコマンドは、メモリ上に展開されているinitrd(bootイメージ)に梱包されているコマンドと推測できます。

② initrdに梱包されているコマンドを確認

というわけで、梱包されているコマンドを確認するため、initrd(bootイメージ)を展開します。以降はUbuntu Server LTS 18.04のイメージで確認しています。

次項でコマンドの一覧をまとめましたが、実際に自分でinitrdを開封して詳細な中身を確認したいという方は、下記の内容を参考に、開封してください。

## imageダウンロード
# cd /tmp
# wget http://archive.ubuntu.com/ubuntu/dists/bionic-updates/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/initrd.gz

## 開封
# mkdir ubuntu_initrd
# cd ubuntu_initrd
# zcat ../initrd.gz | cpio -i
235300 blocks
# ls -l
total 64
drwxr-xr-x 2 root root 4096 Mar 18 01:16 bin
drwxr-xr-x 2 root root 4096 Mar 18 01:16 dev
drwxr-xr-x 14 root root 4096 Mar 18 01:16 etc
-rwxr-xr-x 1 root root 456 Mar 18 01:16 init
drwxr-xr-x 2 root root 4096 Mar 18 01:16 initrd
drwxr-xr-x 17 root root 4096 Mar 18 01:16 lib
drwxrwxr-x 2 root root 4096 Mar 18 01:16 lib64
drwxr-xr-x 2 root root 4096 Mar 18 01:16 media
drwxr-xr-x 2 root root 4096 Mar 18 01:16 mnt
drwxr-xr-x 2 root root 4096 Mar 18 01:16 proc
drwxr-xr-x 2 root root 4096 Mar 18 01:16 run
drwxr-xr-x 2 root root 4096 Mar 18 01:16 sbin
drwxr-xr-x 2 root root 4096 Mar 18 01:16 sys
drwxrwxr-x 2 root root 4096 Mar 18 01:16 tmp
drwxrwxr-x 6 root root 4096 Mar 18 01:16 usr
drwxrwxr-x 7 root root 4096 Mar 18 01:16 var

early_commandで実行可能なコマンド一覧

前項の方法で調べた内容の一覧です。

【Kickstart(%pre)/Preseed(early_command)共通で実行可能】
arping、awk、basename、bzcat、cat、chmod、chown、chroot、chvt、cp、cut、date、dd、df、dirname、dmesg、echo、egrep、env、expr、false、fgrep、find、grep、gunzip、head、hostname、hwclock、ip、kill、killall、ln、losetup、ls、lsmod、md5sum、mkdir、mknod、mkswap、mktemp、modprobe、more、mount、mv、pidof、ping、ps、pwd、readlink、rm、rmdisk、rmmod、route、sed、sh、sha1sum、sleep、swqpoff、swapon、sort、sync、tail、tar、touch、true、umount、uniq、vconfig、wc、wget、zcat
【Kickstart(%pre)でのみ実行可能】
bash、bunzip2、chattr、chgrp、clear、cpio、du、e2fsck、e2label、eject、fdisk、fsck、 fsck.ext2、fsck.ext3、ftp、gzip、hdparm、ifconfig、insmod、ipcalc、less、load_policy、login、lsattr、lvm、mke2fs、mkfs.ext2、mkfs.ext3、mt、nslookup、opend、rpm、tee、telnet、top、tune2fs、vi、wipefs、xargs
【Preseed(early_command)でのみ実行可能】
anna、anna-install、apt-install、ar、archdetect、ash、blkid、blkdiscard、blockdev、block-attr、brltty、brltty-setup、bterm、check-missing-firemware、choose-mirror、ckcomp、ckcomp-mini、cmp、console-type、debian-installer、debian-installer-startup、debconf、debconf-copydb、debconf-dumpdb、debconf-disconect、debconf-get、debconf-set、debconf-set-selections、debconf-loadtemplate、dhclient、dh-client-script、dnsdomainname、env2debconf、ethdetect、fallocate、freeramdisk、fstrim、fetch-url、free、getopt、get-real-console-linux、gpgv、groups、halt、hotplug-pcmcia、hw-detect、httpd、id、in-target、init、insmod、kbd_mode、kill-all-dhcp、klogd、kmod、languagemap、list-devices、loadkeys、localechooser、logger、log-output、lowmem_debconf、lspci、lsscsi、main-menu、modinfo、mountmedia、nano、nc、netcfg、od、pidof、ping6、pivot_root、poweroff、preseed_command、preseed_fetch、printf、ptom、rdisc6、rdnssd、realpath、reboot、register-module、reopen-console、resolve、report-hw、seach-path、setfront、setupcon、setvtrgb、seq、shutdown、steal-ctty、swicth_root、syslogd、start-shell、stat、sysfs-update-devnames、sha256sum、sha512sum、test、tftp、tr、translation-check、trimtemplates、tty、udevadm、udhcpc、uname、udpkg、update-dev、user-params、unxz、usb-list、wpa_supplicant、xzcat

 

パーティショナ起動前のスクリプト実行(手動コマンド発行)

early_commandで記述する前にパーティショナ起動前のinitrd環境にログインして手動コマンド発行で動作確認しておくと便利そうでした。

  • pxeboot で preseedを指定しない状態でbootする
  • debian-installer の load conponent 直後に<Go back>でmenuへ抜ける
  • この状態で Execute a shell を選択
  • <Continue>でshellログイン
BusyBox v1.27.2 (Ubuntu 1:1.27.2-2ubuntu3) built-in shell (ash)
~ #

ここでスクリプト化する内容の動作確認が試せて、便利そうでした。

なお、この環境下においては、エディタはnano、シェルはashです。

 

パーティショナ起動前のスクリプト実行(Preseedのearly_command)

 Preseed内でのearly_commandでの動作確認をしていたところとして、最終行が正常終了(ステータス0)だと正常終了とみなされてしまうという挙動を確認しました。

なので、直接スクリプトを記述せずに、スクリプトダウンロードののち最終行で実行という流れで記述すると良さそうでした。

<記述例>
d-i partman/early_command string \
wget http://{{ 配布元Server }}scripts/prescript.sh -O /tmp/prescript.sh; \
chmod 777 /tmp/prescript.sh ; \
ash /tmp/prescript.sh

 

 またスクリプトについてはashスクリプトとしてのエラーハンドリングの仕方を意識する必要があります。

<記述例>
#!/bin/ash

RC=0

## 何かしらの処理
## 略
RC="$?"
if [ $RC -ne 0 ] ; then
exit $RC
fi

## 何かしらの処理
## 略
RC="$?"
if [ $RC -ne 0 ] ; then
exit $RC
fi

## 略

exit $RC

 

今回は Preseed の early_command で実行できる内容について、紹介しました。

実行可能なコマンドを移植するという内容についても現在実験中です。こちらについても、うまく動作できれば、別途紹介しようと思います。