Po pierwsze /sys
to pseudo system plików . Jeśli na nie spojrzysz /proc/filesystems
, znajdziesz listę zarejestrowanych systemów plików, z których kilka ma nodev
przed sobą. Oznacza to, że są to pseudo systemy plików . Oznacza to, że istnieją w działającym jądrze jako system plików oparty na pamięci RAM. Ponadto nie wymagają urządzenia blokującego.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
Podczas rozruchu jądro montuje ten system i aktualizuje wpisy, gdy są odpowiednie. Np. Gdy nowy sprzęt zostanie znaleziony podczas rozruchu lub przez udev
.
W /etc/mtab
zwykle znajdujesz mount według:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Aby uzyskać miły artykuł na ten temat, przeczytaj artykuł
Patrica Mochela - System plików sysfs .
stat plików / sys
Jeśli przejdziesz do katalogu poniżej /sys
i zrobisz to ls -l
, zauważysz, że wszystkie pliki mają jeden rozmiar. Zazwyczaj 4096 bajtów. Jest to zgłaszane przez 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
...
Ponadto możesz zrobić stat
na pliku i zauważyć inną wyraźną funkcję; zajmuje 0 bloków. Również i-węzeł root (stat / sys) to 1. /stat/fs
zwykle ma i-węzeł 2. itd.
rsync vs. cp
Najłatwiejszym wyjaśnieniem niepowodzenia synchronizacji pseudoplików przez rsync jest być może przykład.
Powiedzmy, że mamy plik o nazwie address
18 bajtów. Plik ls
lub stat
zgłasza 4096 bajtów.
rsync
- Otwiera deskryptor pliku, fd.
- Używa fstat (fd), aby uzyskać informacje, takie jak rozmiar.
- Ustaw, aby odczytać bajty wielkości, tj. 4096. To byłaby linia 253 kodu połączona przez @mattdm .
read_size == 4096
- Zapytać; odczyt: 4096 bajtów.
- Czyta się krótki ciąg znaków, tj. 18 bajtów.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Zapytać; odczyt: 4078 bajtów
- 0 bajtów odczytanych (jako pierwszy odczyt zużył wszystkie bajty w pliku).
nread == 0
, linia 255
- Nie można odczytać
4096
bajtów. Bufor zerowy.
- Ustaw błąd
ENODATA
.
- Powrót.
- Zgłoś błąd.
- Spróbować ponownie. (Powyżej pętli).
- Zawieść.
- Zgłoś błąd.
- W PORZĄDKU.
Podczas tego procesu faktycznie odczytuje cały plik. Ale przy braku dostępnego rozmiaru nie można zweryfikować wyniku - dlatego niepowodzenie jest tylko opcją.
cp
- Otwiera deskryptor pliku, fd.
- Używa fstat (fd), aby uzyskać informacje, takie jak st_size (używa również lstat i stat).
Sprawdź, czy plik może być rzadki. To znaczy, że plik ma dziury itp.
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);
Jako stat
plik raportów mieć zero bloków jest skategoryzowane jako rzadki.
Próbuje odczytać plik według zakresu-kopiowania (bardziej efektywny sposób kopiowania normalnych
plików rzadkich) i kończy się niepowodzeniem.
- Kopiuj przez rzadkie kopiowanie.
- Zaczyna się od maksymalnego rozmiaru odczytu MAXINT.
Zazwyczaj
18446744073709551615
bajty w systemie 32-bitowym.
- Zapytać; odczytać 4096 bajtów. (Rozmiar bufora przydzielony w pamięci na podstawie informacji statystycznych).
- Czyta się krótki ciąg znaków, tj. 18 bajtów.
- Sprawdź, czy potrzebna jest dziura, nie.
- Zapisz bufor do celu.
- Odejmij 18 od maksymalnego rozmiaru odczytu.
- Zapytać; odczytać 4096 bajtów.
- 0 bajtów, ponieważ wszystkie zostały zużyte w pierwszym czytaniu.
- Sukces zwrotu
- Wszystko ok. Zaktualizuj flagi pliku.
- W PORZĄDKU.
/sys/
?