「もしおまえを煙と化すなら,焼き上がる間にフィードルでも奏でて時を過ごそう」 (ローマ皇帝ネロが A.D. 64 年に彼のクラシック CDを焼いた時の言葉です. 彼は完璧に考え違いをして,ローマを焼き払っちゃたんですけどね)
Linux 上での CD-ROM 作成は 2 つの手順で行います:
cdrecord
ユーティリティを使って,このデータをファイル
から CD-R に書き込むこの章では,データ CD とオーディオ CD を焼く手順を詳細に説明します.
CD に焼くためのデータの収集には普通,思っているより時間がかかります. 一度 CD を書き込んで,固着させてしまったら,足りないファイルを追加する ことはできないことに注意してください. また,ISO-9660 ファイルシステムの情報を持つために CD の空き容量がある 程度(普通は数 MB)使われてしまうことを覚えておいてください.620 MB のデー タなら確実に 650MB の CD-R に収まるでしょう.
どんな記録メディア(例: フロッピーディスク,ハードディスク,CD)でも使え るようになる前には,ファイルシステムを作らなければなりません(DOS でい うところのフォーマットです).ファイルシステムの役割は,メディアに保存 されるファイルを組織化し,まとめることです.
ハードディスクのパーティション上にファイルシステムを作る普通のユーティ リティは,空のファイルシステムをパーティション上に作成します.このファ イルシステムには,ユーザの必要に応じてファイルが入れられていきます.こ れに対して,書き込み可能な CD は一度しか書き込めません.したがって,空 のファイルシステムを書き込んでしまうと,フォーマットこそされますが,永 遠に空っぽのままになってしまいます.同じことは書き換え可能なメディアに ついても言えます.というのも,任意のセクタを変更することはできず,全体 の内容を消さなければなりません.
したがって,必要となるのはファイルを CD に書き込むためのファイルシステ
ムを作るツールです.このツールは mkisofs
と呼ばれます.このtー
るの使用例を以下に示します:
mkisofs -r -o cd_image private_collection/
`---------' `-----------------'
| |
書き込み先 入力に使うディレクトリ
オプション '-r' は CD 上の全てのファイルのパーミッションを誰でも読める
ように設定し,RockRidge 拡張を有効にします.自分が何をしているのかが本
当にわかっているのでなければ,このオプションを使うとよいでしょう
(ヒント: '-r' がないと,マウントポイントは
private_collection
のパーミッションを拾ってしまいます!).
mkisofs
は全てのファイル名を DOS が使う 8.3 形式に対応させよ
うとします.これは互換性をできるだけ高めるためです.名前が重なった場合
(別のファイルが同じ 8.3 形式の名前になった場合)には,ファイル名に数字
が使われ,決まったファイル名に関する情報が標準エラー出力(通常は画面)に
出力されます.あわてないでください: Linux 上ではこのような 8.3 形式の
ファイル名を見ることはありません.というのも,Linux は元のファイル情報
(パーミッション,ファイル名など)を持っている Rock Ridge 拡張を使うから
です.
もしかすると,mkisofs
の出力が直接 CD ライタデバイスに送られ
ないのはどうしてかと思うかもしれません.これには 3 つの理由があります:
mkisofs
は CD ライタの駆動について何も知らないCD-R を一気に焼く方法があります.これを以下で説明します.
追加のパーティションを作成し,ファイルではなくそのパーティションへイメー ジを書き込もうと思うかもしれません.筆者はこういったやり方には反対です. というのも,(入力ミスのせいで)間違ったパーティションに書き込みを行うと, Linux システムが全て壊れてしまうからです(注意: 私はやってしまいました…). また,これはディスク容量の無駄使いです.なぜなら,CD イメージは一時的 なデータであり,CD への書き込みを行った後は削除できるからです.しかし, raw パーティションを使えば,650MB のサイズのファイルを消す時間を節約す ることができます.
Linux は,ファイルがまるでディスクのパーティションであるかのようにマウ ントできます.この機能は,CD イメージのディレクトリ構成やファイルの パーミッションが希望通りかどうかを確認する時に便利です.現在はメディア も非常に安いですが,それでも書き込みにはとても時間がかかるので,少なくとも簡単な テストで時間を節約するとよいでしょう.
これまでの作業で作った cd_image
を /cdrom
ディレクト
リにマウントするには,以下のコマンドを使います:
mount -t iso9660 -o ro,loop=/dev/loop0 cd_image /cdrom
ここで /cdrom
以下のファイルを詳しく調べます.これは焼きあがっ
た CD-ROM にあるものと全く同じです.CD イメージをアンマウントするには,
umount /cdrom
を使います.(警告: 2.0.31 以前の Linux カーネル
では,/cdrom
の最後のファイルを完全には読めません.ですから
2.0.36 といったもっと新しいカーネルを使ってください.cdrecord では
-pad オプションはオーディオ CD にしか使えず,mkisofs で -pad オプショ
ンを使うにはパッチを当てる必要があります.このパッチを当てる作
業は,バグのない Linux カーネルに更新するより大変です.)
注意:
古いバージョンのmount
にはループバックデバイスを扱えないもの があります.このような古いバージョンのmount
を使っているなら ば,Linux システム自体を新しくしましょう. 最新の mount ユーティリティの入手に関する情報をこの HOWTO に入れようと 提案してくれた方は今までに何人もいますが,筆者は必ず断っています. お使いの Linux ディストリビューションに古すぎるmount
が付属 しているのなら,バグとして報告すべきです.作りの悪い Linux ディストリビューションのバグを回避するために必要な情報を全て 載せてしまうと,この HOWTO はとても長くて読みにくくなってしまいます.
やることはもうあまり残っていません.まだ試したことがなければ,そろそろ 次のコマンドを実行してみましょう:
cdrecord -scanbus
このコマンドは CD ライタがどの SCSI デバイスに接続されているかを表示し ます.こういった情報の推定は cdrecord で非常にうまくできるので,他の方 法(特に汎用 SCSI デバイスを指定するといったいくらか危険な方法)はこの HOWTO から消しました.
CD を焼くという最後のコマンドを実行する前に,CD ライタには定常的にデー タを流すことが必要だということを注意させてください.というのも,CD ラ イタには小さなデータバッファしか付いていないからです.したがって,CD イメージを CD に書き込む処理の妨害をしてはならず,さもないと焼き損ねの CD ができてしまいます.巨大なファイルを削除すれば簡単にデータの流れを 止めることができます.例: 前に使ったイメージである 650MB の大きさのファ イルを削除すると,カーネルはハードディスク上の 650,000 ブロック分の情 報を更新しなければなりません(このファイルシステムでは 1 ブロックが 1KB であるものとします).これにはある程度の時間がかかり,ディスクの動作が 遅くなってデータの流れが数秒間止まることもありえます. しかし今時のマシンでは普通,メールを読んだり,WWW をブラウズしたり,カー ネルを再構築したくらいでは書き込みに影響しません.
邪魔が入った時にレーザーの位置を直し,CD 上の邪魔が入る前の位置から焼 き続けることができる CD ライタは存在しない点に注意してください.したがっ て,強い振動や機械的な衝撃があると書き込み中の CD は壊れてしまうでしょ う.
心の準備ができれば,魔法使いの黒いローブをまとい,CD ライタの SCSI ID と SCSI のリビジョンの数字を掛け合わせてその数のロウソクを灯し, ASR-FAQ (newsgroup alt.sysadmin.recovery) にある 2 つの文句を唱えた上 で,最後のコマンドを入力します:
shell> SCSI_BUS=0 # リスト 1 の "scsibus0:" の部分を見た
shell> SCSI_ID=6 # リスト 1 の "TOSHIBA XM-3401" の部分を見た
shell> SCSI_LUN=0
shell> cdrecord -v speed=2 dev=$SCSI_BUS,$SCSI_ID,$SCSI_LUN \
-data cd_image
# 上のコマンドと同じ意味ですが,こちらの方が短い
shell> cdrecord -v speed=2 dev=0,6,0 -data cd_image
読みやすさを高めるために,CD ライタのパラメータは自然な名前の 3 つの環 境変数(SCSI_BUS, SCSI_ID, SCSI_LUN)に格納されます. オプション -data は必須ではありませんが,オーディオ CD を焼く時のコマ ンドラインと区別しやすくするために指定しています.
cdrecord を使って CD-RW を上書きする時には,古い内容を消すために "blank=..." というオプションを指定しなければなりません.CD-RW の中身を 消すための色々な方法については,オンラインマニュアルを見てください.
筆者以外のは人はみんな 400MHz のマシンを持っているのではないかと時々思 うのですが,多くの人は mkisofs の出力を直接 cdrecord に送り込んでいます:
shell> IMG_SIZE=`mkisofs -R -q -print-size private_collection/ 2>&1 \
| sed -e "s/.* = //"`
shell> echo $IMG_SIZE
shell> [ "0$IMG_SIZE" -ne 0 ] && mkisofs -r private_collection/ \
|cdrecord speed=2 dev=0,6,0
tsize=${IMG_SIZE}s -data -
# s を忘れないこと --^ ^-- 標準入力からデータを読む
最初のコマンドはイメージの大きさを調べるためにカラ実行します(これを行 うには,cdrecord のパッケージに入っている mkisofs が必要です).お使い の CD ライタは書き込むイメージの大きさを知る必要がないかもしれませんが, その時にはこのコマンドを外しても構いません.出力されたサイズは cdrecord に tsize パラメータとして渡されます(この値は環境変数 IMG_SIZE に格納されます).2 番目のコマンドは mkisofs と cdrecord をパイプ経由 で組み合わせて並べたものです.
オーディオ CD の書き込みは,既に説明したデータ CD の書き込みの手順とよ く似ています.主な違い は 2 つあります.一つはオーディオ CD はオーディオトラックで構成される 点です.これは別々のイメージとして用意します.したがって,CD にトラッ クを 10 個置くつもりならば,イメージを 10 個作らなければなりません.も う一つの相違点は,イメージのフォーマットが ISO-9660(あるいは他のどのファ イルシステム)でなく,「44100 サンプル/秒(44.1 kHz)で PCM コーディング された 16 ビットステレオのサンプル音声」であることです.
サウンドファイルを必要なフォーマットに変換するユーティリティの一つは sox です.sox の使い方は簡単です:
shell> sox killing-my-software.wav killing-my-software.cdr
このコマンドは killing-my-software という歌を WAV 形式から CDR 音声形 式に変換します.sox が認識するファイル形式とファイル名の拡張子について はオンラインマニュアルを見てください.変換結果を出力するには大量のディスク容量が必要 なので,cdrecord には WAV, AU 形式を読み込む機能が組み込まれました.し たがって,音声ファイルの拡張子が .wav または .au (かつサンプルレート が 「ステレオ,16 ビット,44.1 kHz」)ならば,手動で変換しなくてもイメー ジとして使うことができます.
cdrecord は,-audio オプションが指定されるとオーディオトラックを CD イメー ジとして書き込みます.他のオプションについてはデータ CD を書き込む時と 同じです(非常に特殊な要求がある場合は除きます).以下の 3 つの例は全て 同じ処理を行いますが,トラックの読み込みは異なるサウンド形式から行われます:
shell> cdrecord -v speed=2 dev=0,6,0 -audio track1.cdr track2.cdr...
shell> cdrecord -v speed=2 dev=0,6,0 -audio track1.wav track2.wav...
shell> cdrecord -v speed=2 dev=0,6,0 -audio track1.au track2.au...
大きな例外の一つは MPEG レイヤ 3 ファイルです.このファイルは "mpg123 -s track1.mp3 > track1.cdr" というコマンドで CD 形式 に変換することができます.(警告: このコマンドはバイト順をある順序にし てファイルを生成しますが,cdrecord に -swab オプションを付けてバイト順 を入れ換える必要があります.) この逆向きの変換は,WAV ファイルに対して "8hz-mp3" を使うことによって行えます(cdda2wav を使ってオーディオ CD か らトラックを吸い出し,8hz-mp3 を使ってこれを MP3 にエンコードします). たくさんの MP3 ファイルからまとめて CD-R を作るには,以下のコマンド列 を使います:
for I in *.mp3
do
mpg123 -s $I | cdrecord -audio -pad -swab -nofix -
done
cdrecord -fix
マシンの速度によっては,書き込み速度を "speed=1" (cdrecord のオプショ ン)に落とす方がよいかもしれません."speed=4" を使うと,マシンは MP3 ファイルを 4 倍速で演奏できなければなりません.mpg123 は CPU 時間 を大量に消費します! どうすべきか分からなければ,-dummy コマンド(レーザー のスイッチを切ったままにする)を指定して cdrecord をカラ実行してくださ い.これを行うことにより,オーディオトラックの間に 2 秒の無音部分が入っ たオーディオ CD が作られます.
オーディオトラック間の無音部分を無くしたければ,disk-at-once (DAO) 書 き込みを使わなければなりません.これは既に説明した(トラックを一つずつ焼く) track-at-once (TAO) 録音の反対です.DAO のサポートは現在,cdrdao が最 も進んでいます.詳しくは cdrdao のホームページを見てください.
read-cd オプションを使うことにより,オーディオ CD をまるごとコピーする こともできます.
この話題については書くことはあまりありません.-data オプションや -audio オプションを使って,(後に続く)イメージの種類を指定するだけです. 例を以下に示します:
cdrecord -v dev=0,6,0 -data cd_image -audio track*.cdr