Live CD or Live DVDの作り方
FreeBSDの動くLive DVDを作成する。
/livedvd/i386にシステム全体を作る。
まずベースシステムを/livedvd/i386以下に、作る
# cd /usr/src # setenv DESTDIR /livedvd/i386 # mkdir -p $DESTDIR # make buildworld TARGET_ARCH=i386 # make installworld TARGET_ARCH=i386 # make distrib-dirs TARGET_ARCH=i386 # make distribution TARGET_ARCH=i386 # make buildkernel TARGET_ARCH=i386 KERNCONF=GENERIC # make installkernel TARGET_ARCH=i386 KERNCONF=GENERIC
packageのインストール
packageはchrootしてインストールできる。例えば、こんな感じ。
# chroot $DESTDIR jupiter# pkg_add ftp://ftp.jp.freebsd.org/pub/FreeBSD/ports/i386/packages-7.1-release/x11/xorg-7.3_2.tbz jupiter# exit #
chrootすると、普段は"# "としているプロンプトが、デフォルトの"`/bin/hostname -s`# "になり、hostnameが表示される。
Live DVDとdisklessのための設定
Live DVDは書くことができないファイルシステムのため、FreeBSDのdisklessシステムの動作を利用する。disklessの場合は、起動の最中に/etc/rcから/etc/rc.initdisklessを実行し、必要なmdファイルシステムを作るというのが、FreeBSDのdisklessシステムの動作の基本のようだ。diskless(8)よりも、/etc/initdisklessのコメントほうが詳しいので、よく読んで、どのように動作するか知っておくといいと思う。
まず、/etc/rc.initdisklessを確実に実行してもらうために/etc/disklessというファイルを作っておく。
# touch $DESTDIR/etc/diskless
次に、一番最初に読み込まれるfstabを書いておく。
# echo "/dev/iso9660/FreeBSD_7.1-PRERELEASE / cd9660 ro 0 0" > $DESTDIR/etc/fstab
ここでは、後で書き込む、Live DVDのラベルをFreeBSD_7.1-PRERELEASEとする。ここが一致してないと起動できない。
/dev/acd0 / cd9660 ro 0 0
としても、もちろん起動するが、1番目のDVD (or CD) ドライブに決め打ちしてしまうことになる。
これ以上は、$DESTDIR/etcは触らない。
/etc/rc.initdisklessは、/conf以下にあるファイルを読んで、mdファイルシステムを作り、マウントし、ファイルをコピーしてくれる。/conf以下にはbaseとdefaultと{IPaddress}というディレクトリを作ることができる。{IPaddress}はネットワークブートの場合に便利だが、Live DVDの場合にはIP決め打ちにしてよいことがあるとは思えないので、以下では省略。
例えば/etcをmdファイルシステムとして作る場合、/conf/{base,default}/etcを作って、ファイルをコピーしておけば、/etc/rc.initdisklessが、mdファイルシステムを作成し、/conf/{base, default}/etcの中をコピーしてくれる。また、/conf/{base, default}/etc/md_sizeというファイルに、mdファイルシステムの大きさを決めてくれる。ない場合には、デフォルトの10240ブロック (5MB) となる。
/conf/baseと/conf/defaultは、同じように動作する。順番はbase、defaultなので、例えば、/conf/base/etc/rc.confと/conf/default/etc/rc.confがあれば、/conf/default/etc/rc.confが上書きされる。
というのを考慮して、/conf/base/etcにmd_sizeのみをおいて、mdファイルシステムを作って、/etc/default/etcにファイルをおいてコピーさせることにする。
mdファイルシステムを使うのは、/etc、/home、/root、/varとする。
/conf/base/etc/md_size 10240
/conf/base/home/md_size 1024000
/conf/base/root/md_size 10240
/conf/base/var/md_size 102400
と、それぞれのファイルに書いておく。
/conf/default/に、/etc、/home、/root、/varを
# cd $DESTDIR/conf/default # pax -rw -pe ../../etc ./ # mkdir home # pax -rw -pe ../../root ./ # pax -rw -pe ../../var ./
まず、$DESTDIR/conf/default/etc/fstabを書き換える。
# vi ./etc/fstab # cat ./etc/fstab /dev/iso9660/FreeBSD_7.1-PRERELEASE / cd9660 ro 0 0 md /tmp mfs -s=30m,rw 0 0 proc /proc procfs rw 0 0
/tmpは、空のディレクトリでよいので、fstabでmdファイルシステムを作るので問題ない。
次に、$DESTDIR/conf/default/etc/rc.confを書き換える。
# vi ./etc/rc.conf
Live DVDシステムのuserを作らなければならない。vipwには、-dオプションでパスワードファイルの場所を指定できる。
# vipw -d ./etc
に、
freebsd::1000:1000::0:0:FreeBSD User:/home/freebsd:/bin/csh
freebsdというuserを追加する。ついで、./etc/groupも編集しておく。
freebsd:*:1000:
この状態で、パスワードが空になるのだが(rootも)、それを設定する方法が、僕には分からない。$DESTDIRにchrootしてpasswdを使い、$DESTDIR/etc/master.passwdから文字列をコピーするしかないと思う。freebsdも一回追加する必要がある。パスワードが空だといろいろと不便なので。$DESTDIR/etcはあまり変更を加えたくないのだが。
その後、$DESTDIR/conf/default/homeにfreebsdディレクトリを作って、/usr/share/skelディレクトリのdotファイルをコピーをしておく。
この状態で、isoファイルを作れば、bootできる。が、/conf/default以下をDVDから読み込むのは時間がかかる。なので、/conf/default以下をtarで固めておくと、起動が早くなる。
# cd $DESTDIR/conf/default # tar -czpf etc.cpio.gz ./etc # tar -czpf home.cpio.gz ./home # tar -czpf root.cpio.gz ./root # tar -czpf var.cpio.gz ./var # rm -rf etc home root var #
これで、isoイメージを作成できる。
isoイメージの作成
portsからsysutils/cdrtoolsをインストールしておく。
isoイメージを作成するには、/usr/src/release/i386/mkisoimages.shを利用するのが、便利である。ただし、このままだとmkisofsに-rオプションを渡すので、setuidビットが正しくセットされない。
# cp /usr/src/release/i386/mkisoimages.sh /root/bin
この最後の行、
mkisofs $bootable -r -J -V $LABEL -publisher "$publisher" -o $NAME $*
を
mkisofs $bootable -R -J -V $LABEL -publisher "$publisher" -o $NAME $*
に変更しておく。
# sh /root/bin/mkisoimages.sh -b FreeBSD_7.1-PRERELEASE /livedvd/FreeBSD_7.1-PRERELEASE.iso $DESTDIR
で/livedvd/FreeBSD_7.1-PRERELEASE.isoが作成される。これをDVDに焼くとbootable DVDができる。