ZFS menghapus snapshot dengan interdependensi dan klon

9

Di bawah ini adalah daftar volume dan snapshot ZFS saya, serta asal dan klon untuk masing-masing.

Saya ingin menghapus semua snapshot, tetapi simpan semua sistem file. Bagaimana saya bisa melakukan ini?

Saya telah mencoba zfs promotediikuti dengan mencoba menghapus setiap filesystem untuk berbagai kombinasi filesystem yang berbeda. Ini bergeser di sekitar tempat foto "hidup"; misalnya, zfs promote tank/containers/sixmemindahkan snapshot Fdari tank/containers/three@Fke tank/containers/six@F. Data langsung di sistem file tidak dimodifikasi (yang saya inginkan!), Tapi saya masih tidak bisa menghapus snapshot (yang bukan yang saya inginkan).

Suatu zfs destroyupaya yang khas memberi tahu saya bahwa itu memiliki klon tergantung, beberapa di antaranya (snapshot) yang ingin saya hancurkan, tetapi yang lain (sistem file) yang saya tidak ingin hancurkan.

Sebagai contoh.

# zfs destroy tank/containers/six@A
cannot destroy 'tank/containers/six@A': snapshot has dependent clones
use '-R' to destroy the following datasets:
tank/containers/five
tank/containers/two@B
tank/containers/two

Dalam contoh di atas, saya tidak ingin menghancurkan tank/containers/fiveatau tank/containers/two, tetapi jika saya zfs promotelima dan dua, saya masih tidak dapat menghancurkan snapshot. Apakah ada solusinya?

# zfs list -t all -o name,origin,clones
NAME                         ORIGIN                       CLONES
tank                         -                            -
tank/containers              -                            -
tank/containers/five         tank/containers/two@B        -
tank/containers/four         tank/containers/six@C        -
tank/containers/one          -                            -
tank/containers/one@E        -                            tank/containers/three
tank/containers/two          tank/containers/six@A        -
tank/containers/two@B        -                            tank/containers/five
tank/containers/six          tank/containers/three@F      -
tank/containers/six@A        -                            tank/containers/two
tank/containers/six@C        -                            tank/containers/four
tank/containers/three        tank/containers/one@E        -
tank/containers/three@F      -                            tank/containers/six
allquixotic
sumber

Jawaban:

9

AFAIK Anda harus menyalin dataset tersebut ke dataset baru yang independen. Promosi hanya beralih di sekitar dataset mana yang "induk" vs "anak", itu tidak benar-benar memutuskan ketergantungan apa pun jika Anda ingin mempertahankan keduanya.

Misalnya:

root@box~# zfs snapshot tank/containers/six@1 
root@box~# zfs send tank/containers/six@1 | pv | zfs receive tank/containers/newsix  
root@box~# zfs destroy -R tank/containers/six  
root@box~# zfs destroy tank/containers/three@F 
root@box~# zfs rename tank/containers/newsix tank/containers/six

Luangkan waktu Anda dan pastikan apa yang Anda lakukan. Apalagi dengan penghapusan yang sebenarnya.

Replikasi ini adalah blok-untuk-blok, jadi jika ada data yang signifikan di dalamnya AKAN memerlukan waktu. Bagian pvini sepenuhnya opsional, tetapi akan memberi Anda progress bar untuk dilihat saat Anda menunggu.

Juga mungkin mempertimbangkan syncoid untuk mengotomatiskan tugas-tugas replikasi, sekarang dan di masa depan. (Wajib: Saya adalah penulis asli alat ini, yang berlisensi GPLv3 dan bebas untuk digunakan.)

Jim Salter
sumber
Jim, tolong ungkapkan afiliasi Anda dengan syncoid. Dari aturan situs: "Kirimkan jawaban yang baik dan relevan, dan jika beberapa (tetapi tidak semua) kebetulan mengenai produk atau situs web Anda, tidak apa-apa. Namun, Anda harus mengungkapkan afiliasi Anda dalam jawaban Anda."
Costin Gușă
Senang, Costin - tidak menyadari itu adalah masalah besar, karena saya menghubungkan langsung ke proyek repo GitHub dan tidak berbicara sepatah kata pun tentang layanan konsultasi.
Jim Salter