目次


LinuxでCDを焼く

コマンド・ラインのmkisofsとcdrecordですべてが可能

Comments

どのプラットフォームでもコマンド・ラインからCDを焼く作業は、不可解で難渋させられることが多いものですが、それはLinuxでも同じです。しかし、コマンドや用語はプラットフォーム間でかなり似通っていますので、LinuxでCD書き込みの方法を習得しておくとためになります。また、Linuxのソフトウェアは数多くのものが .isoイメージで配布されますので、自分でCDを焼く方法を知っていれば、.isoをダウンロードしてきて独自のインストール・ディスクを作成することができます。

CD書き込みプログラムにはLinux用とWindows用の両方がありますが、Linux版のほうがWindows版よりも強力で応用範囲の広いものになっています。本稿ではLinuxでCDを作成するときに活躍するmkisofscdrecord を紹介します。mkisofs はプリマスター・イメージ (pre-mastered image) を作成してISO9660/JOLIET/HFSのハイブリッド・ファイルシステムを作成するためのツールで、ファイルシステムを作成し、組み込む働きをします。ハードディスクやフロッピー・ディスクなどの他のデータ・ストレージ・メディアと違い、CDの場合、ファイルシステムは最初に作成されずに後でデータといっしょに組み込まれます。CD-Rの場合、作成の機会は1回だけであり、最初にフォーマットを行うと空のファイルシステムのディスクを作成することになります。一方cdrecord は、オレンジ・ブック 仕様のCD-R/RWにデータを記録します。ほとんどのCD-R/RWがこの仕様に従っています。

CDレコーディングのような新式のテクノロジーの場合、こうしたプログラムに新しいバージョンを使うに越したことはありません。mkisofscdrecord は、いずれも1.10以上を使ったほうがよいでしょう。cdrecord の最新版であるバージョン2.0は、名前がcdrtools に変わっています。マシンにインストール済みのバージョンは、以下のようにして調べることができます。

$ cdrecord --version

$ mkisofs --version

記録可能なCDの世界が初めての方のために、さしあたって知っておいたほうがよいことを以下にいくつか列挙しておきます。

  • CD-R: CD-Recordableの略。WORM (Write Once, Read Many [書き込みは1回、読み出しは何度でも自由]) のこと。
  • CD-RW: CD-Rewritableの略。WMRM (Write Many, Read Many [書き込み、読み出しともに何度でも自由]) のこと。
  • CD-Rは汎用的で、どのCD-ROMドライブでも読み出し可能なはずです。
  • CD-RWも最近のものならすべてのドライブで読み出せるはずです。CD-RやCD-RWのディスクを読み出すためには、ドライブは「マルチリード」タイプでなければなりません。古いドライブは問題を起こすことが多くなります。そうした古い4倍速のドライブは廃棄し、新しいドライブを買ったほうがよいでしょう。いらいらさせられるだけです。
  • 商業用のCDはプレスで生産されます。レーザーで焼かれるわけではありません。
  • どのメーカーのCD-R/RWドライブが一番良いかは、よくあるハードウェアの評価記事などで調べてください。

ファイル・フォーマット関係の用語についても、少し紹介しておきます。

  • イエロー・ブック: データCD用の物理フォーマット
  • オレンジ・ブック: 記録可能CD用の物理フォーマット
    • 第1部: CD-MO (光磁気)
    • 第2部: CD-WO (ライト・ワンス。PhotoCD用の「ハイブリッド」仕様を含む)
    • 第3部: CD-RW (再書き込み可能)
  • ISO-9660: 8.3形式のファイル名だけを許す古いファイル・レイアウト標準
  • Rock Ridge: ISO-9660の拡張で長いファイル名やUNIXスタイルのsymlinkを使うことができます。所有権や許可などの属性がすべて保存されます。UNIXのファイル属性は、ディスクをWindowsシステムで読む場合には表示されません。
  • Joliet: ISO 9660ファイルシステムのマイクロソフト拡張版で、長いファイル名を使用できるだけでなく、ファイル名にUnicode文字を使用できるようにしています。MS-DOSとの互換性をもたせるために、切り詰めたファイル名 (FILENA~1.TXTのような変な形のもの) も作成します。64文字までの長さのファイル名が許され、スペースを含めることもできます。Windows 95以上およびJoliet Volume Access拡張の実行されるMacintoshコンピューターで読み出すことができます。Macintoshでは、Jolietファイル名の32文字目以降は読み出せません。
  • El Torito: ブート可能なCD-ROMフォーマット仕様
  • HFS (Hierarchical File System: 階層ファイル・システム): Macintoshで使用されるネイティブのファイル・システム
  • マルチセッション: 1回のセッションではなく、何回にも分けてファイルを追加できるようにする方式。ディスクを読み出し可能とするには、セッションを「閉じる」必要があります。しかし、そうすると、ディスクにファイルを追加できなくなります。マルチセッションは、個々のセッションをリンクし、ディスクの目次を1個のディレクトリとして見えるように更新します。
  • CD-UDF (Universal Disk Format): 業界標準のインクリメンタル・パケット・ライティング・ファイルシステム

