2013年3月10日日曜日

LVM領域・ZFS領域を削除後元に戻すコマンド

2013-03-10:作成
2013-03-15:タイトルの「exFAT移行失敗、」を消去しました
2013-03-21:rsyncのコピー元がデバイス名になっていたため修正しました。
2013-03-25:タイトルを変更しました。元は「LVM上のZFSを削除後復旧させる」
2013-06-28:書き忘れていましたが一ヶ月ぐらいでexFATが壊れたので 移行しました

家のUbuntu Linuxで重複排除を目的にLVMのLV上でZFSを使っていたのですが、 LVM、ZFS、パーティションも8つあるので、どこに何があるのかよくわからなくなってきました。 家でWindowsを使用することが多くなってきたので、ZFSをやめ、 Windowsでも使用できるようにexFATに移行することにしました。

ちなみにZFSの重複排除の圧縮率は1.1~1.2ぐらいでした。

まず、WindowsでフォーマットしたexFATのパーティションをマウントします。 ちなみに現在最新版のUbuntu 12.10です。:

# apt-get install fuse-exfat
# mkdir /mnt/exfat
# mount -t exfat-fuse /dev/sdb2 /mnt/exfat

データをコピーします。通常オプションは-aですが、パーミッション等がexFATに存在しないため、 エラーがたくさん表示されます。気になるので、-rオプションでコピーを行いました。:

# rsync -r /pool/media/ /mnt/exfat/media/

これで移行完了です。ではZFSの領域を削除するとします。:

# zpool destroy pool
# lvremove /dev/vgdata/data3

とここで気づいたのですが、移行先のexFATのファイルの更新日付がすべて今日の日付になっています。 よく考えてみると-rだけではタイムスタンプはコピーされません。 -rtにする必要がありました。なんだか気になるのですが、もうZFSもその下のLVも消してしまいましたし、 どうしようもありません。

でも、ZFSもLVMもエントリを消した直後で、まだ何も書き込み操作を行うようなことをしていないので、 まだ間に合うかもしれません。

そういえば、LVMに関しては/etc/lvm/archiveにLVM設定のバックアップがあったような気がします。 ということで「/etc/lvm/archive」で検索してみますと、すぐに方法が書かれたブログが見つかりました。助かりました。

  LVM上の操作の復旧方法

では、やってみます。まず設定のバックアップファイルを調べます。 (以下、必要ない部分は消去しています。またID等は改変しています。):

# ls -ltr /etc/lvm/archive/vgdata*
....
-rw------- 1 root root 1466  3月  5  2012 vgdata_00018.vg-rw------- 1 root root 1831  3月  9 00:23 vgdata_00019-1959051948.vg

最後のバックアップが「vgdata_00019-1959051948.vg」のようです。 次にこのファイルのバックアップ内容を確認します。:

# vgcfgrestore -f vgdata_00019-1959051948.vg -l vgdata
   ....
  File:        vgdata_00019-1959051948.vg
  VG name:        vgdata
  Description:    Created *before* executing 'lvremove /dev/vgdata/data3'
  Backup Time:    Sat Mar  9 00:25:31 2013

「Created *before* executing ‘lvremove /dev/vgdata/data3’」とあります。 「/dev/vgdata/data3」を削除する*前*に作成されたもののようです。 このファイルで正しいようなので、復旧させます。 復旧させるには確認コマンドの「-l」オプションを省けばいいだけです。:

# vgcfgrestore -f vgdata_00019-1959051948.vg vgdata
  Restored volume group vgdata

ではLVを使用できるようにアクティブにします。:

# vgchange -ay vgdata
  3 logical volume(s) in volume group "vgdata" now active

LVが復活していることを確認します。:

# lvdisplay -c
  ....
  /dev/vgdata/data3:vgdata:3:1:-1:0:474374380:51200:-1:0:-1:252:1

次にZFSを復旧しなければなりません。どうやって調べましょう。 削除した時の復旧方法なので、削除コマンドのところに書いてあるかもしれません。 「zpool destroy」で検索してみます。開発元(?)のOracleの以下のページが見つかります。

狙い通り以下の記述がありました。

  詳細は、 「破棄された ZFS ストレージプールを回復する」
を参照してください。

ではやってみましょう。 まず復旧できる領域を以下のコマンドで確認します。:

# zpool import -D
  ....
  pool: pool
    id: ************************
 state: ONLINE (DESTROYED)
action: The pool can be imported using its name or numeric identifier.
config:

    pool                               ONLINE
      disk/by-id/dm-name-vgdata-data3  ONLINE

削除したpoolがありました(ちなみにpoolっていうプール名です。紛らわしい)。 復旧は確認コマンドの後ろに復旧するプール名を書くだけです。:

# zpool import -D pool

復旧されていることを確認します。:

# ls /pool

では、再びコピーを行います。:

# rsync -rt /pool/media/ /mnt/exfat/media/

蛇足ですがパーティションを消してしまった後の復旧はsfdiskで行います。 ただし、バックアップは自動で行われないので、構成を変更したら手動で保存しておく必要があります。 よくオプションを忘れるので書いておきます。

  • バックアップ

    sfdisk -d /dev/sda > sda.sfdisk

  • リストア

    sfdisk < sda.sfdisk

0 件のコメント:

コメントを投稿