关于文件系统的挂载点

发布于 2022-07-22 12:18:50 字数 63 浏览 7 评论 9

我是个LINUX新手,以前一直以为挂载点只能是个目录。这两天翻看文件系统部分的源代码,感觉挂载点也可以是个文件???是这样吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

北座城市 2022-07-24 16:10:25

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 编辑 ]

巨坚强 2022-07-24 16:09:49

原帖由 dengcainiao 于 2006-6-21 10:17 发表
我是个LINUX新手,以前一直以为挂载点只能是个目录。这两天翻看文件系统部分的源代码,感觉挂载点也可以是个文件???是这样吗?

准确地说,挂接点既可以是目录,也可以是文件.
目录就不用说了,是文件的情况如下:

mount --bind dir1 dir2

dir1必须同为目录,或同为文件

在内核中,具体是通过do_loopback实现这种挂接操作的。

这种操作的效果很类似与符号连接.

池予 2022-07-24 16:08:40

不会吧?
我的理解:  
     /*
         * 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

何处潇湘 2022-07-24 15:54:04

原帖由 dengcainiao 于 2006-6-21 14:41 发表

那么到了我注释的那一行,这时候的dentry都应该是与a.c这个文件对应的dentry

你注释的那一行, dentry应该是tmpdir的dentry。

鲜血染红嫁衣 2022-07-24 15:49:17

我是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 编辑 ]

彻夜缠绵 2022-07-24 10:59:31

我们两个的意思差不多, 但表达不一样。 我是这样看的: 你注释的那行代码, 发生在这样的情形下,例如:

mount  -t vfat /dev/sda1 /mnt/usb #我们假设sda1顶层有个目录tmpdir,tmpdir下有个文件a.c

mount -t vfat /dev/sdb1 /mnt/usb/tmpdir #我们假设sdb1顶层有个文件a.c

这样, 再访问"/mnt/usb/tmpdir/a.c"时, 就判断到底是访问sda1中的tmpdir/a.c还是sdb1中的a.c, 也就是到底是否跟随进sdb1中。 (挂载点始终都是目录, 不过挂载操作是可以堆叠的)

你看对吗?

攒眉千度 2022-07-24 10:48:15

对不起,代码贴的太长了,我在里边加了一行注释。。。。。,就是我的问题所在

原谅我要高飞 2022-07-24 10:35:52

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;
        }

演多会厌 2022-07-24 04:33:35

只能是目录吧? 哪里说可以是文件了?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文