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





