perl - Linux上的磁盘名称

时间:2012-02-13 20:27:48

标签: perl

您建议在Linux上获取磁盘名称的模块是什么?我已经对CPAN进行了一些搜索,但我找到的所有模块都太旧了。在Bash中我可以使用类似的东西:

disk_name=$(df |grep -w '/'|awk '{print $1}'|cut -d/ -f3)
echo $disk_name
sda6

请帮助我了解如何在Perl中执行相同的操作。 感谢。

3 个答案:

答案 0 :(得分:5)

在Linux上列出已安装磁盘的“正确”方法是通过getmntent()系统调用,可以使用Quota模块从Perl访问:

use Quota;

Quota::setmntent();
while (my ($dev, $path, $type, $opts) = Quota::getmntent()) {
    print "The root device is $dev.\n"  if $path eq "/";
}
Quota::endmntent();

作为奖励,使用Quota模块列出设备挂载点应该相当容易移植到其他Unixish系统,解析各种系统文件或df的输出可能不是。不幸的是,这个看似基本的模块没有包含在标准的Perl发行版中,所以你必须从CPAN(或从你的发行版的软件包库中获取它 - 例如,Debian / Ubuntu有libquota-perl包)。


聚苯乙烯。只需在/上拆分设备名称并取第三个元素(如cut命令所做的那样)是一种安全的方法,例如,/dev/sdb1 sdb1。它的一些问题是:

  1. 并非所有块设备都存在于/dev下 - 这实际上只是一种约定。
  2. 即使/dev下的设备文件 ,它也可能位于其子目录中。例如,我的根文件系统位于设备/dev/disk/by-uuid/627f8512-f037-4c6c-9892-6130090c0e0f上。
  3. 有时,设备名称可能甚至不是实际的文件系统路径:例如,tmpfs等虚拟或内存文件系统通常使用设备名称none挂载,但是可以使用任何设备名称。
  4. 如果你想摆脱/dev/部分,我建议使用正则表达式的保守方法,例如:

    if ($dev =~ m(^/dev/(.*)$)s) {
        print "The directory $path is mounted from device $1 under /dev.\n";
    } else {
        print "The directory $path is not mounted from a device under /dev.\n"
    }
    

答案 1 :(得分:2)

您所描述的不是磁盘名称,而是表示在根(/)处安装的分区的块设备的设备名称。在普通计算机上,它通常是/dev/sdXN/dev/hdXN,其中X是磁盘编号(主硬盘驱动器通常是A,辅助硬盘驱动器是B等),N是其上的分区编号设备

如果您始终在unix系统上运行,您可以尝试读取/ etc / mtab文件,其中列出了所有已安装的分区,或者特殊文件/proc/mounts,这几乎完全相同。您需要在之后解析它以找到您需要的那个并从中获取设备名称。

或者,您可以将df作为一个进程运行并将其输入到perl中,例如

open(DF, "df|");
@mount_points = <DF>;
close(DF);

然后迭代数据以找到您需要的内容。我不知道任何能够为你完成工作的顶级模块,但无论如何代码对我来说似乎都很简单。

P.S。请注意,Max OS X虽然是BSD的衍生产品,但它没有相同的文件结构,因此这种方法不起作用。在Mac OS X上,您可以阅读文件/etc/fstab.hd,其中包含类似的信息,但格式略有不同。

答案 2 :(得分:1)

在问题中做你正在做的事情的一种方法

df / | perl -ne 'm"^/\w+/(\w+)";print "$1\n" if defined $1;'

但使用CPAN库可能会更好。