3

У меня есть внешний жесткий диск Transcend Storejet USB. Это не SSD, а механический диск с вращающимися пластинами. Я отформатировал весь диск, без разметки, как NTFS. Я использовал инструмент mkntfs под Linux.

При подключении к машине Linux система видит диск с двумя разделами (/dev/sdc /dev/sdc1 /dev/sdc2). Однако, поскольку я знаю, что это диск без разделов, я могу смонтировать все устройство (mount -t ntfs /dev/sdc /mnt), и оно работает без проблем.

При подключении к машине с MS Windows XP система видит диск с двумя неформатированными разделами и не назначает букву диска ни всему диску, ни любому из разделов.

Кто-нибудь знает, как заставить MS Windows монтировать мой диск как дискету NTFS?

Я уже пытался удалить старые точки подключения USB и остаточные устройства с помощью DriveCleanup. Это не помогло.

Кстати, у меня также есть внешний USB-накопитель Kingston USB, также отформатированный как NTFS superfloppy, без разметки. Тем не менее, этот файл распознается и монтируется нормально в MS Windows.

1 ответ1

3

Я могу воспроизвести вашу проблему и объяснить ее. И исправить это, я думаю.


Краткое объяснение

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


Длинное объяснение

MBR против VBR

Большинство дисков, которые мы используем, были разбиты на разделы. В этом случае первые 512 байт диска являются Master Boot Record (MBR). Даже в таблице разделов GUID (GPT) первые 512 байт образуют своего рода MBR по устаревшим причинам. Важно то, что каждая современная ОС ожидает найти MBR в самом начале диска.

Superfloppy - это диск, который при создании файловой системы рассматривался как раздел. В этом случае первые 512 байт содержат загрузочную запись тома (VBR), как обычно бывает в начале раздела.

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

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

Эта проблема

Давайте сравним базовую раскладку MBR (отсюда) с раскладкой NTFS VBR (отсюда):

    MBR    │ byte offset │  NTFS VBR
           │  hex / dec  │
───────────┼─────────────┼─────────────
           │ 0x000 / 000 │ mainly NTFS
 bootstrap │      …      │  metadata
   code    ├─────────────┼─────────────
           │ 0x054 / 084 │
           │      …      │  bootstrap
───────────┼─────────────┤    code
 partition │ 0x1BE / 446 │
   table   │      …      │
───────────┼─────────────┼─────────────
   0x55    │ 0x1FE / 510 │    0x55
   0xAA    │ 0x1FF / 511 │    0xAA
───────────┴─────────────┴─────────────

Я взял свою флешку и создал NTFS суперфлоппи с помощью mkntfs -F -f /dev/sdc . Инструмент переписал весь первый сектор, включая область кода начальной загрузки. Windows или другая ОС могут некоторое время считать MBR и проверять область таблицы разделов. Вот что он получит:

#fdisk -l /dev/sdc

Disk /dev/sdc: 31.5 GB, 31466323968 bytes
64 heads, 32 sectors/track, 30008 cylinders, total 61457664 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2052474d

This doesn't look like a partition table
Probably you selected the wrong device.

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1   ?     6579571  1924427647   958924038+  70  DiskSecure Multi-Boot
/dev/sdc2   ?  1953251627  3771827541   909287957+  43  Unknown
/dev/sdc3   ?   225735265   225735274           5   72  Unknown
/dev/sdc4      2642411520  2642463409       25945    0  Empty

Partition table entries are not in disk order

Как вы можете видеть, fdisk может сказать, что «это не похоже на таблицу разделов». Windows скажет в основном то же самое, затем предположит, что сектор VBR, найдет в нем сигнатуру NTFS и, наконец, смонтирует. На самом деле у старой Windows XP с этим проблем не было. Также мой Kubuntu сообщил в dmesg:

sdc: неизвестная таблица разделов

но тогда KDE предложил смонтировать его как суперфлоппи.

Обратите внимание, что любой инструмент, который проверяет таблицу разделов, фактически читает фрагмент кода начальной загрузки из VBR. Этот код не нужен для работы NTFS. Я проверил с помощью hexdump что фрагмент вообще не является исполняемым кодом; это выглядит как набор текстовых сообщений, которые будут отображаться, если я попытаюсь загрузиться с этого устройства, например:

Press Ctrl+Alt+Del to restart

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

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

В Windows XP диск ведет себя почти как ваш диск. Почти, потому что я получил письмо, назначенное на первый раздел. Моя настоящая (суперфлоппиальная) файловая система NTFS свежая и пустая, а ваша нет. Один из его секторов интерпретируется как VBR для первого поддельного раздела. Наши сектора наверняка содержат разные данные, возможно, в этом причина. Тем не менее, я верю, что только что разгадал вашу тайну.

Похоже, что кто-то собирался разбить вашу суперфлоппи-диск и передумал между fdisk и mkfs .


Исправление

В моем случае было достаточно записать нули в таблицу разделов:

dd if=/dev/zero of=/dev/sdc bs=1 seek=446 count=64

Если я хочу восстановить весь фрагмент "загрузочного кода" моей суперфлоппи-диска, я могу скопировать его из другого раздела NTFS, созданного mkntfs:

fallocate -l 2MiB tmp.ntfs
mkntfs -F -f tmp.ntfs
dd if=tmp.ntfs of=/dev/sdc bs=1 skip=84 seek=84 count=426
rm tmp.ntfs

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .