显示每个文件系统驻留在 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
我有以下脚本显示每个文件系统驻留在 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 等等...老实说我不知道该怎么做我知道我可以使用这个
获得磁盘的总 spacegetconf 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