![VDI 文件中的原始磁盘映像可以使用 qemu-nbd 挂载,但不能使用循环设备挂载?](https://linux22.com/image/12589/VDI%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%8E%9F%E5%A7%8B%E7%A3%81%E7%9B%98%E6%98%A0%E5%83%8F%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20qemu-nbd%20%E6%8C%82%E8%BD%BD%EF%BC%8C%E4%BD%86%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8%E5%BE%AA%E7%8E%AF%E8%AE%BE%E5%A4%87%E6%8C%82%E8%BD%BD%EF%BC%9F.png)
我在 VirtualBox 上安装了一个非常旧的 Slack 版本 (3.2),然后将其转换为 RAW 格式 (ext2)。但是,由于某种原因,我无法使用 losetup 安装它,但 qemu-nbd 工作正常。为什么?
我试过,
losetup -P -f --show slack-3.2.img
但它不会创建分区。我修改了 /etc/default/grub ,以便 GRUB_CMDLINE_LINUX="loop.max_part=63" 和 grub-mkconfig 等,但它仍然不会从映像创建分区。
我尝试过,kpartx -av slack-3.2.img
然后我得到了
read error, sector 0
read error, sector 1
read error, sector 29
我什至尝试过dd if=slack-3.2.img of=slack.part bs=512 skip=63 count=409185
但sudo losetup -P -f --show slack.part
它仍然失败。为什么行不通?
sudo fdisk -l slack-3.2.img
Disk slack-3.2.img: 200 MiB, 209715200 bytes, 409600 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
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
slack-3.2.img1 63 409247 409185 199.8M 83 Linux
答案1
读取错误,扇区 0
这表明内核访问您的文件时出现问题,我强烈怀疑是 vboxfs 造成的。我有一个长期未解决的错误,它不支持符号链接和硬链接,我认为他们只修复了前者。
qemu-nbd OTOH 只会读取文件,所以没问题,但内核使用 mmap 和其他低级访问。
解决方案是将映像复制到(虚拟)分区上的 ext2/4 上。
答案2
这是因为 VirtualBox 通常不使用原始文件,而是使用特殊内部格式的图像。
要将其转换为原始数据,请使用
qemu-img convert -O raw INPUT OUTPUT
另一种解释可能是您对文件进行操作,但您尝试的许多操作都需要块设备 - 并且您可以从 ndb 或 losetup 获得该块设备。
losetup -o $((63 * 512)) /dev/loop7 FILE
应该直接给你分区。