我正在寻找一种更快的方法来了解 AIX 系统上的文件系统有多少可用空间。目前,我正在使用:
lsvg -o | lsvg -i -l
savevg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
logsave jfs2log 1 1 1 open/syncd N/A
rmanlvp jfs2 282 282 1 open/syncd /oradata/rman
opcon jfs2 4 4 1 open/syncd /opt/OpCon
这样我就知道我的FS /选择/OpCon是在VG保存 然后 :
lsvg savevg
VOLUME GROUP: savevg VG IDENTIFIER: 00f612c600004c000000014c2c91c0fb
VG STATE: active PP SIZE: 1024 megabyte(s)
VG PERMISSION: read/write TOTAL PPs: 699 (715776 megabytes)
MAX LVs: 256 FREE PPs: 217 (222208 megabytes)
有没有办法直接知道文件系统有多少可用空间?
答案1
下面的脚本对输入进行一些健全性检查(期望只有一个文件系统,并且它应该存在),然后按步骤发现所需的信息:
- 给定文件系统,从中提取 LV
lsfs
- 使用 LV,从 中提取 VG
lslv
- 使用 VG,从中提取可用空间
lsvg
这是脚本:
#!/bin/sh
# input: a filesystem
# output: free MB in the containing VG
if [ "$#" -ne 1 ]
then
printf "Usage: %s [ fs ]\n" "$0" >&2
exit 1
fi
if ! /usr/sbin/lsfs -c "$1" > /dev/null 2>&1
then
printf "Error: filesystem %s not found\n" "$1" >&2
exit 2
fi
lv=$(/usr/sbin/lsfs -c "$1" |
awk -F: 'NR == 2 {
split($2, fields, "/");
print fields[3]
}')
vg=$(LANG=C lslv "$lv" 2>/dev/null | awk '/VOLUME GROUP/ { print $6 }')
copies=$(LANG=C lslv "$lv" 2>/dev/null | awk '/^COPIES:/ {print $2}')
mb=$(LANG=C /usr/sbin/lsvg "$vg" |
awk -F: '/FREE PP/ {match($3, /\([[:digit:]]*/); print substr($3, RSTART+1, RLENGTH-1)}')
printf "%d Mb available\n" "$((mb / copies))"
描述一下代码中可能不明显的一些部分:
- 的脚本
awk
将lsfs
输出分割为冒号,并且仅在第 2 行上运行(因为第 1 行是标题)。字段 2 中的值类似于/dev/opcon
,因此我们fields
根据正斜杠将其拆分为数组。元素一为空(第一个之前没有任何内容/
),元素二为dev
,元素三为opcon
,即我们想要的 LV 名称。 - 的脚本
awk
挑选lsvg
出自由空间线;第三个以冒号分隔的字段是 后的文本FREE PPs:
,例如217 (222208 megabytes)
。我们要求match()
该字段匹配(
后跟一些数字。我们假设这里成功了!因为匹配从左括号开始,所以当我们提取空闲 Mb 的数字时,我们会跳过 RSTART 并从 RLENGTH 中减去 1。
如果您计划将此脚本的输出用作另一个管道的一部分,请考虑调整语句printf
以仅输出数字,而不输出“Mb available\n”部分。