在Linux文件系统中创build一个循环

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

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

一些其他响应者已经回答了如何使用回送设备设置挂载,但是您具体询问了有关bind挂载的问题,这些挂载挂载有点不同。 如果要使用绑定装入,则只需在mount命令中指定--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/myfile 。 但是我不能通过路径/new_something/underneath/that/otherfile /something/underneath/that/otherfile来访问像/something/underneath/that/otherfile /new_something/underneath/that/otherfile 。 您必须为每个文件系统设置一个单独的bind安装; 或者如果你有一个相对较新的内核,你可以使用rbind挂载,它遵循挂载点:

 mount --rbind /something /new_something 

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

 /something 

然后我像上面那样设置我的rbind然后我挂载/something/underneath/that :这个rbind不会神奇地使新的挂载通过rbind位置可见。 另外请注意,显然是由于内核中的一个bug,你不能卸载一个rbind挂载。

此外,万一你的意思是“如何使用mount(2)系统调用来设置绑定挂载?”:当您调用mount(2)进行常规bind时,必须指定MS_BIND标志(在mount.h定义)安装。 对于一个rbind挂载,你必须指定MS_BIND和非文件MS_REC标志(在linux/fs.h定义)。

希望有所帮助,

埃里克·梅尔斯基

它看起来像迄今为止所有答案都是关于在回送设备上安装,而不是使用绑定挂载创建一个循环。

正如你可能已经发现的,

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

只允许你访问test/test/test ,而不是进一步。 甚至不

 $ mount --rbind test test/test 

的作品,因为递归绑定挂载有效地通过查找源上的现有坐骑并将其绑定到目标上。

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

 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 

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

首先创建图像文件并初始化它

 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 

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

玩的开心,

Jeach!