программный ремонт usb flash накопителей в linux
Довольно таки часто занимался программным восстановлением usb flash накопителей на Windows, ну и заинтересовался как можно это реализовать на Linux. Как раз под рукой лежала флэшка JetFlash TS4GJF160 на 4Gb, которая не хотела работать
И так для начала разберемся что же есть программный ремонт. В любой флэшке установлена микросхема-контроллер. Она отвечает за передачу данных между компьютером и флэш-памятью. В случае различных сбоев питания, неправильного извлечения и других причин – происходит сбой контроллера. В результате чего контроллер блокируется и не отвечает на запросы операционной системы. Также, блокировка может произойти из-за износа микросхемы памяти — появления дефектных блоков или превышения порога циклов записи (тогда контроллер сам метит блок как неиспользуемый и часто блокирует флэш на запись). И при попытке доступа к нему из операционной системы можно увидеть следующие сообщения «Вставьте диск» или «Нет доступа к диску», «Диск не отформатирован». Но при попытке отфарматировать выдается сообщение типа «Диск защищен от записи»
Так как же боротся с этим?! Весьма просто…
- Вставляем usb flash накопитель в компьютер и определяем какое имя ему присваивается При подключении usb flash накопителя к компьютеру, Linux присваивает ему имя типа sdX (первому устройству присваивается sda, второму sdb и так далее. Но чтобы узнать какое имя он ему присвоил наверняка, используем 1 из способов:
Набираем команду:
[ 1676.752097] usb 1-1: new high speed USB device using ehci_hcd and address 2 [ 1676.885083] usb 1-1: configuration #1 chosen from 1 choice [ 1676.886065] scsi6 : SCSI emulation for USB Mass Storage devices [ 1676.886393] usb-storage: device found at 2 [ 1676.886399] usb-storage: waiting for device to settle before scanning [ 1681.885333] usb-storage: device scan complete [ 1681.886555] scsi 6:0:0:0: Direct-Access JetFlash TS4GJF160 0.00 PQ: 0 ANSI: 2 [ 1681.887796] sd 6:0:0:0: Attached scsi generic sg3 type 0 [ 1681.892418] sd 6:0:0:0: [sdc] 8028160 512-byte logical blocks: (4.11 GB/3.82 GiB) [ 1681.893352] sd 6:0:0:0: [sdc] Write Protect is off [ 1681.893361] sd 6:0:0:0: [sdc] Mode Sense: 00 00 00 00 [ 1681.893368] sd 6:0:0:0: [sdc] Assuming drive cache: write through [ 1681.895713] sd 6:0:0:0: [sdc] Assuming drive cache: write through [ 1681.895725] sdc: sdc1 [ 1681.972724] sd 6:0:0:0: [sdc] Assuming drive cache: write through [ 1681.972738] sd 6:0:0:0: [sdc] Attached SCSI removable disk
Nov 13 22:25:33 espera kernel: [ 1676.752097] usb 1-1: new high speed USB device using ehci_hcd and address 2 Nov 13 22:25:33 espera kernel: [ 1676.885083] usb 1-1: configuration #1 chosen from 1 choice Nov 13 22:25:33 espera kernel: [ 1676.886065] scsi6 : SCSI emulation for USB Mass Storage devices Nov 13 22:25:38 espera kernel: [ 1681.886555] scsi 6:0:0:0: Direct-Access JetFlash TS4GJF160 0.00 PQ: 0 ANSI: 2 Nov 13 22:25:38 espera kernel: [ 1681.887796] sd 6:0:0:0: Attached scsi generic sg3 type 0 Nov 13 22:25:38 espera kernel: [ 1681.892418] sd 6:0:0:0: [sdc] 8028160 512-byte logical blocks: (4.11 GB/3.82 GiB) Nov 13 22:25:38 espera kernel: [ 1681.893352] sd 6:0:0:0: [sdc] Write Protect is off Nov 13 22:25:38 espera kernel: [ 1681.895725] sdc: sdc1 Nov 13 22:25:38 espera kernel: [ 1681.972738] sd 6:0:0:0: [sdc] Attached SCSI removable disk
Nov 13 22:25:38 espera kernel: [ 1681.895725] sdc: sdc1
Имхо самый оптимальный вариант, выведет весь список смонтированных устройств и в самом конце видим следующее:
/dev/sdc1 on /media/A47B-0D0E type vfat (rw, nosuid, nodev, uhelper=udisks, uid=1000, gid=1000, shortname=mixed, dmask=0077, utf8=1, flush)
sudo dd if=/dev/zero of=/dev/sdc1
dd: запись в «/dev/sdc1»: На устройстве кончилось место 8028098+0 записей считано 8028097+0 записей написано скопировано 4110385664 байта (4,1 GB), 97,692 c, 42,1 MB/c
Устройство не содержит ни верной таблицы разделов DOS, ни метки диска Sun, SGI или OSF Building a new DOS disklabel with disk identifier 0x1854766c. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. . Предупреждение: неверный флаг 0x0000 таблицы разделов 4 будет исправлен записью . WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). . Команда (m для справки):
Команда (m для справки): n Действие команды e расширенный p основной раздел (1-4) p Номер раздела (1-4): 1 Первый цилиндр (1-1019, по умолчанию 1): 1 Last цилиндр, +цилиндры or +size (1-1019, по умолчанию 1019): 1019
Команда (m для справки): p . Диск /dev/sdc1: 4110 МБ, 4110385664 байт 127 heads, 62 sectors/track, 1019 cylinders Units = цилиндры of 7874 * 512 = 4031488 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x1854766c . Устр-во Загр Начало Конец Блоки Id Система /dev/sdc1p1 1 1019 4011772 83 Linux
Команда (m для справки): t Выбранный раздел 1 Шестнадцатеричный код (введите L для получения списка кодов): l . 0 Пустой 24 NEC DOS 81 Minix / ста bf Solaris 1 FAT12 39 Plan 9 82 Linux своп c1 DRDOS/sec (FAT- 2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 40 Venix 80286 84 OS/2 скрыт c6 DRDOS/sec (FAT- 4 FAT16
Команда (m для справки): p . Диск /dev/sdc1: 4110 МБ, 4110385664 байт 127 heads, 62 sectors/track, 1019 cylinders Units = цилиндры of 7874 * 512 = 4031488 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x1854766c . Устр-во Загр Начало Конец Блоки Id Система /dev/sdc1p1 1 1019 4011772 6 FAT16
Команда (m для справки): w Таблица разделов была изменена! . Вызывается ioctl() для перечитывания таблицы разделов. . WARNING: Re-reading the partition table failed with error 22: Недопустимый аргумент. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) . ПРЕДУПРЕЖДЕНИЕ: Если вы создали или изменили какие-либо разделы DOS 6.x, пожалуйста, прочтите страницу руководства fdisk для получения дополнительной информации.
sudo mkdosfs -F 32 /dev/sdc1
Вот вообщем-то и все… Удачи в восстановлении!)
Для дополнительной информации об устройстве, введите:
/dev/sdb: HDIO_DRIVE_CMD(identify) failed: Invalid exchange readonly = 0 (off) readahead = 256 (on) geometry = 1024/0/62, sectors = 0, start = 0