在Linux文件系统中创建循环

a1o7rhls  于 2023-02-15  发布在  Linux
关注(0)|答案(5)|浏览(141)

如何在Linux文件系统中创建一个循环?我想破坏Linux文件系统的有向无环图(DAG)属性。这可能吗?我在Ubuntu上安装scratchbox交叉编译器时曾经遇到过这种情况。
我现在不知道怎么复制了。

yzxexxkh

yzxexxkh1#

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

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

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

/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挂载,do遵循挂载点:

mount --rbind /something /new_something

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

/something

然后我按照上面的方法设置我的rbind,并挂载thenrbind不会神奇地使新的挂载通过rbind位置可见。还要注意,显然由于内核中的bug,您无法卸载rbind挂载。
另外,以防您的意思是"如何使用mount(2)系统调用设置绑定挂载?":在为常规bind装载调用mount(2)时,必须指定MS_BIND标志(在mount.h中定义)。对于rbind装载,必须指定MS_BIND和取消文档MS_REC标志(在linux/fs.h中定义)。
希望能有所帮助,
埃里克·梅尔斯基

6jygbczu

6jygbczu2#

看起来到目前为止所有的答案都是关于在环回设备上挂载,而不是使用bind mounts创建环路。
你可能已经发现了,

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

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

$ mount --rbind test test/test

有效,因为递归绑定装载有效地完成了在源系统上查找现有装载并在目标系统中绑定它们的过程。
你所要求的是不可能的,因为绑定挂载不跨挂载点。如果你真的想模拟一个文件系统循环,尝试使用一个伪绑定挂载,比如localfs。我自己还没有试过,当尝试读取它自己提供的文件系统时,它可能会锁定。刚才,我尝试用crossmnt导出一个NFS树,并将它挂载在它自己的下面,但由于类似的原因失败了。

rxztt3cl

rxztt3cl3#

以下是您想要的 * 实际 * 答案:
如果您想实际创建一个真正的目录硬链接,您可以

使用调试文件

手动编辑文件系统,并添加目录链接。如下所示:

# debugfs -w /dev/sda1 # For the first partition of the first SCSI disk.
debugfs 1.46.5 (30-Dec-2021)
debugfs: ln /tmp/crashMe /

这会使/tmp/crashMe指向根目录,如果你在任何时候输入它,可能会导致系统崩溃,所以不要忘记稍后撤销它。
或者我发现

直通/镜像文件系统。

把工作做好。
有几个FUSE实现,因为它是微不足道的。搜索它,在第一页找到至少五个不同的,所以我会避免选择一个。
与绑定挂载AFAIK不同,内核似乎不能防止这样的文件系统引起它的问题。在我的测试中,我可能会崩溃内核(字面上的哎呀,需要重新启动)与镜像FUSE,我安装为 * 正常用户 *!这是一个主要的安全问题,我认为,但我可能忘记了我允许它在一些内核设置。
重点是:如果你想引起崩溃或类似的情况(特别是不弄乱文件系统或不让内核阻止你),我可以证明这个方法能达到目的。)
总的来说,这种循环的问题纯粹在于遍历它们的某些工具的实现(以及内核的一些部分,我想显然像许可检查),文件系统处理得很好,恕我直言,只有糟糕的程序员才不能处理比引用计数垃圾收集更复杂的事情。)

oymdgrw7

oymdgrw74#

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

其中,/path/to/device是指向要挂载的分区或磁盘映像的路径,/path/to/mount/location是指向要在其中挂载设备/映像的文件夹的路径
您可能还需要包括文件系统的类型,如so(使用fat 16/fat32):

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

yacmzcpb5#

您可能还想从头创建一个:
首先创建图像文件并初始化它

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

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

相关问题