Chinaunix

标题: man 8 mount_unionfs的疑问 [打印本页]

作者: 剑心通明    时间: 2006-04-27 10:22
标题: man 8 mount_unionfs的疑问
Q1:
   Filenames are looked up in the upper layer and then in the lower layer.
     If a directory is found in the lower layer, and there is no entry in the
     upper layer, then a shadow directory will be created in the upper layer.
     It will be owned by the user who originally did the union mount, with
     mode ``rwxrwxrwx'' (0777) modified by the umask in effect at that time.

这个怎么测试?怎么我在lower layer下建的目录,在upper layer都能看到啊?

Q2:
   If a file exists in the upper layer then there is no way to access a file
     with the same name in the lower layer.  If necessary, a combination of
     loopback and union mounts can be made which will still allow the lower
     files to be accessed by a different pathname.

怎么让lower layer的同名文件以不同的路径名来显示?
作者: lunchan    时间: 2006-04-27 11:09
這個說的不錯

http://rentzsch.com/macosx/unionFilesystems
作者: 雨丝风片    时间: 2006-04-27 16:32
根据man手册页的论述,结合实际操作,理解如下:

A1:

上层目录中看到的应该就是“shadow directory”。如果下层目录原属主和执行mount的用户不是同一个人,就可以看得更明显一些,上层目录中的shadow directory的属主是mount执行者,至于目录权限,如果umask的当前值为22,那么这个shadow目录的权限就是777 - 22 = 755,即rwxr-xr-x。这个shadow目录的创建,是为了以后的“copy up”做准备,即当你在底层目录中修改了一个文件时(即使你对这个文件并无写权限),union文件系统就会在上层的shadow目录中创建一个同名文件,实际的修改是发生在这个同名文件身上的。但在ls时仅以遇到的第一个文件名有效,在底层目录中的同名文件予以忽略。

A2:

在union文件系统内部是无法访问到底层目录中的同名文件的,如果想访问的话,就需要和null文件系统结合起来。举个例子,/sys/sys下面有四个文件,分别是1111、2222、3333、4444,如下图所示:

/sys/sys
    1111
    2222
    3333
    4444

现在用户想在自己的主目录内编译这些文件,等编辑好之后在merge回系统目录中。它可以先在自己的主目录下创建一个sys1目录,把/sys目录按null文件系统方式mount到sys1目录上,这时,sys1目录中的原有内容就“看不到”了,通过sys1看到的是/sys目录的内容。

现在再创建一个目录sys2,把/sys目录按union文件系统方式mount到sys2目录上,sys2目录作为上层。这时,sys2目录和/sys目录的内容和融为一体了。在sys2目录中就会有一个sys目录,对应于/sys/sys目录。现在再cd到/sys/sys目录中去修改1111文件,就会在~/sys2/sys/目录下生成一个同名的1111文件,实际改动的就是这个文件,而真实的“/sys/sys”目录下的1111文件则安然无恙。

这时如果ls ~/sys2/sys,就可以看到这个1111文件,但这个文件的属主已经变成执行mount操作的用户了。如果ls /sys/sys,我们仍然可以看到如上图所示的输出:

/sys/sys
    1111
    2222
    3333
    4444

但从输出结果中可以看到,1111的属主已经和其它三个文件不一样了。这是因为ls会首先遇到上层目录~/sys2中的1111,于是就输出它,当它在下层目录/sys/sys中再次遇到1111时,由于已有同名文件,将予以忽略。因此,我们在这里就无法把系统目录中的1111给ls出来了。

但由于我们之前还对/sys/sys目录进行了null文件系统的mount,我们依然可以使用~/sys1这个路径名来访问“真实的”/sys/sys目录中的内容。因此,ls ~/sys1命令输出的上述四个文件的属主都是原来的主人(root),它们的内容也都是原封原样的,因为一切的变化都发生在~/sys2目录中了。

总结一下,要想继续访问“真实的”底层目录中的文件,就不能再使用进行union mount时的路径名。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2