7

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 产生的行数和设备排序在两次运行之间是相同的?

4

9 回答 9

8

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

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

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

于 2009-02-26T18:26:38.443 回答
5

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

  paste -d= <(iostat -x | awk '{print $1}') <(iostat -xn | awk '{print $NF}') | tail -n +3
于 2009-08-14T21:22:45.007 回答
3

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

于 2009-02-17T03:26:24.560 回答
2

我在 Solaris Transition 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”更新

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

用于 /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.
于 2009-06-25T18:33:39.540 回答
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";
    }
}
于 2009-07-06T17:11:52.793 回答
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
#

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

于 2017-07-26T12:26:11.483 回答
0

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

于 2009-02-24T19:22:04.490 回答
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]
于 2009-06-11T13:45:46.513 回答
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]
于 2009-06-25T16:53:12.983 回答