首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cfdisk如何修复我的磁盘映像?

cfdisk如何修复我的磁盘映像?
EN

Unix & Linux用户
提问于 2014-09-17 14:10:37
回答 3查看 792关注 0票数 1

我正在做一个复杂的应用程序。您连接一个磁盘,按一个按钮,它对磁盘进行分区和格式化,将其挂载,并将一些文件复制到磁盘上。

为了测试这个应用程序,我们有一个测试系统,它循环安装一个磁盘映像并运行相同的进程。只不过我们更改了应用程序逻辑,现在测试系统无法工作。如果你给程序一个真正的磁盘,一切都正常。但是如果你给它一个循环装置,它就失败了。

具体来说,应用程序对磁盘进行分区、格式化,然后抱怨它无法挂载分区。确切的命令是

代码语言:javascript
复制
mount /dev/vda /mnt --rw -o offset=111149056,sizelimit=314572800

(在这里,/dev/vda只是/dev/loop0的一个符号链接。如果我直接引用loop0,这没有什么区别。)

如果我手动运行命令,我会得到以下信息:

代码语言:javascript
复制
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之类的东西,但我真的非常不愿意这样做。我想知道为什么这一切都是必要的。在我们更改申请之前,一切都很顺利.

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2014-09-18 12:42:57

我对测试框架做了一个小小的修改,问题就消失了。

具体来说,我不是在重新划分设备之后调用kpartx -u /dev/vda,而是调用kpartx -d,然后调用kpartx -a。现在一切都好了。奇怪..。

票数 1
EN

Unix & Linux用户

发布于 2014-09-17 14:32:28

在黑暗中尝试,但也许cfdisk会在内核分区表运行时更新它?

您的应用程序逻辑与循环设备兼容吗?

  1. 格式化磁盘映像文件,创建所需的分区
  2. 使用-P选项设置回送设备以更新内核的分区表:losetup -P /dev/loop0 <image file>
  3. 挂载分区:mount /dev/loop0p1 /mnt

这样,就不需要费心使用偏移量了,而且您的mount命令更接近您在实际磁盘上使用的命令。您可以添加另一个步骤,在2到3之间创建一个符号链接,就像你已经做的那样。

票数 1
EN

Unix & Linux用户

发布于 2014-09-17 14:37:54

内核首先必须了解分区。一旦对循环设备(例如/dev/loop0)进行分区,就不能真正地将其挂载(该分区显然不会在设备开始时开始)。对于物理驱动器,您可以指示内核使用hdparm -z重新读取分区表(至少从(S)ATA驱动器中读取)。

另一种选择是使用一个特殊的实用程序,它将扫描设备上的分区表(不一定仅仅是GPT或MBR)并为您创建分区设备文件。其中之一是partx (附带util)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/156050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档