12. HDDのバックアップ

SOHOに適したHDDのバックアップ方法について3回に分けて解説していきます。

SOHOと言えどHDDのバックアップをないがしろにしてはいけません。いくらディスクをRAID構成にしたからといっても、貴重なデータの消失の可能性はあります。プログラムやスクリプトの不具合や操作ミスによるデータの消失・ファイルシステムの異常,地震や台風・雷などの自然災害の影響などなど。

そもそもRAID1にしたって2つのHDDが短期間の内に続けて壊れることもあります。同一ロットのHDDでRAID1を構成すれば故障も計ったように同時期に訪れることがあります。2台のHDDでRAID1を構成した場合には、もう1台予備のHDDを用意し、RAIDの片方のHDDを定期的に交換することでその時期を故意にずらすという運用もあります。

さて、教科書(?)によれば、サーバ単独のバックアップはdumpコマンドでテープドライブへ・・・となっています。しかし高価なテープドライブと入手困難なテープメディアによるバックアップ運用はSOHOにとって現実的ではありません。

通常フルバックアップを行うためにはシステムを停止させなければなりません。シングルユーザモードで立上げ、ディスクボリューム単位でテープメディアにダンプというのが標準的なフルバックアップ作業になります。当然ながらこの間サーバとしてのサービスは提供できません。

ディスク容量にもよりますが、確認等の作業を含めると半日を要す作業となり、バックアップサーバを持たないSOHOにとってはとても頻繁にできるものではありません。せいぜい年に1〜2回といったところです。

そこで本稿ではSOHO向けの安価でより現実的なバックアップ方法について次の3種類の方法をご紹介します。

  • CD-Rによるデータのバックアップ
  • 市販ネットワークドライブを利用したデータのバックアップ
  • RAID1を利用した究極の(?)フルバックアップ

それぞれの方法の特徴を比較し、まとめたのが次の表です。

バックアップ方法 バックアップ規模 フル
バックアップ
自動化 メディア
可搬性
CD-R 〜700MB × ×
ネットワークドライブ 〜100GB以上
RAID1利用 〜100GB以上

CD-Rは大容量のバックアップはできず、バックアップの自動化にも向きませんが、なんと言っても可搬性の良さやコストの低さは魅力です。重要なデータのみを手動でバックアップするにはもってこいです。

ネットワークドライブにバックアップする方法のメリットは、cronなどによる定期バックアップの自動化が容易であるという点です。また比較的付け外しが容易なため、運用上の足枷にならない点も長所であるといえます。

「RAID1利用」というのは、ミラーリングされたHDDを外してバックアップとして保管するというものです。つまりRAID1を積極的に利用するものです。当然HDD丸ごとのバックアップに相当します。ただしこの方法はシステムの停止を伴いますから頻繁に行うものではありません。

今回はそれぞれの方法について限定的ではありますが具体的な説明をしたいと思います、その前に重要なことを決めなければいけません。

バックアップ本来の目的は「いざという時にシステムを復旧できること」であることを思い出してください。つまり確実な復旧手順に基づくバックアップ計画を立てておくことが大前提なのです。

13. パーシャルバックアップ計画

パーシャルバックアップとは、システム復旧に必要な部分のみのバックアップをとる事と捉えてください。例えば次のディレクトリのバックアップをとります。

ディレクトリ バックアップの対象
/etc Linuxのほとんどの設定ファイル
/boot/grub カーネルブートパラメータ設定
/home ユーザ固有のファイル群
/usr/local 個別にインストールしたコマンド,データなど
/var/lib アプリケーションのデータ群 (MySQLのテーブルなど)
/var/www Webトップページ(ここに設定している場合)
/var/log/httpd Webログ(Webalizerなどの解析ツールが参照)

さてこのパーシャルバックアップがある前提で、ディスククラッシュなどにより、HDDの内容が全て失われた時のことを考えましょう。

その場合は新規ディスクにLinuxをインストールする作業から始めなければなりません。予想される作業は以下のとおりです。LinuxディストリビューションをRedHat Linux 9とすると、

  1. RedHat Linux 9の新規インストール,最低限の設定 ・・・ 約3時間
  2. パッケージのオンラインアップデート ・・・ 数時間〜1日
    up2date または apt-get によるアップデート。 回線スピードと規模により所要時間は変わる。
  3. パーシャルバックアップからのリストア ・・・約1時間
  4. 動作確認 ・・・ 約1時間

これを最悪のケースとしましょう。いずれにせよ復旧できないよりはマシです。ただせめて上記1と2は何とか簡略化したいところですね。その方法については後述の「RAID1を利用したフルバックアップ」参照してください。

