【问题标题】:Create a loop in a Linux filesystem在 Linux 文件系统中创建循环
【发布时间】:2010-10-18 08:26:52
【问题描述】:

如何在 Linux 文件系统中创建循环?我想打破 Linux 文件系统的有向无环图 (DAG) 属性。这可能吗?当我在我的 Ubuntu 上安装 Scratchbox 交叉编译器时,我曾经见过这种情况。

我现在不知道如何重现它。

【问题讨论】:

  • 我对这个问题的解释与每个人似乎都在回答的不同......我认为 OP 想要一个无限递归的目录结构。这可以使用硬链接和符号链接来创建,但我知道如何使用 mount 来创建,所以我不会回答。
  • 您不能在“传统”UNIX 文件系统中硬链接目录。
  • Scratchbox 不应该创建文件系统循环——它不应该这样做,而且我使用 sb 没有发生任何类似的事情。你能详细说明发生了什么吗?
  • 当我在 ubuntu feisty 7.04 中安装暂存盒时,文件系统中存在循环...当我运行更新时,我检测到文件系统中存在循环...。
  • 我现在想重现这样的场景......不知道怎么做?

标签: linux filesystems mount


【解决方案1】:
mount /path/to/device /path/to/mount/location -o loop

其中 /path/to/device 是要挂载的分区的路径或磁盘映像的路径,/path/to/mount/location 是要挂载的文件夹的路径设备/图像下

您可能还需要像这样包含文件系统的类型(使用 fat16/fat32):

mount /path/to/device /path/to/mount/location -o loop -t vfat

【讨论】:

    【解决方案2】:

    其他一些响应者已经回答了如何使用环回设备设置挂载,但您特别询问了bind 挂载,这有点不同。如果要使用绑定挂载,只需在挂载命令中指定--bind。例如:

    mount --bind /original/path /new/path
    

    这将使文件系统位置可通过/original/path 访问可通过/new/path 访问。请注意,这将不会跟随挂载点!例如,假设我有以下挂载点:

    /something
    /something/underneath/that
    

    现在假设我为/something 做了一个bind 挂载:

    mount --bind /something /new_something
    

    我将能够通过路径/new_something/myfile 访问像/something/myfile 这样的文件。但我将能够通过路径/new_something/underneath/that/otherfile 访问像/something/underneath/that/otherfile 这样的文件。您必须为每个文件系统设置单独的bind 挂载;或者如果你有一个相对较新的内核,你可以使用rbind mounts,它 跟随安装点:

    mount --rbind /something /new_something
    

    关于rbind 挂载的一个警告:它们不处理在设置rbind 之后挂载文件系统的情况。也就是说,假设我有这样的坐骑:

    /something
    

    然后我如上所述设置我的rbind,然后然后我挂载/something/underneath/thatrbind 不会神奇地使新挂载通过rbind 位置可见。另请注意,显然由于内核中的错误,您无法卸载 rbind 挂载。

    另外,以防万一您的意思是“如何使用 mount(2) 系统调用设置绑定挂载?”:当您调用 mount(2) 时,您必须指定 MS_BIND 标志(在 mount.h 中定义)对于常规的bind 安装。对于rbind 挂载,您必须指定MS_BIND 和未记录的MS_REC 标志(在linux/fs.h 中定义)。

    希望对你有帮助,

    埃里克·梅尔斯基

    【讨论】:

      【解决方案3】:

      到目前为止,所有答案似乎都是关于安装在环回设备上,而不是使用 bind mounts 创建循环。

      您可能已经发现,

      $ mkdir -p test/test
      $ mount --bind test test/test
      

      只允许您访问test/test/test,不能进一步。甚至没有

      $ mount --rbind test test/test
      

      有效,因为递归绑定挂载有效地通过查找源上的现有挂载并将它们绑定到目标中。

      您所要求的是不可能的,因为绑定挂载不会跨越挂载点。如果您真的想模拟文件系统循环,请尝试使用像localfs 这样的伪绑定挂载。我自己没有尝试过,尝试读取自己提供的文件系统时可能会锁定。刚才,我尝试使用 crossmnt 导出 NFS 树并将其挂载到自身下,但由于类似原因失败。

      【讨论】:

        【解决方案4】:

        您可能还想从头开始创建一个:

        首先创建镜像文件并初始化

        dd if=/dev/zero of=/tmp/loop.img bs=1024k count=$IMG_SIZE
        

        接下来,使用您选择的 FS 类型使其成为有效分区

        mkfs.ext3 -F /tmp/loop.img
        

        安装您的新图像

        mkdir -p /mnt/image
        mount /tmp/loop.img /mnt/image -o loop
        

        您现在可以在新映像中创建/复制文件和目录。

        【讨论】:

          猜你喜欢
          • 2010-09-20
          • 2011-04-22
          • 2013-09-28
          • 1970-01-01
          • 2021-12-04
          • 2018-10-21
          • 2019-06-05
          • 2014-06-29
          相关资源
          最近更新 更多