OpenBSDでLive CDをつくる†
Echigo BSD Users Group 第15回 会合 - 9/17, 2005
Why OpenBSD?, Why Live CD?†
- Other BSD / Linux では?
- Linuxでも昔1FDとかいじっていた ... 1FD Linux 作成キットとして公開*1
- 一番慣れたBSD → make build / make releaseが昂じてやってみたくなった
- OpenBSDには定番がない
- Linux ... Frozen Tech's LiveCD List によると295種類
- FreeBSD ... FreeSBIE
- NetBSD ... pkgsrc - sysutils/mklivecd
- 以前 OpenBSD を使った 1CD snortがあった*2がobsolete
方針・目標†
- HDD上に通常インストールされた実運用環境をなるべく弄らない(可能な限りそのままの形)で載せることにより、
- 常用しているものになるべく近い環境を持ち歩きたい
- バックアップシステムとして手軽に作成したい
- H/Wの検証用などのテスト環境, 障害発生時の Soft/Hardの切り分け用ツールとして活用
などを用途として想定する。
Boot手順概要のおさらい†
アプローチ1†
- CD-ROMを直接マウントする。
- kernel config
config bsd root on cd0c
- 書き込み可能な領域の確保 ... union fsを使ってCDにmfsを被せる。
- CDの作成手順
- ターゲットシステムのファイルツリーをコピー
mkdir ./cdroot
(cd TARGET-ROOT-DIR && pax -rwpe . WORKDIR/cdroot)
rm -rf ./cdroot/{dev/fd,kern,mnt,proc,tmp}/*
- ISOイメージ作成
mkhybrid -R -o ISO-IMAGE -b BOOT-RECORD -c BOOT-CATALOG ./cdroot
- CD-ROM書込
cdrecord dev=/dev/rcd0c ISO-IMAGE
- 欠点
- 「実環境をなるべくいじらない」方針にちょっと反する;
- mfs + union mount の準備のため、ターゲットシステムでの/etc/rcの改造が必要
- union fsが不安定 ... コマンドを実行しただけでpanic / ファイルを消しても df が増えない ... その所為かOpenBSD 3.8ではレイヤー系のファイルシステム(null, union, umapfs)は削除されてしまった。
- CD-ROMデバイスがアンマウントできない。
- ブート時にCD-ROMがマウントできないと、まったく使用不能 → 障害/デバッグが困難
アプローチ2†
- rd*3 (RAM Disk)デバイスをrootとしてマウント ... インストーラが使っている方法 ... あらかじめ内容を作り込んでおける。
- rdは大容量 or 動的なサイズ確保が苦手 → mfsも併用する。
- kernel config
option RAMDISK_HOOKS
option MINIROOTSIZE=3800 ← 512byte block
config bsd root on rd0a
pseudo-device rd 1 # ram disk
- vnデバイス上にrd内のファイルツリー作成
dd if=/dev/zero of=./rdroot.img bs=512 count=3800
mkdir ./rdroot
vnconfig svnd0 ./rdroot.img
disklabel -w svnd0 rdroot
newfs /dev/rsvnd0a
mount /dev/svnd0a ./rdroot
- rdsetrootコマンドでrootパーティションのファイルシステムイメージをカーネルに組込む。
- ルートパーティション(/dev/rd0a)のレイアウト ... 必要なコマンド/ファイルのみ収録
/+-boottmp/
| +-init* ksh* = sh* ln* sysctl*
| login.conf rc
| mount* mount_cd9660* mount_ffs* mount_mfs*
+-bin@ -> boottmp
+-etc@ -> boottmp
+-sbin@ -> boottmp
+-cdrom/
+-mfs/
+-dev/
| +-MAKEDEV (many device files...)
+-mnt/
+-tmp/
上記イメージファイルを作成し、カーネルにファイルシステムのイメージを書き込み;
./rdsetroot bsd.rd < ./rdroot.img
- /etc/rcの内容
- 実装メモリ量の取得/設定 → mfsの作成
- mfsとCD-ROMのマウント → /mfs, /cdrom
これ以降通常のコマンドが使用可能となる(が、この時点ではダイナミックリンクされた実行ファイルはまだ使用できない)。
- /cdrom/{bin,sbin}から / にシンボリックリンク作成
- Read/Write両方が必要なものを /mfs以下にコピー、/ にシンボリックリンク作成
- 残りの /cdrom/* から / にシンボリックリンク作成
- 初期設定(ルートパスワード、ネットワーク設定など)をユーザに問い合わせし、設定を実行
- 本来の /etc/rc (-> /cdrom/etc/rc)にチェイン。以降は通常のブートシーケンス。
- CD-ROMイメージの作成 ... 基本的にはターゲットシステム(通常HDDにインストールして運用しているもの等)をそのままコピー
- /tmp, /proc, /kernfs, /dev/fdなどは空にしておく。
- ブートローダ(cdbr, cdboot)、カーネルのコピー
- 欠点
- Read Onlyのサブディレクトリ以下を一部分書き込み可能にするのが繁雑
- /usr以下に書き込み可でないと正常に動かないものがあった ... /usr/X11R6/X11/lib/xdm/authdir/*
- mfs+nullfsの組合せで対処 ... union fsよりは若干安定
- lndirコマンドを利用 ... シンボリックリンクだと、実行できないようになっているものもあり ... /usr/lib/exec/auth/*
- /etc/securityの実行時、大量のレポートが生成される ... ファイルツリーが本来のものと異なっているため。
- セキュリティに注意
- ホスト固有の情報を入れると紛失した場合危険 ... 端末的使用が無難
- mfs上の情報は消えると復帰できないので、端末やFW, RT的使用が無難
- 遅い
- CD上のファイルが圧縮されていればスループットが上がるのに。
参考文献等†
- ソースコード
- src/distrib/i386/common/Makefile.inc, src/distrib/i386/cdfs/Makefile, src/distrib/i386/cdfs-emu/Makefileあたり
- manpage of section 8
- boot, biosboot, boot_i386, cdboot, installboot, release
- 書籍
- rd, md, mfs関連: BSD Magazine No.4, 6, 10, 16
- ブート関連: Unix Magazine 1998.12 Linuxでリラックス / 1999.8 CD-Rで作るブータブル・リカバリーCD
- Links
作成したISOイメージは、以下に置いてあります;†
アプローチ1により作成 ... http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/CD-OpenBSD-3.6.iso.bz2
アプローチ2により作成 ... http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/CD-OpenBSD-3.7.iso.bz2 / http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/CD-OpenBSD-3.8beta.iso.bz2
9/17 発表結果†
予定どおり9/17のEBUG会合で発表をさせていただきました。
お聴きいただいた皆様、ありがとうございました。
発表後の質疑応答†
- Q OpenBSD 3.8では、レイヤー系のファイルシステムが削除されてしまったということだが、nullfs+mfsで書き込み可能にする方法は使えないのではないのか?
A: 3.8では、レイヤー系のファイルシステムは本当にカーネルのソースツリーから削除されてしまっているので、おっしゃるとおり使えません。この方法を使用するには、リリース 3.7以前で構築するか、3.8に削除された部分をバックポートするしかないと思います。
- Q union fs は、通常ハードディスク上のパーティションなどを被せる形が一般的だと思うが、mfsを被せるというような用途は他にあるのか?
A: 一般的に、あるファイルツリーに変更を{加えられない,加えたくない}場合に用いられます。例えば、CD-ROM上にあるソースツリーをそのまま使ってコンパイルをしたいというような場合です。
- Q union fsの動作が不安定なのは、mfsを被せているからなのか?
A: mfsだからということではなく、ハードディスクなどのFSでも同様に不安定です。
- FYI: NetBSD/pc98では、union FSをかなり手直しし、本家にフィードバックしたが、あまり反映されなかったようだ。
- Q rdsetrootに相当するコマンドは、他のBSDにもあるのか?
A: FreeBSD, NetBSDにもあります。名前は失念してしまいましたが‥。
(註: 同様の働きをするコマンドはFreeBSDでは write_mfs_in_kernel, NetBSDではmdsetrimageです)