Mengapa "cp -R --reflink = always" melakukan salinan standar pada sistem file btrfs?

12

Btrfs mendukung Copy-On-Write. Saya mencoba menggunakan fitur itu untuk mengkloning direktori:

cp -R --reflink=always foo_directory foo_directory.mirror

Saya mengharapkan perintah untuk menyelesaikan hampir secara instan (seperti a btrfs subvolume snapshot), tetapi cpperintah itu tampaknya melakukan salinan standar yang lambat.

Menurut halaman manual, saya diharapkan --reflink=alwaysuntuk menegakkan Copy-On-Write:

Ketika --reflink [= selalu] ditentukan, lakukan penyalinan ringan, di mana blok data disalin hanya ketika dimodifikasi. Jika ini tidak memungkinkan, salinan gagal, atau jika --reflink = otomatis ditentukan, kembali ke salinan standar.

Pertanyaan:

  • Tahukah Anda mengapa --reflink=alwaystidak berhasil?
  • Opsi apa (atau perintah lain) yang harus saya gunakan?
Philipp Claßen
sumber

Jawaban:

20

cp --reflink=alwayshampir pasti berfungsi dengan benar. Jika tidak, Anda akan mendapatkan kesalahan. Secara desain, itulah perbedaan antara --reflink=alwaysdan --reflink=auto. Kesalahan akan terlihat seperti ini:

# Filesystem that does not support the feature at all
cp: failed to clone `xx' from `yy': Inappropriate ioctl for device

# Filesystem that does support it, but copy across filesystems
cp: failed to clone `xx' from `yy': Invalid cross-device link

Apakah Anda menyalin struktur direktori dengan banyak file kecil? Dalam hal ini cpmasih harus membuat setiap direktori dan membuka dan menutup setiap file, sehingga masih akan memakan waktu, tidak seperti btrfs subvolume snapshot. Itu kemungkinan besar menjelaskan waktu yang diperlukan untuk melakukan operasi.

Celada
sumber
3
Ya, itu berisi sejumlah besar file, kebanyakan dari mereka file teks kecil. Saya tidak tahu bahwa cp masih harus memproses setiap file. Terima kasih, itu adalah bagian yang saya tidak mengerti. Saya pikir dalam use case saya, lebih baik membuat snapshot yang dapat ditulis.
Philipp Claßen
1
Ya, jika Anda dapat membuat snapshot maka lakukanlah. cp --reflink=alwaysmasih bisa berguna ketika apa yang Anda coba tiru bukanlah akar dari subvolume, karena btrfs subvolume snapshothanya beroperasi pada subvolume, bukan pada bagian dari subvolume.
Celada