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

编辑:正如阿米特指出的那样, iostat-n 生成设备名称,例如 c0t0d0s0 而不是 sd0。但我如何发现 sd0 实际上是 c0t0d0s0 呢?我正在寻找可以生成如下列表的东西:

sd0=/dev/dsk/c0t0d0s0
...
sdd2=/dev/dsk/c1t0d0s4
...
也许我可以运行 iostat 两次(带和不带 -n),然后将结果连接起来,并希望 iostat 生成的行数和设备排序在两次运行之间相同?

有帮助吗?

解决方案

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

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 声誉,所以我无法发表评论):

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

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

正如其他答案中所指出的,您可以通过设备路径和中包含的信息将设备名称映射回实例名称 /etc/安装路径. 。下面是一个可以完成该任务的 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";
    }
}

我在 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.

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

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

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

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

我前段时间在互联网上发现了这个片段,它确实有效。这是在 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 个字符的细微变化(在处理 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]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top