【问题标题】:Map sd?/sdd? names to Solaris disk names?映射 sd?/sdd?名称到 Solaris 磁盘名称?
【发布时间】:2009-02-17 03:17:07
【问题描述】:

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

【问题讨论】:

  • 上述脚本缺少最后一个 awk 的结尾 "。它应该是 ($9,1,index($9,"s0")-1)}'

标签: solaris iostat


【解决方案1】:

按照 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

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

【讨论】:

  • 您可以将这一切折叠成一个(bash)命令并避免任何临时文件:paste -d= <(iostat -x | tail -n +3 | awk '{print $1}') <(iostat -nx | tail -n +3 | awk '{print "/dev/dsk/"$11}')
  • @Tekne 不错!你可以更简洁;你不需要tail,因为你有awk:paste -d= <(iostat -x | awk 'NR>2{print $1}') <(iostat -nx | awk 'NR>2{print "/dev/dsk/"$11}')
  • 如果我使用 tail 运行任何 iostat 命令,我会得到 tail [+/-[n][l][r|f]] [file]
【解决方案2】:

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

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

【讨论】:

  • 在 Solaris 标准 tail 命令中使用不带 -n 选项的 | tail +3-n 选项适用于 GNU tail 或 POSIX /usr/xpg4/bin/tail
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    正如其他答案所指出的,您可以通过 /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】:

      我在 Solaris 转换指南中找到了以下内容:

      "实例名称

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • 您也可以添加-p 下到磁盘分区/分片。
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          前段时间我在互联网上发现了这个 sn-p,它可以解决问题。这是在 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]
          

          【讨论】:

            【解决方案9】:

            允许磁盘名称超过 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]
            

            【讨论】:

              猜你喜欢
              • 2016-05-29
              • 1970-01-01
              • 1970-01-01
              • 2011-10-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-07
              相关资源
              最近更新 更多