UDFについての簡単な補足: UDFは、ディスクに直接ファイルをドロップできることを意味します。現在これはソフトウェア・レベルで実現されています。このディスクを読み出すためには、そのディスクを作成するために使用されるソフトウェアが必要です。LinuxカーネルへのUDFの追加は現在開発中であり、恐らく2.6で追加されることになります。UDFを可能にするためには、CDドライブにCD-MRW回路 (CD Mount Rainier ReWrite: なぜこんな名前になったのかは私も知りません) が必要ですので、今後これが新しいドライブの目玉になることと思います。これが実装されると、CD-R/RWへのファイルのコピーはフロッピー・ディスクへのコピーと同じぐらい簡単になり、それらのディスクはどこでも普通に読み出せるようになります。UDFは、長く君臨してきた3.5インチ・ディスケットの代わりになると大きく宣伝されています。見ものですね (Mount Rainierの詳細については、参考文献に示したリンクを参照してください)。

LinuxでのSCSIエミュレーションの冒険

できればIDE/ATAPIかSCSIのCDライターを使用してください。パラレル・ポート・インターフェースは、わざわざ災いを背負込むような忌まわしい代物ですし、USBドライブは遅くて使いものになりません。どちらもLinuxではきちんとサポートされていません (ただし、新しいUSB 2.0のドライブはサポートされている可能性もあります)。

最もよく使用されているのがIDE/ATAPIドライブですが、このドライブを使う場合、少し細工が必要です。組み込まれているドライブがないとcdrecord が表示してきた場合です。これは以下のコマンドで調べることができます。

$ cdrecord -scanbus

これでCD-RWドライブが表示されれば (以下のディスクの焼き方を参照)、この節の内容はほとんど飛ばしてもかまいません。もちろん、参考までにざっと目を通しておくのもよいでしょう。

LinuxはSCSIエミュレーション・サブシステムを使用していますので、IDE/ATAPIのCDライターに対しては互換性をもたせるためのドライバーが必要となります。同じPCにCD-ROMとCD-R/RWがそれぞれ1基ずつある場合、ディスクをコピーできるようにするためには、両方でide-scsi擬似デバイス・ドライバーを使用する必要があります。CD-ROMでSCSIエミュレーションを使うことに不都合なことは何もありません。まったく同じ働きをします。名前が変わるだけのことです。Linuxのバージョンによって、ドライブの指定は、/dev/cdrom0や /dev/hdcや /dev/scd0などと違ってきます (IDE/ATAPIのデバイス名一覧は、表1のとおりです)。

表1. IDE/ATAPIのデバイス名
名前デバイス
hdaIDEバス/コネクター0マスター・デバイス
hdbIDEバス/コネクター0スレーブ・デバイス
hdcIDEバス/コネクター1マスター・デバイス
hddIDEバス/コネクター1スレーブ・デバイス

システムに搭載されているドライブは、以下のコマンドで調べることができます。

$ dmesg | grep '^hd.:'
hda: IBM-DTLA-305020, ATA DISK drive
hdb: TOSHIBA DVD-ROM SD-M1202, ATAPI CD/DVD-ROM drive
hdc: LITE-ON LTR-24102B, ATAPI CD/DVD-ROM drive
hda: 40188960 sectors (20577 MB) w/380KiB Cache, CHS=2501/255/63, UDMA(66)

最近のLinuxのカーネルには、最初からSCSIエミュレーションがコンパイルされ、組み込まれています。それは、以下のコマンドで確認できます。

$ locate ide-scsi.o /lib/modules/2.4.19/kernel/drivers/scsi/ide-scsi.o

システムにSCSIエミュレーションが組み込まれていない場合、これをコンパイルしてカーネルに組み込む必要があります。その方法は、この小さな記事で扱うには大きすぎるテーマですので、参考文献を参照してください (やり方さえわかれば、難しいことではありません)。

2個のテキスト・ファイルを編集して、ide-scsiドライバーが使用されるようにシステムを設定する必要があります。1つは /etc/modules.confです (Debianの場合 /etc/modules)。私のシステムにはCD-ROMドライブとCD-R/RWドライブが1基ずつ搭載されています (hdbとhdc)。そこで、以下の行を /etc/modules.conf (あるいは /etc/modules) に追加し、システムに合わせて適当な値を指定します。

ide-cd ignore=\"hdb hdc\" ide-scsi

