Öncelikle /sys
bir olduğunu sözde dosya sistemi . Eğer bakarsanız, /proc/filesystems
birkaçının nodev
önünde kayıtlı dosya sistemlerinin bir listesini bulacaksınız . Bu, sözde dosya sistemleri olduklarını gösterir . Bu, çalışan bir çekirdeğe RAM tabanlı bir dosya sistemi olarak var oldukları anlamına gelir. Ayrıca bir blok cihaz gerektirmezler.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
Çekirdek açılışta bu sistemi monte eder ve uygun olduğunda girişleri günceller. Örneğin, önyükleme sırasında veya tarafından yeni bir donanım bulunduğunda udev
.
Gelen /etc/mtab
genellikle bulmak tarafından monte:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Konuyla ilgili güzel bir makale için Patric Mochel's - sysfs Dosya Sistemi'ni okuyun
.
stat / sys dosyaları
Altında bir dizine gidip /sys
bir ls -l
yaparsanız, tüm dosyaların bir boyutu olduğunu fark edeceksiniz. Genellikle 4096 bayt. Bu tarafından bildirilir 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
...
Ayrıca stat
bir dosya üzerinde bir yapabilir ve başka bir belirgin özelliği fark edebilirsiniz; 0 blok kaplar. Ayrıca kök inode (stat / sys) 1'dir. /stat/fs
Tipik olarak inode 2 vardır.
rsync vs. cp
Sahte dosyaları senkronize etmede rsync hatası için en kolay açıklama belki örnek olarak verilebilir.
Diyelim ki address
18 bayt adlı bir dosyamız var . Bir ls
veya stat
dosyanın 4096 bayt bildirir.
rsync
- Dosya tanımlayıcıyı açar, fd.
- Boyut gibi bilgileri almak için fstat (fd) kullanır.
- Olacağını boyutu bayt, yani 4096. okumak için yola hat 253 ile bağlantılı kod @mattdm .
read_size == 4096
- Sor; okuma: 4096 bayt.
- Kısa bir dize okunur, yani 18 bayt.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Sor; okuma: 4078 bayt
- 0 bayt okundu (ilk okunduğunda dosyadaki tüm baytları tüketir).
nread == 0
, satır 255
4096
Bayt okunamıyor . Sıfır tamponu.
- Hata ayarlayın
ENODATA
.
- Dönüş.
- Hata bildir.
- Tekrar dene. (Döngünün üstünde).
- Başarısız.
- Hata bildir.
- İNCE.
Bu işlem sırasında dosyanın tamamını okur. Ancak hiçbir boyut mevcut olmadığında sonucu doğrulayamaz - bu nedenle hata sadece seçenektir.
cp
- Dosya tanımlayıcıyı açar, fd.
- St_size gibi bilgileri almak için fstat (fd) kullanır (ayrıca lstat ve stat kullanır).
Dosyanın seyrek olup olmadığını kontrol edin. Dosyanın delikleri vb.
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);
Gibi stat
raporlar dosya sıfır bloğuna sahip olacak o seyrek olarak kategorize edilir.
Dosyayı kapsamlı kopyalamaya ( normal
seyrek dosyaları kopyalamanın daha etkili bir yolu) göre okumaya çalışır ve başarısız olur.
- Seyrek kopya ile kopyalayın.
- MAXINT maksimum okuma boyutu ile başlar.
Tipik olarak
18446744073709551615
32 bit sistemdeki bayt sayısı.
- Sor; 4096 bayt oku. (Bellek bilgilerinde stat bilgilerinden ayrılan arabellek boyutu.)
- Kısa bir dize okunur, yani 18 bayt.
- Bir deliğin gerekli olup olmadığını kontrol edin, hayır.
- Hedefe tampon yaz.
- Maksimum okuma boyutundan 18 çıkartın.
- Sor; 4096 bayt oku.
- İlk okunuşta tüketildiği gibi 0 bayt.
- Geri dönüş başarısı.
- Her şey yolunda. Dosya bayraklarını güncelle.
- İNCE.
/sys/
?