我有一个 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