なお、Linuxのインストール時点から、どのようなパッケージを追加してきたかの履歴をきちんと残しておくことが重要なのは言うまでもありません。

ルーズな私は、とにかく全てのパッケージをインストールしてしまうようにしています。つまりインストーラのパッケージの選択で「Everything」を選び、インストール完了後に不要なサービスを停止させるわけです。こうすれば後からパッケージを追加する必要がなくなるわけですが、アップデートの対象が増えますから、アップデートの頻度や時間は増えます。

14. CD−Rによるバックアップ

ご存知のとおり、CD-Rはいまや最もコストパフォーマンスの良いリムーバブル記録メディアです。ドライブの価格も安く、メディアもコンビニに置かれるほど普及しています。記録速度も問題ありません。
また忘れてならないのがそのポータビリティです。CD-Rに保存されたデータはほとんどのOSで読み出すことができます。

問題はその記録容量が約700MBと比較的少ないということです。このためディスクボリュームのフルバックアップなどの用途には向かず、おのずとパーシャルバックアップに限定されます。

さて能書きはこれくらいにしてLinuxにおけるCD-Rの使い方について解説します。解説はRedhat Linux 9を前提としたものです。

14.1 LinuxでCD-Rを使えるようにするための準備

LinuxでCD-Rにデータを書き込めるようにするためには初期設定が必要です。具体的には、ファイル /etc/cdrecord.conf を編集してお使いのCD-Rドライブに合った設定を行います。以下の手順を参考にしてください。RedHat Linux9でIDEに接続されたATAPI CD-Rドライブを想定しています。
またブートローダはGRUBを使用しているものとします。

手順1. CD-Rドライブが認識されているかどうかを確認する

rootでログインし、cdrecord -scanbusとタイプします。

[root@host root]# cdrecord -scanbus
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 Jg Schilling
Linux sg driver version: 3.1.24
Using libscg version 'schily-0.7'
scsibus0:
0,0,0    0) 'RICOH ' 'DVD/CDRW MP9120 ' '1.10' Removable CD-ROM
0,1,0    1) *
0,2,0    2) *
0,3,0    3) *
0,4,0    4) *
0,5,0    5) *
0,6,0    6) *
0,7,0    7) *
[root@host root]#
  注目すべき部分を赤色で強調しています。実際の出力には色は付きません。

このように出力のいずれかの行にCD-Rドライブの情報が現れればOKです。IDE接続であるのにSCSIデバイスと認識されるのは、LinuxのSCSIエミュレーションによるものです。

出力行の意味は次のとおりです。

0,0,0
順にSCSIバス番号,ターゲットID,LUN(Logical Unit Number)。
0)
「SCSIバス番号×100+ターゲットID」で表した番号。例えばSCSIバス=1,ターゲットID=1では 「101)」 となる。
'RICOH ' 'DVD/CDRW MP9120 ' '1.10' Removable CD-ROM
SCSIのInquiryコマンドで得られたドライブ情報。順にベンダ情報,デバイスID,レビジョン,デバイスタイプ。

RedHat Linux 9 を普通にインストールすればCD-Rドライブはこのように最初から認識できているはずです。もし認識されていない場合は次の「手順2」に進んでください。逆に問題なく認識できている場合は「手順2」はスキップしてください。

手順2. CD-Rドライブが認識されない場合の対処方法

ATAPI接続のCD−RドライブをLinux上で利用するためには

  1. IDEドライバで認識されていること
  2. SCSIエミュレーションによりSCSIデバイスとして認識されていること

の2つの条件を満たす必要があります。

まず条件Aを確認してみましょう。dmesgコマンドによるブートメッセージを調べます。

[root@host root]# dmesg | grep ATAPI
hdd: RICOH DVD/CDRW MP9120, ATAPI CD/DVD-ROM drive
[root@host root]#

このようにCD-Rドライブが認識されていればOKです。認識されていない場合は事態は厄介です。CD-Rドライブを買い替えるか、カーネルのソースを追って認識されない原因を探り、対策するなどの対応が必要になります。

余談ですが、私はEasyHardとSPCというLinux用のSCSIドライバを書いていたことがあります。もう10年も前のことで、カーネルバージョンは1.1でした。当時はカーネルのSCSIドライバを熟知していたので、どのようなSCSI機器も使えるようにできるという自信がありました。
そんな活動をしていたお陰でLinus氏と彼のフィアンセ(今の奥様)とお話したこともあります。とても素敵なカップルでした。

