perl - имя диска в Linux - PullRequest
       1

perl - имя диска в Linux

1 голос
/ 14 февраля 2012

Какой модуль вы бы порекомендовали для получения имени диска в Linux?Я провел некоторый поиск по CPAN, но все найденные модули слишком старые.В Bash я могу использовать что-то вроде:

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

Пожалуйста, помогите мне понять, как сделать то же самое в Perl.Спасибо.

Ответы [ 3 ]

5 голосов
/ 14 февраля 2012

«Правильный» способ отображения подключенных дисков в Linux - через системный вызов getmntent(), доступ к которому можно получить из Perl с помощью модуля Quota :

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 (или из репозитория вашего дистрибутива & mdash; например, Debian / Ubuntu имеет пакет libquota-perl ).


Ps. Простое разделение имени устройства на / и получение третьего элемента (как это делает ваша команда cut) - это , а не безопасный способ превратить, скажем, /dev/sdb1 в sdb1. Вот некоторые проблемы:

  1. Не все блочные устройства имеют для жизни в /dev & mdash; это действительно просто соглашение.
  2. Даже если файл устройства равен в /dev, он может находиться в его подкаталоге. Например, моя корневая файловая система находится на устройстве /dev/disk/by-uuid/627f8512-f037-4c6c-9892-6130090c0e0f.
  3. Иногда имя устройства может даже не быть фактическим путем к файловой системе: например, виртуальные или файловые системы в памяти, такие как tmpfs, часто монтируются с именем устройства none, но возможно использовать любое имя устройства с ними.

Если вы хотите избавиться от части /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"
}
2 голосов
/ 14 февраля 2012

То, что вы описываете, это не имя диска, а имя устройства блочного устройства, представляющего раздел, смонтированный в корневом каталоге (/). На обычном компьютере это обычно что-то вроде /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, который содержит аналогичную информацию, но в несколько ином формате.

1 голос
/ 14 февраля 2012

Один из способов сделать то, что вы делаете в вопросе

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

но использование библиотеки CPAN для этого, вероятно, лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...