CD や DVD に書き込む
準備
5-系でのデフォルトでは ATAPI ドライブの DMA 転送が有効になっておらず、 PIO でアクセスするようだ。これだと遅いので、 以下の通り /boot/loader.conf に追記することで DMA 転送を有効にする。
hw.ata.atapi_dma="1"
また、cam を入れておくと ATAPI ドライブが SCSI サブシステム経由で アクセスできるようになって便利 (DVD を焼く場合は必須と思っていい) なので、 kernel を作りなおしておく。 追加すべきものは以下の通り。
device atapicam ← これは GENERIC にはないので追記することになる。 device scbus ← これ以下は GENERIC にあるので、 device pass ← 自分で消していないか確認の上 device cd ← 無ければ追加する。
kernel 入れ替え→再起動後、 dmesg で ATAPI のドライブ (例えば acd0) に対して SCSI のドライブ (例えば cd0) が両方出ていれば OK である。 また、DMA 転送についても dmesg で acd0 の行の行末に「UDMA33」などが見えれば OK、 PIO4 などと出ていたら失敗である。 cam 制御下にあるデバイスの一覧は devlist で確認できる。
# camcontrol devlist
イメージの作成には mkisofs を使うので、ports から入れておく。 ports からであれば、sysutils/cdrtools-cjk を入れるべし。
DVD を扱うならば、sysutils/dvd+rw-tools も入れておく。
ISO ファイルシステムイメージの作成
ISO ファイルシステムのイメージの作成には mkisofs を用いる。
# export TZ=UTC # mkisofs -l -r -J -o image.iso -V volume_label tree_base
TZ を UTC にしたほうがいい理由 についてざっくり抜粋すると、 ISO9660 内のファイルのタイムスタンプが日本時間で記録されていいると システムによっては読み出し時に時刻を正しく読めないケースがある。 CD というメディアの汎用性・互換性を考えると、 いろいろなシステムで読まれることが想定されるので、 UTC にしておくのが最も問題が発生しにくいと考えられる。 そんなわけで UTC にしておくことを推奨する。
mkisofs のオプションについては -help か man を見よ。 この例で挙げているものについてのみ以下に抜粋する。
- -l Allow full 31 character filenames for ISO9660 names
- -r Generate rationalized Rock Ridge directory information (aka UNIX 拡張)
- -J Generate Joliet directory information (aka Windows 拡張)
- -o 出力ファイル名指定
- -V ボリュームラベル名指定
ボリュームラベルは Unix ファミリでは滅多に利用されることはないが、 Windows ファミリや Macintosh ファミリでは visual shell 上での情報となるので、 面倒くさがらずに付けておいたほうがよい。
bootable イメージの作成
bootable な ISO イメージを作るには、まず el trito 的に bootable な物体 (FD など) のイメージを作成する必要がある。 物理的に FD ドライブがあれば、起動できることを確認した実物の FD のイメージを 用意して、そこから吸い上げてしまうのが簡単である。
吸い上げた起動用の FD イメージを boot_image とすると、 これを tree_base の中に置いておいて
# mkisofs -l -r -J -o image.iso -V volume_label -b boot_image tree_base
とすれば bootable な ISO イメージのできあがりである。
ISO9660 イメージの吸い上げ
昔焼いて消してしまったファイルを再構成して CD を作りなおしたい時には、 まだ読める CD を持っているなら、そこから ISO イメージを吸い上げて ファイルを救い出せばよい。
% cat /dev/acd0 > hogehoge.iso
マウントしないままでOKだ。cat ではなく、dd を使うという手もある。
# dd if=/dev/cd0c of=cdimage.iso # dd if=/dev/acd0c of=cdimage.iso bs=2048 (FreeBSD 4.11)
どちらでも、mkisofs で作ったものと同じイメージを作成することができる。
DVD-rom も cd と同じように cat や dd で吸い上げることができる。 DVD-video をデータとして吸い上げる場合は、dvdbackup が便利である。
% dvdbackup -i /dev/cd1 -o ./ -M % gmplayer -dvd-device dirname dvd://
これもマウントする必要はない。吸い上げたデータは mplayer で再生できる。
CD image のループバックマウント
イメージファイルを入手・作成できたら、 マウントしてみてちゃんと期待通りに見えるかどうか確認する。
( 4-系 ) # vnconfig /dev/vn0 image.iso # mount -t cd9660 /dev/vn0 /mnt # umount /mnt # vnconfig -u /dev/vn0 ( 5-系 ) # mdconfig -a -t vnode -f image.iso # mount -t cd9660 /dev/md0 /mnt # umount /mnt # mdconfig -d -u 0 ( 5.4-RELEASE 以降、かつ面倒な時 ) % tar tvf image.iso
mdconfig のユニット番号は、mdconfig -l で調べることができる。 mdconfig -a でユニット番号を指定しない場合、 自動でユニット番号が割り当てられるので、 作業手順を事前に整備したい時などは 自分で指定する方がよいだろう。
bootable な CD イメージの場合は、実際に boot できるかどうか qemu や VMware などを使えば確認することができる。
CD-RW の初期化
CD-RW の内容消去は以下の通り。ここでは、ATAPI ドライブの例。
# burncd -f /dev/acd0c blank
イメージの焼き付け
ここでも、ATAPI ドライブの例。CD-R でも CD-RW でもいっしょである。
# burncd -s 8 -f /dev/acd0 data image.iso fixate
DVD (-R, -RW, +R DL など) への焼き付けには growisofs を使う。
# growisofs -dvd-compat -Z /dev/cd0=image.iso # growisofs -dvd-compat -Z /dev/cd0 -J -r -V VOLUME_TITLE /path/to/data/
前者の例はもちろん iso イメージを焼く場合。 後者の例はイメージを作らないで (オンザフライで) 焼く場合。 裏で mkisofs が動いてくれる。 ちなみに、速度はドライブと媒体に応じて適当に自動選択してくれるらしい。
DVD-VIDEO の形式で焼きたい時は「-dvd-compat」の替わりに「-dvd-video」を使う。
一層 DVD でデータを焼く時は 4.7G が 1000 で計算した値であることに注意。
4,700,000,000 / 1024 = 4589843.75 (K bytes) 4,700,000,000 / 1024 / 1024 = 4482.26928710938 (M bytes) 4,700,000,000 / 1024 / 1024 / 1024 = 4.37721610069275 (G bytes)
1024 で計算すると上記の通り。結構少ない。 また、ファイルシステム上では 512 byte block で書かれていたりするので、 ギャップはやっぱりある。キッチリ無駄なく埋めつくすのは難しい。
二層 DVD (+R DL) に growisofs で書き込みを行うと、 初回にエラーが表示されるが、そのまま再実行すれば書き込むことができる。
※初回のエラー↓ # growisofs -dvd-video -Z /dev/cd1 -J -r -V TEST_DATA_TEST_BURN ./ Executing 'mkisofs -dvd-video -J -r -V TEST_DATA_TEST_BURN ./ | builtin_dd of=/d ev/pass2 obs=32k seek=0' Warning: Disabling Joliet support for DVD-Video. 0.15% done, estimate finish Fri Oct 13 01:45:53 2006 0.30% done, estimate finish Fri Oct 13 01:40:21 2006 0.45% done, estimate finish Fri Oct 13 01:38:31 2006 /dev/pass2: splitting layers at 1656896 blocks :-[ SEND DVD+R DOUBLE LAYER RECORDING INFORMATION failed with SK=5h/ASC=26h/ACQ= 00h]: Input/output error ※そのまま再実行↓ # !! growisofs -dvd-video -Z /dev/cd1 -J -r -V TEST_DATA_TEST_BURN ./ Executing 'mkisofs -dvd-video -J -r -V TEST_DATA_TEST_BURN ./ | builtin_dd of=/d ev/pass2 obs=32k seek=0' Warning: Disabling Joliet support for DVD-Video. 0.15% done, estimate finish Fri Oct 13 01:36:05 2006 0.30% done, estimate finish Fri Oct 13 01:36:05 2006 0.45% done, estimate finish Fri Oct 13 01:36:05 2006 :-? L0 Data Zone Capacity is set already ← びっくりしている /dev/pass2: "Current Write Speed" is 2.5x1385KBps. 0.60% done, estimate finish Fri Oct 13 01:58:09 2006 0.75% done, estimate finish Fri Oct 13 02:00:22 2006 0.91% done, estimate finish Fri Oct 13 02:01:50 2006 (中略) 99.89% done, estimate finish Fri Oct 13 02:10:00 2006 Total translation table size: 0 Total rockridge attributes bytes: 2147 Total directory bytes: 4096 Path table size(bytes): 26 Max brk space used c1c4 3313788 extents written (6472 MB) builtin_dd: 3313792*2KB out @ average 2.3x1385KBps /dev/pass2: flushing cache /dev/pass2: closing track /dev/pass2: closing disc # mount /dvdrom # df | grep dvd /dev/acd1 6627576 6627576 0 100% /dvdrom ※焼けている模様↑
ちなみに、on the fly ではなく、先に iso ファイルを作って
# growisofs -Z /dev/cd1=DATA.ISO
…という具合に書いてやると、謎のエラーは出ないようだ。
参考サイト: