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产生的排序在两次运行之间是相同的吗?
答案 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]