Rsync má kód, který konkrétně kontroluje, zda je soubor během čtení zkrácen, a dává tuto chybu — ENODATA
. Nevím proč soubory v /sys
mají toto chování, ale protože to nejsou skutečné soubory, myslím, že to není příliš překvapivé. Zdá se, že neexistuje způsob, jak říci rsync, aby tuto konkrétní kontrolu vynechal.
Myslím, že pravděpodobně bude lepší nesynchronizovat /sys
a používání specifických skriptů k výběru konkrétních informací, které chcete (jako je adresa síťové karty).
Nejprve /sys
je pseudo souborový systém . Pokud se podíváte na /proc/filesystems
najdete seznam registrovaných souborových systémů, z nichž některé mají nodev
vpředu. To znamená, že se jedná o pseudo souborové systémy . To znamená, že existují v běžícím jádře jako souborový systém založený na RAM. Dále nevyžadují blokovací zařízení.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
Při bootování jádro připojí tento systém a aktualizuje záznamy, když se to hodí. Např. když je nalezen nový hardware během bootování nebo pomocí udev
.
V /etc/mtab
připojení obvykle najdete podle:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Chcete-li získat pěkný článek na toto téma, přečtěte siPatric Mochel's – The sysfs Filesystem.
status souborů /sys
Pokud přejdete do adresáře pod /sys
a proveďte ls -l
všimnete si, že všechny soubory mají jednu velikost. Obvykle 4096 bajtů. Hlásí to 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
...
Dále můžete provést stat
na soubor a všimněte si další odlišné vlastnosti; zabírá 0 bloků. Také inode kořenového adresáře (stat /sys) je 1. /stat/fs
typicky má inode 2. atd.
rsync vs. cp
Nejjednodušším vysvětlením selhání rsync synchronizace pseudo souborů je možná příklad.
Řekněme, že máme soubor s názvem address
to je 18 bajtů. ls
nebo stat
of thefile hlásí 4096 bajtů.
rsync
- Otevře deskriptor souboru, fd.
- Používá fstat(fd) k získání informací, jako je velikost.
- Nastavte čtení bajtů velikosti, tj. 4096. To by byl řádek 253 kódu propojeného @mattdm.
read_size == 4096
- Zeptejte se; přečteno:4096 bajtů.
- Čte se krátký řetězec, tj. 18 bajtů.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Zeptejte se; přečteno:4078 bajtů
- 0 přečtených bajtů (při prvním čtení byly spotřebovány všechny bajty v souboru).
nread == 0
, řádek 255- Nelze přečíst
4096
bajtů. Vynulovat vyrovnávací paměť. - Nastavit chybu
ENODATA
. - Vraťte se.
- Nahlásit chybu.
- Zkuste to znovu. (Nad smyčkou).
- Neúspěšné.
- Nahlásit chybu.
- Fajn.
Během tohoto procesu skutečně čte celý soubor. Ale bez dostupné velikosti nemůže ověřit výsledek – selhání je tedy jedinou možností.
cp
- Otevře deskriptor souboru, fd.
- Používá fstat(fd) k získání informací, jako je st_size (také používá lstat a stat).
-
Zkontrolujte, zda není soubor pravděpodobně řídký. To znamená, že soubor má díry atd.
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
soubor reportů, který má nulové bloky, je kategorizován jako řídký. -
Pokusí se číst soubor pomocí kopírování rozsahu (efektivnější způsob kopírování normálním řídké soubory) a selže.
- Kopírovat pomocí řídkého kopírování.
- Začíná maximální velikostí čtení MAXINT.
Obvykle18446744073709551615
bajtů na 32bitovém systému. - Zeptejte se; přečteno 4096 bajtů. (Velikost vyrovnávací paměti přidělená v paměti ze statistických informací.)
- Čte se krátký řetězec, tj. 18 bajtů.
- Zkontrolujte, zda je potřeba díra, ne.
- Zapsat do vyrovnávací paměti cíle.
- Od maximální velikosti čtení odečtěte 18.
- Zeptejte se; přečíst 4096 bajtů.
- 0 bajtů, protože všechny byly spotřebovány při prvním čtení.
- Návrat byl úspěšný.
- Začíná maximální velikostí čtení MAXINT.
- Vše v pořádku. Aktualizujte příznaky pro soubor.
- Fajn.
Může to souviset, ale volání rozšířených atributů selžou na sysfs:
[[email protected] eth0]# adresa lsattr
lsattr:Nevhodný ioctl pro zařízení Při čtení příznaků na adrese
[[email protected] eth0]#
Při pohledu na můj strace to vypadá, že se rsync ve výchozím nastavení pokouší stáhnout rozšířené atributy:
22964 <... getxattr restored> , 0x7fff42845110, 132) =-1 ENODATA (Žádná data nejsou k dispozici)
Zkoušel jsem najít příznak, který dává rsync, abych zjistil, zda přeskočení rozšířených atributů problém vyřeší, ale nic jsem nenašel (--xattrs
zapne v cíli).