显示每个文件系统驻留在 IBM AIX 上的 hdisk 的脚本

Script that Show which hdisks each of the filesystems reside on for IBM AIX

我有以下脚本显示每个文件系统驻留在 IBM AIX 上的 hdisks。

#!/bin/ksh
for vg in `lsvg -o`; do 
    for fs in `lsvgfs $vg`; do 
            printf "%-22s" $fs; 
            for disk in `lsvg -p $vg | tail +3 | awk '{print }'`; do
                    lspv -l $disk | grep -q " ${fs}$" && printf "%-8s" $disk; 
            done; 
            echo
    done; 
done

输出结果如下:

/apps/data/IAMV1/sys1hdisk189hdisk200hdisk146hdisk151hdisk136hdisk141
/apps/data/IAMV1/sys2hdisk188hdisk201hdisk144hdisk152hdisk137hdisk191

首先输出不会正确显示,因为它应该是这样的:

/apps/data/IAMV1/sys1    hdisk189 hdisk200 hdisk146 hdisk151 hdisk136 hdisk141
/apps/data/IAMV1/sys2    hdisk188 hdisk201 hdisk144 hdisk152 hdisk137 hdisk191

而且我需要升级它以查看磁盘的总数 space 和文件系统使用的 space 每个文件系统都像

/apps/data/IAMV1/sys1    hdisk189 hdisk200 hdisk146 hdisk151 hdisk136 hdisk141
                         1000g    2000g    1000g    1000g    3000g    1000g
                          300g     500g     250g      90g      80g      30g 

/apps/data/IAMV1/sys2    hdisk188 hdisk201 hdisk144 hdisk152 hdisk137 hdisk191
                         1000g    2000g    1000g    1000g    3000g    1000g
                          300g     500g     250g      90g      80g      30g 

在此示例中,fs /apps/data/IAMV1/sys1 使用来自 hdisk189 的 300g 等等...老实说我不知道​​该怎么做我知道我可以使用这个

获得磁盘的总 space
getconf DISK_SIZE /dev/hdisk189 

谢谢大家。

我创建了一个初始版本,可能适合您的需要。在 AIX 7.1 上测试。

我没有带有多个 PV 的 vg,所以我不确定文本是否会正确对齐。

可能的 BUG:我用 awk 表达了 lspv 输出以获得 /PP 大小 / 总 PP / 使用的 PP / 计数,我不知道这是否因不同的 AIX 版本而异。


deccnt - 控制十进制计数,根据需要更改。稍作调整即可作为脚本执行的参数提供。

如果最长的磁盘名称小于总磁盘大小数并且总磁盘大小数大于 8 个字符,那么您将看到这样的未对齐:

/apps/data/IAMV1/sys1    hdisk189 hdisk200   hdisk146 hdisk151 hdisk136 hdisk141
                         1000g    200000000g 1000g    1000g    3000g    1000g
                          300g         5000g  250g      90g      80g      30g 

/apps/data/IAMV1/sys2    hdisk188 hdisk201 hdisk144 hdisk152     hdisk137 hdisk191
                         1000g    2000g    1000g    10000000000g 3000g    1000g
                          300g     500g     250g             90g   80g      30g

可以通过在此处增加较低的 8 个字符的硬上限来进一步缓解问题 BEGIN{lng=0;cap=8}'),但这也会增加磁盘列之间的默认间距。我不相信你会经常看到这种行为,但我想提一下。在任何其他情况下,对齐应该是好的。

#!/bin/ksh

# Accuracy
deccnt='2'

# FS name lenght 
fsLng=$(lsvg -l rootvg | awk 'BEGIN{lng=0} !/N\/A/{if(NR>2){if (lng < length()){lng=length()}}} END{print lng}')
# Disk name lenght | cant be less than 8 
diskLng=$(lspv | awk 'BEGIN{lng=0;cap=8} !/N\/A/{if(NR>2){if(lng < length()){lng=length()}}} END{if(lng > cap){print lng}else{print cap}}')

for vg in $(lsvg -o)
do
  for fs in $(lsvgfs ${vg})
  do
    line1="$(printf "%-${fsLng}s  " ${fs})"
    line2="$(printf "%-${fsLng}s  " '')"
    line3="$(printf "%-${fsLng}s  " '')"

    for disk in $(lsvg -p $vg | awk '{if(NR>2){print }} END{print "hdisk0";print "hdisk0"}')
    do
      set -A diskparam $(lspv ${disk} | awk 'BEGIN{PPsize=0;PPtotal=0;PPused=0}
        /^PP SIZE:/{ if(~"gigabyte" ){PPsize=}else 
                     if(~"megabyte" ){PPsize=/1000}else 
                     if(~"kilobyte" ){PPsize=/1000000} }
        /^TOTAL PPs:/{ PPtotal= }
        /^USED PPs:/{ PPused= }
        END{ GBtotal=PPtotal*PPsize
             GBused=PPused*PPsize
             print length(int(GBtotal))" "GBtotal" "GBused
           }
      ')

      NumWdt=$(( ${diskparam[0]}+${deccnt} ))
      [[ ${deccnt} -ne  0 ]] && (( NumWdt=NumWdt+1 )) # +1 due we have decimal point char

      if [[ ${NumWdt} -lt ${diskLng} ]]
      then
        colWdt=${diskLng}
      else
        colWdt=$(( ${NumWdt}+1 )) # +1 hence 'g' char make line2-3 larger if NumWdt control the column width. 
      fi

      if lspv -l ${disk} | grep -q " ${fs}$"
      then
        line1="${line1} $(printf "%-${diskLng}s%-$(( ${colWdt}-${diskLng} ))s" ${disk} '')"
        line2="${line2} $(printf "%${NumWdt}.${deccnt}f%-$(( ${colWdt}-${NumWdt} ))s" ${diskparam[1]} 'g')"
        line3="${line3} $(printf "%${NumWdt}.${deccnt}f%-$(( ${colWdt}-${NumWdt} ))s" ${diskparam[2]} 'g')"
      fi
    done
    print "${line1}\n${line2}\n${line3}\n"
  done
  print
done