Mar*_*rco 6 freebsd solaris mount posix block-device
如何在已知文件系统标签的情况下获取分区设备名称和挂载点?
有几种可能:
可以通过以下方式获取设备名称blkid
:
blkid -l -o device -t LABEL="$label" -c /dev/null
Run Code Online (Sandbox Code Playgroud)
我尝试使用 获取挂载点blkid
,但失败了。使用-s
开关可以在提供标签时查询所有其他字段:
blkid -l -t LABEL="$label" -o value -s LABEL # yields label
blkid -l -t LABEL="$label" -o value -s TYPE # yields partition type
blkid -l -t LABEL="$label" -o value -s UUID # yields UUID
blkid -l -t LABEL="$label" -o value -s MOUNTPOINT # yields nothing
Run Code Online (Sandbox Code Playgroud)
显然不支持获取挂载点,尽管在-o list
给出选项时列出了它,但不是以易于解析的方式:
blkid -o list -c /dev/null <device>
Run Code Online (Sandbox Code Playgroud)
下一次尝试是使用df -P
. 这是我想出的,假设设备存储在变量中device
:
export device
mountpoint=$(df -P |
awk --assign dev="$device" \
'{if ($1==dev) \
{for (i=1; i<=NF-5; i++) \
$i=$(i+5); \
NF-=5; \
print \
} \
}')
Run Code Online (Sandbox Code Playgroud)
此代码有效。但是,鉴于它的丑陋,我不相信解析
df
是首选方式。
blkid
在 Linux 上运行良好,但在 Solaris 或 FreeBSD 上不可用(至少不能指望安装它)。也是如此
findfs
。
如何在 Linux、Solaris 和 FreeBSD 上以可移植的方式获取设备名称?
df -P
很高兴在所有测试系统上产生非常相似的输出。问题是我丑陋的awk
脚本似乎不可移植(用 Sun 测试awk
,gawk
在 Solaris 和 FreeBSDs 上awk
)。什么是首选方式?
如何使用uuid获取U盘的挂载点?
问题:/proc/mounts
即使在 Linux 上,解析也是不可移植且麻烦的。解析mount
似乎更糟。Perl 通常不可用。
是否有命令可以查看磁盘安装位置?
问题:/proc/mounts
使用有问题的awk
脚本进行解析。这些解决方案不可移植。
当以可移植的方式提供文件系统标签时(假设是 POSIX shell),我想获取设备名称和挂载点。磁盘标签可能包含空格或其他非 ASCII 字符,这似乎使事情更加复杂。
Label-To-Device Device-To-Mount-Point
--------------- ---------------------
Linux ? ? (ugly)
Solaris . .
FreeBSD . .
Run Code Online (Sandbox Code Playgroud)
小智 1
您可以按照以下步骤进行操作:
devname
使用blkid_dev_devname(...)
prob
此分区blkid_new_probe_from_filename(...)
setmntent(...)
, getmntent(...)
, & endmntent(...)
,其中 mnt->mnt_fsname
等于devname
复制mnt->mnt_dir
安装点!struct mntent {
char *mnt_fsname; /* name of mounted file system */
char *mnt_dir; /* file system path prefix */
...
};
Run Code Online (Sandbox Code Playgroud)