LANDISK Home HDL4-Gのバックアップとリストア
かなり以前に、LANDISK Home HDL4-Gのバックアップをしたつもりになっていたのですが、不完全でした。
- LANDISK HDL4-Gにtelnet[追記あり]: プラスα空間 (2010年5月29日)
この時は、システム領域しかバックアップせず、md(ソフトウェアRAID)のメタデータをバックアップしていなかったのです。
その反省をふまえ、次の方法でバックアップしなおしました。
- HDL4-G2.0の種HDDデータを作る: プラスα空間 (2013年4月14日)
でも、バックアップしただけで、検証していませんでした。
そうしている内に、もっと確実かつシンプルな方法がわかりました。
この方は、HDL2-A4.0を使っておられるのですが、ディスクのパーティション構造は、HDL2-A4.0と、HDL4-G2.0で、同じ様です。情報ありがとうございます。
この方のウェブページによると、partedコマンドでパーティションテーブルを確認し、理論的に必要な部分だけをバックアップすると言う方法をとられています。非常にスマートなやり方です。
なお、以下の作業には、外付けHDDケース(USB-SATA接続)と、Parallels上のLinux(Ubuntu 12.04)を使っています。また、外付けHDDは、/dev/sdbにつながっているとします。
バックアップ
上記ウェブページ手順をHDL4-G2.0に適用すると、次の様になります。
- パーティションテーブル確認
- システム領域のダンプ
- md領域のメタデータのダンプ
順に解説します。
1. パーティションテーブル確認
Linuxのpartedコマンドで確認できます。
% sudo parted -s /dev/sdb print モデル: Ext Hard Disk (scsi) ディスク /dev/sdb: 500GB セクタサイズ (論理/物理): 512B/512B パーティションテーブル: msdos 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 8225kB 222MB 214MB primary ext2 2 222MB 642MB 419MB primary ext3 3 642MB 1727MB 1086MB primary linux-swap(v1) 4 1727MB 500GB 498GB extended 5 1727MB 2270MB 543MB logical ext3 6 2270MB 500GB 498GB logical
1本500GiBのディスクなので、この様な表示となります。
この表示だと、実際のセクタ数がわかりません。セクタ数を表示するには、次の方法でできます。
% sudo parted -s /dev/sdb u s print モデル: Ext Hard Disk (scsi) ディスク /dev/sdb: 976773168s セクタサイズ (論理/物理): 512B/512B パーティションテーブル: msdos 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 16065s 433754s 417690s primary ext2 2 433755s 1253069s 819315s primary ext3 3 1253070s 3373649s 2120580s primary linux-swap(v1) 4 3373650s 976559219s 973185570s extended 5 3373651s 4433939s 1060289s logical ext3 6 4433941s 976559219s 972125279s logical
ここで注意するのは、5番目のパーティションの「終了」の値「4433939」です。
2. システム領域のダンプ
次のコマンドで、ダンプ(dd)します。
% sudo dd if=/dev/sdb bs=512 count=4433941 | bzip2 -c > HDL4-G20-system.img.bz2
この、countで指定している数字「4433941」は、先ほどの5番目の終了セクタの値「4433939」に、2を足した値です。次のページでは、1を加えていますが、私の場合だと2を加えないと、うまく行きませんでした。
次の図を参考にして下さい。
3. md領域のメタデータのダンプ
linuxのmdadmで作ったversion 0.90のmdのsuperblock(4kB)は、パーティションの終わりの128kBのどこか(64kBでアラインされた所)に書かれています。
なので、次の方法でバックアップできます。
dd if=/dev/sdb bs=512 skip=$((976559220-128*(1024/512))) | bzip2 -c > HDL4-G20-md-metadata.img.bz2
この、skipで使われている数字「976559220」は、6番目のパーティションの終了セクタに1を加えた値となります。その後ろの数字、128*1024は、128kBを表します。それを512で割っているのは、1セクタ(bs)が512Bだからです。
つまり、ディスク(パーティション)の最後から128kB分を引いた分だけスキップして、128kBをダンプしている事になります。
リストア
リストアは、次の手順となります。
- システム領域のリストア
- パーティションテーブル変更のOSへの通知
- md領域のメタデータのリストア
順に解説します。
1. システム領域のリストア
これは非常に単純で、ダンプしたデータをそのままディスクに書き戻すだけです。
% sudo bzip2 -dc HDL4-G20-system.img.bz2 > /dev/sdb
2. パーティションテーブル変更のOSへの通知
このままでは、システム(Linux)でパーティションを認識できません。
次のコマンドで、パーティションテーブルを認識させます。
% sudo partprobe /dev/sdb
うまく行けば、partedコマンドで表示できるはずです。
% sudo parted -s /dev/sdb print モデル: Ext Hard Disk (scsi) ディスク /dev/sdb: 500GB セクタサイズ (論理/物理): 512B/512B パーティションテーブル: msdos 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 8225kB 222MB 214MB primary ext2 2 222MB 642MB 419MB primary ext3 3 642MB 1727MB 1086MB primary linux-swap(v1) 4 1727MB 500GB 498GB extended 5 1727MB 2270MB 543MB logical ext3 6 2270MB 500GB 498GB logical
3. md領域のメタデータのリストア
最後は、メタデータをリストアします。
% bzip2 -dc HDL4-G20-md-metadata.img.bz2 | sudo dd of=/dev/sdb bs=512 seek=$((976559220-128*(1024/512)))
seekの数字の意味は、バックアップのskipの値と同じ考え方です。
確認
リストアが終わったら、そのドライブだけHDL4-Gに刺して、起動を確認します。RAID崩壊モードで立ち上がれば成功です。PC(Mac)のIPアドレスを、192.168.0.1など、192.168.0.0/24のセグメントに入れてから、http://192.168.0.200/にアクセスすれば、起動が確認できるはずです。
実は、最初の頃は、本当にバックアップとリストアができているかどうか、不安でした。
この方法で確認が取れたのも、次の改造のおかげです。
- LANDISK Home HDL4-Gにシリアルコンソール付けました: プラスα空間 (2014年2月25日)
自動化
この作業の確認をするために、何度もバックアップとリストアを繰り返しています。面倒だったので、bashスクリプト化しました。
私の環境ではうまく行きました。あくまでも、参考用と言う事で掲載します。うまく動かなくても、保証はできません。
DEVICEとDRIVEの定義は、適当に修正して下さい。
バックアップ
#/ussr/bin/bash
DEVICE=/dev/sdb
DRIVE=HDL4-G20
parted -s $DEVICE print > $DRIVE.parted.size.txt
parted -s $DEVICE u s print > $DRIVE.parted.sec.txt
NO5END=`egrep '^ *5' $DRIVE.parted.sec.txt | cut -d 's' -f 2 | sed -e 's/ //g'`
NO5ENDCOUNT=$(($NO5END+2))
NO6END=`egrep '^ *6' $DRIVE.parted.sec.txt | cut -d 's' -f 2 | sed -e 's/ //g'`
NO6ENDSKIP=$(($NO6END-128*(1024/512)+1))
echo "system"
#echo $NO5ENDCOUNT
dd if=$DEVICE bs=512 count=$NO5ENDCOUNT | bzip2 -c > $DRIVE-system.img.bz2
echo "md-metadata"
#echo $NO6ENDSKIP
dd if=$DEVICE bs=512 skip=$NO6ENDSKIP | bzip2 -c > $DRIVE-md-metadata.img.bz2
リストア
#/ussr/bin/bash
DEVICE="/dev/sdb"
DRIVE="HDL4-G20"
parted -s $DEVICE print
parted -s $DEVICE u s print
echo "system"
bzip2 -dc $DRIVE-system.img.bz2 > $DEVICE
partprobe $DEVICE
parted -s $DEVICE u s print > $DRIVE.parted.sec-restore.txt
NO6END=`egrep '^ *6' $DRIVE.parted.sec-restore.txt | cut -d 's' -f 2 | sed -e 's/ //g'`
NO6ENDSKIP=$(($NO6END-128*(1024/512)+1))
echo "md-metadata"
bzip2 -dc $DRIVE-md-metadata.img.bz2 | dd of=$DEVICE bs=512 seek=$NO6ENDSKIP
parted -s $DEVICE print
parted -s $DEVICE u s print
これで、いつでもシステムを初期状態に戻せる様になったので、やりたい放題です。もう何も恐くない。う〜ん、でも、何でこんなにLANDISK HDL4-Gに固執するんだろう? まあ、頭の体操みたいな物です。メリットはあまりありません。
ディスカッション
コメント一覧
まだ、コメントがありません