HDDからのcasperブートの最適化

casperブートは大変便利”でメモしたように、/casperというディレクトリとその下にfilesystem.dirというシンボリックファイルを作るだけでHDDからcasperブートが可能となる。しかし、casperはLiveCD等のために作られていてHDDからブートして使うことを前提としていないため、起動時に幾つか余計な設定もしてしまう。

そこで、casperをHDDからのブート用にカスタマイズする方法をメモしておく。(“casperブートは大変便利”に追加しても良いのだが、長くなるのでこちらに別記する。)

余計なスクリプトの削除

apt-get install casper でインストールすると、/usr/share/initramfs-tools/scripts/casper-bottomというディレクトリの下にcasperブート時にinitramfsで実行するスクリプトが入っている。標準だと次のような感じ:

root@ubuntu-804:/usr/share/initramfs-tools/scripts/casper-bottom# ls
01integrity_check  20xconfig                  33enable_apport_crashes
02timezone         22gnome_panel_data         34disable_kwallet
05mountpoints      22screensaver              35fix_language_selector
10adduser          23etc_modules              36disable_trackerd
12fstab            23networking               38disable_restricted_manager
13swap             24preseed                  40install_driver_updates
14locales          25configure_init           41apt_cdrom
15autologin        30accessibility            42disable_apparmor
18hostname         31disable_update_notifier  43disable_updateinitramfs
19keyboard         32disable_hibernation      44pk_allow_ubuntu
root@ubuntu-804:/usr/share/initramfs-tools/scripts/casper-bottom# 

OSのバージョン等によっても若干異なるが、まぁ、大体こんな感じ。この殆どはLiveCDを起動するための設定を行っている。例えば 01integrity_check はCDに書き込まれたファイルに問題ないか確かめるものでHDDからの起動には必要ない、等である。そこで、次の様に幾つかファイルを残して削除してしまう。

root@ubuntu-804:/usr/share/initramfs-tools/scripts/casper-bottom# rm -f \
01integrity_check 15autologin 22gnome_panel_data 22screensaver 23etc_modules \
30accessibility 31disable_update_notifier 32disable_hibernation \
33enable_apport_crashes 34disable_kwallet 35fix_language_selector \
36disable_trackerd 38disable_restricted_manager 40install_driver_updates \
41apt_cdrom 42disable_apparmor 43disable_updateinitramfs 44pk_allow_ubuntu

root@ubuntu-804:/usr/share/initramfs-tools/scripts/casper-bottom# ls
02timezone     10adduser  13swap     18hostname  20xconfig     24preseed
05mountpoints  12fstab    14locales  19keyboard  23networking  25configure_init
root@ubuntu-804:/usr/share/initramfs-tools/scripts/casper-bottom# 

残ったスクリプトも必要ないものがあるかも知れないが、まぁ、大体こんな感じだろう。この後書くが、10adduserに関してはユーザが登録されている通常のLinux環境であれば、これも削除して置く。(Thin Client環境を作る場合などには残しておき、ブート時に動的にユーザをシステムへ登録する。)

スクリプトの変更

HDDから起動を前提として 05mountpoints、10adduser、18hostname に変更を加える。05mountpointsと10adduserは大した変更ではないが、18hostnameは大幅な変更が必要となる。

■ 05mountpoints
casperのベースとなるルートファイルシステムのマウントポイントを“/root/cdrom”以外に変更する(2ヶ所)。私の場合は“/root/casper_root”にしてある。変更後は次のようになる(変更箇所のみ):

mkdir -p /root/casper_root
mount -n -o move /cdrom /root/casper_root

(disklessのルートファイルシステムをマウントする場合は“nfs_root”という名前の方がピッタリくるかもしれない。)

■ 10adduser
casperで追加される“ubuntu”ユーザのデフォルトのパスワードを変更する。多くの場合(ユーザIDが1000以上のユーザが存在する場合)、このスクリプトは大した意味を持たなくなるが、Thin Clientのベースとする場合など“ubuntu”ユーザを追加する場合は変更しておいた方が良い。
デフォルトのパスワードは暗号化された状態で“U6aMy0wojraho”となっていて、これは“Enterだけ”(つまり“空行”)のパスワードとなっている。このままだとsshで他のマシンから入れない。そこでパスワードを“ubuntu”にしておく。(sshの設定を変更してパスワード無しのユーザでもアクセスできるようにする方法もあるが、そちらは手を加えずにここを変更して置く方が正解だろう。)“ubuntu”の暗号化されたパスワードは“agBuRffX36TXQ”。従って次のように変更する(変更箇所近辺のみ):

# agBuRffX36TXQ is "ubuntu"
chroot /root debconf-communicate -fnoninteractive casper > /dev/null <<EOF
set passwd/root-password-crypted *
set passwd/user-password-crypted agBuRffX36TXQ

(勿論、“ubuntu”ではなく、任意に自分の好きなパスワードにすれば良い。)

■ 18hostname
現在使っているホスト名(やネットワーク環境)がcasper環境でも使えるように変更する。次の内容と入れ替える。

#! /bin/sh

# Written by Adsaria Mood, 2010/02/15
#    for casper boot from HDD or network

PREREQ=""
DESCRIPTION="Setting hostname..."

. /scripts/casper-functions

prereqs()
{
       echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
       prereqs
       exit 0
       ;;
esac

log_begin_msg "$DESCRIPTION"

HOSTNAME=ubuntu
IPV4ADDR=127.0.1.1
DNSDOMAIN=localdomain

WRITEOUT=

if [ -e /root/etc/hosts ] ; then
    if [ -r /root/etc/hostname ]; then
        TEMP_STRING=$(cat /root/etc/hostname)
        [ "$TEMP_STRING" ] && HOSTNAME=$TEMP_STRING
    fi
else
    WRITEOUT=true
fi

# read from /netboot.config, rather than /tmp/net-*.config
CONFIG=/netboot.config
if [ -r "$CONFIG" ]; then
    NET_CONFIG=$(cat $CONFIG)

    TEMP_STRING=$(echo $NET_CONFIG | sed -ne 's/.* host : \([^ ]*\) .*/\1/p' )
    [ "$TEMP_STRING" ] && HOSTNAME=$TEMP_STRING

    TEMP_STRING=$(echo $NET_CONFIG | sed -ne 's/.* address: \([0-9.]*\) .*/\1/p' )
    [ "$TEMP_STRING" ] && IPV4ADDR=$TEMP_STRING

    # resolv.conf will be configured later, by "23networking".
    rm -f /root/etc/resolv.conf

    WRITEOUT=true
fi

if [ $WRITEOUT ] ; then
	echo "$HOSTNAME" > /root/etc/hostname
	cat > /root/etc/hosts <<EOF
127.0.0.1 localhost
$IPV4ADDR $HOSTNAME

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

EOF
fi

hostname "$HOSTNAME"

log_end_msg

initrdの更新

以上の変更を加えたら initrdを更新する。

root@ubuntu-804:~# dpkg-reconfigure casper