/proc/pid/mountinfo
/proc/pid/mountinfoは、pidのネームスペース配下のマウント情報を表示します。
マウントID
親のマウントID
デバイスのメジャ番号:マイナ番号
マウント元のパス
マウント先のパス
マウントのro/rw
マウントフラグ、
共有時 :共有グループID
スレーブ時 :マスタのグループID、直近の共有を継承しているシステムのマウントID
バインド不可 :unbindable
ファイルシステム名
デバイス名(show_devname()コールバックがあればその内容を表示)
スーパブロックのro/rw
スーパブロックオプション(ファイルシステム依存のshow_options()コールバックがあれば追加表示)
デバイス名(show_devname()コールバックがあればその内容を表示)
マウント先のパス
ファイルシステム名
マウントのro/rw
スーパブロックオプション
マウントオプション
ファイルシステム依存のshow_options()コールバック
デバイス名(show_devname()コールバックがあればその内容を表示)
マウント先のパス
ファイルシステム名
ファイルシステム依存のshow_stats()コールバック(本関数はNFSで実装されており、割り込み発生等の状態が表示される。)
[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; }