IDEサブシステムは、デフォルトで、すべてATAデバイスからなっているものとされますので、ignore の行によって、SCSIサブシステムがCD-R/RWとCD-ROMの両方を掌中に納めることになります。

次に、ブートローダーのGRUBまたはLILOの構成ファイルを編集します。LILOユーザーなら、lilo.confの最後に以下の行を追加します。

append="hdb=ide-scsi"
append="hdc=ide-scsi"

GRUBユーザーの場合、/etc/grub.conf (Debianの場合 /boot/grub/menu.lst) のkernel 行の最後に以下の行を追加します。

hdb=scsi hdc=scsi

そこでリブートして、ide-scsiドライバーがロードされているかどうかを以下のコマンドで確認します。

$ lsmod

長いリストが表示されますので、ide-scsiがあるか確認します。

.isoファイルの作成

コピーしたいファイルの選択を済ませたら、CDへの書き込みは2段階の手順で行います。まずmkisofs で .isoを作成し、次にcdrecord でディスクを焼くという手順です。以下のコマンドで .isoファイルを作成します。

$ mkisofs -o test.iso -Jrv -V test_disk /home/carla/

ここでの指定の意味は、以下のとおりです。

  • -o で、新しい .isoイメージ・ファイル (test.iso) を指定する
  • -J で、Joliet方式の命名レコードを使用して、Windowsとの互換性をもたせる
  • -r で、Rock Ridge方式の命名規約を使用して、UNIX/Linuxとの互換性をもたせるとともに、すべてのファイルを一般に読み出せるようにする
  • -v で、イメージを作成する際の実行状況表示を詳細モード (verbose mode) にする
  • -V で、ボリュームIDを指定する (test_disk)。Windowsのエクスプローラーには、このディスク名が表示される
  • リストの最後は、.isoへのパッケージ対象として選択されたファイル (/home/carla/ 内のすべてのファイル)

次に .isoをマウントして確認を行います。このとき、私は、テスト・ディレクトリーを作成することにしています。

$ mkdir /test_iso
$ mount -t iso9660 -o ro,loop=/dev/loop0 test.iso /test_iso

ディレクトリーの内容を確認してください。すべてのファイルをこのディレクトリーに入れておき、読み出し可能な状態にしておく必要があります。そうなっていないと、正しいイメージが得られず、それをディスクに焼いてもコースターにしか使えない代物になってしまいます。

ディスクの焼き方

イメージをディスクに書き込むのは、ごく簡単なことです。まず、CD-R/RWのSCSIアドレスを調べます。

$ cdrecord -scanbus Cdrecord 1.10 (i686-pc-linux-gnu) Copyright (C) 1995-2001 Jrg Schilling
Linux sg driver version: 3.1.24
Using libscg version 'schily-0.5'
scsibus0:
0,0,0 0) 'TOSHIBA ' 'DVD-ROM SD-M1202' '1020' Removable CD-ROM
0,1,0 1) 'LITE-ON ' 'LTR-24102B ' '5S54' Removable CD-ROM
0,2,0 2) *
0,3,0 3) *
0,4,0 4) *
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *

各項目の最初の3つの数字は、それぞれ、SCSIバス、デバイスID、LUN (論理ユニット番号) を指しています (4番目の数字も、デバイスIDを表しています)。cdrecord で必要となるのは、この最初の3つの数字です。上の例では、CDレコーダーは0,1,0です。SCSIバス0につながっているものは、すべて、最初の0を落として、1,0と短縮することができます。一般にこのような約束になっています。他にバスがある場合、そのバスは短縮せずに指定しなければなりません。

ここで、ディスクへの書き込みを行います。

$ cdrecord -v -eject speed=8 dev=0,1,0 test.iso

ここでの指定の意味は、以下のとおりです。

  • -v は詳細表示 (verbose)
  • -eject は、終了時にディスクをイジェクトする
  • -speed は、書き込み速度の指定 (8)
  • -dev は、cdrecord -scanbus で得られたデバイス番号 (0,1,0)
  • 最後は、焼かれるイメージの名前 (test.iso)

WindowsあるいはLinuxのどんなシステムでも読み出すことのできるディスクを作成するわけですので、これは、一般に配布されるディスクを作成するための簡単で実用的な方法として利用することができます。mkisofs 単体でも、ダウンロード用として .isoファイルを作成できますし、mkisofs は、数多くのプラットフォームに対応したファイルシステムを作成することができます。さらに詳しいことについては、mkisofs のマニュアル・ページを参照してください。

メモリーをたくさん搭載した高速なマシンなら、レコーディングの最中にCPU負荷の少ない (low-CPU-intensive) タスクを実行しても問題を起こすことはありませんが、書き込み時には何も行わないほうが無難です。レーザーは、途中で中断してまたそこから再開するということができませんので、中断を起こすと致命的です。

