Mengapa cp --reflink=auto
bukan perilaku default? Mungkinkah ada salahnya mengaktifkannya?
Apakah mungkin untuk mengaktifkannya pada waktu kompilasi, sehingga digunakan di seluruh sistem, tidak hanya di shell interaktif?
Mengapa cp --reflink=auto
bukan perilaku default? Mungkinkah ada salahnya mengaktifkannya?
Apakah mungkin untuk mengaktifkannya pada waktu kompilasi, sehingga digunakan di seluruh sistem, tidak hanya di shell interaktif?
Jawaban:
Ini bukan default karena untuk alasan ketahanan seseorang mungkin ingin salinan dilakukan untuk melindungi terhadap korupsi data. Juga untuk alasan kinerja, Anda mungkin ingin agar penulisan terjadi pada waktu penyalinan alih-alih beberapa proses sensitif latensi yang bekerja pada file CoW dan ditunda oleh penulisan mungkin ke bagian lain dari disk mekanis. Perhatikan bahwa dari coreutils v8.24 mv akan reflink secara default, karena tidak memiliki kendala di atas.
Tidak tahu mengapa itu tidak default, mungkin sehingga berperilaku sama seperti utilitas menyalin lainnya ( rsync
, cpio
, pax
, tar
...) yang tidak memiliki dukungan untuk itu (atau ketika file akan disalin di seluruh antarmuka yang tidak memungkinkan bahwa (seperti NFS, samba, lapisan sistem file sekering ...).
Saya berada dalam situasi yang sama beberapa tahun yang lalu, dan melihat kode cp GNU dengan cepat, masih sama, Anda harus menambal kode untuk mendapatkan perilaku default yang berbeda:
--- coreutils-8.21/src/cp.c~ 2013-06-22 21:50:26.265639114 +0100
+++ coreutils-8.21/src/cp.c 2013-06-22 21:51:06.880513924 +0100
@@ -775,7 +775,7 @@ cp_option_init (struct cp_options *x)
x->interactive = I_UNSPECIFIED;
x->move_mode = false;
x->one_file_system = false;
- x->reflink_mode = REFLINK_NEVER;
+ x->reflink_mode = REFLINK_AUTO;
x->preserve_ownership = false;
x->preserve_links = false;
Satu masalah besar adalah potensi kehabisan ruang untuk melakukan penyalinan ketika Anda menulis.
Dengan salinan normal, maka segera setelah salinan selesai, Anda tidak perlu khawatir menulis ke bagian yang ada dari file gagal: ruang sepenuhnya dialokasikan dan tidak akan hilang sampai Anda menghapus file. Tetapi dengan salinan reflink, selalu ada risiko bahwa pada titik tertentu minggu atau bulan di jalan, menulis ke bagian file yang ada akan gagal karena tidak ada cukup ruang untuk membuat salinan.
Menemukan bahwa sistem Anda telah melakukan salinan reflink di belakang Anda ketika sebuah operasi seperti itu gagal akan menjadi kejutan yang cukup buruk.
alias cp='cp --reflink=auto --sparse=always'
lebih masuk akal daripada menambal kode
/bin/cp
dan menggantinya dengan skrip shell yang serupa
Alasan kuat seseorang mungkin menginginkan salinan untuk melindungi dari "kehilangan" data.
Kami tidak tahu itu alasannya, tetapi hal-hal buruk yang dapat terjadi terbatas pada perusakan media. Sebagian besar semua perangkat blok akan memiliki beberapa bentuk identifikasi korupsi (CRC), jika tidak meneruskan koreksi kesalahan (paritas).
Bukan karena alasan kinerja.
CoW terjadi ketika hanya sebagian dari? Erase? blok ditulis untuk. Dengan disk! Modern! perangkat ukuran blok perangkat keras adalah kelipatan dari 4k. Mengubah bagian dari 4k menyebabkan drive membaca seluruh 4k dan menuliskannya lagi, tetapi di atas itu kernel akan melakukan hal yang sama sehingga tidak akan ada tulisan parsial yang mencapai perangkat blok, SSD atau sebaliknya . Kernel perlu melakukan KK karena alasan yang sama, kecuali kami memiliki salinan cache, kami tidak dapat membuat data yang ada di bagian lain perangkat, simpan untuk akhir kisah file tetapi intinya adalah bisa diperdebatkan. Tapi caching salinan file dan menyalin file berbeda-beda operasi, yang pertama jauh lebih murah.
Alamat penulisan ini tidak penting, tetapi perlu diketahui bahwa "beberapa bagian perangkat yang tidak digunakan" lebih murah untuk ditemukan daripada "di mana blok file saat ini berada."
Faktanya adalah setiap metode Kontrak Karya lebih murah atau sama dengan hanya memperbarui perangkat blok. Sekarang jika kita tidak berbicara tentang perangkat blok, maka itu akan menjadi cerita lain ... Ditulis di suatu tempat.