CD-Rにバックアップを取る

(2007.8.30 新規作成。2007.10.4 公開。)

Linux機でデータをバックアップするのに、CD-Rに追記する手順をメモします。

Webで古めの方法は見つかりますが、Linuxのバージョンが上がったりして状況が変わったりしているので、新たにまとめてみました。Fedora 7 Linuxで確認しています。

CD-Rは書き換え不能ですから、メディア破損を除いて、バックアップデータが失われることはありません。また、副次的に、バックアップ時点でのデータはCD-Rに保存されているとおりなのは確実です。(ディスクをコピーして改竄することができるので、保証はできませんが。)

CDのデータ構造

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を拡張したフォーマットもあります。

CD-ROM data mode 1
Yellow Bookでの標準。ユーザデータは2,048バイト。
CD-ROM data mode 2
エラー訂正を省略。オーディオ、ビデオデータ用。ユーザデータ長は2,336バイト。

モード2をさらに二つに区分し、

  • CD-ROM XA mode 2 form 1 -- 2,048バイト、データ用
  • CD-ROM XA mode 2 form 2 -- 2,324バイト、オーディオ・ビデオ用

ドライブの情報を得る

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
(以下略)

GUIで書き込み

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

genisoimageコマンド

ファイルシステムイメージの作成は、以前はmkisofsコマンドでおこなっていましたが、Fedora 7では、mkisofsコマンドはgenisoimageへのシンボリックリンクです。このコマンドはgenisoimageパッケージに含まれます。

genisoimageコマンドは、ISO 9660 / Joliet / HFSファイルシステムイメージを作成します (pre-mastering)。

書式は、

genisoimage [オプション] [-o ファイル名] パス指定 [パス指定 ...]

主なオプションは、

-R
Rock Ridge拡張を作成。
-o ファイル名
イメージを出力するファイル名。
-C ディスクセッション情報 -M デバイスファイル
ディスクに追記する場合に与える。ディスクセッション情報は、wodim -msinfoコマンドの戻り値。-Mオプションを同時に付けると前回のセッションの続きとなるようなファイルシステムイメージを作成し、-Mを付けなければ新しいセッションのためのイメージを作成する。
-graft-points
genisoimageに与えるパス指定が、CDパス=ローカルパス、という形式になる。CDパスはCDファイルシステムのルートディレクトリに作られる。

graft-pointsを指定するのがミソで、これがないとgenisoimageコマンドに与えたローカルパスの中身がCDのルートディレクトリに来てしまいます。

wodimコマンド

CD-Rへの書き込みは、以前はcdrecordコマンドでしたが、こちらも替わっていて、Fedora 7 ではcdrecordコマンドはwodimへのシンボリックリンクになっています。このコマンドはwodimパッケージに含まれます。

wodimパッケージは、cdrkitから作られており、これはcdrecord (cdrtools) のライセンスがfree (自由) ではないものに変更になったため、forkしたプロジェクトです。

wodimコマンドの書式は、

wodim [一般オプション] dev=出力デバイス [トラックオプション] トラック1 トラック2 ...

主な一般オプション。詳しくはman wodimしてください。

-eject
書き込みが終わったらメディアを排出する。
-data
CD-ROM mode 1フォーマットで書き込む。
-dao
-sao
SAO (Session At Once) あるいは Disk At Onceモード。
-tao
TAO (Track At Once) モード。
-multi
マルチセッションCDを作る。後ろにさらにセッションを書き込めるようにする。最後のセッションにしたい(もうセッション追加しない)ときは指定しない。

このオプションを指定すると、デフォルトでは CD-ROM XA mode 2 form 1 (セクタ長 = 2048バイト) になる。

-v
詳細に状況を表示。

UDFファイルシステム

以下は余談ですが、CD-RにUDFファイルシステムが載らないか試してみました。UDFファイルシステムは、DVDなどでも使われているファイルシステムで、CD-Rのように追記型メディアでも使えることになっています。

結論から言えば、今のところ、うまくいかないです。

growisofsコマンド

dvd+rw-toolsパッケージのgrowisofsコマンドは、mkisofsのラッパです。

メディアとしてはDVDしか対象にしていないようです。

udftools

udftoolsパッケージのcdrwtoolコマンドで下記のようにするとエラーになりました。

# cdrwtool -d /dev/cdrom -q

mkudffsコマンドはどうでしょうか。UDFファイルシステムを作成します。

mkudffs [オプション] デバイス [ブロック数]

--media-typeオプションでメディアの種別を指定しますが、いろいろ試してもエラーになってしまいました。

genisoimage

genisoimageコマンドでもUDFファイルシステムが作成できます。ただし、UDFだけのイメージは作れません。

試してみたところ、きちんとUDFでイメージを作ることができました。Linuxでマウントすることもできます。しかし、追記するとLinuxでマウントできなくなりました。どこに問題があるのかは分かりません。

サイト内関連ページ

LinuxでDVDを作成
デスクトップユーザ向けの話題。

外部リンク

Welcome to Orange Forum Web Site
メーカで組織されていた団体。技術解説が正確。
pdumpfs: Plan9もどきのバックアップシステム
別ハードディスクにバックアップを取る方法もあります。pdumpfsは過去のデータも参照できるので、安心です。