Saya ingin menghapus direktori yang memiliki banyak data di dalamnya. Ini adalah array cadangan saya, yang merupakan sistem file ZFS , rentang linier, kumpulan tunggal yang disebut "san". San sudah terpasang di /san
jadi saya ingin menghapus massal / san / thispc / tertentuFolder
$ du -h -d 1 certainFolder/
1.2T certainFolder/
Daripada saya harus menunggu, rm -rf certainFolder/
tidak bisakah saya menghancurkan pegangan ke direktori itu sehingga dapat ditimpa (bahkan dengan nama dir yang sama jika saya memilih untuk membuatnya kembali) ??
Jadi untuk misalnya tidak mengetahui banyak tentang zfs fs internal mgmnt secara khusus bagaimana memetakan direktori, tetapi jika saya menemukan bahwa peta mengatakan untuk misalnya, dan menghapus entri yang tepat untuk misalnya, direktori tidak akan lagi ditampilkan, dan ruang yang sebelumnya dimiliki oleh direktori harus dihapus dari semacam audit juga.
Apakah ada cara mudah untuk melakukan ini, bahkan jika pada ext3 fs, atau apakah sudah melakukan perintah hapus rekursif di tempat pertama, yaitu mencuri melalui dan mengedit jurnal?
Saya hanya berharap untuk melakukan sesuatu seperti di kill thisDir
mana ia hanya menghapus beberapa jenis ID, dan poof direktori tidak lagi muncul ls -la
dan data masih ada di drive jelas, tetapi ruang sekarang akan digunakan kembali ( ditimpa), karena ZFS memang keren?
Maksud saya, saya pikir zfs benar-benar keren, bagaimana kita bisa melakukannya? Idealnya? menggosok tangan bersama-sama :-)
Kasing penggunaan khusus saya (selain cintaku untuk zfs) adalah pengelolaan arsip cadangan saya. Dir cadangan ini didorong melalui freefilesync (PROG AWESOME) pada kotak Windows saya ke file-smb berbagi, tetapi juga memiliki direktori versi di mana file lama pergi. Saya menghapus direktori tingkat atas yang berada di cadangan utama, yang disalin ke versi - misalnya /san/version/someStuff
, sebagai pembersihan dua bulanan dari rm -rf /san/version/someStuff/*
terminal dempul, sekarang saya harus membuka terminal lain; tidak ingin melakukan itu setiap waktu, saya bosan sia-sia harus memonitor rm -rf.
Maksudku, mungkin aku harus mengatur perintah untuk hanya melepaskan pegangan, lalu mencetak ke std, itu mungkin bagus. Lebih realistis lagi , membuat ulang set data dalam beberapa detik zfs destroy san/version; zfs create -p -o compression=on san/version
setelah pemikiran dari respons dari @Gilles.
zfs create dataset -p -o compression=on yourPoolName/BackupRootDir/hostNameYourPc/somesubdir
Jawaban:
Melacak blok yang dibebaskan tidak dapat dihindari dalam sistem file yang layak dan ZFS tidak terkecuali . Namun ada cara sederhana di bawah ZFS untuk memiliki penghapusan direktori hampir seketika dengan "menunda" pembersihan yang mendasarinya. Secara teknis sangat mirip dengan saran Gilles tetapi secara inheren dapat diandalkan tanpa memerlukan kode tambahan.
Jika Anda membuat snapshot dari sistem file Anda sebelum menghapus direktori, penghapusan direktori akan sangat cepat karena tidak ada yang perlu dieksplorasi / dibebaskan di bawahnya, semua masih dirujuk oleh snapshot. Anda kemudian dapat menghancurkan snapshot di latar belakang sehingga ruang akan secara bertahap pulih.
sumber
feature@async_destroy
mungkin juga membantu mempercepat ini (dari perspektif pengguna atau administrator) jika diaktifkan; lihatzpool get all $pool
. Perhatikan bahwa setidaknya yang terakhir saya perhatikan, jika ada penghancuran yang tertunda sedang berlangsung pada impor pool , maka destr tersebut menjadi sinkron dan impor pool tidak akan selesai sampai penghancuran selesai. Hati-hati jika Anda perlu reboot!Apa yang Anda minta tidak mungkin. Atau, lebih tepatnya, ada biaya yang harus dibayar saat menghapus direktori dan file-nya; jika Anda tidak membayarnya pada saat penghapusan, Anda harus membayarnya di tempat lain.
Anda tidak hanya menghapus direktori - itu hampir instan. Anda menghapus direktori dan semua file di dalamnya dan juga secara rekursif juga menghapus semua subdirektori. Menghapus file berarti mengurangi jumlah tautannya, dan kemudian menandai sumber dayanya (blok digunakan untuk konten file dan metadata file, dan inode jika sistem file menggunakan tabel inode) gratis jika jumlah tautan mencapai 0 dan file tidak Buka. Ini adalah operasi yang harus dilakukan untuk setiap file di pohon direktori, sehingga waktu yang dibutuhkan setidaknya sebanding dengan jumlah file.
Anda dapat menunda biaya menandai sumber daya sebagai gratis. Sebagai contoh, ada filesystem yang dikumpulkan sampah, di mana Anda dapat menghapus direktori tanpa menghapus file yang dikandungnya. Jalankan pengumpul sampah akan mendeteksi file yang tidak dapat dijangkau melalui struktur direktori dan menandainya sebagai gratis. Melakukan
rm -f directory; garbage-collect
pada filesystem yang dikumpulkan sampah melakukan hal yang samarm -rf
pada sistem file tradisional, dengan pemicu yang berbeda. Ada beberapa filesystem yang dikumpulkan sampah karena GC adalah kompleksitas tambahan yang jarang dibutuhkan. Waktu GC dapat datang kapan saja, ketika filesystem membutuhkan beberapa blok gratis dan tidak menemukannya, sehingga kinerja suatu operasi akan tergantung pada sejarah masa lalu, bukan hanya pada operasi, yang biasanya tidak diinginkan. Anda harus menjalankan pengumpul sampah hanya untuk mendapatkan jumlah ruang kosong yang sebenarnya.Jika Anda ingin mensimulasikan perilaku GC pada sistem file normal, Anda bisa melakukannya:
(Saya menghilangkan banyak detail penting seperti pengecekan error, seperti ketahanan terhadap kehilangan daya, dll.) Nama direktori menjadi tidak ada segera; ruang reklamasi semakin progresif.
Pendekatan yang berbeda untuk menghindari membayar biaya selama penghapusan tanpa GC adalah dengan membayarnya selama alokasi. Tandai pohon direktori sebagai dihapus, dan pergi melalui direktori yang dihapus ketika mengalokasikan blok. Itu akan sulit untuk didamaikan dengan tautan keras, tetapi pada sistem berkas tanpa tautan keras, hal itu dapat dilakukan dengan O (1) peningkatan biaya dalam alokasi. Namun itu akan membuat operasi yang sangat umum (membuat atau memperbesar file) lebih mahal, dengan satu-satunya manfaat menjadi operasi yang relatif jarang (menghapus pohon direktori besar) lebih murah.
Anda bisa menghapus sebagian besar pohon direktori jika pohon itu disimpan sebagai kumpulan bloknya sendiri. (Catatan: Saya menggunakan kata "kumpulan" dalam arti yang berbeda dari "kumpulan penyimpanan" ZFS. Saya tidak tahu apa istilah yang tepat.) Itu bisa sangat cepat. Tapi apa yang Anda lakukan dengan ruang kosong? Jika Anda menetapkan ulang ke kumpulan lain, itu memiliki biaya, meskipun jauh lebih sedikit daripada menghapus file satu per satu. Jika Anda meninggalkan ruang sebagai ruang cadangan yang tidak digunakan, Anda tidak dapat segera mengklaimnya kembali. Memiliki kumpulan individu untuk pohon direktori berarti menambah biaya untuk menambah atau mengurangi ukuran kumpulan itu (baik dengan cepat atau eksplisit). Membuat pohon kumpulan penyimpanannya sendiri juga meningkatkan biaya memindahkan file masuk dan keluar dari pohon.
sumber
zfs list
. Sampai saat itu, berharap orang lain memiliki beberapa masukan tentang cara menghapus massal pada ZFS di sebuah subdir pool. :-)Jika harus cepat, saya membuat direktori sementara baru,
mv
direktori di bawahnya dan kemudian secara temporer menghapus sementara:sumber
rm
perintah tidak selesai karena alasan lain, direktori phantom dibiarkan tidak terhapus.&
hanya latar belakang proses, sehingga Anda dapat terus melakukan hal-hal lain dalam shell yang sama saat penghapusan sedang berjalan (dikenakan hukuman kinerja yang relevan).