Спасая флешку, устройство пропадает при ошибке чтения, как создать байт-копию
Мой флеш-диск Kingston 16 ГБ, и он является частью dmesg при подключении как /dev/sdc:
usb 2-3: new SuperSpeed USB device number 126 using xhci_hcd
usb 2-3: New USB device found, idVendor=0951, idProduct=1666
usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-3: Product: DataTraveler 3.0
usb 2-3: Manufacturer: Kingston
[sdc] 30277632 512-byte logical blocks: (15.5 GB/14.4 GiB)
Также есть устройства /dev/sdc1 и /dev/sdc2 после подключения диска. Я хотел бы создать байт-копию устройства. Однако когда я запускаю что-то как
dd if=/dev/sdc of=FLASH bs=512
тогда просто небольшая часть копируется:
dd: error reading '/dev/sdc': Input/output error
127456+0 records in
127456+0 records out
65257472 bytes (65 MB, 62 MiB) copied, 13.0206 s, 5.0 MB/s
Еще более странно то, что после неудачного чтения в dmesg появляются следующие сообщения
blk_update_request: I/O error, dev sdc, sector 127456
sd 7:0:0:0: [sdc] tag#0 FAILED Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
sd 7:0:0:0: [sdc] tag#0 CDB: Read(10) 28 00 00 01 f2 e0 00 01 00 00
usb 2-3: new SuperSpeed USB device number 127 using xhci_hcd
usb 2-3: New USB device found, idVendor=13fe, idProduct=5500
usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 2-3: Product: 2307 Boot ROM
usb 2-3: Manufacturer: Phison
usb-storage 2-3:1.0: USB Mass Storage device detected
scsi host7: usb-storage 2-3:1.0
scsi 7:0:0:0: Direct-Access 2307 PRAM 1.00 PQ: 0 ANSI: 0 CCS
sd 7:0:0:0: Attached scsi generic sg3 type 0
sd 7:0:0:0: [sdc] Attached SCSI removable disk
Таким образом, кажется, что после сбоя чтения устройство исчезает и каким-то образом восстанавливается модулем ядра xhci_hcd. Проблема в том, что когда я переиздаю команду
dd if=/dev/sdc of=FLASH bs=512
тогда результат
dd: failed to open '/dev/sdc': No medium found
/ Dev / sdc все еще находится в списке устройств, но устройства /dev/sdc1 и /dev/sdc2 исчезают.
Я решил создать байт-копию устройства, выполнив следующую процедуру. Сначала я создаю пустой файл размером с устройство
dd if=/dev/zero of=FLASH bs=512 count=30277632
Затем я создаю следующий скрипт
#!/bin/bash
#usage ./ddscript /dev/sdc blockoffset
dd bs=512 if=$1 of=FLASH seek=$2 skip=$2 conv=nocreat,notrunc,fdatasync iflag=direct,fullblock
После этого сценария из выходных данных я анализирую количество прочитанных байтов, увеличиваю blockoffset и повторяю, пока не достигну 16 ГБ. Я хотел бы автоматизировать процесс. Считать блок на dd, увеличить смещение на длину прочитанных данных или на константу в случае неудачи и повторять до конца блочного устройства.
Проблема в том, что мне нужно физически отключить и снова подключить USB-накопитель между этими испытаниями. Я не мог понять, как сбросить устройство в состояние, когда его снова читабельно и его разделы появляются без удаления его из USB-слота или перезагрузки компьютера.
Конечно, было бы также полезно, если бы я выяснил, почему после ошибки чтения устройство исчезает, и если я могу каким-то образом заставить модуль ядра или xhci_hcd игнорировать ошибки чтения и не уничтожать устройство. Если это происходит из-за аппаратного обеспечения, которое выключается после неправильной попытки чтения, тогда я не понимаю, почему ядро смонтировало бы его тогда в какое-то состояние зомби, а не в состояние, которое появляется, когда я отключаюсь и снова подключаю устройство. Из любопытства я хотел бы видеть место в исходном коде ядра, где сообщение "blk_update_request: ошибка ввода-вывода, dev sdc, сектор 127456" запускается, если этот фрагмент кода не уничтожает / не сбрасывает устройство без вывода сообщений.
В случае успеха я опубликую здесь скрипт для интерактивного чтения содержимого исчезающего устройства при ошибках чтения.