cdrecord はレコーダーを最高の速度で実行させようとしますので、速度を指定する必要はありませんが、経験がある場合はそれに基づいて指定しておくとよいでしょう。遅い速度を指定するとエラーやバッファー・アンダーランを訂正できるようになります。「耐書き込み (burn-proof)」テクノロジー (行うべきことと反対の名前になっている。誰がこんな名前を付けたのでしょうか) を装備した新しいドライブの場合、古いドライブのように、バッファー・アンダーランに悩まされることはありません。

ディスクのコピー

ソース・ディスクから記録可能なディスクに直接コピーを行うには、以下のコマンドを使います。

$ cdrecord -v dev=0,1,0 speed=4 -isosize /dev/scd0

このコマンドは、CD-ROM (/dev/scd0) の内容をCDレコーダー (dev=0,1,0) に直接送り込みます。古い、遅いマシンでこのコマンドを実行してはなりません。直接コピーは高速ですが、エラーも発生しやすくなります。次のように、いったんソース・ディスクをハードディスクにコピーしておいて、ハードディスクからCDレコーダーにコピーするほうが無難です。

$ mount /cdrom
$ dd if=/dev/scd0 of=/tmp/diskfile.iso
$ cdrecord dev=0,1,0 speed=8 fs=8m -v -eject -dummy /tmp/diskfile.iso

ここではfs=8m-dummy という新しいオプションが2つ使われています。fs=8m はリング・バッファーのサイズを指定しています。この値はある程度大きくしたほうが性能がよくなります。先に触れたように、中断は致命的です。何らかの理由でデータ転送速度が低下してもレコーダーを動かし続けるだけの充分な大きさのバッファーがfs=8m によって得られます。8 Mバイトでも不充分な場合には、性能の高いPCを使うことを考えたほうがよいかもしれません。一方、8 Mバイトより大きくしても、オペレーティング・システムがMMU (メモリー管理ユニット) の各種テーブルをロードし直すのに時間を浪費する可能性がありますので、良い結果になるとはかぎりません。デフォルトは、4 Mバイトです。

-dummy は、実際のディスクで試す前にドライ・ランを行うためのありがたいオプションです。レコーダーは、レーザーをオフにする以外すべてのことを行いますので、ユーザーは実際にディスクに書き込みを行う前にエラーが発生するかどうかをチェックできます。

マルチセッション

CDはセッションで構成され、セッションはトラックに分割されます。単一セッション・ディスクには、リード・イン、単一のTOC (table of contents: 目次)、データ、および、ディスクを確定し、そのディスクにそれ以上レコーディングを行えないようにするリード・アウトが設けられます。mkisofs には別々のセッションをリンクしていっしょにする機能があります。マルチセッション・ディスクはX-CD-RoastやKonCDのようなGUIプログラムを使ったほうが簡単に作成できるかもしれませんが、ここではコマンド・ラインのコマンドでそれを行う方法を紹介します。

ディスクに1回目にセッションを記録するときには、以下のようにcdrecord-multi スイッチを指定します。

$ cdrecord -v -eject speed=8 dev=0,1,0 -multi test.iso

こうすると、ディスクは読み出しが可能になるとともに、データの追加が可能なオープンな状態に固定されます。このディスクにさらにセッションを追加していくためには、mkisofs に開始セクター番号と終了セクター番号を知らせる必要があります。それらの番号は以下のようにして調べることができます。

$ cdrecord dev=0,1,0 -msinfo
0,27139

データを追加しようとしているディスクをCDレコーダーに入れておくことを忘れないでください。データを追加するときは、-C-M の2つのスイッチを追加します。

$ mkisofs -o test2.iso -Jr -V Session2 -C 0,27139 -M 0,1,0 /files/path/

あるいはこれは、以下のようにコマンド・シェルにやらせればよいでしょう。

$ mkisofs -o test2.iso -Jr -V Session2 -C `cdrecord dev=0,1,0 -msinfo` -M 0,1,0 /files/path/

マルチセッションCDドライブは、一番最後に書き込まれたセッションを読み出します。このコマンドは最後のセッションからTOCを読み出してきて、それを統合して新しいTOCにします。一番最後のセッションでは-multi オプションを省略してください。

まとめ

LinuxでのCD書き込みは、強力で、いろいろな使い方ができます。CDレコーダーはネットワーク経由で共有できますし、バックアップを自動化するのにも使用できます。またmkisofscdrecord はDVDにも利用できます。グラフィカルなフロント・エンドに良いものがたくさん存在しますが、CD書き込みの機能自体はすべてコマンド・ラインで行われます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=226915
ArticleTitle=LinuxでCDを焼く
publish-date=04232003