/proc/pid/mountinfo
Rev.2を表示中。最新版はこちら。
/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); }