简短说明

简短说明

我有一个 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 超级软盘吗?

我已经尝试使用“DriveCleanup”删除旧的 USB 安装点和残留设备。但没有帮助。

顺便说一句,我还有一个外置金士顿 USB SSD,也是格式化为 NTFS 超级软盘,没有分区。但是,这个可以被 MS Windows 正常识别和安装。

答案1

我可以重现你的问题并进行解释。我认为,然后修复它。


简短说明

由于某种原因,当磁盘的第一个扇区被解释为 MBR 时,它包含半有效的分区表。操作系统没有理由认为它是超级软盘。


详细解释

MBR 与 VBR 对比

我们使用的大多数磁盘都已分区。在这种情况下,磁盘的前 512 个字节是主引导记录 (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
───────────┴─────────────┴─────────────

我拿出我的 USB 棒,用 创建了一个 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 却建议将其安装为超级软盘。

请注意,任何探测我的 USB 驱动器的分区表的工具实际上都会从 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

相关内容