Pertama /sys
adalah sistem file pseudo . Jika Anda melihat, /proc/filesystems
Anda akan menemukan daftar sistem file terdaftar di mana beberapa memiliki nodev
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.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
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:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
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 melakukan ls -l
Anda akan melihat bahwa semua file memiliki satu ukuran. Biasanya 4.096 byte. Ini dilaporkan oleh sysfs
.
:/sys/devices/pci0000:00/0000:00:19.0/net/eth2$ ls -l
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_assign_type
-r--r--r-- 1 root root 4096 Apr 24 20:09 address
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_len
...
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. Sebuah ls
atau stat
dari file melaporkan 4096 byte.
rsync
- Buka deskriptor file, fd.
- Menggunakan fstat (fd) untuk mendapatkan informasi seperti ukuran.
- Set untuk membaca byte ukuran, yaitu 4096. Itu akan menjadi baris 253 dari kode yang dihubungkan oleh @mattdm .
read_size == 4096
- Meminta; baca: 4096 byte.
- Sebuah string pendek dibaca yaitu 18 byte.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Meminta; baca: 4078 byte
- 0 byte baca (sebagai pembacaan pertama dikonsumsi semua byte dalam file).
nread == 0
, baris 255
- Tidak dapat membaca
4096
byte. Zero out buffer.
- Setel kesalahan
ENODATA
.
- Kembali.
- Laporan kesalahan.
- Mencoba kembali. (Di atas lingkaran).
- Gagal.
- Laporan kesalahan.
- BAIK.
Selama proses ini sebenarnya membaca seluruh file. Tetapi tanpa ukuran yang tersedia itu tidak dapat memvalidasi hasilnya - dengan demikian kegagalan hanya pilihan.
cp
- Buka deskriptor file, fd.
- Menggunakan fstat (fd) untuk mendapatkan informasi seperti st_size (juga menggunakan lstat dan stat).
Periksa apakah file cenderung jarang. Itu adalah file berlubang dll.
copy.c:1010
/* Use a heuristic to determine whether SRC_NAME contains any sparse
* blocks. If the file has fewer blocks than would normally be
* needed for a file of its size, then at least one of the blocks in
* the file is a hole. */
sparse_src = is_probably_sparse (&src_open_sb);
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.
- Salin dengan jarang-salin.
- Mulai dengan ukuran baca maks MAXINT.
Biasanya
18446744073709551615
byte pada sistem 32 bit.
- Meminta; baca 4096 byte. (Ukuran buffer dialokasikan dalam memori dari informasi stat.)
- Sebuah string pendek dibaca yaitu 18 byte.
- Periksa apakah lubang diperlukan, tidak.
- Tulis buffer ke target.
- Kurangi 18 dari ukuran baca maksimal.
- Meminta; baca 4096 byte.
- 0 byte karena semua telah dikonsumsi dalam pembacaan pertama.
- Kembali sukses.
- Semua baik-baik saja Perbarui flag untuk file.
- BAIK.
/sys/
?