Ubuntu Serverの全自動インストール環境作成

百台近くも鯖をインストールせねばならなくなった。
さすがにめんどくさいので、d-iのpreseed機能を使って自動化する。

  • Ubuntu鯖のミニマム環境を入れる。
  • マシンがかなりいろいろになるのでi386がターゲット。
  • ネットワーク環境は存在しない。
  • 全数USBメモリからのインストールになる。
  • debになってない必要なプログラムを追加する。
  • パッケージとしては、rootでシェル環境を立ち上げるので、mingettyを追加する。
  • 起動時800x600で、コンソールはスリープしないようにする。
  • 電源オン時、rootでコンソール起動、指定のプログラムを自動起動する。
  • ログをHDDからUSBメモリへ回収する必要がある。

isoを抜く

kinneko@BuildSV:~/_ISO$ mkdir REMASTER
kinneko@BuildSV:~/_ISO$ cd REMASTER/
kinneko@BuildSV:~/_ISO/REMASTER$ cp ../ubuntu-12.10-server-i386.iso ./
kinneko@BuildSV:~/_ISO/REMASTER$ mkdir image
kinneko@BuildSV:~/_ISO/REMASTER$ sudo mount -o loop ubuntu-12.10-server-i386.iso /media
kinneko@BuildSV:~/_ISO/REMASTER$ cd /media/
kinneko@BuildSV:/media$ find . ! -type l | cpio -pdum ~/_ISO/REMASTER/image/
1366865 blocks

起動設定ファイルを変更する

kinneko@BuildSV:/media$ ls ~/_ISO/REMASTER/image/
README.diskdefines  dists  install   md5sum.txt  pool
boot                doc    isolinux  pics        preseed
kinneko@BuildSV:/media$ cd ~/_ISO/REMASTER/image/
kinneko@BuildSV:~/_ISO/REMASTER/image$ sudo vi isolinux/isolinux.cfg 

もとはこうなっている。

# D-I config version 2.0
include menu.cfg
default vesamenu.c32
prompt 0
timeout 0
ui gfxboot bootlogo

変更後。

# Custom Ubuntu Server Installer 20130130 by kinneko@gmail.com
default install
label install
menu label ^Custom Ubuntu Server Installer 20130130
kernel /install/vmlinuz
append auto=true pkgsel/language-pack-patterns= pkgsel/install-language-support=false vga=normal file=/cdrom/preseed/custom.cfg initrd=/install/initrd.gz quiet --

自動設定ファイルの作成

preseedのデフォルトは、以下のようなファイルがある。
カスタムには、あまり参考にならなかった。

kinneko@BuildSV:~/_ISO/REMASTER/image$ ls preseed/
cli.seed ubuntu-server-minimalvm.seed
ubuntu-server-minimal.seed ubuntu-server.seed

起動設定で、custom.cfgを指定したのでそれを作成する。

kinneko@BuildSV:~/_ISO/REMASTER/image$ sudo vi preseed/custom.cfg
d-i debian-installer/locale string en_US
d-i localechooser/supported-locales en_US.UTF-8
d-i console-setup/ask_detect boolean false
d-i console-setup/layoutcode string ja106

# NIC not use
d-i netcfg/enable boolean false
# d-i netcfg/choose_interface select auto
# d-i netcfg/choose_interface select eth0 
# d-i netcfg/disable_dhcp boolean true 
# d-i netcfg/get_nameservers string 192.168.0.1
# d-i netcfg/get_ipaddress string 192.168.0.100
# d-i netcfg/get_netmask string 255.255.255.0
# d-i netcfg/get_gateway string 192.168.0.1

d-i netcfg/confirm_static boolean true
d-i netcfg/get_hostname string customusv
d-i netcfg/get_domain string local.exsample.com
d-i netcfg/wireless_wep string
d-i mirror/http/mirror select CC.archive.ubuntu.com
d-i clock-setup/utc boolean false
d-i time/zone string Asia/Tokyo
d-i clock-setup/ntp boolean false

