CD は他の一般的なディスクと異なる様々な特徴を持っています。 そもそもユーザが書き込むことができません。 また遅延なしで連続的に読み出せるように、 トラック間をヘッドが移動しないですむようにデザインされています。 さらにこのサイズのメディアの中ではシステムをまたぐデータの 移動が比較的簡単でもあります。
CD はトラックの概念を持っていますが、 これはデータを連続的に読み出すためのものであってディスクの物理特性ではありません。 FreeBSD で CD を作成するには、まず CD のトラックとなるデータファイルを用意し、 そのトラックを CD に書き込みます。
ISO 9660 ファイルシステムはこの様な差異を扱うべく設計されました。 その結果、ファイルシステムは一般的に使用するのに差しつかえない程度に 制限されて標準化されています。幸いなことに、ISO 9660 ファイルシステムには拡張機構が提供されています。適切に書かれた CD は、 拡張機構に対応したシステムでは拡張を利用して、そうでないシステムでは 拡張機構を使用しない範囲で動作するようになっています。
sysutils/mkisofs プログラムは ISO 9660 ファイルシステムを含むデータファイルを作成するのに使われます。 これには様々な拡張をサポートするオプションがあり、 以下で説明します。 このソフトウェアは、ports の sysutils/mkisofs からインストールすることができます。
CD に書き込むためのツールは、お使いの CD ライタが ATAPI 接続か否かにも依存します。ATAPI CD ライタなら、ベースシステムの一部である burncd プログラムを使います。SCSI や USB の CD ライタなら、ports の sysutils/cdrecord をインストールして cdrecord プログラムを使うべきでしょう。
burncd が対応しているドライブは限定されています。 ドライブが対応されているかどうかを確認するには、 CD-R/RW supported drives にある一覧を見てください。
Note: FreeBSD 5.X または FreeBSD 4.8-RELEASE 以降のバージョンを使用している場合、 ATAPI/CAM モジュール を使用すると ATAPI ハードウェア上で SCSI ドライブ用の cdrecord および他のツールを使用できるようになります。
sysutils/mkisofs は UNIX® ファイルシステムの名前空間におけるディレクトリツリーのイメージとして ISO 9660 ファイルシステムを作成します。 最も簡単な使い方は以下の通りです。
# mkisofs -o imagefile.iso /path/to/tree
このコマンドは /path/to/tree 以下のディレクトリツリーのコピーである ISO 9660 ファイルシステムを含んだ imagefile.iso ファイルを作成します。この過程において、ファイル名は標準的な ISO 9660 ファイルシステムの制限に適合するようなファイル名に対応づけられ、 ISO ファイルシステムでファイル名を文字化できないファイルは除外されます。
この制限を回避するために利用できるオプションはいくつもあります。 特に -R
オプションは UNIX
システムで標準的な Rock Ridge 拡張を有効にします。-J
オプションは Microsoft のシステムで標準的な Joliet 拡張を有効にし、 -hfs
オプションは Mac OS®
で使用されている HFS ファイルシステムを作成するために使われます。
FreeBSD でしか使わないのであれば、-U
オプションを使用するとあらゆるファイル名制限を無効にできます。 さらに -R
オプションとともに使うことで FreeBSD
と同一のファイルシステムイメージを作成できますが、 これは ISO 9660
標準の多くを無視しています。
一般的に使われる最後のオプションは -b
オプションです。
これは “El Torito” ブータブル CD
を作成するのに使う起動イメージのありかを指定します。
このオプションは引数として起動イメージへのパスを、 CD
に書き込まれるディレクトリツリーの頂点からの相対位置で取ります。 したがって /tmp/myboot がブート可能な FreeBSD システムで /tmp/myboot/boot/cdboot
にブートイメージがあるならば、以下のようにすることで ISO 9660
ファイルシステムのイメージを /tmp/bootable.iso
に作成することができます。
# mkisofs -U -R -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
この後、カーネルで vn (FreeBSD 4.X) または md (FreeBSD 5.X) が設定されていれば、 ファイルシステムを以下のようにしてマウントすることができます。
# vnconfig -e vn0c /tmp/bootable.iso # mount -t cd9660 /dev/vn0c /mnt
FreeBSD 4.X および FreeBSD 5.X に対しては以下の通りです。
# mdconfig -a -t vnode -f /tmp/bootable.iso -u 0 # mount -t cd9660 /dev/md0 /mnt
/mnt と /tmp/myboot が同一かどうか確認してください。
sysutils/mkisofs には挙動を細かく制御するために他にもたくさんのオプションがあります。 特に、ISO 9660 レイアウトの変更や Joliet および HFS ディスク作成などの 詳細は mkisofs(8) のマニュアルページをご覧ください。
あなたが持っているのが ATAPI CD ライタなら、CD に ISO イメージを書き込むために burncd コマンドが使えます。 burncd はベースシステムの一部で /usr/sbin/burncd としてインストールされています。 使い方はとても単純でオプションも少ししかありません。
# burncd -f cddevice data imagefile.iso fixate
以上のコマンドは imagefile.iso のコピーを cddevice に書き込みます。 デフォルトのデバイスは /dev/acd0c です。 書き込み速度や操作完了後に CD を自動的に取り出す方法、 オーディオデータの書き込みなどのオプションについては burncd(8) を見てください。
あなたが持っている CD ライタが ATAPI ではなければ、 CD を書き込むのに cdrecord を使う必要があります。 cdrecord はベースシステムの一部ではなく、 sysutils/cdrtools の port または 適切な package を利用してインストールしなければなりません。 なお、ベースシステムを変更するとバイナリに矛盾が発生し、 “コースター” を作ってしまうおそれがあります。 したがって、システムをアップグレードする度にこの port も作り直すか、 あるいはFreeBSD の安定版を追いかけているのならば、 新しいバージョンが利用できるようになった時に ports をアップグレードする必要があります。
cdrecord にはたくさんのオプションがありますが、 基本的な使い方は burncd よりもさらに簡単です。 ISO 9660 イメージを書き込むには以下のようにします。
# cdrecord dev=device imagefile.iso
cdrecord のトリッキーな部分は、使用する dev
を見つけるところにあります。 適切な設定を見つけるためには cdrecord の -scanbus
フラグを使います。
たとえば、以下のような結果が出力されるでしょう。
# cdrecord -scanbus Cdrecord 1.9 (i386-unknown-freebsd4.2) Copyright (C) 1995-2000 Jörg Schilling Using libscg version 'schily-0.1' scsibus0: 0,0,0 0) 'SEAGATE ' 'ST39236LW ' '0004' Disk 0,1,0 1) 'SEAGATE ' 'ST39173W ' '5958' Disk 0,2,0 2) * 0,3,0 3) 'iomega ' 'jaz 1GB ' 'J.86' Removable Disk 0,4,0 4) 'NEC ' 'CD-ROM DRIVE:466' '1.26' Removable CD-ROM 0,5,0 5) * 0,6,0 6) * 0,7,0 7) * scsibus1: 1,0,0 100) * 1,1,0 101) * 1,2,0 102) * 1,3,0 103) * 1,4,0 104) * 1,5,0 105) 'YAMAHA ' 'CRW4260 ' '1.0q' Removable CD-ROM 1,6,0 106) 'ARTEC ' 'AM12S ' '1.06' Scanner 1,7,0 107) *
リストにあるデバイスに対する適切な dev
の値がここに示されています。あなたの CD ライタをこのリストから見つけ、 カンマで区切られた
3 つの数値を dev
の値として使ってください。この例では CRW
デバイスは 1,5,0 なので、適切な入力は dev=1,5,0
となります。
値を明示するもっと簡単な方法もあります。詳細は cdrecord(1)
を見てください。そこにはオーディオトラックを書き込む方法や、
書き込み速度その他を操作する方法も書かれています。
CD からオーディオデータを連続したファイルに展開し、ブランク CD にこれらのファイルを書き込むことで、オーディオ CD を複製することができます。 この手順は ATAPI および SCSI ドライブの間で少し異なります。
SCSI ドライブ
cdda2wav を使用してオーディオを展開します。
% cdda2wav -v255 -D2,0 -B -Owav
cdrecord を使用して .wav ファイルに書き出します。
% cdrecord -v dev=2,0 -dao -useinfo *.wav
Section 15.5.4 に説明されているように 2.0 が適切に指定されていることを確かめてください。
ATAPI ドライブ
ATAPI CD ドライバでは、それぞれのトラックを /dev/acddtnn のように利用できます。 ここで d はドライブ番号であり、 nn は二桁十進のトラック番号です。 一桁の場合 0 を前に付加する必要があります。 したがって、一番目のディスクの一番目のトラックは /dev/acd0t01、二番目のトラックは /dev/acd0t02、三番目のトラックは /dev/acd0t03 などとなります。
適切なデバイスファイルが /dev に存在することを確かめてください。 存在しなければ、たとえば次のようにして作成します。
# cd /dev # sh MAKEDEV acd0t99
Note: FreeBSD 5.0 では devfs(5) が /dev にエントリを自動的に作成、 管理するので、MAKEDEV を使用する必要はありません。
dd(1) を使用して各トラックを展開します。 ファイルを展開する際、ブロックサイズを指定しなければなりません。
# dd if=/dev/acd0t01 of=track1.cdr bs=2352 # dd if=/dev/acd0t02 of=track2.cdr bs=2352 ...
burncd を使用して、 展開したファイルをディスクに書き込みます。 これらがオーディオファイルであること、 そして書き込みが終了したときに burncd がディスクを固定 (fixate) することを明示しなければなりません。
# burncd -f /dev/acd0c audio track1.cdr track2.cdr ... fixate
データ CD を、sysutils/mkisofs を用いて作成されたイメージファイルと機能的に等価なイメージファイルにコピーできます。 これを使用して、すべてのデータ CD を複製することができます。 ここでの例は CDROM デバイスが acd0 であるとしています。あなたの CDROM デバイスに読み替えてください。 CDROM の場合には、パーティション全体またはディスク全体 を指定するために c をデバイス名の後に追加しなければなりません。
# dd if=/dev/acd0c of=file.iso bs=2048
これでディスクイメージを取り出すことができました。 すでに説明した方法を用いて CD に書き込むことができます。
さて、標準的なデータ CDROM を作成したので、 おそらく次はそれをマウントしてデータを読み出したいと思うでしょう。 デフォルトでは mount(8) は、ファイルシステムタイプを ufs としています。 次のように実行しようとすると、
# mount /dev/cd0c /mnt
“Incorrect super block”
というエラーが返されてマウントできないでしょう。 CDROM は UFS
ファイルシステムではないために、 このような手順でマウントしようすると失敗します。
ファイルシステムのタイプが ISO9660 であると mount(8)
に教えさえすれば、すべてはうまく動作します。 mount(8) に -t cd9660
オプションを指定することでこれを行います。 たとえば /dev/cd0c
の CDROM デバイスを /mnt にマウントしたい場合は、
以下のように実行します。
# mount -t cd9660 /dev/cd0c /mnt
使用している CDROM インタフェースによっては、 デバイス名 (この例では /dev/cd0c) が異なるかもしれないことに注意してください。
また、-t cd9660
オプションは、単に mount_cd9660(8)
を実行します。 この例を以下のように短縮することもできます。
# mount_cd9660 /dev/cd0c /mnt
一般的にこの方法では、すべてのメーカの データ CDROM を使用することができます。しかしながら、特定の ISO 9660 拡張が施されたディスクでは奇妙な動作をするかもしれません。 たとえば Joliet ディスクは、 すべてのファイル名を 2 バイトの Unicode 文字で格納します。 FreeBSD カーネルは (まだ) Unicode を理解できないので、 非英語文字はクエスチョンマークで表示されます (FreeBSD 4.3 以降を使用している場合、CD9660 ドライバには適切な Unicode 変換表を読み込むための急ごしらえのフックが含まれています。 いくつかの共通のエンコードに対するモジュールは sysutils/cd9660_unicode port から利用可能です)。
CDROM をマウントしようとする時に、 “Device not configured” と表示されるかもしれません。これは、ディスクがトレーにないと CDROM ドライブが判断しているか、 ドライブがバス上に認識できないことを通常意味します。 ディスクが挿入されたことを CDROM ドライブが認識するには数秒かかりますので、 辛抱強く待ってください。
バスのリセットに返答するためのタイムアウトが短いために、時々 SCSI CDROM は認識に失敗するかもしれません。SCSI CDROM を持っている場合は、 次のオプションをカーネルコンフィギュレーションファイルに追加して、 カーネルを再構築してください。
options SCSI_DELAY=15000
これより、SCSI バスを起動時に 15 秒間停止させて、 CDROM ドライブがバスリセットに応答する機会を与えます。
ISO 9660 ファイルシステムを作成すること無く、 ファイルを直接 CD に書き込むこともできます。 この方法をバックアップ目的に使用している人もいます。 これは、標準 CD を書き込むよりもさらに速く実行することができます。
# burncd -f /dev/acd1c -s 12 data archive.tar.gz fixate
このように CD に書き込まれたデータを取得するには、 raw デバイスノードからデータを読み込まなくてはなりません。
# tar xzvf /dev/acd1c
このディスクを通常の CDROM としてマウントすることはできません。 このような CDROM は FreeBSD を除いて、 他のすべてのオペレーティングシステムでは読み込むことはできません。 CD をマウントしたいか、 その他のオペレーティングシステムとデータを共有したい場合は、 上記に説明したように sysutils/mkisofs を使用しなくてはなりません。
このドライバは、ATAPI デバイス (CD-ROM, CD-RW, DVD ドライブなど) へ SCSI サブシステムを通じてアクセスすることを可能にします。 これにより、sysutils/cdrdao または cdrecord(1) のようなアプリケーションが使用できるようになります。
このドライバを使用するためには、 カーネルコンフィギュレーションファイルに次の行を追加する必要があります。
device atapicam device scbus device cd device pass
次の行もカーネルコンフィギュレーションファイルに必要です。
device ata device atapicd
両方がすでに存在しなければなりません。
それから再構築し、新しいカーネルをインストールし、 コンピュータを再起動します。 起動プロセス中にディスクライタは以下のように表示されるでしょう。
acd0: CD-RW <MATSHITA CD-RW/DVD-ROM UJDA740> at ata1-master PIO4 cd0 at ata1 bus 0 target 0 lun 0 cd0: <MATSHITA CDRW/DVD UJDA740 1.00> Removable CD-ROM SCSI-0 device cd0: 16.000MB/s transfers cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed
ドライブは /dev/cd0 デバイスを通じてアクセスすることが可能となります。 たとえば、次のようにして CD-ROM を /mnt にマウントします。
# mount -t cd9660 /dev/cd0c /mnt
root 権限で次のコマンドを実行して、 ライタの SCSI アドレスを得ることができます。
# camcontrol devlist <MATSHITA CDRW/DVD UJDA740 1.00> at scbus1 target 0 lun 0 (pass0,cd0)
したがって、1,0,0 が cdrecord(1) およびその他の SCSI アプリケーションで使用する SCSI アドレスです。
ATAPI/CAM および SCSI システムの詳細は atapicam(4) および cam(4) マニュアルページを参照してください。