/proc/pid/mountinfo


Rev.1を表示中。最新版はこちら

/proc/pid/mountinfoは、pidのネームスペース配下のマウント情報を表示します。
[root@localhost ~]# ps
  PID TTY          TIME CMD
 1229 pts/0    00:00:00 bash
 1286 pts/0    00:00:00 ps

[root@localhost ~]# cat /proc/1229/mountinfo
 :
 :
38 17 0:31 / /sys/kernel/security rw,relatime - securityfs securityfs rw
39 17 0:7 / /sys/kernel/debug rw,relatime - debugfs debugfs rw
40 22 0:32 / /var/lib/nfs/rpc_pipefs rw,relatime - rpc_pipefs sunrpc rw
41 33 0:33 / /proc/sys/fs/binfmt_misc rw,relatime - binfmt_misc binfmt_misc rw  
43 22 8:17 / /mnt rw,relatime - ext3 /dev/sdb1 rw,user_xattr,acl,barrier=1,nodelalloc,data=ordered
44 22 8:2 / /boot rw,relatime - ext4 /dev/sda2 rw,user_xattr,acl,barrier=1,data=ordered
順に、
 マウントID
 親のマウントID
 デバイスのメジャ番号:マイナ番号
 マウント元のパス
 マウント先のパス
 マウントのro/rw
 マウントフラグ、
 共有時 :共有グループID
 スレーブ時 :マスタのグループID、直近の共有を継承しているシステムのマウントID
 バインド不可 :unbindable
 ファイルシステム名
 デバイス名(show_devname()コールバックがあればその内容を表示)
 スーパブロックのro/rw
 スーパブロックオプション(ファイルシステム依存のshow_options()コールバックがあれば追加表示)
static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt)
{
       struct proc_mounts *p = m->private;
       struct mount *r = real_mount(mnt);
       struct super_block *sb = mnt->mnt_sb;
       struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
       struct path root = p->root;
       int err = 0;

       seq_printf(m, "%i %i %u:%u ", r->mnt_id, r->mnt_parent->mnt_id,
                  MAJOR(sb->s_dev), MINOR(sb->s_dev));
       if (sb->s_op->show_path)
               err = sb->s_op->show_path(m, mnt->mnt_root);
       else
               seq_dentry(m, mnt->mnt_root, " \t\n\\");
       if (err)
               goto out;
       seq_putc(m, ' ');

       /* mountpoints outside of chroot jail will give SEQ_SKIP on this */
       err = seq_path_root(m, &mnt_path, &root, " \t\n\\");
       if (err)
               goto out;

       seq_puts(m, mnt->mnt_flags & MNT_READONLY ? " ro" : " rw");
       show_mnt_opts(m, mnt);

       /* Tagged fields ("foo:X" or "bar") */
       if (IS_MNT_SHARED(r))
               seq_printf(m, " shared:%i", r->mnt_group_id);
       if (IS_MNT_SLAVE(r)) {
               int master = r->mnt_master->mnt_group_id;
               int dom = get_dominating_id(r, &p->root);
               seq_printf(m, " master:%i", master);
               if (dom && dom != master)
                       seq_printf(m, " propagate_from:%i", dom);
       }
       if (IS_MNT_UNBINDABLE(r))
               seq_puts(m, " unbindable");

       /* Filesystem specific data */
       seq_puts(m, " - ");
       show_type(m, sb);
       seq_putc(m, ' ');
       if (sb->s_op->show_devname)
               err = sb->s_op->show_devname(m, mnt->mnt_root);
       else
               mangle(m, r->mnt_devname ? r->mnt_devname : "none");
       if (err)
               goto out;
       seq_puts(m, sb->s_flags & MS_RDONLY ? " ro" : " rw");
       err = show_sb_opts(m, sb);
       if (err)
               goto out;
       if (sb->s_op->show_options)
               err = sb->s_op->show_options(m, mnt->mnt_root);
       seq_putc(m, '\n');
out:
       return err;
}
マウントオプションでmnt->mnt_flagsの設定により、,nosuid/nodev/noexec/noatime/nodiratime/relatimeが表示されます。
static void show_mnt_opts(struct seq_file *m, struct vfsmount *mnt)
{
       static const struct proc_fs_info mnt_info[] = {
               { MNT_NOSUID, ",nosuid" },
               { MNT_NODEV, ",nodev" },
               { MNT_NOEXEC, ",noexec" },
               { MNT_NOATIME, ",noatime" },
               { MNT_NODIRATIME, ",nodiratime" },
               { MNT_RELATIME, ",relatime" },
               { 0, NULL }
       };
       const struct proc_fs_info *fs_infop;

       for (fs_infop = mnt_info; fs_infop->flag; fs_infop++) {
               if (mnt->mnt_flags & fs_infop->flag)
                       seq_puts(m, fs_infop->str);
       }
}
スーパブロックオプションでsb->s_flagssの設定により、,sync/dirsync/mandが表示されます。SeLinuxで、security_ops->sb_show_options()が設定されていれば追加表示されます。
static int show_sb_opts(struct seq_file *m, struct super_block *sb)
{
       static const struct proc_fs_info fs_info[] = {
               { MS_SYNCHRONOUS, ",sync" },
               { MS_DIRSYNC, ",dirsync" },
               { MS_MANDLOCK, ",mand" },
               { 0, NULL }
       };
       const struct proc_fs_info *fs_infop;

       for (fs_infop = fs_info; fs_infop->flag; fs_infop++) {
               if (sb->s_flags & fs_infop->flag)
                       seq_puts(m, fs_infop->str);
       }

       return security_sb_show_options(m, sb);
}


最終更新 2013/12/05 19:28:44 - north
(2013/12/05 19:28:44 作成)


検索

アクセス数
3576116
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。