Mam skrypt bash, który służy rsync
do tworzenia kopii zapasowych plików w Archlinux. Zauważyłem, że rsync
nie udało się skopiować pliku /sys
, ale cp
działało dobrze:
# 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
Zastanawiam się, dlaczego się nie rsync
udaje i czy można z nim skopiować plik?
linux
arch-linux
rsync
sysfs
Eugene Yarmash
źródło
źródło
/sys/
?/sys/class/net/*/address
(gdy próbuję uzyskać „odmowę dostępu ”)? Jeśli nie, to nie tworzysz prawdziwej / przydatnej kopii zapasowej, ponieważ nie można jej przywrócić.Odpowiedzi:
Rsync ma kod, który konkretnie sprawdza, czy plik jest obcinany podczas odczytu i podaje ten błąd -
ENODATA
. Nie wiem, dlaczego pliki/sys
mają takie zachowanie, ale ponieważ nie są to prawdziwe pliki, myślę, że nie jest to zbyt zaskakujące. Wydaje się, że nie ma sposobu, aby powiedzieć rsync, aby pomijał ten konkretny test.Myślę, że lepiej, żebyś nie rsynchronizował
/sys
i nie używał określonych skryptów do wybrania konkretnych informacji (takich jak adres karty sieciowej).źródło
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 manodev
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.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: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 tols -l
, zauważysz, że wszystkie pliki mają jeden rozmiar. Zazwyczaj 4096 bajtów. Jest to zgłaszane przezsysfs
.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. Plikls
lubstat
zgłasza 4096 bajtów.rsync
read_size == 4096
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
nread == 0
, linia 2554096
bajtów. Bufor zerowy.ENODATA
.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
Sprawdź, czy plik może być rzadki. To znaczy, że plik ma dziury itp.
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.
Zazwyczaj
18446744073709551615
bajty w systemie 32-bitowym.źródło
Być może są powiązane, ale rozszerzone wywołania atrybutów nie będą działać na sysfs:
Patrząc na moją ścieżkę, wygląda na to, że rsync próbuje domyślnie rozszerzyć atrybuty:
Próbowałem znaleźć flagę dać rsync, aby sprawdzić, czy pomijanie atrybutów rozszerzonych rozwiązuje problem, ale nie był w stanie znaleźć coś (
--xattrs
zamienia je na w miejscu przeznaczenia).źródło
Rsync zwykle odczytuje informacje o pliku, przenosi zawartość pliku lub deltę do pliku tymczasowego w katalogu docelowym, a następnie po zweryfikowaniu danych pliku zmienia nazwę na docelową nazwę pliku.
Uważam, że problem z sysfs polega na tym, że wszystkie pliki są wyświetlane jako 4k (jedna strona pamięci), ale mogą zawierać tylko kilka bajtów. Aby uniknąć kopiowania potencjalnie uszkodzonego pliku do miejsca docelowego, rsync anuluje kopię, gdy zobaczy niezgodność między metadanymi pliku a tym, co zostało skopiowane.
Przynajmniej w rsync v3.0.6 tego zachowania można uniknąć za pomocą
--inplace
przełącznika. Rsync nadal wykrywa błędy, ale ponieważ pliki docelowe zostały już nadpisane, pozostawia tam potencjalnie uszkodzone pliki.Zauważ jednak, że efektem ubocznym jest to, że pliki są zerowane do 4k, ponieważ taki rozmiar rsync uważa za pliki. W większości przypadków nie powinno to mieć znaczenia, ponieważ bajty zerowe są zwykle ignorowane.
źródło