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

…という具合に書いてやると、謎のエラーは出ないようだ。


参考サイト:

[$Revision: 1.8 $ $Date: 2009.12.07 00:14:59 $]
[EOF]