話をもとに戻します。
次は条件B、すなわちSCSIエミュレーションが有効になっているかどうかの確認です。前と同様にdmesgの出力を調べます。

[root@host root]# dmesg | grep -i scsi
Kernel command line: ro root=/dev/md2 hdd=ide-scsi
ide_setup: hdd=ide-scsi
SCSI subsystem driver Revision: 1.00
hdd: attached ide-scsi driver.
scsi0 : SCSI host adapter emulation for IDE ATAPI devices
Type: CD-ROM ANSI SCSI revision: 02
Attached scsi CD-ROM sr0 at scsi0, channel 0, id 0, lun 0
sr0: scsi3-mmc drive: 32x/32x writer cd/rw xa/form2 cdda tray
[root@host root]#

赤くハイライトした部分と同様な行が見えれば問題ないはずです。手順1をもう一度実行して、その結果を注意深く眺めてください。

逆に上のような行が見えない場合はSCSIエミュレーションの設定がなされていないことが考えられます。この場合に調べるファイルは/boot/grub/grub.confです。

# grub.conf generated by anaconda
<中略>
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-20.9)
root (hd0,0)
kernel /vmlinuz-2.4.20-20.9 ro root=/dev/hda2 hdd=ide-scsi
initrd /initrd-2.4.20-20.9.img

赤くハイライトした部分に注目してください。「hdd=ide-scsi」というカーネルオプションが、"hdd"として認識されるIDEドライブをSCSIドライブとしてエミュレーションするための指定です。条件Aを調べた時にそのデバイス名「hd〜」がわかっているはずなので、/boot/grub/grub.confを編集してそのオプションを追加してください。例えばCD-Rドライブがhdcとして認識されていたとすれば、

kernel /vmlinuz-2.4.20-20.9 ro root=/dev/hda2 hdc=ide-scsi

とします。

これが済んだらサーバをリブートしてから、手順2でSCSIエミュレーションが有効になったかどうかを確認してみてください。

手順3. /etc/cdrecord.confの編集

次に/etc/cdrecord.confを編集します。このファイルはcdrecordコマンドがCD-Rへの書き込みを行う際にデフォルトで参照するものです。

注: オリジナルの設定ファイルは /etc/default/cdrecord です。 Redhatディストリビューションではこれが /etc/cdrecord.conf に変更されています。
#ident @(#)cdrecord.dfl 1.4 02/07/07 Copyr 1998 J. Schilling
# The default device, if not specified elswhere
#
CDR_DEVICE=cdr
#
# The default FIFO size if, not specified elswhere
#
CDR_FIFOSIZE=4m
# Unless you have a good reason, use speed == -1 and let
# cdrecord use it's intercal drive specific defaults.
#
# drive name device speed fifosize driveropts
#
cdr= 0,0,0 -1 -1 burnfree

#で始まる行はコメントです。すなわち意味のある行は3行だけです。

CDR_DEVICE=cdr
標準的に使用するCD-Rドライブの名前を定義します。「cdr」が名前で、任意の名前で構いません。
CDR_FIFOSIZE=4m
書き込み時に用いるバッファのサイズを指定します。「4m」は4Mバイトの意味で、通常この値でOKです。
cdr= 0,0,0 -1 -1 burnfree
上のCDR_DEVICEで定義したドライブの仕様を記述します。各値の意味は次のとおりです。
0,0,0
SCSIバス番号,ターゲットID,LUN(Logical Unit Number)
cdrecord -scanbus で得た値
-1 -1
それぞれ書き込み速度,バッファサイズ。-1は自動認識であることを示す
burnfree
バッファアンダーラン防止機構を用いる。ドライブにその機能が備わっている場合にのみ有効
14.2 CD-Rへのデータの書き込み

以上の準備が済んだら実際にCD-Rへの書き込みをしてみましょう。手順は以下の通りです。

手順1. ターゲットディレクトリのアーカイブ

バックアップを目的としますから、ファイルやディレクトリのオーナ,パーミッション,タイムスタンプなどの各種属性を保存する必要があるため、バックアップのターゲットディレクトリをtarコマンドでアーカイブします。

以下の例ではディレクトリ /home と /etc をターゲットとし、それぞれを圧縮しながらアーカイブして2本のファイルを作ります。作業ディレクトリは /var/tmp とします。

[root@host root]# cd /var/tmp
[root@host tmp]# tar cvzf home-20040317.tgz -p -C /home --exclude \*~ .
  <表示省略>
