Nesmyslnost volání syncu po zápisu do souboru už byla rozebrána výše, ale já bych chtěl upozornit na jinou vlastnost dd (minimálně toho GNU), o které se moc neví: když nastavíte bs, tak to říká, jak velký bude buffer pro read(2), a count říká, kolik readů se provede. Ale vůbec nikdo negarantuje, že read dostane buffer naplněný! Jádro úplně v pohodě může vrátit třeba i jenom jeden bajt. To se může stát třeba při signálu nebo při čtení z pomalého zařízení. A vyřešit se to dá třeba pomocí iflag=fullblock.
Díky za tip.
Pro zrychlení dd používám iflag=direct
také čtení a zápis pouštím v samostatných procesech, což má smysl, pokud jsou disky na samostatných řadičích.
Pak to vypadá třeba:
dd if=/dev/sdc bs=8M iflag=direct | dd of=/dev/sdb bs=8M oflag=direct
Direct a fullblock se dají kombinovat?
Velikost bs dávám s ohledem na cache řadiče.
Zjistitelné třeba přes hdparm -i /dev/sdx hodnota BuffSize.
Ne každý disk se o ten údaj podělí.
Když se rychlost blíží parametrům max rychlosti čtení z disku tak fajn.
A ta se dá zjistit přes: hdparm -t /dev/sdx
A pro ty co to netuší: stav dd, tedy kolik už se zkopírovalo, se dá vypsat zasláním signálu USR1.
Tak pv je na trubky. Mimochodem ještě existuje příkaz progress, který zobrazí aktuální progress již běžícího procesu, a funguje asi na 30 různých programů (cp, mv, gzip…). Funguje tak, že se koukne do /proc/pid/fd na symlinky a pak si z /proc/pid/fdinfo/číslo přečte pozici v souboru. A to je současně návod jak to emulovat ručně pro programy, které v progressu explicitní podporu nemají (třeba ffmpeg, nebo něco co jste napsali sami).
(2) za názvem značí, že to je syscall. (3) by byla funkce z libc, (1) by byl uživatelský příkaz, (8) administrátorský příkaz (viz man man). Zde je to celkem bez kolize (resp. man read bez čísla na mém systému zobrazí nějakou funkci z Tcl), ale vyzkoušej si rozdíl mezi man 2 mount a man 8 mount.