关于文件系统的挂载点
我是个LINUX新手,以前一直以为挂载点只能是个目录。这两天翻看文件系统部分的源代码,感觉挂载点也可以是个文件???是这样吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我是个LINUX新手,以前一直以为挂载点只能是个目录。这两天翻看文件系统部分的源代码,感觉挂载点也可以是个文件???是这样吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
mount 可以挂载文件
http://www.blog.edu.cn/user1/19948/archives/2006/1074207.shtml
有这么一段话
:mv /boot/initrd-2.4.20.img /tmp/initrd.gz
cd /tmp
gunzip initrd.gz
mkdir /mnt/initrd
mount –o loop initrd /mnt/initrd
因为我是菜鸟,所以发过来供大家分析
那个initrd就是文件
[ 本帖最后由 艾因思念 于 2006-6-22 10:02 编辑 ]
准确地说,挂接点既可以是目录,也可以是文件.
目录就不用说了,是文件的情况如下:
mount --bind dir1 dir2
dir1必须同为目录,或同为文件
在内核中,具体是通过do_loopback实现这种挂接操作的。
这种操作的效果很类似与符号连接.
不会吧?
我的理解:
/*
* We have the parent and last component. First of all, check
* that we are not asked to creat(2) an obvious directory - that
* will not do.
*/
error = -EISDIR;
if (nd->last_type != LAST_NORM || nd->last.name[nd->last.len])
goto exit;
dir = nd->dentry;//此为tmpdir的dentry
down(&dir->d_inode->i_sem);
dentry = lookup_hash(&nd->last, nd->dentry);//该函数返回最终目标文件的dentry
你注释的那一行, dentry应该是tmpdir的dentry。
我是LINUX内核的新手,很多东西弄不太清楚。我还有一些疑问。就如你刚才的例子所说,比如我们现在要打开a.c这个文件,我想无论我们从你举的哪个路径进入a.c,那么到了我注释的那一行,这时候的dentry都应该是与a.c这个文件对应的dentry(不知道是不是我理解错了),这个dentry既然是个文件的dentry那么他上边不应该挂载文件系统。那么我注释的地方的代码我觉得没什么必要了。。。
你说的情况如何区分呢?我想应该是寻径时在tmpdir时做一下while (d_mountpoint(dentry) && __follow_down(&nd->mnt, &dentry)),这时候的dentry应该是tmpdir目录的DENTRY。
当然,我想我的理解应该哪里出了问题,内核代码应该是正确地,希望这里的前辈和版主帮我指正。
[ 本帖最后由 dengcainiao 于 2006-6-21 14:42 编辑 ]
我们两个的意思差不多, 但表达不一样。 我是这样看的: 你注释的那行代码, 发生在这样的情形下,例如:
这样, 再访问"/mnt/usb/tmpdir/a.c"时, 就判断到底是访问sda1中的tmpdir/a.c还是sdb1中的a.c, 也就是到底是否跟随进sdb1中。 (挂载点始终都是目录, 不过挂载操作是可以堆叠的)
你看对吗?
对不起,代码贴的太长了,我在里边加了一行注释。。。。。,就是我的问题所在
int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd)
{
int acc_mode, error = 0;
struct inode *inode;
struct dentry *dentry;
struct dentry *dir;
int count = 0;
acc_mode = ACC_MODE(flag);
/*
* The simplest case - just a plain lookup.
*/
if (!(flag & O_CREAT)) {
if (path_init(pathname, lookup_flags(flag), nd))
error = path_walk(pathname, nd);
if (error)
return error;
dentry = nd->dentry;
goto ok;
}
/*
* Create - we need to know the parent.
*/
if (path_init(pathname, LOOKUP_PARENT, nd))
error = path_walk(pathname, nd);
if (error)
return error;
/*
* We have the parent and last component. First of all, check
* that we are not asked to creat(2) an obvious directory - that
* will not do.
*/
error = -EISDIR;
if (nd->last_type != LAST_NORM || nd->last.name[nd->last.len])
goto exit;
dir = nd->dentry;
down(&dir->d_inode->i_sem);
dentry = lookup_hash(&nd->last, nd->dentry);
do_last:
error = PTR_ERR(dentry);
if (IS_ERR(dentry)) {
up(&dir->d_inode->i_sem);
goto exit;
}
/* Negative dentry, just create the file */
if (!dentry->d_inode) {
error = vfs_create(dir->d_inode, dentry, mode);
up(&dir->d_inode->i_sem);
dput(nd->dentry);
nd->dentry = dentry;
if (error)
goto exit;
/* Don't check for write permission, don't truncate */
acc_mode = 0;
flag &= ~O_TRUNC;
goto ok;
}
/*
* It already exists.
*/
up(&dir->d_inode->i_sem);
error = -EEXIST;
if (flag & O_EXCL)
goto exit_dput;
if (d_mountpoint(dentry)) {//不太明白这里为什么要判断是否为挂载点我认为从
//lookup_hash(&nd->last, nd->dentry);返回的是个文件dentry
error = -ELOOP;
if (flag & O_NOFOLLOW)
goto exit_dput;
do __follow_down(&nd->mnt,&dentry); while(d_mountpoint(dentry));
}
error = -ENOENT;
if (!dentry->d_inode)
goto exit_dput;
if (dentry->d_inode->i_op && dentry->d_inode->i_op->follow_link)
goto do_link;
dput(nd->dentry);
nd->dentry = dentry;
error = -EISDIR;
if (dentry->d_inode && S_ISDIR(dentry->d_inode->i_mode))
goto exit;
ok:
error = -ENOENT;
inode = dentry->d_inode;
if (!inode)
goto exit;
error = -ELOOP;
if (S_ISLNK(inode->i_mode))
goto exit;
error = -EISDIR;
if (S_ISDIR(inode->i_mode) && (flag & FMODE_WRITE))
goto exit;
error = permission(inode,acc_mode);
if (error)
goto exit;
/*
* FIFO's, sockets and device files are special: they don't
* actually live on the filesystem itself, and as such you
* can write to them even if the filesystem is read-only.
*/
if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
flag &= ~O_TRUNC;
} else if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) {
error = -EACCES;
if (IS_NODEV(inode))
goto exit;
flag &= ~O_TRUNC;
} else {
error = -EROFS;
if (IS_RDONLY(inode) && (flag & 2))
goto exit;
}
/*
* An append-only file must be opened in append mode for writing.
*/
error = -EPERM;
if (IS_APPEND(inode)) {
if ((flag & FMODE_WRITE) && !(flag & O_APPEND))
goto exit;
if (flag & O_TRUNC)
goto exit;
}
只能是目录吧? 哪里说可以是文件了?