Solaris/Linux/FreeBSDでCD-Rを焼こう

YAMAMORI Takenori ●yamamori

§実行編「これだけやればCD-Rが焼ける」

○“cdrecord -scanbus”でドライブの確認

CD-RドライブがSCSIで接続された状態で,まずは“cdrecord -scanbus”を 実行してみましょう.以下のように,認識されていればOKです.

●“cdrecord -scanbus”の実行例
# 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いくつで認識されているか確認して下さい.

camcontrol/dev/pass* の確認(FreeBSD)
# /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で,ISO9660のイメージファイルを作成します. なお,mkisofscdrecord'|'でつないで,イメージファイルを作らずに CD-Rを焼くこともできますが,アンダーランしやすいことと, 先にファイルシステムイメージをマウントして,中身を確認できないことから, あまりお勧めしません.

十分な空き容量のあるハードディスク上の適当なディレクトリに, たとえばcdrootというディレクトリを作り,その下に, 実際にCD-ROMになった時に見えるのと全く同じ状態に, サブディレクトリ作成,ファイルのコピーなどを行ないます.

この,cdroot以下がそのままCD-ROMになりますので, ファイル本体はもちろん,ファイルのパーミッション,uid/gid, タイムスタンプも含めて,適切かどうか確認します.

そして,以下のようにオプションを付けてmkisofsを実行します.

mkisofsの実行

$ su
# TZ=UTC mkisofs -R -J -b images/BOOTFILE -o CD.iso cdroot
− ※注 −
  • カレントディレクトリ以下にある cdroot というディレクトリの下すべてを ISO9660イメージにして,CD.isoというファイルに出力します.
  • TZ=UTCにして,タイムスタンプをUTCで書き込むことを お勧めします.(研究編参照) なお,シェルがcsh系の場合は,env TZ=UTCとします.
  • -b images/BOOTFILE”オプションで,cdroot以下の images/BOOTFILEを, El Toritoでのブートファイルとして指定しています. ブートファイルは,あらかじめブート可能なFDを作成しておき, それをddコマンドで吸い出してimages/BOOTFILE に配置しておきます. CD-ROMブートの必要がなければこのオプションは外します.
  • -R -J”オプションを付けて,RockRidgeとJolietの 両方の拡張を行なっています. ただし, データ保存用のディスクなどでは -R の代わりに -r にして,ファイルのパーミッションを r--r--r-- または r-xr-xr-x に,UID/GID を 0(root) に固定した方がよいでしょう.
  • cdroot ディレクトリ以下のファイルが,一般ユーザ権限ですべて読めるなら, su せずに mkisofs を実行しても構いません.
  • すべてのファイルを対象とするための mkisofsの“-a”オプションは,mkisofs-1.12 (以降)ではデフォルトになり,“-a”オプションは廃止されました.

●ファイルシステムイメージのマウント

ファイルシステムイメージができたら,もうCD-Rを焼くことができますが, その前に一度イメージファイルをループバックマウントして 中身をざっと眺めてみることをお勧めします.

マウントの仕方はOSによって少々異なり,以下のようになります.

●ISO9660イメージファイルのマウント(Linuxの場合)
# mkdir /mnt/tmp
# mount -t iso9660 -r -o loop CD.iso /mnt/tmp
…中身を確認し,確認が終ったら元に戻す…
# umount /mnt/tmp

●ISO9660イメージファイルのマウント(FreeBSDの場合)
# vnconfig /dev/vn0 CD.iso
# mount -t cd9660 -r /dev/vn0 /mnt
…中身を確認し,確認が終ったら元に戻す…
# umount /mnt
# vnconfig -u /dev/vn0

●ISO9660イメージファイルのマウント(Solaris 8の場合)
# 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
− ※注 −
  • Linuxの場合は,mountの“-o loop”オプションで, イメージファイルのデバイス(/dev/loop0など)が 自動的に割り当てられます. このほか,losetupコマンドで, イメージファイルをいったん/dev/loop0などに 割り当ててからマウントすることもできます.
  • FreeBSDの場合,使用しているカーネルに vnデバイスが組み込まれている必要があります. vnconfig実行時に“vnconfig: open: Device not configured”とエラーが出るようなら, カーネルのコンフィグファイルに“pseudo-device vn”を追加して,カーネルを再構築して下さい.
  • Solarisの場合,lofiはSolaris 8以降で使えます. Solaris 7以前では,fbkというデバイスドライバを,scg と同様にダウンロードして,カーネルにロードする必要があります.

cdrecordでCD-Rを焼く

これでCD-Rを焼く準備が整いました.CD-Rのブランクメディアを ドライブに入れた状態で, まずは以下のように,“-dummy”オプションを付けて, 予行演習を行ない,アンダーランその他の問題が起きないかどうかチェックします.

-dummy”を付けると,CD-Rドライブ内の書き込みレーザ出力が オフのままになりますが,その他の処理は本番同様に行なわれます.

cdrecordの実行
# 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 を焼いているところ
cd-r-write.gif


cdrecordの“-pad”オプションについて

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 の embedded MD5 と -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 の計算から除外するセクタ数を指定できるようになっているようです。


To 『Solaris/Linux/FreeBSDでCD-Rを焼こう』index


このページは,技術評論社 SoftwareDesign 2000年6月号,『CD-R/CD-ROM完全ガイド』の原稿を元に,Web 用に再構成したものです.
To 謎の処理系 SunOS 4.1.4 Home
yamamori