想象一下使用以下命令调整物理卷的大小:
pvresize /dev/sda2
并且逻辑卷的大小已调整为:
lvresize -l +100%FREE system/home
但这个命令没有执行:
resize2fs /dev/mapper/system-home
由于忘记了上一个命令,因此存在未使用的空间。
如何计算未使用的字节数?
背景:我想编写一个检查脚本,检查服务器上是否忘记了文件系统的大小调整。
顺便说一句:我不信任 shell 脚本。
答案1
整个块设备的默认大小加上在线增长,使得大小检查变得没有必要。resize2fs
在所有文件系统上运行。
(如果您的用例需要该尺寸,请编辑您的问题。)
lvresize --resizefs
通过添加到脚本或 shell 别名来防止再次忘记文件系统。
理想情况下,容量规划报告中会不断显示空间不足。但愿空间不会变得太满,从而触发即将填满的警报。
答案2
步骤1:识别文件系统边界
dumpe2fs -h /dev/mapper/system-home | grep -E "^Block count|^Block size"
您将通过这两个数字获得文件系统的总大小,例如以下:
Block count: 98304
Block size: 1024 (which is 1k)
FS size = 98304 = **96MB**
第2步:识别块设备边界
A)识别与逻辑卷关联的 dm
readlink -f /dev/mapper/system-home
,它会为您提供 /dev/dm-XX
b)确定 /dev/dm-XX 边界
cat /sys/block/dm-XX/size
,该边界会给出总大小(以 512 字节为单位)块。如果大小为 300000 个块,则您拥有的块数略小于150MB在块设备上
150-96 制造~54MB可用可分配文件系统空间
答案3
我使用一个脚本解决了调整大小的问题,该脚本查找所有涉及的块设备并相应地打印调整大小的命令。
https://github.com/mircea-vutcovici/scripts/blob/master/vol_resize.sh
类似地,您可以将其更改为运行显示块设备大小和文件系统大小的命令。只需看一下脚本,您就会意识到答案有点复杂。
例如想象这样的布局:
- LUN 的多路径
- 分区表
- lvm
- 加密
- 文件系统
- zfs 文件系统
如何找到尺寸:
- 块设备:
blockdev --getsz sdX
,grep . /sys/block/*/size
- lvm:
pvs
- 扩展 2、3、4:
dumpe2fs /dev/sdX|egrep '^Block (count|size):'
- zfs :
zpool status
,,zpool list
zfs list
- btrfs:
- xfs:
xfs_info
- 设备映射器:
dmsetup table
- 挂载的文件系统:
df
答案4
简单来说,使用狂欢特征:
crtdev=/dev/sda9
crtdev=/dev/Vol-1/Root
设备大小(实际):
{ read devsz;read devss;}< <(blockdev --getsz --getss $crtdev) devsize=$((devsz*devss))
注意:您可以使用
lsblk
以下尺寸列出设备:lsblk -no KNAME,NAME,SIZE
这在脚本中可能很有用...请参阅下文!
文件系统大小(当前)
为了
ext2|ext3|ext4
:while IFS=$':\t\r\n' read fld val;do case $fld in Block\ size) fsbs=$val;; Block\ count) fssz=$val;; esac done < <(dumpe2fs 2>&1 -h $crtdev) fssize=$((fssz*fsbs))
为了
xfs
:XFS 信息无法在已安装的设备上执行,您必须改用 mont-point:
mntpnt=/mnt while IFS=$' =,\t\r\n' read -a lne;do [ "$lne" = "data" ] && fsbs=${lne[2]} fssz=${lne[4]} done < <( xfs_info $mntpnt ) fssize=$((fssz*fsbs))
为了
ntfs
:事情似乎不那么简单……因为我不经常使用它们,即使我
ntfsresize
过去已经使用过。有以下几点:read fsinfo < <(file -bs $1) fssz=${fsinfo#*, sectors } fssz=${fssz%%,*} fssize=$(( 512 * ( fssz + 1 ) ))
注意:我讨厌这个:我无法解释
+ 1
,而且我的一些测试工作+ 8
反而……
最后
printf "Dev: %d - FS: %d = Unused: %d\n" $devsize $fssize $(( devsize - fssize ))
lsblk
用于扫描所有设备的脚本:
此脚本在不带参数的情况下运行时,将按具有 diff 非空值的设备打印一行。使用任何(虚拟)参数运行时,将按每个设备打印xfs
一行ext[234]
。
由于这种用途狂欢高效巴什主义并且有限的分叉lshw
,dumpe2fs
和/或xfs_info
只有这个脚本占用非常小的资源。
!! 运行为root
或与sudo
!!
#!/bin/bash
shopt -s extglob
declare -A KNAMES='()' # Prevent double check
infolog() {
# Entering this with $kname, $size, $fs, $name, $fsbs and $fssz.
fssize=$((fssz*fsbs))
(( $# | size-fssize ))&& # Only if diffsize > 0 or if argument was submited
printf "%-25s %-6s %15u %15u %14u\n" \
${NAME##*/} $FSTYPE $SIZE $fssize $((SIZE-fssize))
}
while read line; do eval "$line"
[ "${KNAMES[${KNAME##*/}]}" ] || case $FSTYPE in
ext* ) while IFS=$':\t\r\n' read fld val;do
case $fld in
Block\ size) fsbs=$val;;
Block\ count) fssz=$val;;
esac
done < <(dumpe2fs 2>&1 -h $KNAME)
infolog $@ ;;
xfs ) check=$KNAME
[ "$MOUNTPOINT" ] && check="$MOUNTPOINT"
while IFS=$' =,\t\r\n' read -a lne;do
[ "$lne" = "data" ] &&
fsbs=${lne[2]} fssz=${lne[4]}
done < <( xfs_info "$check" )
infolog $@ ;;
ntfs )
read fsinfo < <(file -Lbs $KNAME)
fssz=${fsinfo#*, sectors } fssz=${fssz%%,*}
(( fssz += 1, fsbs=512 ))
infolog $@ ;;
esac
KNAMES[${KNAME##*/}]="done"
done < <(lsblk -bnpPo KNAME,NAME,MOUNTPOINT,FSTYPE,SIZE)
(这稍微缩小了一点以防止 SO 的滚动条;)
示例运行(无参数):
./unused_bytes_by_dev.sh
Vol--I-XDATAS xfs 48318382080 42949672960 5368709120
sdd1 ext4 1010774016 175472640 835301376
有一个论点:
./unused_bytes_by_dev.sh dummy
md0 ext4 246349824 246349824 0
Vol--I-ROOT ext4 1610612736 1610612736 0
Vol--V-USR ext4 31138512896 31138512896 0
Vol--I-VAR ext4 22548578304 22548578304 0
Vol--I-HOME ext4 34359738368 34359738368 0
Vol--I-XDATAS xfs 48318382080 42949672960 5368709120
Vol--I-Win ntfs 42949672960 42949672960 0
sdd1 ext4 1010774016 175472640 835301376