Saya memiliki skrip bash yang digunakan rsync
untuk membuat cadangan file di Archlinux. Saya perhatikan bahwa rsync
gagal menyalin file dari /sys
, sementara cp
berfungsi dengan baik:
# rsync /sys/class/net/enp3s1/address /tmp
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
ERROR: address failed verification -- update discarded.
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.9]
# cp /sys/class/net/enp3s1/address /tmp ## this works
Saya bertanya-tanya mengapa rsync
gagal, dan apakah mungkin menyalin file dengan itu?
linux
arch-linux
rsync
sysfs
Eugene Yarmash
sumber
sumber
/sys/
?/sys/class/net/*/address
(saya mendapat "izin ditolak" ketika saya mencobanya)? Jika tidak, maka Anda tidak membuat cadangan nyata / berguna karena tidak dapat dipulihkan.Jawaban:
Rsync memiliki kode yang secara khusus memeriksa apakah file terpotong saat membaca dan memberikan kesalahan ini -
ENODATA
. Saya tidak tahu mengapa file-file/sys
ini memiliki perilaku ini, tetapi karena mereka bukan file nyata, saya kira itu tidak terlalu mengejutkan. Sepertinya tidak ada cara untuk memberitahu rsync untuk melewatkan pemeriksaan khusus ini.Saya pikir Anda mungkin lebih baik tidak melakukan sinkronisasi
/sys
dan menggunakan skrip khusus untuk memilih informasi tertentu yang Anda inginkan (seperti alamat kartu jaringan).sumber
Pertama
/sys
adalah sistem file pseudo . Jika Anda melihat,/proc/filesystems
Anda akan menemukan daftar sistem file terdaftar di mana beberapa memilikinodev
di depan. Ini menunjukkan mereka adalah sistem file semu . Ini berarti mereka ada pada kernel yang berjalan sebagai sistem file berbasis RAM. Selanjutnya mereka tidak memerlukan perangkat blok.Pada saat boot kernel mount sistem ini dan memperbarui entri bila sesuai. Misalnya ketika perangkat keras baru ditemukan saat boot atau oleh
udev
.Di
/etc/mtab
Anda biasanya menemukan mount dengan:Untuk makalah yang bagus tentang hal ini, baca Patric Mochel's - The sysfs Filesystem .
file stat / sys
Jika Anda masuk ke direktori di bawah
/sys
dan melakukanls -l
Anda akan melihat bahwa semua file memiliki satu ukuran. Biasanya 4.096 byte. Ini dilaporkan olehsysfs
.Selanjutnya Anda dapat melakukan
stat
pada file dan melihat fitur berbeda lainnya; ini menempati 0 blok. Juga inode root (stat / sys) adalah 1./stat/fs
biasanya memiliki inode 2. dll.rsync vs. cp
Penjelasan termudah untuk kegagalan rsync menyinkronkan file pseudo mungkin dengan contoh.
Katakanlah kita memiliki file yang bernama
address
18 byte. Sebuahls
ataustat
dari file melaporkan 4096 byte.rsync
read_size == 4096
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
nread == 0
, baris 2554096
byte. Zero out buffer.ENODATA
.Selama proses ini sebenarnya membaca seluruh file. Tetapi tanpa ukuran yang tersedia itu tidak dapat memvalidasi hasilnya - dengan demikian kegagalan hanya pilihan.
cp
Periksa apakah file cenderung jarang. Itu adalah file berlubang dll.
Sebagai
stat
file laporan memiliki nol blok itu dikategorikan jarang.Mencoba membaca file dengan cara copy-copy (cara yang lebih efisien untuk menyalin file jarang yang normal ), dan gagal.
Biasanya
18446744073709551615
byte pada sistem 32 bit.sumber
Mungkin terkait, tetapi panggilan atribut panjang akan gagal di sysfs:
Melihat strace saya sepertinya rsync mencoba menarik atribut yang diperluas secara default:
Saya mencoba mencari bendera untuk memberikan rsync untuk melihat apakah skipping atribut diperpanjang menyelesaikan masalah tetapi tidak dapat menemukan apa pun (
--xattrs
ternyata mereka pada di tempat tujuan).sumber
Rsync biasanya membaca informasi file, mentransfer konten file atau delta ke file sementara di direktori tujuan, kemudian setelah memverifikasi data file itu berganti nama menjadi nama file tujuan.
Saya percaya masalah dengan sysfs adalah bahwa semua file menunjukkan sebagai 4k (satu halaman memori) namun mereka mungkin hanya mengandung beberapa byte. Untuk menghindari menyalin file yang berpotensi rusak ke tujuan, rsync membatalkan salinan ketika melihat ketidakcocokan antara metadata file dan apa yang sebenarnya disalin.
Setidaknya pada rsync v3.0.6 perilaku ini dapat dihindari menggunakan
--inplace
sakelar. Rsync masih akan mendeteksi kesalahan tetapi karena file tujuan sudah ditimpa ketika itu akan meninggalkan file yang berpotensi rusak di sana.Perhatikan bahwa efek sampingnya adalah bahwa file akhirnya menjadi nol-empuk menjadi 4k karena ini adalah ukuran yang menurut rsync file tersebut. Seharusnya tidak membuat perbedaan dalam banyak kasus karena null byte biasanya diabaikan.
sumber