如何在 Linux 文件系统中创建循环?我想打破 Linux 文件系统的有向无环图 (DAG) 属性。这可能吗?当我在我的 Ubuntu 上安装 Scratchbox 交叉编译器时,我曾经见过这种情况。
我现在不知道如何重现它。
如何在 Linux 文件系统中创建循环?我想打破 Linux 文件系统的有向无环图 (DAG) 属性。这可能吗?当我在我的 Ubuntu 上安装 Scratchbox 交叉编译器时,我曾经见过这种情况。
我现在不知道如何重现它。
其他一些响应者已经回答了如何使用环回设备设置挂载,但您特别询问了bind
挂载,这有点不同。如果要使用绑定挂载,只需--bind
在挂载命令中指定即可。例如:
mount --bind /original/path /new/path
这将使文件系统位置/original/path
可以通过/new/path
. 请注意,这不会跟随挂载点!例如,假设我有以下挂载点:
/something
/something/underneath/that
现在假设我bind
为/something
:
mount --bind /something /new_something
我将能够/something/myfile
通过路径访问文件/new_something/myfile
。但我将无法/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
位置可见。另请注意,显然由于内核中的错误,您无法卸载rbind
挂载。
另外,以防万一您的意思是“如何使用 mount(2) 系统调用设置绑定挂载?”:当您调用常规挂载时,您必须指定MS_BIND
标志(在 中定义)。对于挂载,您必须指定和 undocument标志(在 中定义)。mount.h
mount(2)
bind
rbind
MS_BIND
MS_REC
linux/fs.h
希望有帮助,
埃里克·梅尔斯基
到目前为止,看起来所有答案都是关于安装在环回设备上,而不是使用bind mounts创建循环。
你可能已经发现,
$ mkdir -p test/test
$ mount --bind test test/test
只允许你访问test/test/test
,没有进一步的。甚至不
$ mount --rbind test test/test
有效,因为递归绑定挂载有效地通过查找源上现有的挂载并将它们绑定到目标中。
您所要求的是不可能的,因为绑定安装不会跨越安装点。如果您真的想模拟文件系统循环,请尝试使用类似localfs的伪绑定挂载。我自己没有尝试过,尝试读取自己提供的文件系统时可能会锁定。刚才,我尝试导出一个 NFS 树crossmnt
并将其安装在它自己的下面,但由于类似的原因失败了。
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
您现在可以在新映像中创建/复制文件和目录。