zfs mengganti nama / memindahkan sistem file root ke child

9

Pertanyaan serupa ada tetapi solusinya (menggunakan mv) mengerikan karena dalam hal ini berfungsi sebagai "salin, lalu hapus" daripada murni "bergerak".

Jadi, saya membuat kolam:

zpool create tank /dev/loop0

dan rsynced data saya dari penyimpanan lain di sana langsung sehingga data saya sekarang di /tank.

zfs list
NAME      USED  AVAIL  REFER  MOUNTPOINT
tank      591G  2.10T   591G  /tank

Sekarang saya menyadari bahwa saya perlu data saya berada di sistem file anak, bukan di /tanksistem file secara langsung.

Jadi bagaimana cara saya memindahkan atau mengganti nama sistem file root yang ada sehingga menjadi anak di dalam kumpulan?

Ganti nama sederhana tidak akan berfungsi:

zfs rename tank tank/mydata
cannot rename to 'tank/mydata': datasets must be within same pool

(Btw, mengapa itu mengeluh bahwa dataset tidak berada dalam kelompok yang sama padahal jika sebenarnya saya hanya memiliki satu kelompok?)

Saya tahu ada solusi yang melibatkan menyalin semua data ( mv, atau mengirim seluruh dataset ke perangkat lain dan kembali), tetapi tidakkah seharusnya ada cara elegan yang sederhana?

Hanya mencatat bahwa saya tidak peduli dengan snapshot pada tahap ini (belum ada yang peduli).

Anton
sumber

Jawaban:

4

(lihat catatan dalam komentar, ini berfungsi, tetapi Anda tidak akan pernah bisa menghapus inisial foto, jadi itu bukan solusi yang baik)

Dengan ZFS ini sangat mudah: hanya snapshot, klon dan kemudian rm. Tidak diperlukan ruang tambahan atau waktu menyalin.

zfs snapshot tank@mydata
zfs clone tank@mydata tank/newname
zfs set mountpoint=/beep/boop tank/newname
rm -rf /tank/*

Hati-hati saat menjalankan rm -rf jika Anda tidak mengubah titik mount jika Anda memiliki sistem file lain di zpool Anda. Anda tidak ingin menghapus konten filesystem baru (/ tank / newname) secara rekursif atau anak-anak lainnya (tank / *) secara tidak sengaja. Setelah Anda mengonfirmasi file Anda tidak di root fs (/ tank /) dan hanya di sistem file baru Anda, Anda juga dapat menghapus snapshot awal itu.

zfs delete tank@mydata
notpeter
sumber
Sepertinya jawaban yang masuk akal (saya tidak bisa memikirkan cara lain untuk memasukkan data ke dalam dataset baru tanpa memindahkannya) tetapi sayangnya Anda tidak dapat menghapus snapshot asli ini. Klon memiliki beberapa efek samping yang aneh. Anda tidak dapat menghapus tank @ mydata karena dataset baru bergantung padanya. Anda dapat mempromosikan dataset baru, yang akan memindahkan tank @ mydata ke tank / newname @ mydata, tetapi sekarang Anda telah bertukar ketergantungan dan Anda mendapatkan kesalahan lucu 'dataset sudah ada' jika Anda mencoba dan menghapus dataset baru (Setidaknya pada FreeBSD, meskipun saya menganggap ini kemungkinan ZFS spesifik daripada OS).
USD Matt
@ USDMatt: Anda sepenuhnya benar. Ini berfungsi dengan baik jika Anda bekerja dengan subfileystems (tank / a -> tank / a @ snap -> tank / asnap-clone -> tank / berganti nama menjadi asnap-clone) tetapi tidak jika Anda bekerja pada akar dari zpool. Terasa seperti bug, tuliskan itu sebagai alasan lain untuk tidak pernah mengisi sistem file root dari kumpulan Anda).
notpeter
4

Mengingat masalah yang didokumentasikan oleh @USDMatt, ZFS kirim / terima mungkin adalah cara terbaik untuk pergi.

zfs snapshot tank@snap
zfs send tank@snap | zfs receive tank/anotherfs
zfs set mountpoint=/beep/boop tank/anotherfs
rm -rf /tank/*
zfs destroy tank@snap

Hati-hati saat menjalankan rm -rf jika Anda tidak mengubah titik mount jika Anda memiliki sistem file lain di zpool tangki Anda. Anda tidak ingin menghapus konten filesystem baru (/ tank / newname) secara rekursif atau / lainnya (/ tank / *) lainnya secara tidak sengaja.

notpeter
sumber
0

Saya tidak berpikir ada cara elegan yang sederhana ... meskipun Anda hanya bisa mengubah mountpoint Anda ...

mkdir /tank
zfs set mountpoint=/tank/mydata <possibly renamed tank set>

Atau mungkin ganti nama tangki dan kemudian pasang di tempat yang Anda butuhkan ...

Entah itu, atau membuat sistem file di tempat yang tepat dan cp, mv, atau zfs mengirim / menerima ...

putih
sumber