d-i partman-auto/init_automatically_partition select biggest_free 
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman/default_filesystem string ext4
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true

d-i partman/confirm_nooverwrite boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/mount_style select traditional

d-i base-installer/install-recommends boolean true
d-i base-installer/kernel/image string linux-generic

d-i passwd/root-login boolean true
d-i passwd/make-user boolean false
d-i passwd/root-password password test
d-i passwd/root-password-again password test
d-i passwd/user-fullname string test
d-i passwd/username string test
d-i passwd/user-password password test
d-i passwd/user-password-again password test
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false
d-i apt-setup/use_mirror boolean false

d-i debian-installer/allow_unauthenticated boolean true
tasksel tasksel/first multiselect none
d-i pkgsel/include string openssh-server build-essential
d-i pkgsel/upgrade select none
d-i pkgsel/update-policy select none
popularity-contest popularity-contest/participate boolean false
d-i pkgsel/updatedb boolean true
d-i grub-installer/grub2_instead_of_grub_legacy boolean false
d-i grub-installer/only_debian boolean true
d-i grub-installer/bootdev  string (hd0,0)
d-i finish-install/reboot_in_progress note

試しにiso化する

kinneko@BuildSV:~/_ISO/REMASTER/image$ cd ..
kinneko@BuildSV:~/_ISO/REMASTER$ sudo genisoimage -N -J -R -D  -V "CUSTOMUSV"  -o ubuntu-12.10-server-i386-custom-preseed.iso -b isolinux/isolinux.bin -c isolinux/boot.cat  -no-emul-boot -boot-load-size 4 -boot-info-table image

できたもの。

kinneko@BuildSV:~/_ISO/REMASTER$ ls -lh ubuntu-12.10-server-i386-custom-preseed.iso
-rw-r--r-- 1 kinneko kinneko 673M Jan 30 11:56 ubuntu-12.10-server-i386-custom-preseed.iso

仮想マシンで動きを見てみる

netcfgでエラーになった。
"d-i netcfg/enable boolean false" を書かなきゃいいのかな?
netcfg関連を全てコメントアウトしてみる。

kinneko@BuildSV:~/_ISO/REMASTER$ sudo vi image/preseed/custom.cfg
# NIC not use
#d-i netcfg/enable boolean false
# d-i netcfg/choose_interface select auto
# d-i netcfg/choose_interface select eth0
# d-i netcfg/disable_dhcp boolean true
# d-i netcfg/get_nameservers string 192.168.0.1
# d-i netcfg/get_ipaddress string 192.168.0.100
# d-i netcfg/get_netmask string 255.255.255.0
# d-i netcfg/get_gateway string 192.168.0.1

#d-i netcfg/confirm_static boolean true
#d-i netcfg/get_hostname string customusv
#d-i netcfg/get_domain string local.exsample.com
#d-i netcfg/wireless_wep string
#d-i mirror/http/mirror select CC.archive.ubuntu.com

ホスト名Ubuntuで止まる。
やりすぎか。
このへん戻す。

d-i netcfg/confirm_static boolean true
d-i netcfg/get_hostname string customusv
d-i netcfg/get_domain string local.exsample.com
d-i netcfg/wireless_wep string
d-i mirror/http/mirror select CC.archive.ubuntu.com

なんかIPv6とかDHCPとか動いているな...
おそらく、NICは存在する実機ではダメっぽい。


pkgselでエラーになった。
その前にtaskselでエラーになっているけど、それはよさげ。
これかな?
#d-i pkgsel/include string openssh-server build-essential
違う。
よく見ると、"no space left on device"だ... orz
1GBでは足りないのか。
仮想マシンのドライブを8GBにする。


無事インストールできた。
中身を見る。
eth0は自動で設定されてしまっている...
これ起動時にDHCP待つのでよろしくない。

d-i netcfg/enable boolean auto

かな。
NICをナシにして起動してみたらダメだった。

#d-i netcfg/enable boolean false
d-i netcfg/choose_interface select auto

やはりダメ。

d-i netcfg/enable boolean false

