色々な面でのバックアップはエンジニアにとって必須の習得項目だ。
プログラムでのバージョン管理やデータの自動保存など、様々な面でバックアップは行っているはずだ。
Linuxを使うときもバックアップは必須で、これがないと怖くてやってられない。
このページではLinuxでの「バックアップ」について全般的にまとめてみた。参考にしていただければと思う。
目次
リスクとバックアップについて
スマホ普及のお陰か、一般の人でも「バックアップ」という言葉自体の意味がわからない人はほとんどいなくなった。それくらい日常的に行われているのがデータのバックアップだ。
仕事のデータをオペレーションミスで削除しても復元できるように違うディレクトリにコピーする。これは「論理的なデータ損失」に対しての対策だ。
内蔵のHDDが故障してもデータを失わないように、外付けの記憶媒体へ保存する。NASなどのファイルサーバに定期的にデータをコピーしておくなど、これらは「物理的な故障と損失に対しての対策」だ。
ファイルサーバに定期的に自動でデータをコピーしておく、ここからは「計画的なバックアップ」である。
それが論理的なものか物理的なものか、計画的か気紛れかはさておき、結果的にはバックアップとは「成果を失うことを回避する」ということになる。
例えばあなたが4時間かけて書いたWordデータがHDDの故障でなくなった場合、それは純粋に損失であり、4時間を失ったということになる。
さらにはNFSをマウントしているとき、要するに顧客のサーバにつないでいるとき不意にrmコマンドを誤操作してしまったとき、そこに「顧客のデータ」が存在していたら?それは会社の存続にかかわってくる。
データという成果物の価値が高いほど、バックアップは重要になってくるのである。
バックアップの形式
バックアップの形式にも種類がある。
ファイル単位のバックアップ
「単純にファイルをコピーする」これはもっとも古典的かつ一般的なバックアップである。ファイルの大小、形式を問わない。
重要だと思われるファイルやディレクトリをちがう場所、外部記憶媒体、ネットワークファイルサーバなどにコピーするということだ。
もっとも単純なため、スクリプトや後でお伝えするcronなどを利用して、定期バックアップなどにも簡単に応用できる。バックアップの基礎である。
tar、cpやrsyncコマンドを使う。
イメージ単位のバックアップ
イメージ単位というとわかりにくいかもしれない。ディスク丸ごとバックアップを意味していると思っておくといい。
これはシステム復旧や環境の複製などによく使われる手段である。
そのため巨大なイメージファイルが生成されることも多い。HDDなどを丸ごとバックアップするときなどにイメージ単位のバックアップがおこなわれる。dumpとrestoreやddなどを使うとこれが実現できる。特にddはファイルシステムに関係なく記憶媒体の配列をそのまま他の記憶媒体に保存および、書き込みができるため、環境の丸ごとの複製を作成するときに重宝する。
バックアップの種類
続いて用語としてよく使われるバックアップの種類を紹介しよう。
フルバックアップ
形式を問わず、まるごと「全てのバックアップ」をとることを「フルバックアップ」という。このフルバックアップは「復元すると完全に元の状態と同じ」になる。簡潔で分かりやすいがバックアップに非常に時間がかかる。
差分バックアップ
前回の「フルバックアップから最後に至るまで」が「差分バックアップ」である。前回のフルバックアップと差分バックアップがあればデータは完全に元の状態と同じになる。
増分バックアップ
0を前回のフルバックアップとして1のとき、2のとき、3のとき、とそのときおり増加した分だけバックアップを取る方法を「増分バックアップ」と言う。
完全に復元するにはフルバックアップ0と増加した1、2、3の「全ての増加分が必要」である。そのときどきのバックアップ時間は短くなるが、バックアップ回数が増える、そして途中の増加分を紛失した場合復元は不可能になる。
一般的なバックアップのための記憶媒体
HDDなどの大容量記憶媒体
現代では大容量のフラッシュメモリやHDD、SSDといった大容量記憶媒体をUSBなどを使い簡単に接続できるようになっている。
もっともポピュラーな媒体だろう。値段は容量や性能、方式によってことなるが、現代では数GBで1000円未満で購入できる。
自由に書き換えが出来、書き込み回数の限界があるものの、一般使用範囲ないでは充分な耐久性をもっている。
しかし扱うにあたってフォーマットが必要である、ファイル形式がOSごとに異なると読みこめないファイル形式もでてくる。例えばext4はWindows環境で読み込むことができないなどだ、またfatやfat32といった一部のファイルシステムはパーミッション情報を保持できないなどの点を注意していただきたい。
光学ディスク
一般的に入手できるなかでは単価は最も低い部類にはいるCDは650から700MB、一般的なDVDは4.8GBほどで、目安として50枚ほどで1500円程だ。
現在はDVDの方が入手性及び容量に鑑みてCDより普及しているだろう。
規格が幾つか存在する。ドライブが対応しているか、ソフトウェアが対応しているか、など予め確認しておく必要がある。またDVDRWなどはフォーマットすれば繰り返し書き込みが可能となっている。
growisofsなどのコマンドでデータを書きこむことになる。
テープドライブ
低コストで大容量な記憶媒体である。
しかし一般では余り見かけない。サーバストレージや工業用のファクトリーコンピュータなどに搭載されていることがある。最近になって低コストかつHDDをこえるほど大容量であり、運用時に消費電力が低く、コンパクトであることからサーババックアップストレージとして復権をはたしている。
VHSビデオテープを想像してもらえるとわかるが上から順にアクセスするシーケンシャルアクセスはよいがランダムなアクセスに弱いという特徴がある。規格は多くあるのだが最大記憶密度は15TB程である。ただしドライブが非常に高価なため、一般の方が購入することは殆どないだろう。そういうメディアがあるという認識で充分だ。
バックアップの為のコマンド
それでは、バックアップのためのコマンドをご紹介していこう。
cp
バックアップをとるとき最も単純な方法はコピーをとることである。
$ cp hogefile path/
でhogefileのコピーがpathディレクトリのなかに作成される。
ディレクトリごとコピーしたい場合は-rオプションをつけるcp -r hogedir path/とするとpath/hogedirというようにディレクトリごとコピーされる。パーミッション情報を保持してコピーしたい場合は -a オプションをつける、パーミッションを始めとした構造と属性をできるだけ保持してコピーすることができる。ただしこれはGNUの独自オプションでありBSDなどでは通用しない可能性がある。その場合-pRがそれにほぼ同じ動作となる。
cp オプション
-f 既存のコピー先のファイルを削除しそのうえでコピーを配置する。
-i コピー先に同じファイルがある場合といあわせる。
-p タイムスタンプとパーミッション情報を保持してコピーする。
-r 再帰的にコピーをおこなう。
-R ほぼ-rオプションとかわらない。スペシャルファイルへの特性を保持したままコピーできるところに差がある。
くわしくは下記でお伝えしている。
tar
このコマンドは複数のファイルを一つのファイルにまとめる、アーカイブするコマンドだ。tar自体は圧縮操作を行わない。通常他の圧縮コマンドgzipやbzip2などとあわせて使用される。
これらアーカイブを利用すると、ファイルサイズが小くなる。また、複数のファイルを一つにまとめることで管理がしやすくなるという利点がある。
gzipとtarを組み合わせたアーカイブ方法は以下のようになる。
$ tar cvzf <できあがるファイル名.tar.gz> <アーカイブディレクトリや複数のファイル>
解凍するときは
$ tar xzvf <hoge.tar.gz>
bzip2とtarを組み合わせたアーカイブ方法は以下のようになる。
$ tar cvjf <できあがるファイル名.tar.bz2> <アーカイブディレクトリや複数のファイル>
解凍するときは
$ tar xzvf <hoge.tar.bz2>
である。またLinuxの場合
$ tar xvf <hoge.tar.gzもしくはhoge.tar.bz2>
などを自動判別して解凍してくれる。
rsync
rsyncコマンドはディレクトリとディレクトリを同期することができる。
またローカルだけでなく、ネットワーク越しに同期することも可能である。--deleteオプションをつかうとコピー元にないファイルやディレクトリは削除される。
同期という意味では正しい挙動だが、論理的なデータ損失につながるので、コピー先に容量に余裕があるのならばあえて使わないという選択肢もあるだろう。ケースバイケースだがrsync -au <コピー元> <コピー先>としておけば満足のできる結果がえられることが多い。
$ rsync オプション <コピー元> <コピー先>
rsync オプション
-a コピー元のディレクトリを再帰的にオーナー、グループ、パーミッション、タイムスタンプをそのままコピーする。オプション -rlptgoD と同等。
-u コピー元とコピー先を比較し、追加や更新されたファイル、ディレクトリのみをコピーする。
-v コピーしているファイル名などの情報を表示する。
--delete コピー元にないディレクトリやファイルを削除する。
またコピー元で指定するディレクトリ名の最後に「/」を付けた場合、ディレクトリ内のファイルをコピーする、「/」を付けなかった場合は、ディレクトリごとコピーするという挙動に気をつけていただきたい。コピー先に存在しないディレクトリは自動で生成される。
rysncはデーモンとして起動することができる。使用されるポートは
ポート873番
である。
/etc/rsyncd.conf 一例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
uid = root gid = root log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid [opt] path = /opt read only = no |
これはあくまでも説明のための簡易的な一例であり、セキュリティを考慮していないので、実用段階ではポート番号指定やアクセス元制限、ユーザ認証などを設定すること。
デーモンとして起動
# rsync --daemon --config=/etc/rsyncd.conf
同期するときは
$ rsync -avu rsync://192.168.XXX.XXX/opt/ .
などでワーキングディレクトリにサーバのoptディレクトリ内の全てのファイルがコピーされる。rsyncをデーモンとして起動する場合init管理のスクリプトを作成管理した方がよい。
dumpとrestore
これらはファイルシステムのext2、ext3、ext4で有効な手段だ。
# dump -0uf /mnt/backupUSB/dump-sda1.dumpbackup /dev/sda1
とすると/dev/sda1の全ての内容が/mnt/backupUSBにdump-sda1.dumpbackupとして保存される
# restore -rf /<path>/dump-sda1.dumpbackup
復元するにあたってはrestoreコマンドを使用する。ここでは現在のワーキングディレクトリにdump-sda1.dumpbackupの内容が全てレストアされる。またdumpは増分バックアップに対応している。
dumpオプション
0~9 バックアップレベルを指定する0の場合フルバックアップになる。
- u /etc/dumpdatesファイルに記録および更新
- f ダンプ出力先のファイルもしくはデバイスを指定
バックアップレベルについてはフルバックアップを0としたものを基準点として、それよりも大きな数のレベルが設定された場合は、その設定したレベルよりも低い部分からの変更された部分のみがバックアップされる。1、2、3としてゆけば順に増分バックアップされてゆく。
restoreオプション
-r 対話せず一括で復元
-f バックアップファイルを指定
restoreする場合フルバックアップをレストアしてからから順に1、2、3と作成したダンプファイルをレストアしてゆくことになる。
dd
このコマンドは単純でディスクのデータ配列をそのままファイルとして出力したり、そのファイルをデバイスに書きもどしたりなどができる、圧縮などは一切しないぶん単純でわかりやすいだろう。
# dd if=/dev/sda of=/backup.img bs=64k
ddオプション
if=入力元のファイル、もしくは/dev/sda1や/dev/cdromなどのデバイスファイルを指定する。
of=出力先のファイル、もしくは/dev/sda1や/dev/cdromなどのデバイスファイルを指定する。
bs=一度で転送されるデータサイズ(bytes)を指定
ifとofの入出力先はよく確認すること、間違えもしくは、逆を指定してしまった場合取り返しがつかないことになる。余談だがこのコマンドはバックアップの他、フォレンジクスするときにデータ解析の為の複製を作るために使用されることがある。
growisofs
このコマンドを使うとDVD-R、DVD±R、DVD+RWといったメディアへデータを書きこむ事ができる。
# growisofs -Z /dev/dvd -R -J <ファイルやディレクトリ>
とするとファイルを書きこむことができる。DVDRの場合は書きこまれディスクがクローズされる。DVDRWの場合再度上書きされる。
# growisofs -M /dev/dvd -R -J <ファイルやディレクトリ>
とするとDVDRWの場合追加書き込みが可能になる。
/dev/dvdはデバイスを指定している、環境によって変る可能性があるので各自あわせてほしい
growisofsオプション
-Z最初の書き込みを指定
-M既存の状態に新しい物をマージ。
-R Rock-Ridge を指定
-J Joliet拡張フォーマットを有効にする。
バックアップ定期実行
cronの利用
cronを利用することでコマンドやスクリプトの定期実行が可能になる。cp、tar、rsyncなどを使用しバックアップを行う処理を一連のスクリプトにしておいて、cronで自動実行すると計画的なバックアップが可能である。
$ crontab -e
とすると、エディタが立ち上がり設定ファイルを編集できる
分 時 日 月 曜日 [実行スクリプト]
という形式で記述する、たとえば「毎時20分に/home/hoge/cron/backup.shを実行したい」場合
20 * * * * /home/hoge/cron/backup.sh
となる。それぞれの項目は
分 0~59
時 0~23
日 1~31
月 1~12
曜日 0~7 0および7=日、1=月、2=火、3=水、4=木、5=金、6=土
の値で調節できる。
まとめ
Linuxのバックアップについて概要をまとめてきたが、いかがだっただろうか?
バックアップはエンジニアとしての必須技能だ。知るだけではなく、それぞれのコマンドは使いこなせるようになっておこう。
rsyncは--link-destオプションでハードリンクをうまく利用した世代バックアップがおすすめ。
バックアップにかかる時間や容量のコストは増分バックアップと変わらないのに、できたバックアップはどの世代をとっても全てがその時点のフルバックアップであり、世代間の繋がりなど考慮せず不要な世代は削除できる優れた方法です。