Zunächst einmal /sys
ist ein Pseudo-Dateisystem . Wenn Sie sich das ansehen /proc/filesystems
, werden Sie eine Liste der registrierten Dateisysteme finden, bei denen einige nodev
vor Ihnen liegen . Dies zeigt an, dass es sich um Pseudodateisysteme handelt . Dies bedeutet, dass sie auf einem laufenden Kernel als RAM-basiertes Dateisystem existieren. Außerdem benötigen sie kein Blockgerät.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
Beim Booten stellt der Kernel dieses System bereit und aktualisiert die Einträge, wenn dies angebracht ist. ZB wenn neue Hardware beim Booten oder durch gefunden wird udev
.
In der /etc/mtab
Regel finden Sie die Montierung durch:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Lesen Sie Patric Mochels - Das sysfs-Dateisystem, um eine schöne Abhandlung zu diesem Thema zu erhalten
.
stat von / sys Dateien
Wenn Sie in ein Verzeichnis unter gehen /sys
und a ls -l
ausführen, werden Sie feststellen, dass alle Dateien eine Größe haben. Normalerweise 4096 Bytes. Dies wird berichtet von 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
...
Außerdem können Sie eine stat
Datei bearbeiten und eine weitere Besonderheit feststellen. Es belegt 0 Blöcke. Auch Inode von root (stat / sys) ist 1. hat /stat/fs
typischerweise Inode 2. usw.
rsync vs. cp
Die einfachste Erklärung für rsync-Fehler beim Synchronisieren von Pseudodateien ist möglicherweise ein Beispiel.
Angenommen, wir haben eine Datei mit dem Namen address
18 Byte. Eine ls
oder stat
der Datei meldet 4096 Bytes.
rsync
- Öffnet den Dateideskriptor fd.
- Verwendet fstat (fd), um Informationen wie Größe abzurufen.
- Lies die Größe von Bytes, also 4096. Das wäre Zeile 253 des durch @mattdm verknüpften Codes .
read_size == 4096
- Fragen; gelesen: 4096 Bytes.
- Ein kurzer String wird gelesen, dh 18 Bytes.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Fragen; gelesen: 4078 Bytes
- 0 gelesene Bytes (beim ersten Lesen wurden alle Bytes in der Datei verbraucht).
nread == 0
, Linie 255
4096
Bytes können nicht gelesen werden . Puffer auf Null setzen.
- Fehler einstellen
ENODATA
.
- Rückkehr.
- Fehler melden.
- Wiederholen. (Über Schleife).
- Scheitern.
- Fehler melden.
- FEIN.
Während dieses Vorgangs wird die gesamte Datei gelesen. Da jedoch keine Größe verfügbar ist, kann das Ergebnis nicht validiert werden. Ein Fehlschlag ist daher nur die Option.
cp
- Öffnet den Dateideskriptor fd.
- Verwendet fstat (fd), um Informationen wie st_size abzurufen (verwendet auch lstat und stat).
Überprüfen Sie, ob die Datei wahrscheinlich spärlich ist. Das heißt die Feile hat Löcher etc.
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);
Als stat
Berichtsdatei mit null Blöcken wird sie als dünn eingestuft.
Versucht, die Datei durch Extent-Copy zu lesen (eine effizientere Methode zum Kopieren normaler
Dateien mit geringer Dichte), und schlägt fehl.
- Kopie durch Sparse-Copy.
- Beginnt mit der maximalen Lesegröße von MAXINT.
In der Regel
18446744073709551615
Bytes auf einem 32-Bit-System.
- Fragen; liest 4096 Bytes. (Puffergröße wird aus den stat-Informationen im Speicher zugewiesen.)
- Ein kurzer String wird gelesen, dh 18 Bytes.
- Überprüfen Sie, ob ein Loch benötigt wird, nein.
- Schreibe Puffer zum Ziel.
- Subtrahieren Sie 18 von der maximalen Lesegröße.
- Fragen; liest 4096 Bytes.
- 0 Bytes, da alle beim ersten Lesen verbraucht wurden.
- Rückkehr zum Erfolg.
- Alles ok. Aktualisieren Sie die Flags für die Datei.
- FEIN.
/sys/
?