Компьютер-Информ || Архив || Рубрики || Поиск || Подписка || Работа || О "КИ" || Карта


ИТ дома и на работе


Программный ремонт USB flash в Linux

Виталий Розизнаный


Предисловие

Публикуя данную статью, мы предваряем ее выдержками из внутренней редакционной рецензии.

  1. Статья интересная. Но надо обязательно предупредить читателей, что поверхностное знакомство с ОС Linux при выполнении перечисленных в статье действий может создать проблемы для их данных. Даже небольшая ошибка в командах или параметрах может привести к потере всей информации на жестких дисках системы.
  2. Утверждения автора об отсутствии нормального софта для аккуратного форматирования USB под Windows достаточно жесткие, но, на первый взгляд, это соответствует действительности, - просто проблема, рассматриваемая в статье, встает не очень часто. В большинстве случаев проблему решают форматированием стандартными средствами Windows.
  3. Заполнить диск нулями можно бесплатной утилитой KillDisk (http://www.killdisk.com). В Windows при этом все работает, что и устраивает большинство пользователей. Немногие задумываются об использовании вновь отформатированного Flash-диска в других ОС.

Статья перепечатывается с любезного разрешения автора и сайта компании R.LAB (http://rlab.ru/doc/repair_usb_flash_linux.html).


Сегодня речь пойдет о так называемом "программном ремонте" USB flash-накопителей. Вопросы аппаратного ремонта рассматриваться не будут по причине копеечной стоимости новых абсолютно исправных устройств; вопрос же снятия данных с неисправных флэшек не рассматривается из-за отсутствия у автора желания публично его рассматривать.

Поводом для написания статьи послужило обилие на различных форумах советов по устранению программных глюков флэшек с помощью различных утилит "низкоуровневого форматирования" и пр. Не отрицая существования утилит "от производителя", хочу заметить, что существует весьма простой и вполне надежный метод удаления софт-бэдов на флэшках, устранения проблем с файловой системой, бут-сектором и MBR, возникающих, как правило, при небезопасном извлечении этих устройств из компьютера, либо же из-за иных программных или аппаратных сбоев компьютера.

Существующие методы "излечения" этих болезней под ОС MS Windows имеют ряд существенных недостатков, причиной которых является отсутствие в Windows достаточно функциональных средств диск-менеджмента даже от сторонних производителей. Простой пример: после "заливки" флэшки нулями Windows форматирует ее как super-floppy, т. е., без организации MBR, что для корректной работы флэшки под разными ОС недопустимо. Сторонние диск-менеджеры либо не умеют работать с USB-устройствами (Norton Partition Magic), либо работают некорректно (Paragon Partition Manager). Работа же с флэшкой под различными ОС ведется именно как с жестким диском, поэтому и предъявляемые требования к организации логической структуры аналогичны винчестеру, а не дискете. Для этих целей воспользуемся правильными ОС и софтом, которые к тому же абсолютно бесплатны.

Итак... Имеет место флэшка, которая либо виснет в Windows, либо просится быть отформатированной, но не форматируется ("Windows не может завершить форматирование" - о, ужас!), либо сыплет бэдами при сканировании тем же HDDScan.

Если с Linux вы незнакомы, то я предложу для начала скачать один из LiveCD-дистрибутивов и, предварительно записав образ на CD, загрузиться с него. Я, как "слаковод", естественно, предложу Slax, - он невелик по размерам, несложен (впрочем, как и всякий LiveCD общего назначения), быстро грузится, и в нем есть все необходимое для "ремонта". Если же какой-либо из Linux у вас уже стоит на HDD, и вы с ним дружите, то буду рад добавить в вашу копилку знаний еще несколько советов.

Лично мной работа велась под локализованным неофициальным портом Slackware для 64-битных процессоров BlueWhite64.

Немного о форматировании: сейчас пойдут большие куски кода. Обычным моноширинным шрифтом мы будем показывать вывод консоли, жирным - наш ввод. Сразу за решеткой # -мои комментарии.

Итак, загрузились. Если вы не root, то станьте им, выполнив команду su и введя пароль, ибо борьба с ополоумевшим железом по праву только суперпользователю.

Подключаем флэшку, смотрим список USB-устройств. Вводим lsusb, нажимаем Enter, смотрим вывод:

root@H84_103:~# lsusb
#Наблюдаем вывод: вот она, родимая, даже, вроде "аппаратно" живая.
Bus 005 Device 003: ID 0ea0:2168 Ours Technology, Inc. Transcend JetFlash 2.0/Astone USB Drive
Bus 005 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
#Это сканер, он нам не мешает.
Bus 001 Device 003: ID 04a5:20fc Acer Peripherals Inc. (now BenQ Corp.) Benq 5000
Bus 001 Device 001: ID 0000:0000

Флэш-накопители распознаются как SCSI-диски, т. е., устройства /dev/sdX, но работает с ними почему-то типично IDE-дисковая утилита hdparm. Внимание!!! SATA-винчестеры у нас тоже обозначаются как /dev/sdX! У меня SATA-винчестер, потому ему по праву принадлежит /dev/sda, а флэшке - следующая буква b, т. е., /dev/sdb. Попытаемся познакомиться с ней поближе:

root@H84_103:~# hdparm /dev/sdb

/dev/sdb:
#Защита от записи выключена
readonly = 0 (off)
readahead = 256 (on)
#Транслируемая геометрия соответствует реальной: 1017856 секторов - это примерно равно 512 МБ
geometry = 1014/17/59, sectors = 1017856, start = 0
Теперь сделаем ей "низкоуровневое форматирование", т. е. забъем все пространство накопителя нулевыми байтами.
Таким образом мы удалим софт-бэды, сотрем ошибочные таблицы FAT, загрузочный сектор, MBR. Внимание! Все оставшиеся данные на флэшке будут безвозвратно утеряны!

root@H84_103:~# dd if=/dev/zero of=/dev/sdb
#dd вводили без параметров, теперь он жалуется на нехватку места на флэшке. И правильно, генератор нулей-то у нас безразмерный...
dd: запись в '/dev/sdb': No space left on device
1017857+0 записей считано
1017856+0 записей написано
скопировано 521142272 байта (521 МБ), 144,185 секунд, 3,6 МБ/сек
Флэшка USB 2.0 на 512 МБ стиралась 2,5 минуты.
Теперь "по-фирменному" создаем раздел.
root@H84_103:~# fdisk /dev/sdb

#fdisk ругается, что не нашел ни DOS-овской таблицы разделов, ни метки диска в стиле BSD. Оно и понятно - вся флэшка забита нулями.
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w (rite)

#Умный fdisk сразу предлагает помощь. Давим m
Command (m for help): m
#Вывод списка команд:
Command action
a - toggle a bootable flag
b - edit bsd disklabel
c - toggle the dos compatibility flag
d - delete a partition
l - list known partition types
m - print this menu
n - add a new partition
o - create a new empty DOS partition table
p - print the partition table
q - quit without saving changes
s - create a new empty Sun disklabel
t - change a partition's system id
u - change display/entry units
v - verify the partition table
w - write table to disk and exit
x - extra functionality (experts only)

#Нам нужен новый раздел. Жмем n, как написано:
Command (m for help): n
Command action
e - extended
p - primary partition (1-4)
#Естественно, первичный раздел. Жмем p
p
#И первый, естественно. Жмем 1
Partition number (1-4): 1
#Здесь соглашаемся со всем, что предлагает fdisk. Он умный, сам разберется
First cylinder (1-1014, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1014, default 1014):
Using default value 1014

#Смотрим, чего мы наваяли. Жмем p
Command (m for help): p

Disk /dev/sdb: 521 MB, 521142272 bytes
17 heads, 59 sectors/track, 1014 cylinders
Units = cylinders of 1003 * 512 = 513536 bytes

 Device Boot  Start  End  Blocks  Id  System
 
/dev/sdb1
 
1
 
1014
 
508491+
 
83
 
Linux

#По умолчанию fdisk создал, естественно, Lunux'овый раздел (ну не Windows'овый же ему создавать). Надо поменять ID раздела. Жмем t.
Command (m for help): t
#Выбираем первый раздел для изменения ID.
Selected partition 1
#предусмотрительный fdisk предлагает посмотреть, на что мы можем поменять тип раздела.
Hex code (type L to list codes): l

0 Empty 1e Hidden W95 FAT1 80 Old Minix be Solaris boot
1 FAT12 24 NEC DOS 81 Minix / old Lin bf Solaris
2 XENIX root 39 Plan 9 82 Linux swap c1 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
5 Extended 41 PPC PReP Boot 85 Linux extended c7 Syrinx
6 FAT16 42 SFS 86 NTFS volume set da Non-FS data
7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set db CP/M / CTOS /.
8 AIX 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility
9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM df BootIt
a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e1 DOS access
b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O
c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS e4 SpeedStor
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs
f W95 Ext'd (LBA) 54 OnTrackDM6 a5 FreeBSD ee EFI GPT
10 OPUS 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/
11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b
12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f1 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor a9 NetBSD f4 SpeedStor
16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fd Linux raid auto
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fe LANstep
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid ff BBT
1c Hidden W95 FAT3 75 PC/IX

#Елки-палки, а мы думали, что кроме Windows и FAT32 на свете ничего и нет.
Меняем ID partition на FAT16 - топчем 6
Hex code (type L to list codes): 6
Changed system type of partition 1 to 6 (FAT16)

#Еще раз посмотрим на дело рук своих.
Command (m for help): p

Disk /dev/sdb: 521 MB, 521142272 bytes
17 heads, 59 sectors/track, 1014 cylinders
Units = cylinders of 1003 * 512 = 513536 bytes

 Device Boot  Start  End  Blocks  Id  System
 
/dev/sdb1
 
1
 
1014
 
508491+
 
6
 
FAT16

#Все ОК. Пишем изменения и выходим.
Command (m for help): w
The partition table has been altered!

Calling ioctl () to re-read partition table.

WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional information.
Syncing disks.

И все!? Ан нет. Это создан раздел для FAT16. А его надо отформатировать, или, по-научному говоря, создать на нем чистую файловую систему. В Linux есть простая и прямая как рельс утилитка для этого - mkdosfs. Просто пишем, на каком разделе мы хотим создать чистую FAT16.

root@H84_103:~# mkdosfs /dev/sdb1
mkdosfs 2.11 (12 Mar 2005)

Линкусоиды могут тут же примонтировать новообретенный девайс и что-нибудь записать на него. Пользователи дружественной и удовлетворяющей всем запросам пользователей ОС грузятся в Windows и радуются, что стали "настоящими" линуксоидами.


Необходимое послесловие

Автор не несет никакой ответственности за то, что счастливые обладатели SATA-дисков попутали буквы и постирали информацию со своих винчестеров (а такие будут, это я гарантирую). Данная технология справедлива для флэшек до 2 ГБ включительно.

Автор искренне благодарит Алексея Хована за помощь в написании статьи и дополнительную проверку работоспособности метода.


Рубрики || Работа || Услуги || Поиск || Архив || Дни рождения
О "КИ" || График выхода || Карта сайта || Подписка

Рассылка анонсов газеты по электронной почте

Главная страница

Сайт газеты "Компьютер-Информ" является зарегистрированным электронным СМИ.
Свидетельство Эл 77-4461 от 2 апреля 2001 г.
Перепечатка материалов без письменного согласия редакции запрещена.
При использовании материалов газеты в Интернет гиперссылка обязательна.

Телефон редакции (812) 718-6666, 718-6555.
Адрес: 196084, СПб, ул.Заставская, д.23, БЦ "Авиатор", 3-й этаж, офис 307
e-mail: editor@ci.ru
Для пресс-релизов и новостей news@ci.ru