/proc/pid/mountinfo


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

追記

他にmounts/mountstatというのがありますが、似たようなものです。
[root@localhost ~]# cat /proc/8909/mounts
  :
hugetlbfs /dev/hugepages hugetlbfs rw,relatime 0 0
tmpfs /media tmpfs rw,nosuid,nodev,noexec,relatime,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
/dev/sdb1 /mnt ext3 rw,relatime,user_xattr,acl,barrier=1,nodelalloc,data=ordered 0 0
/dev/sda2 /boot ext4 rw,relatime,user_xattr,acl,barrier=1,data=ordered 0 0
順に、
 デバイス名(show_devname()コールバックがあればその内容を表示)
 マウント先のパス
 ファイルシステム名
 マウントのro/rw
 スーパブロックオプション
 マウントオプション
 ファイルシステム依存のshow_options()コールバック
static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt)
{
       struct mount *r = real_mount(mnt);
       int err = 0;
       struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
       struct super_block *sb = mnt_path.dentry->d_sb;

       if (sb->s_op->show_devname) {
               err = sb->s_op->show_devname(m, mnt_path.dentry);
               if (err)
                       goto out;
       } else {
               mangle(m, r->mnt_devname ? r->mnt_devname : "none");
       }
       seq_putc(m, ' ');
       seq_path(m, &mnt_path, " \t\n\\");
       seq_putc(m, ' ');
       show_type(m, sb);
       seq_puts(m, __mnt_is_readonly(mnt) ? " ro" : " rw");
       err = show_sb_opts(m, sb);
       if (err)
               goto out;
       show_mnt_opts(m, mnt);
       if (sb->s_op->show_options)
               err = sb->s_op->show_options(m, mnt_path.dentry);
       seq_puts(m, " 0 0\n");
out:
       return err;
}

[root@localhost ~]# cat /proc/8909/mountstats
  :
device mqueue mounted on /dev/mqueue with fstype mqueue
device hugetlbfs mounted on /dev/hugepages with fstype hugetlbfs
device tmpfs mounted on /media with fstype tmpfs
device securityfs mounted on /sys/kernel/security with fstype securityfs
device debugfs mounted on /sys/kernel/debug with fstype debugfs
device sunrpc mounted on /var/lib/nfs/rpc_pipefs with fstype rpc_pipefs
device binfmt_misc mounted on /proc/sys/fs/binfmt_misc with fstype binfmt_misc
device /dev/sdb1 mounted on /mnt with fstype ext3
device /dev/sda2 mounted on /boot with fstype ext4
順に、
 デバイス名(show_devname()コールバックがあればその内容を表示)
 マウント先のパス
 ファイルシステム名
 ファイルシステム依存のshow_stats()コールバック(本関数はNFSで実装されており、割り込み発生等の状態が表示される。)
static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt)
{
       struct mount *r = real_mount(mnt);
       struct path mnt_path = { .dentry = mnt->mnt_root, .mnt = mnt };
       struct super_block *sb = mnt_path.dentry->d_sb;
       int err = 0;

       /* device */
       if (sb->s_op->show_devname) {
               seq_puts(m, "device ");
               err = sb->s_op->show_devname(m, mnt_path.dentry);
       } else {
               if (r->mnt_devname) {
                       seq_puts(m, "device ");
                       mangle(m, r->mnt_devname);
               } else
                       seq_puts(m, "no device");
       }

       /* mount point */
       seq_puts(m, " mounted on ");
       seq_path(m, &mnt_path, " \t\n\\");
       seq_putc(m, ' ');

       /* file system type */
       seq_puts(m, "with fstype ");
       show_type(m, sb);

       /* optional statistics */
       if (sb->s_op->show_stats) {
               seq_putc(m, ' ');
               if (!err)
                       err = sb->s_op->show_stats(m, mnt_path.dentry);
       }

       seq_putc(m, '\n');
       return err;
}

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


検索

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