目标
我正在尝试使用文件从头开始制作硬盘映像。这包括 MBR、分区表、分区数量等。但我一生都无法让 Linux 挂载我创建的分区。
编辑:请参阅问题末尾的更新 - 似乎与 vboxsf 有关
程序
到目前为止,我已经尝试了许多不同的方法,但那些最有效的方法最终都到达了同一个地方。我在下面制作了一个简化版本,应该足以解释我的问题
使用 dd 生成空文件(或截断速度)
dd if=/dev/zero of=test.img bs=1M count=150
制作分区表
parted -s test.img mklabel gpt
Warning: The resulting partition is not properly aligned for best performance.
制作分区
parted -s test.img -- mkpart logical 0 5M
parted -s test.img set 1 bios_grub on
parted -s test.img -- mkpart logical 5M 50M
etc.
安装为循环设备(加载 max_part=31 的循环模块)
losetup /dev/loop0 test.img
lsblk 来检查
loop0 7:0 0 150M 0 loop
├─loop0p1 7:1 0 4.8M 0 loop
├─loop0p2 7:2 0 43M 0 loop
└─loop0p3 7:3 0 4M 0 loop
到目前为止一切顺利——我想。格式化分区
mkfs.ext4 /dev/loop0p1
mkfs.ext4 /dev/loop0p2
mkfs.ext4 /dev/loop0p3
现在让我们挂载我们的新分区
[root@localhost vmdk test]# mount /dev/loop0p2 boot
mount: /dev/loop0p2 is write-protected, mounting read-only
mount: unknown filesystem type '(null)'
每次都到此结束。我尝试在创建图像后立即将其安装到循环中,并在 /dev/loop0 上调用parted。这会产生相同的结果。我已经尝试过手动使用 Lostup 进行偏移。我尝试过 kpartx - 我不知道如何超越这一点。
我应该指出,我还使用实际的硬盘尝试了此过程(我正在使用虚拟机,但你知道我的意思)。在本例中,我调用了完全相同的命令,但在 /dev/sdb 上调用。在最后我能够毫无问题地挂载 /dev/sdb2 。
调试信息
我不知道它是否相关,但这里是
[root@localhost vmdk test]# uname -a
Linux localhost.localdomain 3.10.0-327.36.2.el7.x86_64 #1 SMP Mon Oct 10 23:08:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost vmdk test]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@localhost vmdk test]# file test.img
test.img: x86 boot sector; partition 1: ID=0xee, starthead 0, startsector 1, 307199 sectors, extended partition table (last)\011, code offset 0x0
[root@localhost vmdk test]# file -s /dev/loop0
/dev/loop0: x86 boot sector; partition 1: ID=0xee, starthead 0, startsector 1, 307199 sectors, extended partition table (last)\011, code offset 0x0
[root@localhost vmdk test]# file -s /dev/loop0p2
/dev/loop0p2: data
[root@localhost vmdk test]# fdisk -lu /dev/loop0
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
Disk /dev/loop0: 157 MB, 157286400 bytes, 307200 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 label type: gpt
# Start End Size Type Name
1 34 9765 4.8M BIOS boot parti logical
2 10240 98303 43M Microsoft basic logical
3 98304 106495 4M Microsoft basic logical
我不明白为什么当我遵循相同的过程时,循环设备的行为与硬盘驱动器的行为不完全相同。如果有人有任何想法,他们将不胜感激!
更新
巧合的是,我发现重新启动可以解决我的问题,因此我的思维立即同步。经过一些测试后,似乎只有当 test.img 文件放置在我的 vboxsf 挂载(主机和虚拟机之间的共享文件夹)上时才会出现我的问题。我还没有真正考虑过这一点,但也许它以一种奇怪的方式缓存文件写入?我暂时保留这个问题 - 也许有人可以详细说明。
答案1
如果图像文件托管在奇怪的文件系统(例如 vboxsf)上,这可能是问题所在。