Mengapa cp --reflink = otomatis bukan perilaku default?

31

Mengapa cp --reflink=autobukan perilaku default? Mungkinkah ada salahnya mengaktifkannya?

Apakah mungkin untuk mengaktifkannya pada waktu kompilasi, sehingga digunakan di seluruh sistem, tidak hanya di shell interaktif?

Fabian Henze
sumber
4
Ya, pertanyaan bagus. IMHO akan, karena hanya BTRFS mulai menjadi sistem file Linux default.
Adam Ryczkowski

Jawaban:

38

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.

Pádraig Brady
sumber
8
(yang dapat dianggap sebagai jawaban resmi karena Pádraig adalah pengelola GNU coreutils).
Stéphane Chazelas
8
Saya ragu jawaban ini benar, setidaknya pada btrfs. Jika file tersebut nantinya ditulis, data baru akan ditulis ke sektor disk yang berbeda karena btrfs CoW, jadi tidak ada keuntungan latensi untuk tidak melakukan reflink. File yang memiliki set NoDataCoW tidak dapat direflink. Dan jika Anda ingin melindungi dari kerusakan data, Anda harus menyalin ke partisi lain dan reflink juga tidak akan berfungsi.
JanKanis
3
Ada masalah latensi karena BTRFS perlu menemukan dan mengalokasikan ruang pada waktu penulisan. Ini bahkan mungkin tidak tersedia sehingga melemparkan kesalahan ENOSPC pada waktu menulis
Pádraig Brady
1
Apa gunanya mv untuk reflink?
Macil
1
cross subvolume renames on btrfs
Pádraig Brady
17

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;
Stéphane Chazelas
sumber
4

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.

gwd
sumber
Setidaknya pada btrfs bahkan menulis ke bagian file yang sudah dialokasikan dapat gagal dengan ENOSPC ...
graywolf
2
alias cp='cp --reflink=auto --sparse=always'

lebih masuk akal daripada menambal kode

Blog Teknis James
sumber
6
Sepertinya Anda mengabaikan Apakah mungkin untuk mengaktifkannya pada waktu kompilasi, sehingga digunakan di seluruh sistem, tidak hanya dalam kerangka interaktif dalam pertanyaan OP.
Stéphane Chazelas
5
@StephaneChazelas One selalu dapat mengganti nama /bin/cpdan menggantinya dengan skrip shell yang serupa
goncalopp
0
  1. 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).

  2. 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.

Mike Mestnik
sumber