如果分区标签已知,则获取设备名称和挂载点

Mar*_*rco 6 freebsd solaris mount posix block-device

如何在已知文件系统标签的情况下获取分区设备名称和挂载点?

有几种可能:

Linux

文件系统标签到设备名称

可以通过以下方式获取设备名称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 测试awkgawk在 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

您可以按照以下步骤进行操作:

  1. 开始devname使用blkid_dev_devname(...)
  2. 使用获取prob此分区blkid_new_probe_from_filename(...)
  3. 使用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)