Top / EBUG勉強会 / 20050917_LiveCD

OpenBSDでLive CDをつくる

Echigo BSD Users Group 第15回 会合 - 9/17, 2005
川俣 吉広 - kaw@on.rim.or.jp

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手順概要のおさらい

BootSeq.gif

実際

アプローチ1

  • CD-ROMを直接マウントする。
    • kernel config
      config bsd root on cd0c
    • 書き込み可能な領域の確保 ... union fsを使ってCDにmfsを被せる。
    • CDの作成手順
      1. ターゲットシステムのファイルツリーをコピー
        mkdir ./cdroot
        (cd TARGET-ROOT-DIR && pax -rwpe . WORKDIR/cdroot)
        rm -rf ./cdroot/{dev/fd,kern,mnt,proc,tmp}/*
      2. ISOイメージ作成
        mkhybrid -R -o ISO-IMAGE -b BOOT-RECORD -c BOOT-CATALOG ./cdroot
      3. 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の内容
      1. 実装メモリ量の取得/設定 → mfsの作成
      2. mfsとCD-ROMのマウント → /mfs, /cdrom
        これ以降通常のコマンドが使用可能となる(が、この時点ではダイナミックリンクされた実行ファイルはまだ使用できない)。
      3. /cdrom/{bin,sbin}から / にシンボリックリンク作成
      4. Read/Write両方が必要なものを /mfs以下にコピー、/ にシンボリックリンク作成
      5. 残りの /cdrom/* から / にシンボリックリンク作成
      6. 初期設定(ルートパスワード、ネットワーク設定など)をユーザに問い合わせし、設定を実行
      7. 本来の /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上の情報は消えると復帰できないので、端末やFirewall, Router的使用が無難
  • 遅い
    • CD上のファイルが圧縮されていればスループットが上がるのに。

参考文献等

作成したISOイメージは、以下に置いてあります;

アプローチ1により作成 ... http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/old/CD-OpenBSD-3.6.iso.bz2
アプローチ2により作成 ... http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/old/CD-OpenBSD-3.7.iso.bz2 / http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/old/CD-OpenBSD-3.8beta.iso.bz2 / http://kaw.ath.cx/dl/pub/OpenBSD/LiveCD/CD-OpenBSD-3.8.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です)

Top / EBUG勉強会 / 20050917_LiveCD


*1 http://www.on.rim.or.jp/~kaw/fdlinux/
*2 http://slashdot.jp/article.pl?sid=03/11/27/1456226
*3 FreeBSD, NetBSDではmd
Attach file: fileBootSeq.gif 1490 download [Information] fileBootSeq.fig 944 download [Information]
Reload  New Edit Freeze Diff Attach Copy Rename  Top Index Search Recent Backups  Help  RSS
Last-modified: 2005-09-18 (Sun) 22:42:15 (4716d)