Rsync se nezastaví na chybě

RDa

  • *****
  • 2 797
    • Zobrazit profil
    • E-mail
Rsync se nezastaví na chybě
« kdy: 04. 01. 2025, 13:38:38 »
Ahoj, kopiruji data z USB SSD ktere neni v nejlepsim stavu, a po ruznych pokusech jsem zjistil ze kdyz se kopiruji pomalu, tak to vykazuje mene chyb. Tu pomalost jsem dostahl pres rsync --bwlimit option, ale pak kdyz dojde k chybe, tak to rsync vesele ignoruje a kopiruje same nuly.

Jak rict rsyncu, aby pri "read error" skoncil ? (napr. mc ve stejnem pripade o chybe vi a zastavi se)

Cely prikaz je:
Kód: [Vybrat]
rsync -ai --progress --partial --append --bwlimit=1000 /mnt/usb/neco/ /mnt/sata/neco

A chyba disku takhle:
Kód: [Vybrat]
Jan 04 05:26:51 [kernel] sd 10:0:0:0: Device offlined - not ready after error recovery
Jan 04 05:26:51 [kernel] sd 10:0:0:0: rejecting I/O to offline device

Jde o exfat (s kernel driverem).

Ze tam je chyba nejakym zpusobem musi rsync vedet, protoze od tech cca 5:26 jsou vsechny poskozene soubory s aktualnim create/modify date, zatimco pred tim selhanim blokoveho zarizeni rsync prenastavil timestampy podle zdroje. Takze jsem nastesti mohl identifikovat a odstranit ty falesne data.


Celej log:
Kód: [Vybrat]
Jan 04 04:25:01 [kernel] usb 2-7: reset SuperSpeed Plus Gen 2x1 USB device number 23 using xhci_hcd
Jan 04 04:25:01 [kernel] sd 10:0:0:0: [sdd] tag#0 FAILED Result: hostbyte=DID_TIME_OUT driverbyte=DRIVER_OK cmd_age=30s
Jan 04 04:25:01 [kernel] sd 10:0:0:0: [sdd] tag#0 CDB: Read(16) 88 00 00 00 00 00 0a 0f a4 00 00 00 01 00 00 00
Jan 04 04:25:01 [kernel] I/O error, dev sdd, sector 168797184 op 0x0:(READ) flags 0x80700 phys_seg 16 prio class 0
Jan 04 05:01:01 [CROND] (root) CMD (run-parts /etc/cron.hourly)
Jan 04 05:01:01 [CROND] (root) CMDEND (run-parts /etc/cron.hourly)
Jan 04 05:25:23 [kernel] usb 2-7: reset SuperSpeed Plus Gen 2x1 USB device number 23 using xhci_hcd
Jan 04 05:25:23 [kernel] sd 10:0:0:0: [sdd] tag#0 FAILED Result: hostbyte=DID_TIME_OUT driverbyte=DRIVER_OK cmd_age=30s
Jan 04 05:25:23 [kernel] sd 10:0:0:0: [sdd] tag#0 CDB: Read(16) 88 00 00 00 00 00 0b 3a a3 00 00 00 02 00 00 00
Jan 04 05:25:23 [kernel] I/O error, dev sdd, sector 188392192 op 0x0:(READ) flags 0x80700 phys_seg 9 prio class 0
Jan 04 05:25:53 [kernel] usb 2-7: reset SuperSpeed Plus Gen 2x1 USB device number 23 using xhci_hcd
                - Last output repeated 4 times -
Jan 04 05:26:51 [kernel] sd 10:0:0:0: Device offlined - not ready after error recovery
Jan 04 05:26:51 [kernel] sd 10:0:0:0: [sdd] tag#0 FAILED Result: hostbyte=DID_ABORT driverbyte=DRIVER_OK cmd_age=88s
Jan 04 05:26:51 [kernel] sd 10:0:0:0: [sdd] tag#0 CDB: Read(16) 88 00 00 00 00 00 0b 3a a3 00 00 00 00 08 00 00
Jan 04 05:26:51 [kernel] I/O error, dev sdd, sector 188392192 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:51 [kernel] sd 10:0:0:0: rejecting I/O to offline device
Jan 04 05:26:51 [kernel] I/O error, dev sdd, sector 188392704 op 0x0:(READ) flags 0x80700 phys_seg 5 prio class 0
Jan 04 05:26:51 [kernel] I/O error, dev sdd, sector 188392192 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:51 [kernel] I/O error, dev sdd, sector 188392448 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:52 [kernel] I/O error, dev sdd, sector 188392960 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
Jan 04 05:26:52 [kernel] I/O error, dev sdd, sector 188392960 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:52 [kernel] I/O error, dev sdd, sector 188393472 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
Jan 04 05:26:52 [kernel] I/O error, dev sdd, sector 188393472 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:52 [kernel] I/O error, dev sdd, sector 188393984 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
Jan 04 05:26:52 [kernel] I/O error, dev sdd, sector 188393984 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:57 [kernel] blk_print_req_error: 32 callbacks suppressed
Jan 04 05:26:57 [kernel] I/O error, dev sdd, sector 188402688 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
Jan 04 05:26:57 [kernel] I/O error, dev sdd, sector 188402688 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:57 [kernel] I/O error, dev sdd, sector 188403200 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
Jan 04 05:26:57 [kernel] I/O error, dev sdd, sector 188403200 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:57 [kernel] I/O error, dev sdd, sector 188403712 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
Jan 04 05:26:57 [kernel] I/O error, dev sdd, sector 188403712 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:57 [kernel] I/O error, dev sdd, sector 188404224 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
Jan 04 05:26:57 [kernel] I/O error, dev sdd, sector 188404224 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:26:58 [kernel] I/O error, dev sdd, sector 188404736 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
Jan 04 05:26:58 [kernel] I/O error, dev sdd, sector 188404736 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Jan 04 05:27:02 [kernel] blk_print_req_error: 30 callbacks suppressed
« Poslední změna: 04. 01. 2025, 13:42:09 od RDa »


