在已知文件系统标签的情况下如何获取分区设备名和挂载点?
有几种可能:
Linux
文件系统标签到设备名称
设备名称可以通过以下方式获取blkid
:
blkid -l -o device -t LABEL="$label" -c /dev/null
挂载点的设备名称
我尝试使用 获取挂载点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
显然不支持获取挂载点,尽管在-o list
给出选项时会列出它,但不是以易于解析的方式:
blkid -o list -c /dev/null <device>
下一次尝试是使用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 \
} \
}')
这段代码有效。然而,鉴于它的丑陋,我不相信解析
df
是首选方式。
其他大学
文件系统标签到设备名称
blkid
在 Linux 上工作得很好,但它在 Solaris 或 FreeBSD 上不可用(至少不能指望它会被安装)。也同样如此
findfs
。
如何在 Linux、Solaris 和 FreeBSD 上以便携方式获取设备名称?
挂载点的设备名称
令人高兴的是,df -P
在所有测试的系统上都会产生非常相似的输出。问题是我的丑陋awk
脚本似乎不可移植(在 Solaris 和 FreeBSD 上使用awk
Sun进行了测试)。首选方式是什么?gawk
awk
相关问题
如何使用uuid获取闪存驱动器的挂载点?
问题:/proc/mounts
即使在 Linux 上,解析也不是可移植的并且很麻烦。解析mount
似乎更糟糕。 Perl 一般不可用。
有没有命令可以查看磁盘挂载位置?
问题:/proc/mounts
使用有错误的awk
脚本进行解析。这些解决方案不可移植。
概括
当以可移植方式提供文件系统标签时(假设是 POSIX shell),我想获取设备名称和安装点。磁盘标签可能包含空格或其他非 ASCII 字符,这似乎使事情变得更加复杂。
Label-To-Device Device-To-Mount-Point
--------------- ---------------------
Linux ✓ ✓ (ugly)
Solaris . .
FreeBSD . .
答案1
您可以按照以下步骤进行操作:
- 开始
devname
使用blkid_dev_devname(...)
- 使用获取
prob
此分区blkid_new_probe_from_filename(...)
- 使用
setmntent(...)
,getmntent(...)
, &endmntent(...)
,其中mnt->mnt_fsname
等于devname
复制mnt->mnt_dir
安装点!
请参阅这些参考资料以了解更多详细信息
- http://linux.die.net/man/3/getmntent
- https://www.kernel.org/pub/linux/utils/util-linux/v2.21/libblkid-docs/api-index-full.html
内容数据结构
struct mntent {
char *mnt_fsname; /* name of mounted file system */
char *mnt_dir; /* file system path prefix */
...
};