GNU/Linux >> Znalost Linux >  >> Linux

Proč se rsync nedaří zkopírovat soubory z /sys v Linuxu?

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

  1. Otevře deskriptor souboru, fd.
  2. Používá fstat(fd) k získání informací, jako je velikost.
  3. Nastavte čtení bajtů velikosti, tj. 4096. To by byl řádek 253 kódu propojeného @mattdm. read_size == 4096
    1. Zeptejte se; přečteno:4096 bajtů.
    2. Čte se krátký řetězec, tj. 18 bajtů. nread == 18
    3. read_size = read_size - nread (4096 - 18 = 4078)
    4. Zeptejte se; přečteno:4078 bajtů
    5. 0 přečtených bajtů (při prvním čtení byly spotřebovány všechny bajty v souboru).
    6. nread == 0 , řádek 255
    7. Nelze přečíst 4096 bajtů. Vynulovat vyrovnávací paměť.
    8. Nastavit chybu ENODATA .
    9. Vraťte se.
  4. Nahlásit chybu.
  5. Zkuste to znovu. (Nad smyčkou).
  6. Neúspěšné.
  7. Nahlásit chybu.
  8. 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

  1. Otevře deskriptor souboru, fd.
  2. Používá fstat(fd) k získání informací, jako je st_size (také používá lstat a stat).
  3. 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ý.

  4. Pokusí se číst soubor pomocí kopírování rozsahu (efektivnější způsob kopírování normálním řídké soubory) a selže.

  5. Kopírovat pomocí řídkého kopírování.
    1. Začíná maximální velikostí čtení MAXINT.
      Obvykle 18446744073709551615 bajtů na 32bitovém systému.
    2. Zeptejte se; přečteno 4096 bajtů. (Velikost vyrovnávací paměti přidělená v paměti ze statistických informací.)
    3. Čte se krátký řetězec, tj. 18 bajtů.
    4. Zkontrolujte, zda je potřeba díra, ne.
    5. Zapsat do vyrovnávací paměti cíle.
    6. Od maximální velikosti čtení odečtěte 18.
    7. Zeptejte se; přečíst 4096 bajtů.
    8. 0 bajtů, protože všechny byly spotřebovány při prvním čtení.
    9. Návrat byl úspěšný.
  6. Vše v pořádku. Aktualizujte příznaky pro soubor.
  7. 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).


Linux
  1. Zkopírujte soubory v terminálu Linux

  2. Linux – Jak otestovat, zda je blokové zařízení pouze pro čtení z /sys nebo /proc?

  3. Co jsou soubory /dev/zero a /dev/null v Linuxu

  1. Jak vytvořit soubor v Linuxu z okna terminálu?

  2. pscp zkopírujte soubor vzdáleně z Windows do Linuxu

  3. Proč systém Windows nerozpozná soubory uvnitř oddílů Linux?

  1. [Vyřešeno]:Proč rsync nezkopíroval skryté soubory/adresáře a proč hvězdička nezahrnuje skryté (tečkové) soubory v Linuxu?

  2. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  3. Proč dd z /dev/random dává různé velikosti souborů?