プールは、スナップショットの一部であるファイルデータへの永続的なデータ破損を受けています。ファイルデータがファイルシステムの一部であり(スナップショットの一部ではない)場合、適切なバックアップコピーからファイルを回復するだけで済みます。スナップショットまたは(部分的な)のコピーからスナップショット内のファイルを回復または修復(および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
これが私の少し一般化された解決策です:
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
を回復するためにそれらを失わないようにしたいのですが。
非冗長プールの代わりに冗長プールを使用することをお勧めします(常に可能とは限りません)。上記の問題は、冗長プールでは発生しない可能性があります。また、スナップショットのクローンを作成する(ファイルを取得する)方が、どこかに再作成するよりも高速です(もちろん、ハードウェアの障害についての苦情がない場合)。