题
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]