Карта SD? / SDD? имена для имен дисков Solaris? - PullRequest
7 голосов
/ 17 февраля 2009

Некоторые команды в Solaris (например, iostat) сообщают информацию о диске, используя имена дисков, такие как sd0 или sdd2. Существует ли согласованный способ сопоставления этих имен стандартным / dev / dsk / c? T? D? S? имена дисков в солярисе?

Редактировать: Как указывает Амит, iostat -n создает имена устройств, например, c0t0d0s0 вместо sd0. Но как я узнал, что sd0 на самом деле является c0t0d0s0? Я ищу что-то, что создает список вроде этого:

sd0=/dev/dsk/c0t0d0s0
...
sdd2=/dev/dsk/c1t0d0s4
...
Может быть, я мог бы запустить iostat дважды (с и без -n), а затем объединить результаты и надеяться, что количество строк и сортировка устройств, произведенных iostat, идентичны между двумя пробегами?

Ответы [ 9 ]

8 голосов
/ 26 февраля 2009

Следуя идее Амита, чтобы ответить на мой собственный вопрос, вот что я придумал:

iostat -x|tail -n +3|awk '{print $1}'>/tmp/f0.txt.$$
iostat -nx|tail -n +3|awk '{print "/dev/dsk/"$11}'>/tmp/f1.txt.$$
paste -d= /tmp/f[01].txt.$$
rm /tmp/f[01].txt.$$

Запуск этого на сервере Solaris 10 дает следующий вывод:

sd0=/dev/dsk/c0t0d0
sd1=/dev/dsk/c0t1d0
sd4=/dev/dsk/c0t4d0
sd6=/dev/dsk/c0t6d0
sd15=/dev/dsk/c1t0d0
sd16=/dev/dsk/c1t1d0
sd21=/dev/dsk/c1t6d0
ssd0=/dev/dsk/c2t1d0
ssd1=/dev/dsk/c3t5d0
ssd3=/dev/dsk/c3t6d0
ssd4=/dev/dsk/c3t22d0
ssd5=/dev/dsk/c3t20d0
ssd7=/dev/dsk/c3t21d0
ssd8=/dev/dsk/c3t2d0
ssd18=/dev/dsk/c3t3d0
ssd19=/dev/dsk/c3t4d0
ssd28=/dev/dsk/c3t0d0
ssd29=/dev/dsk/c3t18d0
ssd30=/dev/dsk/c3t17d0
ssd32=/dev/dsk/c3t16d0
ssd33=/dev/dsk/c3t19d0
ssd34=/dev/dsk/c3t1d0

Решение не очень элегантное (не однострочное), но, похоже, работает.

5 голосов
/ 15 августа 2009

Версия принятого ответа с одним вкладышем (у меня только 1 репутация, поэтому я не могу оставить комментарий):

  paste -d= <(iostat -x | awk '{print $1}') <(iostat -xn | awk '{print $NF}') | tail -n +3
3 голосов
/ 17 февраля 2009

Попробуйте использовать ключ -n. Например, 'iostat -n'

2 голосов
/ 06 июля 2009

Как указано в других ответах, вы можете сопоставить имя устройства с именем экземпляра через путь к устройству и информацию, содержащуюся в / etc / path_to_inst . Вот Perl-скрипт, который выполнит задачу:

#!/usr/bin/env perl

use strict;

my @path_to_inst = qx#cat /etc/path_to_inst#;
map {s/"//g} @path_to_inst;
my ($device, $path, @instances);

for my $line (qx#ls -l /dev/dsk/*s2#) {
    ($device, $path) = (split(/\s+/, $line))[-3, -1];
    $path =~ s#.*/devices(.*):c#$1#;

    @instances =
        map {join("", (split /\s+/)[-1, -2])}
            grep {/$path/} @path_to_inst;
*emphasized text*
    for my $instance (@instances) {
        print "$device $instance\n";
    }
}
2 голосов
/ 25 июня 2009

В руководстве по переходу к Solaris я обнаружил следующее:

"Имена экземпляров

Имена экземпляров относятся к n-му устройству в системе (например, sd20).

Имена экземпляров иногда сообщаются в сообщениях об ошибках драйвера. Вы можете определить привязку имени экземпляра к физическому имени, просмотрев вывод dmesg(1M), как в следующем примере.

sd9 at esp2: target 1 lun 1
sd9 is /sbus@1,f8000000/esp@0,800000/sd@1,0
     <SUN0424 cyl 1151 alt 2 hd 9 sec 80>

Как только имя экземпляра назначено устройству, оно остается связанным с этим устройством.

Номера экземпляров кодируются в младшем номере устройства. Чтобы поддерживать постоянство номеров экземпляров при перезагрузке, система записывает их в файл / etc / path_to_inst. Этот файл доступен только для чтения во время загрузки и в настоящее время обновляется add_drv(1M) и drvconf "

Итак, основываясь на этом, я написал следующий сценарий:

для устройства в / dev / dsk / * s2

сделать

dpath="$(ls -l $device | nawk '{print $11}')"

dpath="${dpath#*devices/}"

dpath="${dpath%:*}"

iname="$(nawk -v dpath=$dpath '{

    if ($0 ~ dpath) {

        gsub("\"", "", $3)

        print $3 $2

    }

}' /etc/path_to_inst)"

echo "$(basename ${device}) = ${iname}"

сделано

By reading the information directly out of the path_to_inst file, we are allowing for adding and deleting devices, which will skew the instance numbers if you simply count the instances in the /devices directory tree.
1 голос
/ 26 июля 2017

Я думаю, что самый простой способ найти описательное имя с именем экземпляра:

# iostat -xn sd0
                    extended device statistics
    r/s    w/s   kr/s   kw/s wait actv wsvc_t asvc_t  %w  %b device
    4.9    0.2  312.1    1.9  0.0  0.0    3.3    3.5   0   1 c1t1d0
#

В последнем столбце показано описательное имя для предоставленного имени экземпляра.

0 голосов
/ 25 июня 2009

Небольшое отклонение, позволяющее использовать имена дисков длиной более 8 символов (встречается при работе с дисковыми массивами в сети SAN)

#!/bin/sh

cd /dev/rdsk
/usr/bin/ls -l *s0 | tee /tmp/d1c | awk '{print "/usr/bin/ls -l "$11}' | \
sh | awk '{print "sd" substr($0,38,4)/8}' >/tmp/d1d
awk '{print substr($9,1,index($9,"s0)-1)}' /tmp/d1c | paste - /tmp/d1d
rm /tmp/d1[cd]
0 голосов
/ 11 июня 2009

Я нашел этот фрагмент в интернете некоторое время назад, и он делает свое дело. Это было на Solaris 8:

#!/bin/sh
cd /dev/rdsk
/usr/bin/ls -l *s0 | tee /tmp/d1c |awk '{print "/usr/bin/ls -l "$11}' | \
sh | awk '{print "sd" substr($0,38,4)/8}' >/tmp/d1d
awk '{print substr($9,1,6)}' /tmp/d1c |paste - /tmp/d1d
rm /tmp/d1[cd]
0 голосов
/ 24 февраля 2009

sd0 sdd0 - это имена экземпляров устройств. Вы можете проверить / etc / path_to_inst, чтобы получить сопоставление имени экземпляра с именем физического устройства, а затем проверить ссылку в / dev / dsk (на какое физическое устройство оно указывает) это значение составляет 100% верный способ, хотя я не знаю, как его кодировать;)

...