でよさげだな。

d-i netcfg/enable boolean false
d-i netcfg/confirm_static boolean true
d-i netcfg/get_hostname string customusv
d-i netcfg/get_domain string local.exsample.com
#d-i netcfg/wireless_wep string
#d-i mirror/http/mirror select CC.archive.ubuntu.com

d-i netcfg/enable boolean falseでsegfaultするのはバグですか。
isoは修正されてないですか、そーですか… orz
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=690330
https://bugs.launchpad.net/ubuntu/+source/netcfg/+bug/901700
どーしましょう...
こんなマイナー機能だと、isoの差し替えはないわなぁ... orz
netcfg.udebを1.68ubuntu17に差し替えればいいのかな。

kinneko@BuildSV:~/_ISO/REMASTER$ wget ftp://ftp.ubuntu.com/ubuntu/pool/main/n/netcfg/netcfg_1.68ubuntu17_i386.udeb
kinneko@BuildSV:~/_ISO/REMASTER$ sudo cp netcfg_1.68ubuntu17_i386.udeb image/pool/main/n/netcfg/
kinneko@BuildSV:~/_ISO/REMASTER$ sudo rm image/pool/main/n/netcfg/netcfg_1.68ubuntu16_i386.udeb 

iso化する。
起動テスト。
うぐぐ。失敗。
パッケージリストも更新しないといけないのか。めんどくさい。
ファイル名上書きにする。
チェックサムがダメかな。

kinneko@BuildSV:~/_ISO/REMASTER$ sudo mv image/pool/main/n/netcfg/netcfg_1.68ubuntu17_i386.udeb image/pool/main/n/netcfg/netcfg_1.68ubuntu16_i386.udeb

bad md5sumだってさ。
パッケージ情報書き換える。

kinneko@BuildSV:~/_ISO/REMASTER/image/dists/quantal/main/debian-installer/binary-i386$ sudo cp Packages.gz Packages.gz.org
kinneko@BuildSV:~/_ISO/REMASTER/image/dists/quantal/main/debian-installer/binary-i386$ sudo gzip -d Packages.gz 
kinneko@BuildSV:~/_ISO/REMASTER/image/dists/quantal/main/debian-installer/binary-i386$ sudo vi Packages
(snip)
Package: netcfg
Priority: optional
Section: debian-installerInstalled-Size: 946
Maintainer: Ubuntu Installer Team <ubuntu-installer@lists.ubuntu.com>
Original-Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: i386
Version: 1.68ubuntu16
Provides: configured-network
Depends: libc6-udeb (>= 2.15), libdebconfclient0-udeb, libdebian-installer4-udeb (>= 0.79ubuntu3), libiw30-udeb (>= 30~pre1), ethernet-card-detection, isc-dhcp-client-udeb, wpasupplicant-udeb, crypto-modules, rdnssd-udeb, ndisc6-udeb
Filename: pool/main/n/netcfg/netcfg_1.68ubuntu16_i386.udeb
Size: 315084
MD5sum: 40f0c35b3ac33c9f1ce1e0c7eb33500b
SHA1: 598300ff6afd6ed7395e519911c1a48252e15da5
SHA256: 26d7ed75aedaad9be2fe71743e38f5499b6cc6406485e77ca0cfbdc35de7e577
Description: Configure the network
 To install additional installer components or the Debian Base System over
 the network, you need to configure the network in the installer. This
 component will first try to configure your network with DHCP and ask
 you for static network configuration if this fails. The configured
 network settings will be copied to your newly installed system.
Installer-Menu-Item: 1800
Supported: 18m

以下を調べて無理やり書き換える。

