(2007.8.30 新規作成。2007.10.4 公開。)
Linux機でデータをバックアップするのに、CD-Rに追記する手順をメモします。
Webで古めの方法は見つかりますが、Linuxのバージョンが上がったりして状況が変わったりしているので、新たにまとめてみました。Fedora 7 Linuxで確認しています。
CD-Rは書き換え不能ですから、メディア破損を除いて、バックアップデータが失われることはありません。また、副次的に、バックアップ時点でのデータはCD-Rに保存されているとおりなのは確実です。(ディスクをコピーして改竄することができるので、保証はできませんが。)
CDは、歴史的に拡張を重ねてきているので、仕組みがなかなか複雑です。
CDディスクのデータは複数のセッションからなります。音楽CDや普通のデータCDでは、セッションは一つだけです。
セッションは、リードイン (lead-in)、データ部、リードアウト (lead-out) からなります。リードイン、リードアウトはいわば余白です。この分だけ書き込めるデータは小さくなります。セッションを複数作ると、リードイン、リードアウトの大きさがバカになりません。
音楽CDでは、データ部がさらに複数のトラック (曲) に分かれます。データCDでは、何らかのファイルシステムを載せます。
データCDで使われるファイルシステムには、ISO 9660, HFS (Macintosh), UDFなどがあります。ISO 9660と一口に言っても、ファイル名に使える文字の制限などで、レベル1〜3 (ISO-9660:1988)、レベル4 (ISO-9660:1999) があります。また、ISO 9660の拡張として、Rock Ridge (UNIX向け), Joliet (Windows向け) があります。
CDの物理的なセクタ長は2,352バイトです。データCDは標準的には、各セクタに誤り検出・誤り訂正を組み込み、1セクタ2,048バイト (2キロバイト) になります。このほか、オーディオ・ビデオとデータを混在させるため、モード2を拡張したフォーマットもあります。
モード2をさらに二つに区分し、
CDドライブがどのディスクを読めてどのディスクに書き込めるかは、cd-driveコマンドで確認できます。libcdioパッケージに含まれます。
実行してみると以下のようになりました。デバイスファイル名をメモしておきます。
$ cd-drive cd-drive version 0.78.2 i386-redhat-linux-gnu Copyright (c) 2003, 2004, 2005 R. Bernstein This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The driver selected is GNU/Linux The default device for this driver is /dev/cdrom Drivers available... GNU/Linux ioctl and MMC driver cdrdao (TOC) disk image driver bin/cuesheet disk image driver Nero NRG disk image driver CD-ROM drive supports MMC 3 Drive: /dev/cdrom Vendor : HL-DT-ST Model : DVDRAM GMA-4082N Revision : HV02 Profile List Feature Re-writable DVD Re-recordable DVD using Sequential recording Unknown Profile 15 Re-recordable DVD using Sequential recording Re-recordable DVD using Restricted Overwrite DVD+RW - DVD ReWritable DVD+R - DVD Recordable DVD+R Double Layer - DVD Recordable Double Layer Read only DVD Write once Compact Disc capable - on CD-RW Re-writable Compact Disc capable Read only Compact Disc capable Core Feature ATAPI interface (以下略)
Fedora 7のデスクトップ環境 (GNOME) では、生CD-Rを入れると、自動的にデスクトップにアイコンが現れます。
[TODO: 画面]
あとはファイルをドロップして書き込めます。これが一番簡単です。しかし、今回は、定期的・自動的にバックアップを取りたいので、この方法は採りません。
GUIは非常に簡単ですが、バックアップの自動実行には向きません。コマンドラインでどのように書き込むのか見ていきます。
CD-Rに書き込むには、(1) 保存したいファイルをまとめてファイルシステムイメージを作成し、(2) 実際に書き込む、という手順を踏みます。手順 (1) をgenisoimageコマンド、(2) をwodimコマンドでおこないます。
まず、実際に動くバックアップスクリプトを見てみましょう。以下は、私が実際に使っているRubyスクリプトです。このスクリプトを走らせる前に、データベースやSubversionリポジトリ、静的なファイルなどを集めてきます。
#!/usr/bin/ruby # CDドライブのデバイスファイル DEV = "/dev/scd0" # バックアップデータのディレクトリ DATADIR = "/var/backup" require 'date' # ファイルシステムイメージを作成 def make_image(day) info = `wodim dev=#{DEV} -msinfo`.chomp if info != '' opt = "-C #{info} -M #{DEV}" # 追記 else opt = "" # 新規 end `genisoimage -R -o #{DATADIR}/image #{opt} -graft-points #{day}=#{DATADIR}/#{day}` end # 書き込む def write_image `wodim -multi -eject -data -tao dev=#{DEV} #{DATADIR}/image` end d = Date.today make_image(d) write_image
ファイルシステムイメージの作成は、以前はmkisofsコマンドでおこなっていましたが、Fedora 7では、mkisofsコマンドはgenisoimageへのシンボリックリンクです。このコマンドはgenisoimageパッケージに含まれます。
genisoimageコマンドは、ISO 9660 / Joliet / HFSファイルシステムイメージを作成します (pre-mastering)。
書式は、
genisoimage [オプション] [-o ファイル名] パス指定 [パス指定 ...]
主なオプションは、
graft-pointsを指定するのがミソで、これがないとgenisoimageコマンドに与えたローカルパスの中身がCDのルートディレクトリに来てしまいます。
CD-Rへの書き込みは、以前はcdrecordコマンドでしたが、こちらも替わっていて、Fedora 7 ではcdrecordコマンドはwodimへのシンボリックリンクになっています。このコマンドはwodimパッケージに含まれます。
wodimパッケージは、cdrkitから作られており、これはcdrecord (cdrtools) のライセンスがfree (自由) ではないものに変更になったため、forkしたプロジェクトです。
wodimコマンドの書式は、
wodim [一般オプション] dev=出力デバイス [トラックオプション] トラック1 トラック2 ...
主な一般オプション。詳しくはman wodimしてください。
このオプションを指定すると、デフォルトでは CD-ROM XA mode 2 form 1 (セクタ長 = 2048バイト) になる。
以下は余談ですが、CD-RにUDFファイルシステムが載らないか試してみました。UDFファイルシステムは、DVDなどでも使われているファイルシステムで、CD-Rのように追記型メディアでも使えることになっています。
結論から言えば、今のところ、うまくいかないです。
dvd+rw-toolsパッケージのgrowisofsコマンドは、mkisofsのラッパです。
メディアとしてはDVDしか対象にしていないようです。
udftoolsパッケージのcdrwtoolコマンドで下記のようにするとエラーになりました。
# cdrwtool -d /dev/cdrom -q
mkudffsコマンドはどうでしょうか。UDFファイルシステムを作成します。
mkudffs [オプション] デバイス [ブロック数]
--media-typeオプションでメディアの種別を指定しますが、いろいろ試してもエラーになってしまいました。
genisoimageコマンドでもUDFファイルシステムが作成できます。ただし、UDFだけのイメージは作れません。
試してみたところ、きちんとUDFでイメージを作ることができました。Linuxでマウントすることもできます。しかし、追記するとLinuxでマウントできなくなりました。どこに問題があるのかは分かりません。