Ich habe ein Bash-Skript, mit dem ich rsync
Dateien in Archlinux sichern kann. Mir ist aufgefallen, dass rsync
das Kopieren einer Datei fehlgeschlagen ist /sys
, während es einwandfrei cp
funktioniert hat:
# 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
Ich frage mich, warum dies rsync
fehlschlägt und ist es möglich, die Datei damit zu kopieren?
linux
arch-linux
rsync
sysfs
Eugene Yarmash
quelle
quelle
/sys/
?/sys/class/net/*/address
ich überhaupt schreiben (ich bekomme "Erlaubnis verweigert", wenn ich es versuche)? Wenn nicht, dann machen Sie kein echtes / nützliches Backup, da es nicht wiederhergestellt werden kann.Antworten:
Rsync hat Code, der speziell prüft, ob eine Datei während des Lesens abgeschnitten wird, und diesen Fehler ausgibt
ENODATA
. Ich weiß nicht, warum die Dateien in/sys
dieses Verhalten haben, aber da es sich nicht um echte Dateien handelt, ist es wohl nicht allzu überraschend. Es scheint keine Möglichkeit zu geben, rsync anzuweisen, diese bestimmte Prüfung zu überspringen.Ich denke, Sie sind wahrscheinlich besser dran, wenn Sie nicht rsynchen
/sys
und bestimmte Skripte verwenden, um die gewünschten Informationen (wie die Netzwerkkartenadresse) herauszusuchen.quelle
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 einigenodev
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.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: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 als -l
ausführen, werden Sie feststellen, dass alle Dateien eine Größe haben. Normalerweise 4096 Bytes. Dies wird berichtet vonsysfs
.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. Einels
oderstat
der Datei meldet 4096 Bytes.rsync
read_size == 4096
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
nread == 0
, Linie 2554096
Bytes können nicht gelesen werden . Puffer auf Null setzen.ENODATA
.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
Überprüfen Sie, ob die Datei wahrscheinlich spärlich ist. Das heißt die Feile hat Löcher etc.
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.
In der Regel
18446744073709551615
Bytes auf einem 32-Bit-System.quelle
Könnte verwandt sein, aber erweiterte Attributaufrufe schlagen auf sysfs fehl:
Wenn ich mir meine Position ansehe, sieht es so aus, als würde rsync standardmäßig versuchen, erweiterte Attribute einzuspielen:
Ich habe versucht, ein Flag zu finden, mit dem rsync ausgeführt werden kann, um festzustellen, ob das Überspringen erweiterter Attribute das Problem behebt, konnte aber nichts finden (
--xattrs
aktiviert sie am Zielort).quelle
Normalerweise liest Rsync die Dateiinformationen, überträgt den Dateiinhalt oder das Delta in eine temporäre Datei im Zielverzeichnis und benennt sie nach Überprüfung der Dateidaten in den Zieldateinamen um.
Ich glaube, das Problem mit sysfs ist, dass alle Dateien als 4k (eine Speicherseite) angezeigt werden, aber möglicherweise nur wenige Bytes enthalten. Um zu vermeiden, dass eine möglicherweise beschädigte Datei auf das Ziel kopiert wird, bricht rsync die Kopie ab, wenn ein Konflikt zwischen den Metadaten der Datei und den tatsächlich kopierten Daten festgestellt wird.
Zumindest in rsync v3.0.6 kann dieses Verhalten mithilfe des
--inplace
Schalters vermieden werden . Rsync erkennt weiterhin Fehler. Da die Zieldateien jedoch bereits überschrieben wurden, verbleiben die möglicherweise beschädigten Dateien dort.Beachten Sie jedoch, dass der Nebeneffekt darin besteht, dass Dateien auf 4 KB mit Nullen aufgefüllt werden, da dies die Größe ist, die rsync für die Dateien hält. In den meisten Fällen sollte dies keinen Unterschied machen, da Null-Bytes normalerweise ignoriert werden.
quelle