web-dev-qa-db-ja.com

ZFS-スナップショット内の破損したファイルをバックアップから回復または修復しますか?

プールは、スナップショットの一部であるファイルデータへの永続的なデータ破損を受けています。ファイルデータがファイルシステムの一部であり(スナップショットの一部ではない)場合、適切なバックアップコピーからファイルを回復するだけで済みます。スナップショットまたは(部分的な)のコピーからスナップショット内のファイルを回復または修復(およびZFSによって報告されたエラーをクリア)するにはどうすればよいですか?1)プールのコピー?

1 部分コピーに少なくとも影響を受けるスナップショットと、影響を受けるプール上の前のスナップショットが含まれている場合。

非常に工夫された例を簡単に再現できます。

(bash)シェルプロンプトから:

cd
mkdir zfs-test
for i in {1..2}; do dd if=/dev/zero of=zfs-test/tank-file$i bs=1G count=1 &> /dev/null; done

Sudo zpool create tank1 ~/zfs-test/tank-file1
Sudo zpool create tank2 ~/zfs-test/tank-file2

Sudo zfs snapshot tank1@snapshot1
Sudo sh -c 'zfs send tank1@snapshot1 | zfs receive -F tank2'

16進エディタで簡単に見つけることができるコンテンツを含むテキストファイル/ tank1/test-text-fileを作成します。これが私が使ったものです:

Lorem ipsum dolorは、amet、consectetuer adipiscingelitに座っています。 Aenean commodo ligula egetdolor。アエネアンマッサ。兼社会性natoque penatibus et magnis disparturient montes、nascetur ridiculus mus。 Donec quam felis、ultricies nec、pellentesque eu、pretium quis、sem。 Nulla consequat massa quisenim。 Donec pede justo、fringilla vel、aliquet nec、vulputate eget、arcu。 enim justo、rhoncus ut、imperdiet a、venenatis vitae、justoで。 Nullam dictum felis eu pede mollispretium。 Integer tincidunt。クラスダピバス。 Vivamus elementum sempernisi。 Aenean vulputateeleifendtellus。 Aenean leo ligula、porttitor eu、consequat vitae、eleifend ac、enim。 Aliquam lorem ante、dapibus in、viverra quis、feugiat a、telrus。 Phasellus viverra nulla ut metus variuslaoreet。風変わりな轍。アエネの帝国。 Etiam ultricies nisi velaugue。 Curabitur ullamcorper ultricies nisi。ナムエゲット飲酒運転。

再びシェルプロンプトから:

Sudo zfs snapshot tank1@snapshot2
Sudo sh -c 'zfs send -i tank1@snapshot1 tank1@snapshot2 | zfs receive -F tank2'

今、あなたはファイルデータを破壊する必要があります。 ht を使用して、「dui」を検索し、「duh」に変更しました。

データが破損していることが確認できます。

Sudo zpool scrub tank1; Sudo zpool status -v tank1
  pool: tank1
 state: ONLINE
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://zfsonlinux.org/msg/ZFS-8000-8A
  scan: scrub repaired 0 in 0h0m with 1 errors on Sun Jan 11 20:16:30 2015
config:

        NAME                               STATE     READ WRITE CKSUM
        tank1                              ONLINE       0     0     1
          /home/kenny/zfs-test/tank-file1  ONLINE       0     0     2

errors: Permanent errors have been detected in the following files:

        tank1@snapshot2:/test-text-file
4
Kenny Evitt

これが私の少し一般化された解決策です:

Sudo cp /tank2/test-text-file /tank1/test-text-file
Sudo zfs snapshot tank1@snapshot3
Sudo sh -c 'zfs send -i tank1@snapshot2 tank1@snapshot3 | zfs receive -F tank2'
Sudo zfs rollback -r tank1@snapshot1
Sudo sh -c 'zfs send -i tank2@snapshot1 tank2@snapshot3 | zfs receive -F tank1'
Sudo zpool scrub tank1; Sudo zpool status -v tank1

そして、他にエラーが報告されていないと仮定します。

Sudo zpool clear tank1

私がsnapshot3を作成した理由は、それが私の(非常に考案された)例に必要だったからではなく、おそらく開発するのが良い習慣であるためです(そして、私は当初、期待どおりに機能するかどうかをテストしたかった)。もしtank1以降にsnapshot2以降に変更があった場合あったtest-text-fileを回復するためにそれらを失わないようにしたいのですが。

1
Kenny Evitt

非冗長プールの代わりに冗長プールを使用することをお勧めします(常に可能とは限りません)。上記の問題は、冗長プールでは発生しない可能性があります。また、スナップショットのクローンを作成する(ファイルを取得する)方が、どこかに再作成するよりも高速です(もちろん、ハードウェアの障害についての苦情がない場合)。

2
drookie