我正在做一个复杂的应用程序。您连接一个磁盘,按一个按钮,它对磁盘进行分区和格式化,将其挂载,并将一些文件复制到磁盘上。
为了测试这个应用程序,我们有一个测试系统,它循环安装一个磁盘映像并运行相同的进程。只不过我们更改了应用程序逻辑,现在测试系统无法工作。如果你给程序一个真正的磁盘,一切都正常。但是如果你给它一个循环装置,它就失败了。
具体来说,应用程序对磁盘进行分区、格式化,然后抱怨它无法挂载分区。确切的命令是
mount /dev/vda /mnt --rw -o offset=111149056,sizelimit=314572800(在这里,/dev/vda只是/dev/loop0的一个符号链接。如果我直接引用loop0,这没有什么区别。)
如果我手动运行命令,我会得到以下信息:
root# mount /dev/vda /mnt --rw -o offset=111149056,sizelimit=314572800
FUSE exfat 1.0.1
ERROR: exFAT file system is not found.
root# echo $?
1我可以一遍又一遍地运行这个命令,但它不起作用。没有理由,就是没有。
这是可怕的部分:如果我运行cfdisk /dev/vda,然后立即退出而不改变任何东西,现在它挂载了!!
cfdisk对使它突然开始工作的磁盘做了什么?怎样才能消除调用这个程序的需要?
(我试图调用sfdisk -R /dev/vda是徒劳的;它只是抱怨“无效的参数”之类的。)
我可以让应用程序调用cfdisk -Ps /dev/vda之类的东西,但我真的非常不愿意这样做。我想知道为什么这一切都是必要的。在我们更改申请之前,一切都很顺利.
发布于 2014-09-18 12:42:57
我对测试框架做了一个小小的修改,问题就消失了。
具体来说,我不是在重新划分设备之后调用kpartx -u /dev/vda,而是调用kpartx -d,然后调用kpartx -a。现在一切都好了。奇怪..。
发布于 2014-09-17 14:32:28
在黑暗中尝试,但也许cfdisk会在内核分区表运行时更新它?
您的应用程序逻辑与循环设备兼容吗?
-P选项设置回送设备以更新内核的分区表:losetup -P /dev/loop0 <image file>mount /dev/loop0p1 /mnt这样,就不需要费心使用偏移量了,而且您的mount命令更接近您在实际磁盘上使用的命令。您可以添加另一个步骤,在2到3之间创建一个符号链接,就像你已经做的那样。
发布于 2014-09-17 14:37:54
内核首先必须了解分区。一旦对循环设备(例如/dev/loop0)进行分区,就不能真正地将其挂载(该分区显然不会在设备开始时开始)。对于物理驱动器,您可以指示内核使用hdparm -z重新读取分区表(至少从(S)ATA驱动器中读取)。
另一种选择是使用一个特殊的实用程序,它将扫描设备上的分区表(不一定仅仅是GPT或MBR)并为您创建分区设备文件。其中之一是partx (附带util)。
https://unix.stackexchange.com/questions/156050
复制相似问题