プラスα空間

ブログ in お市 のーと

LANDISK Home HDL4-Gのバックアップとリストア

かなり以前に、LANDISK Home HDL4-Gのバックアップをしたつもりになっていたのですが、不完全でした。

この時は、システム領域しかバックアップせず、md(ソフトウェアRAID)のメタデータをバックアップしていなかったのです。

その反省をふまえ、次の方法でバックアップしなおしました。

でも、バックアップしただけで、検証していませんでした。

そうしている内に、もっと確実かつシンプルな方法がわかりました。

この方は、HDL2-A4.0を使っておられるのですが、ディスクのパーティション構造は、HDL2-A4.0と、HDL4-G2.0で、同じ様です。情報ありがとうございます。

この方のウェブページによると、partedコマンドでパーティションテーブルを確認し、理論的に必要な部分だけをバックアップすると言う方法をとられています。非常にスマートなやり方です。

なお、以下の作業には、外付けHDDケース(USB-SATA接続)と、Parallels上のLinux(Ubuntu 12.04)を使っています。また、外付けHDDは、/dev/sdbにつながっているとします。

バックアップ

上記ウェブページ手順をHDL4-G2.0に適用すると、次の様になります。

  1. パーティションテーブル確認
  2. システム領域のダンプ
  3. 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を加えないと、うまく行きませんでした。

次の図を参考にして下さい。

LANDISK Home HDL4-G parted

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をダンプしている事になります。

リストア

リストアは、次の手順となります。

  1. システム領域のリストア
  2. パーティションテーブル変更のOSへの通知
  3. 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/にアクセスすれば、起動が確認できるはずです。

実は、最初の頃は、本当にバックアップとリストアができているかどうか、不安でした。

この方法で確認が取れたのも、次の改造のおかげです。

自動化

この作業の確認をするために、何度もバックアップとリストアを繰り返しています。面倒だったので、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に固執するんだろう? まあ、頭の体操みたいな物です。メリットはあまりありません。

コメントを残す