(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でマウントできなくなりました。どこに問題があるのかは分かりません。