#topicpath
*OpenBSDでLive CDをつくる [#t51994f1]
RIGHT:Echigo BSD Users Group 第15回 会合 - 9/17, 2005
RIGHT:川俣 吉広 - kaw@on.rim.or.jp
**Why OpenBSD?, Why Live CD? [#e2ba0579]
-Other BSD / Linux では?
--Linuxでも昔1FDとかいじっていた ... 1FD Linux 作成キットとして公開(( http://www.on.rim.or.jp/~kaw/fdlinux/ ))
--一番慣れたBSD → make build / make releaseが昂じてやってみたくなった
--OpenBSDには定番がない
---Linux ... Frozen Tech's LiveCD List によると295種類
---FreeBSD ... FreeSBIE
---NetBSD ... pkgsrc - sysutils/mklivecd
---以前 OpenBSD を使った 1CD snortがあった(( http://slashdot.jp/article.pl?sid=03/11/27/1456226 ))がobsolete
// -Live CDの利点
// --利用の容易さ
**方針・目標 [#ke7c2074]
-HDD上に通常インストールされた実運用環境をなるべく弄らない(可能な限りそのままの形)で載せることにより、
--常用しているものになるべく近い環境を持ち歩きたい
--バックアップシステムとして手軽に作成したい
--H/Wの検証用などのテスト環境, 障害発生時の Soft/Hardの切り分け用ツールとして活用

>などを用途として想定する。
**Boot手順概要のおさらい [#e2b049ba]
// |BIOS|
// CENTER:↓
// ||HDD|FD|CD|
// |boot&br;sector|MBR|1st sector|El-Torito|
// |1st stage&br;boot|PBR(biosboot)|biosboot|cdbr|
// |2nd stage&br;boot|/boot|/boot|/cdboot|
// CENTER:↓
// |kernel|/bsd|
// |~|mount root fs|
// CENTER:↓
// |user&br;land|/sbin/init|
// |~|/etc/rc|
// |~|(fork gettys, etc...)|
>~
#ref(BootSeq.gif,center)
**実際 [#t0c1505a]
***アプローチ1 [#b56439b6]
-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 [#w2b10a7b]
-rd((FreeBSD, NetBSDではmd)) (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の実行時、大量のレポートが生成される ... ファイルツリーが本来のものと異なっているため。
**雑感 [#l36bc2da]
-セキュリティに注意
--ホスト固有の情報を入れると紛失した場合危険 ... 端末的使用が無難
--mfs上の情報は消えると復帰できないので、端末やFirewall, Router的使用が無難
-遅い
--CD上のファイルが圧縮されていればスループットが上がるのに。
**参考文献等 [#a2f27536]
-ソースコード
--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
--Building an OpenBSD Live CD~
 http://www.onlamp.com/pub/a/bsd/2005/07/14/openbsd_live.html
--How to Make a Bootable, Full System OpenBSD 3.2 CDROM~
 http://www.blackant.net/other/docs/howto-bootable-cdrom-openbsd.php
--CD Bootable OpenBSD firewall~
 http://www.jtan.com/jtanoss/cdboot/
--Construccion de un OpenBSD LiveCD~
 [[http://ieee.udistrital.edu.co/computer/docs/manuales/>http://ieee.udistrital.edu.co/computer/docs/manuales/2004.05.04.manual_livecd_openbsd/html/manual-livecd-openbsd.html]]↓~
  [[2004.05.04.manual_livecd_openbsd/html/manual-livecd-openbsd.html>http://ieee.udistrital.edu.co/computer/docs/manuales/2004.05.04.manual_livecd_openbsd/html/manual-livecd-openbsd.html]]
--Frozen Tech's LiveCD List~
 http://www.frozentech.com/content/livecd.php
--ライブCDの部屋~
 http://2.csx.jp/livecdroom/
**作成したISOイメージは、以下に置いてあります; [#p7f635cf]
>アプローチ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 発表結果 [#t5276c9a]
予定どおり9/17の[[EBUG会合>http://www.ebug.jp/event/20050917/index.html]]で発表をさせていただきました。~
お聴きいただいた皆様、ありがとうございました。
**発表後の質疑応答 [#p164972d]
: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です)
----
#topicpath

Front page   Edit Diff History Attach Copy Rename Reload   New Page list Search Recent changes   Help   RSS of recent changes