如何获取给定磁盘 ID 的磁盘名称?

Posted

技术标签:

【中文标题】如何获取给定磁盘 ID 的磁盘名称?【英文标题】:How to obtain the name of the disk given the disk ID? 【发布时间】:2020-03-01 02:35:39 【问题描述】:

stat 系统调用 (man 2 stat) 返回包含该文件的设备的 ID。

在脚本中,这个 ID 可以通过,比如说

perl -e 'print((stat "/tmp/blah.txt")[0])'

给定ID,如何获取磁盘名称,如/dev/sda2/dev/disk1s1

我想在脚本(bash、perl 等)中执行此操作,最好以可移植的方式进行,以便它在 MacOS 和 Linux 上都能可靠地工作。

【问题讨论】:

warn 的用法很有趣。为什么不print?射击,为什么 perl 而不是 stat(1): stat -c '%d' /tmp @Shawn 可移植性可能吗? macos有stat吗? @ogizismail stat 不是 posix 命令吗?而且我记得看到一些关于苹果如何从操作系统中删除脚本语言的事情...... @Shawn 不,不是,它带有 GNU coreutils。您可以搜索标准here。 从操作系统中删除脚本语言真的吗? @oguzismail 真的。 developer.apple.com/documentation/macos_release_notes/… 【参考方案1】:

您可以使用“df”枚举文件系统,并在设备 ID 和磁盘之间创建映射。回想一下,每个 df 行都会在第一列列出挂载点(/dev/sda1, ...),在第五列列出挂载点)。

以下脚本对地图使用 bash 关联数组,并使用 stat -c '%d' 提取给定路径的 'dev' 值。

# Create map dev2fs
function file2dev 
   stat -c '%d' "$1"
# If needed, use Perl equivalent
#    perl -e 'print ((stat($ARGV[0]))[0])' "$1"


declare -A dev2fs
while read fs size used available use mount ; do
    id=$(file2dev $mount);
    [ "$id" ] &&  dev2fs[$id]=$fs
done <<< "$(df)"

# Map a file to device
dev=$(file2dev /path/to/file );
echo "Device=$dev2fs[$dev]"

此外,还可以使用“mount -l”来迭代挂载的文件系统。我不确定 MacOS 上存在哪一个。

【讨论】:

通过阅读这个脚本,我学到了很多东西——这里是字符串、关联数组等。上次阅读 bash 手册时,这些都没有:)【参考方案2】:

我认为您正在尝试重新发明***。 给定一个文件名,它所属的文件系统名称可以在df 输出的最后一行的第一列中找到。例如:

df -P /tmp | awk 'END  print $1 '

【讨论】:

漂亮而简单,但只能在 Linux 下工作。在 BSD/MacOS 下,df ~/.bashrc 产生与df 相同的输出。 好吧,它确实适用于-P。 (即使手册页说它应该做其他事情:使用(默认)512 字节块。这仅作为从环境中覆盖 BLOCKSIZE 规范的一种方式有用。)跨度> 我从规范中收集到的是 -P 用于生成可移植的输出,尽管 Linux 和 BSD 手册页都没有提到这一点 好想知道-P,+1

以上是关于如何获取给定磁盘 ID 的磁盘名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何从网络逻辑磁盘名称获取物理磁盘索引?

java 如何获得磁盘名称

如何确定给定磁盘的 SATA 通道?

如何获取包含正在运行的 Windows/Linux 的当前磁盘号/名称? [关闭]

如何在 Linux 上获取磁盘信息?

如何在 Windows 上获取磁盘的标识符?