[root@host tmp]# tar cvzf etc-20040317.tgz -p -C /etc --exclude \*~ .
  <表示省略>
[root@host tmp]# ls -l
合計 162644
-rw-r--r-- 1 root root 3524037 3月 17 13:17 etc-20040317.tgz
-rw-r--r-- 1 root root 162850316 3月 17 13:16 home-20040317.tgz
[root@host tmp]#

tarコマンドのオプションの意味は次のとおりです。

cvzf
c
Create : アーカイブ生成
v
Verbose : 詳細経過表示
z
Zip (Compress) : 圧縮
f
File : アーカイブファイル名指定
-C /home または -C /etc
アーカイブ実行前に指定されたディレクトリに移動する
--exclude \*~
指定されたファイルはアーカイブしない。この例では ~ (チルド)で終わるファイル -- すなわちemacsが作るバックアップファイルはアーカイブしない

最後に「ls -l」でファイルサイズを調べてその合計がCD-Rの記録可能容量以内であることを確認します。600MBを目安にすれば良いでしょう。

手順2. CD-ROMフォーマットのイメージファイル作成

次にCD-ROMフォーマット(ISO9660,Joliet)に準拠したイメージファイルを作成します。コマンドは mkisofs です。

[root@host tmp]# mkisofs -r -J -o 20040317.img home-20040317.tgz etc-20040317.tgz
6.15% done, estimate finish Wed Mar 17 13:37:43 2004
12.31% done, estimate finish Wed Mar 17 13:37:43 2004
18.45% done, estimate finish Wed Mar 17 13:37:37 2004
24.61% done, estimate finish Wed Mar 17 13:37:39 2004
  <表示中略>
98.42% done, estimate finish Wed Mar 17 13:37:40 2004
Total translation table size: 0
Total rockridge attributes bytes: 346
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 5444
81296 extents written (158 Mb)
[root@host tmp]#

mkisofsコマンドのオプションの意味は次のとおりです。

-r
ファイル,ディレクトリのオーナや属性を適切に処理する
-J
Windows環境でも読めるようにするためのJolietフォーマット指定
-o 20040317.img
出力するイメージファイル名を指定
手順3. CD-Rへのイメージファイル書き込み

いよいよCD-Rへの書き込みです。CD-Rをドライブにセットしてから次に示す手順に従って下さい。書き込みコマンドは cdrecord です。

[root@host tmp]# cdrecord -eject -dao 20040317.img
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 Jg Schilling
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Linux sg driver version: 3.1.24
Using libscg version 'schily-0.7'
Device type : Removable CD-ROM
  <表示中略>
Track 01: Total bytes read/written: 166494208/166494208 (81296 sectors).
[root@host tmp]#

cdrecordコマンドのオプションの意味は次のとおりです。

-eject
書き込み完了後自動的にイジェクトする
-dao
Disk at once (Session at once) モード指定

/etc/cdrecord.confで指定した条件がデフォルトになるため、コマンドラインはシンプルになります。

手順4. 書き込みの確認

念のためファイルが書き込まれたかどうかを確認します。通常のCD-ROMと同様にマウントしてからlsコマンドで内容を確認します。マウントポイントは /mnt/cdrom とします。確認が終わったらアンマウントしてイジェクトします。

[root@host tmp]# mount /mnt/cdrom/
[root@host tmp]# ls -l /mnt/cdrom/
合計 162476
-r--r--r-- 1 root root 3524037 3月 17 13:17 etc-20040317.tgz
-r--r--r-- 1 root root 162850316 3月 17 13:16 home-20040317.tgz
[root@host tmp]# umount /mnt/cdrom
[root@host tmp]# eject

なお、上の操作でマウント,アンマウントやイジェクトができない場合は次を試してみてください。

[root@host tmp]# mount -rt iso9660 /dev/cdrom /mnt/cdrom/
[root@host tmp]# ls -l /mnt/cdrom/
合計 162476
-r--r--r-- 1 root root 3524037 3月 17 13:17 etc-20040317.tgz
-r--r--r-- 1 root root 162850316 3月 17 13:16 home-20040317.tgz
[root@host tmp]# umount /mnt/cdrom
[root@host tmp]# eject /dev/cdrom

バックアップするディレクトリがいつも同じなら、これまでの一連の操作をシェルスクリプトなどにして簡略化すると良いでしょう。

さてこれでバックアップの第1回は終わりです。ご意見やご要望・ご質問は当社の掲示板でお願いします。
次回は最近安価になってきたネットワークドライブ(NASドライブ)を利用したバックアップ方法を解説します。ご期待下さい。

(石)