Solaris/Linux/FreeBSDでCD-Rを焼こう |
YAMAMORI Takenori ●yamamori |
§実行編「これだけやればCD-Rが焼ける」
CD-RドライブがSCSIで接続された状態で,まずは“cdrecord -scanbus”を 実行してみましょう.以下のように,認識されていればOKです.
# cdrecord -scanbus Cdrecord 1.8 (i686-pc-linux-gnu) Copyright (C) 1995-2000 Jrg Schilling Using libscg version 'schily-0.1' scsibus0: 0,0,0 0) 'QUANTUM ' 'FIREBALL_TM3200S' '300N' Disk 0,1,0 1) * 0,2,0 2) * 0,3,0 3) * 0,4,0 4) 'TEAC ' 'CD-R56S ' '1.0E' Removable CD-ROM 0,5,0 5) * 0,6,0 6) * 0,7,0 7) * |
この例では,SCSI ID=4のTEAC CD-R56Sが認識されていることがわかります. その行の左に表示されている“0,4,0”は SCSI bus=0,SCSI ID=4,LUN=0を意味します. これは,cdrecordの実行時に,dev=0,4,0 というオプションを付けるために必要なので覚えておきます. ただし,Linuxの場合は dev=/dev/sgbと,デバイスファイル名で指定することも 可能です.(この場合,CD-RがSCSI上の2つ目の機器として認識されているので, sgaの次のsgbです)
もしも,FreeBSDでCD-Rドライブが“cdrecord -scanbus” で表示されない場合は, 以下のように,camcontrolを実行して,CD-Rドライブが passいくつで認識されているか確認して下さい.
# /sbin/camcontrol devlist <IBM DORS-32160 S82C> at scbus0 target 0 lun 0 (pass0,da0) <TEAC CD-R56S 1.0E> at scbus0 target 4 lun 0 (pass1,cd0) |
この場合,CD-Rはpass1ですので,/dev/pass1が必要です. 存在しない場合は,以下のようにして作成します.
# cd /dev # ./MAKEDEV pass4 ← 余裕をみて/dev/pass0〜pass3まで作成
次に,mkisofsで,ISO9660のイメージファイルを作成します. なお,mkisofsとcdrecord を'|'でつないで,イメージファイルを作らずに CD-Rを焼くこともできますが,アンダーランしやすいことと, 先にファイルシステムイメージをマウントして,中身を確認できないことから, あまりお勧めしません.
十分な空き容量のあるハードディスク上の適当なディレクトリに, たとえばcdrootというディレクトリを作り,その下に, 実際にCD-ROMになった時に見えるのと全く同じ状態に, サブディレクトリ作成,ファイルのコピーなどを行ないます.
この,cdroot以下がそのままCD-ROMになりますので, ファイル本体はもちろん,ファイルのパーミッション,uid/gid, タイムスタンプも含めて,適切かどうか確認します.
そして,以下のようにオプションを付けてmkisofsを実行します.
$ su # TZ=UTC mkisofs -R -J -b images/BOOTFILE -o CD.iso cdroot |
ファイルシステムイメージができたら,もうCD-Rを焼くことができますが, その前に一度イメージファイルをループバックマウントして 中身をざっと眺めてみることをお勧めします.
マウントの仕方はOSによって少々異なり,以下のようになります.
# mkdir /mnt/tmp # mount -t iso9660 -r -o loop CD.iso /mnt/tmp …中身を確認し,確認が終ったら元に戻す… # umount /mnt/tmp |
# vnconfig /dev/vn0 CD.iso # mount -t cd9660 -r /dev/vn0 /mnt …中身を確認し,確認が終ったら元に戻す… # umount /mnt # vnconfig -u /dev/vn0 |
# lofiadm -a `pwd`/CD.iso ← Solarisでは絶対PATHで指定する必要あり /dev/lofi/1 ← 割り当てられたデバイスファイル名が表示される # mount -F hsfs -r /dev/lofi/1 /mnt …中身を確認し,確認が終ったら元に戻す… # umount /mnt # lofiadm -d /dev/lofi/1 |
これでCD-Rを焼く準備が整いました.CD-Rのブランクメディアを ドライブに入れた状態で, まずは以下のように,“-dummy”オプションを付けて, 予行演習を行ない,アンダーランその他の問題が起きないかどうかチェックします.
“-dummy”を付けると,CD-Rドライブ内の書き込みレーザ出力が オフのままになりますが,その他の処理は本番同様に行なわれます.
# cdrecord -dummy -v dev=0,4,0 speed=6 -pad -dao CD.iso ------ --------- ------- ---- ---- | | | | | | | | | +-- Disc At Once モードで焼く | | | | | | | +--- 終りの数セクタが確実に | | | 読めるように,環境によっては | | | 付けておいた方がよいでしょう | | | | | +--- 6倍速書き込みドライブの場合 | | | +--- SCSI ID=4の場合 | “cdrecord -scanbus”での表示を用いれば良い | +--- まずは“-dummy”を付け,本番ではこれを外す |
なお,cdrecordの実行後,そのまま再度cdrecordをする場合, “-dummy”を付けているかどうかに関わらず, SCSIレベルのエラーが出て,書き込みに失敗することがあります. これを防ぐには,cdrecordの実行前に必ず一度CD-Rメディアをejectして 入れ直すようにします.これを忘れないように,cdrecord に“-eject”オプションを付けて実行するのもよいでしょう.
ただし,cdrecord-1.9 以降では,この問題は解消されているようです.
以上のようにして,kterm 上で cdrecord を実行し,実際に CD-R を焼いている様子を下図に示します.
●kterm 上で 実際に CD-R を焼いているところ
cdrecord を使って焼いたCD-Rは,普通にマウントして使う分には問題ありませんが, CD-RのISOイメージをデバイスファイルから直接 dd コマンドで読み出すと,環境によっては,最後の方の数セクタの読み込み時にデバイスレベルのエラーが出て,dd コマンドが最後付近のセクタを読み切らずに異常終了してしまうという 問題が発生する場合があります. そのような環境では -pad オプションを付けておいた方がよいでしょう.これにより,ISO9660 のデータのうしろに 2048×15バイトのゼロのデータが追加されてCD-Rが焼かれます.
ただし,cdrecord に -dao オプションを付けて Disc At Once モードでCD-Rを焼ける場合には,最後付近のセクタでのエラーは発生しません. また,-pad オプションを付けることによって,CD-R 全体の MD5 sum が変わってしまうという副作用もあります.このため,-dao オプションを付ける場合はむしろ -pad オプションを付けない方がよいでしょう.
RedHat Linux のインストール用CD-ROMでは、バージョン7.3以降から ISOイメージ自体に MD5 sum が埋め込まれていて、インストール時に 「LILO boot: linux mediacheck」と入力することにより、 MD5を自己チェックすることができます。
embedded MD5 を埋め込んだり、それをチェックしたりするためのツールは、anaconda のソースの utils ディレクトリに implantisomd5 および checkisomd5 として存在します。ソースを見ると、ISO9660 の PVD の中の application_data と呼ばれる 512バイトの領域に、 ASCII コードで MD5 を書き込んでいます。application_data は、 mkisofs の実行直後はすべてスペース(0x20)で埋まっており、 MD5の計算時、およびチェック時には、この領域はスペースコードで埋まっているもの として計算します。
さて、この MD5 の計算時にも、上記の -pad オプションと同様、最後付近のセクタが読めないかも知れないという問題が存在します。 ソースファイルを確認したところ、implantisomd5.c や checkisomd5.c では、この問題を回避するために、ISOイメージの volume_space_size で得られる全体のISOサイズから、最後の 150*2048(=307200) バイトを除いた部分についてのみ MD5 を計算するという方式になっていました。 ということは、ISOイメージの最後の 300K バイトはチェックされていないわけで、この部分に瑕疵があっても検出できないことになります。 この、300K バイトは少し大きく取り過ぎで、15セクタの 30Kバイト程度で よかったのではないかと思います。
なお、RedHat 8.0 以降の ISOイメージでは、SKIPSECTORS = 15; のような文字列が md5sum とともに application_data の領域に書き込まれており、これによって MD5 の計算から除外するセクタ数を指定できるようになっているようです。