Re:rsync se nezastavi na chybe
« Odpověď #1 kdy: 04. 01. 2025, 13:48:30 »
Pro kopírování dat z poškozených médií je lepší ddrescue. Ve vašem případě je pravděpodobné, že rsync ta chybná data dostává od něčeho před sebou, tipoval bych řadič toho USB disku.

RDa

  • *****
  • 2 797
    • Zobrazit profil
    • E-mail
Re:rsync se nezastavi na chybe
« Odpověď #2 kdy: 04. 01. 2025, 14:16:01 »
Pro kopírování dat z poškozených médií je lepší ddrescue. Ve vašem případě je pravděpodobné, že rsync ta chybná data dostává od něčeho před sebou, tipoval bych řadič toho USB disku.

V tomto pripade lepsi neni, protoze s timto konkrektnim kousem nemate zkusenost. dd-rescue vyhnije rovnou kolem sektoru 1700, protoze ten uz radic disku neprecte a disk se odpoji. A delat fyzicke odpojeni a pripojeni bych fakt nechtel delat pri kazde chybe kterou ddrescue potka. Obnovoval jsem stovky tera a vim co kdy pouzit, o to nemejte obavy.

Klasickym kopirovanim se ziskalo uz 2T z 3T obsahu (na 4T disku), protoze novejsi data precist slo, a rucni intervence s odpojenim a pripojenim kabelu byly na unosne mire. Starsi soubory tam vykazuji caste resety (radic premysli/pokousi se dele nez mu linux toleruje), ale pak nastane situace kdy FW crashne a pak uz se ani nenecha resetovat USB (pak je to tvrde nedostupne pro jakekoliv I/O).

Ty nuly nepochazi z radice - protoze disk je offline, a jak jsem psal, midnight commander ve stejnem pripade napsat ze zdrojovy soubor je necitelny a mohl jsem ponechat nebo smazat cil a tim to koncilo.

Ale rsync je proste divny nastroj - neverim tomu ze nekontroluje navratove kody z fopen/fread a tupe nakopiruje nuly.
^^ a tohle je to co resim, tak se prosim drzte tematu


Re:Rsync se nezastaví na chybě
« Odpověď #3 kdy: 04. 01. 2025, 20:33:31 »
Netuším, jak přesně se chová rsync při kopírování z toho konkrétního zařízení. To že to neskončí chybou a kopíruje nuly rozhodně není košér. Nezměnilo by tam přidání parametru timeout, kdy mu přidáš nějaký časový limit - nevím vteřina - pro získání konkrétního souboru? Pokud při tom read requestu to blokové zařízení nějak váhá, tak by to možná mohlo něco hodit.

Jinak ještě mimoběžně. jediné, co mi trochu vysvětluje, proč by mělo projít kopírování, ale ddrescue selže takhle brzy, je to, že si při sekvenčním kopírování všech bloků FS hrábne na nějakou oblast, kde sice nejsou reálně není žádné alokované soubory, ale SSDčko se z toho přístupu už nevzbelhá.
Já už párkrát používal ddrescue dohromady s partclone - primárně aby netrávil čas zbytečnými opakováními při čtení z oblastí, kde nejsou užitečná data. Pokud je čitelná alokační tabulka, tak partclone vytvoří mapu alokovaných oblastí, a ddrescue pak ignoruje zbytek.
S exfatem a omezením rychlosti čtení u ddrescue by to mohlo být něco jako..


partclone.exfat --domain -s /dev/partition -o /tmp/partition.domain
ddrescue --max-read-rate=$((1024*1024)) --domain-mapfile=/tmp/partition.domain /dev/partition /tmp/image
mount -o loop /tmp/image /mnt/tmp


I když vím, že jestli už máš zachráněno větší část dat rsyncem, tak to možná nebude dávat úplně smysl, krom zkoušky s více možnostmi čtení a chování při chybě, co nabízí ddrescue oproti rsyncu.
Další možnost s ddrescue je - udělat si seznam zbývajících souborů ke zkopírování (třeba rsyncem s dry run), pak případně vytvořit cílovou adresářovou strukturu a finálně to protáhnout smyčkou ve skriptu nebo xargs, co bude pro každé kopírování souboru volat ddrescue s parametry.