7

Solaris の一部のコマンド (iostat など) は、sd0 や sdd2 などのディスク名を使用してディスク関連の情報をレポートします。これらの名前を標準の /dev/dsk/c?t?d?s に戻す一貫した方法はありますか? Solaris のディスク名?

編集: Amit が指摘するように、iostat -nは、sd0 ではなく c0t0d0s0 などのデバイス名を生成します。しかし、どうすれば sd0 が実際に c0t0d0s0 であることを確認できますか? 次のようなリストを生成するものを探しています。

sd0=/dev/dsk/c0t0d0s0
...
sdd2=/dev/dsk/c1t0d0s4
...
iostat を 2 回 (-n を使用した場合と使用しない場合) 実行し、結果を結合して、iostat によって生成された行数とデバイスの並べ替えが 2 回の実行で同じであることを期待できますか?

4

9 に答える 9

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

ソリューションはあまりエレガントではありません (ワンライナーではありません) が、うまくいくようです。

于 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 に答える
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 に答える
2

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.
于 2009-06-25T18:33:39.540 に答える
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 に答える
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

sd0 sdd0 はデバイスのインスタンス名です。/etc/path_to_inst をチェックして、物理デバイス名へのインスタンス名マッピングを取得し、/dev/dsk のリンク (それが指している物理デバイス) をチェックすることができます。これは 100% 確実な方法です。私はそれをコーディングする方法を知りませんが;)

于 2009-02-24T19:22:04.490 に答える