无法挂载 .img 文件 - “不是目录”错误

无法挂载 .img 文件 - “不是目录”错误

我尝试在 ubuntu 12.04 系统上执行以下命令:

sudo mount minix203.img -o loop -t minix /mnt/myminix/

为了使用 minix 分区挂载 .img 文件;并得到以下错误:

mount: Not a directory

我的命令有什么问题吗?

答案1

我认为布鲁斯所说的是真的 - 它包含整个分区表。那么这里面就没有什么不能用的了。对于以下命令,您需要util-linux2.21 或更高版本。

sudo losetup --find --show -P minix203.img

这应该将您的图像附加到环回设备,并显示图像附加到哪个环回设备(例如/dev/loop0)。假设,fdisk -l /dev/loop0应该显示分区表和设备名称,以便您能够安装它们。所以你最终会得到类似的结果:

sudo mount /dev/loop0p1 -t minix /mnt/myminix

应该管用。请注意,该loop选项已消失,losetup请处理该部分。

但是,如果您碰巧没有util-linux正确版本的软件包,您可以使用fdisk和手动执行此操作losetup(或者更好 - 从外部源安装软件包)。在这种情况下,您只需要进行一些计算即可。首先是附加整个驱动器的图像:

sudo losetup --find --show part.img

这应该告诉您设备名称 - 让我们假设它是/dev/loop0.然后,尝试fdisk -l一下以获得分区布局:

fdisk -l /dev/loop0

对于我的文件,我得到如下输出:

Disk /dev/loop0: 67 MB, 67108864 bytes, 131072 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: 0x2645940b

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            2048       63487       30720   83  Linux
/dev/loop0p2           63488      131071       33792   83  Linux

不要被欺骗,这些可能不是现有的设备名称。您必须确定要使用此表安装哪个分区。大小或文件系统类型应该让您做出一些假设。

现在是计算时间 - 您需要分区的偏移量及其大小。您可以通过将扇区大小乘以单位大小来得到结果(以字节为单位)。你可以看到fdisk告诉我我的扇区大小是512字节,所以如果我想挂载/dev/loop0p1,它从第(2048 * 512)个字节开始。这就是偏移量,它等于 1048576(当然是在该示例的情况下)。

扇区大小为end_sector_number - start_sector_number + 1,因为这些数字包含在内(最终扇区在该大小之内)。这里它等于 61440 个扇区 == 31457280 字节。这就是我们所需要的。

您现在可以分离环回设备并重新连接它,限制其大小限制到您想要安装的特定分区(用您自己的数字替换这些数字):

sudo loopback -d /dev/loop0
sudo loopback -f --show -o 1048576 --sizelimit 31457280 part.img

它可能会将其附加到/dev/loop0,您现在可以安全地安装它:

mount -t minix /dev/loop0 /mnt/myminix

除了通常会影响整个驱动器的 MBR 的情况(例如使用 mkfs 进行格式化)之外,这应该几乎完全可操作。

它是如何工作的?

MBR 分区表的布局很简单 - 首先有 512 字节的描述,分区从哪里开始,在哪里结束,然后是数据。对于扩展分区,这可能会有点困难。您可以手动设置分区限制,这就是内核为您自己为常规硬盘驱动器所做的事情。

答案2

那是 Minix 的一个相当旧的版本。

有一个Google 网上论坛页面这里面有你的答案。引用那篇文章:

在 minix203.img 中有一个完整的高清图像,包括分区表。 mount一开始查找的不是第一个分区,而是分区表。所以安装失败。

我相信较新的 Minix 3 ISO 映像也存在同样的情况。安装程序知道有一个小一点的 Joliet 文件系统和一个更大的 Minix 文件系统。所以你不能只挂载 ISO 镜像(环回)然后看东西。

答案3

这个答案可能不会立即相关,但我在一次调查中发现了它 chroot 救援

我的情况:
我在计算机上安装 Ubuntu 之后安装了 Windows,但我的引导加载程序 (grub) 已损坏并且操作系统探测器无法在系统上看到 Ubuntu 映像。

这是我所做的:

1) 使用 Ubuntu Live CD 启动。

2)从磁盘管理器中找到我的卷的位置:
root - /dev/sda6
boot - /dev/sda8

3)创建临时目录/tmp/mydir并以root身份执行以下命令。

   mount /dev/sda6 /tmp/mydir
   mount --bind /proc /tmp/mydir/proc
   mount --bind /sys /tmp/mydir/sys
   mount --bind /dev /tmp/mydir/dev
   mount --bind /dev/pts /tmp/mydir/dev/pts

最后,我想将启动设备即/dev/sda8绑定到/tmp/mydir/boot文件夹,然后麻烦就来了。

   mount --bind /dev/sda8 /tmp/mydir/boot

我收到以下错误:

   mount : not a directory

一开始我对这个和这个有点困惑GitHub 文章帮我解决了。当我尝试将设备(此处为 /dev/sda8)安装到已安装的设备(此处为 /dev/sda6)时,出现了问题。简而言之,您不能这样做,因为该--bind选项需要一个目录而不是像 /dev/sda8 这样的块设备作为输入。

现在好消息来了!有一个解决方法。我将启动卷安装到 /tmp 中的另一个目录,然后将此目录绑定到 /tmp/mydir/boot。

    mount /dev/sda8 /tmp/booty
    mount --bind /tmp/booty /tmp/mydir/boot

这解决了mount : not a directory错误。

4)我进行了chroot救援以解决我的最终问题。

相关内容