kinneko@BuildSV:~/_ISO/REMASTER$ md5sum netcfg_1.68ubuntu17_i386.udeb 
20d119be495ac3ea4037b11a630d3500  netcfg_1.68ubuntu17_i386.udeb
kinneko@BuildSV:~/_ISO/REMASTER$ sha1sum netcfg_1.68ubuntu17_i386.udeb 
6a84c0ced0add99c61434ce65353964fede569f2  netcfg_1.68ubuntu17_i386.udeb
kinneko@BuildSV:~/_ISO/REMASTER$ sha256sum netcfg_1.68ubuntu17_i386.udeb 
7bff6a8a7c6aacbf6b072d44a6d04084c07a07839012d7077619033f71853151  netcfg_1.68ubuntu17_i386.udeb
kinneko@BuildSV:~/_ISO/REMASTER$ ls -l netcfg_1.68ubuntu17_i386.udeb 
-rw-r--r-- 1 kinneko kinneko 314998 Jan 30 14:48 netcfg_1.68ubuntu17_i386.udeb

Size: 314998
MD5sum: 20d119be495ac3ea4037b11a630d3500
SHA1: 6a84c0ced0add99c61434ce65353964fede569f2
SHA256: 7bff6a8a7c6aacbf6b072d44a6d04084c07a07839012d7077619033f71853151

kinneko@BuildSV:~/_ISO/REMASTER/image/dists/quantal/main/debian-installer/binary-i386$ sudo gzip -9 Packages
kinneko@BuildSV:~/_ISO/REMASTER/image/dists/quantal/main/debian-installer/binary
-i386$ cd ~/_ISO/REMASTER/

iso作成。
仮想マシンでテスト。
通った通った。

実機でテスト

kinneko@BuildSV:~/_ISO/REMASTER$ sudo dd if=ubuntu-12.10-server-i386-custom-preseed.iso of=/dev/sdc[sudo] password for kinneko: 
1378172+0 records in
1378172+0 records out
705624064 bytes (706 MB) copied, 289.158 s, 2.4 MB/s

うう、USB起動できぬな。
isohybrideがないからか。
http://d.hatena.ne.jp/kinneko/20111214/p5

kinneko@BuildSV:~/_ISO/REMASTER$ isohybrid ubuntu-12.10-server-i386-custom-preseed.iso 

焼いてリトライ。
うまくいった。
課題としては、以下の2つくらいか。

  • キーボードが英語のままだった。
  • マニュアルでtaskselするのとパッケージ構成が違うので、pyserialがはいらなかった。

キーボードの件は、これが効いてない?

d-i console-setup/layoutcode string ja106


今回は、時間切れで以下の問題については、追加インストールスクリプト書いてインストール後に対応することにした。

  • debになってない必要なプログラムを追加する。
  • パッケージとしては、rootでシェル環境を立ち上げるので、mingettyを追加する。
  • 起動時800x600で、コンソールはスリープしないようにする。
  • 電源オン時、rootでコンソール起動、指定のプログラムを自動起動する。
  • ログをHDDからUSBメモリへ回収する必要がある。

パッケージの追加と、自動インストールについては目処がついている。
その他の課題については、前回やったときに解決済み。
続きは、またの機会に。
あ、いや、もう次がないといいなぁ... orz

実戦投入結果

これによって、PCのUSB起動の設定だけできれば、誰でも全自動でUbuntu鯖がインストールできるようになった。
自分でやらなくていいのは楽だわぁ。
PATAなどの古いものを含めて、8種類くらいのマシンに入れてみた。
結局、2つのシステムで合計100台弱くらいかな。
微妙なとこでインストール後にsdaが見えなくてダメになるマシンがあった。
RAID付きのコントローラーは、ドライバが見つからないというエラーになるので、BIOSで無効にしておくとか必要。
あと、RAIDなどで使っていたHDDでは、それを消してもいいかという確認ダイアログが出て、キーボードが必要になった。
ブートメディアをESCやF11で選べないBIOSのときは、起動順序をUSB優先にしないといけない。でも、それだとヘッドレスで画面見ていないと、インストールループになってしまって微妙。
追加インストールをマニュアルで行ったので、英語キーボードに直感的に脳内切り替えできない人には対応できなかった。


機会があれば、NFS起動で一斉にやったりしてみたいな。


そして、次の機会はすぐにやってきた... orz
続きはこちら。http://d.hatena.ne.jp/kinneko/20130215/p1