地图sd?/添加? Solaris磁盘名称的名称?

时间:2009-02-17 03:17:07

标签: solaris iostat

Solaris中的某些命令(例如iostat)使用磁盘名称(如sd0或sdd2)报告磁盘相关信息。是否有一致的方法将这些名称映射回标准/ dev / dsk / c?t?d?s? Solaris中的磁盘名称?

编辑:正如Amit所指出的那样, iostat -n 会产生设备名称,例如c0t0d0s0而不是sd0。但是我如何发现sd0实际上是c0t0d0s0?我正在寻找产生这样一个列表的东西:

sd0=/dev/dsk/c0t0d0s0
...
sdd2=/dev/dsk/c1t0d0s4
...
也许我可以运行iostat两次(有和没有-n)然后加入结果并希望行和设备的数量iostat产生的排序在两次运行之间是相同的吗?

9 个答案:

答案 0 :(得分:8)

按照阿米特的想法回答我自己的问题,这就是我想出的:

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

解决方案不是很优雅(它不是单行),但似乎有效。

答案 1 :(得分:5)

接受答案的一个班轮版本(我只有1个声誉,因此我无法发表评论):

  paste -d= <(iostat -x | awk '{print $1}') <(iostat -xn | awk '{print $NF}') | tail -n +3

答案 2 :(得分:3)

尝试使用'-n'开关。例如。 'iostat -n'

答案 3 :(得分:2)

我在Solaris Transistion Guide中找到了以下内容:

“实例名称

实例名称是指系统中的第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

更新

基于此,我编写了以下脚本:

for / dev / dsk / * s2

中的设备

DO

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.

答案 4 :(得分:2)

正如其他答案所指出的,您可以通过设备路径和 / 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";
    }
}

答案 5 :(得分:1)

我认为找到具有实例名称的描述性名称的最简单方法是:

# 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
#

最后一列显示了提供的实例名称的描述性名称。

答案 6 :(得分:0)

sd0 sdd0是设备的实例名称..您可以检查/ etc / path_to_inst以获取实例名称映射到物理设备名称,然后检查/ dev / dsk中的链接(它指向的物理设备)它是100%确定的方法,虽然我不知道如何编码;)

答案 7 :(得分:0)

我不久前在互联网上找到了这个片段,它就是诀窍。这是在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]

答案 8 :(得分:0)

允许长度超过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]