Support shrink persistence dat file for ext4 filesystem.

This commit is contained in:
longpanda 2021-09-24 10:07:32 +08:00
parent 471432fc50
commit 8cecdae8f9

View File

@ -27,6 +27,13 @@ if [ ! -f "$file" ]; then
exit 1 exit 1
fi fi
if echo $size | grep -q "^-"; then
mode="Shrink"
size=${size:1}
else
mode="Extend"
fi
if echo $size | grep -q "[^0-9]"; then if echo $size | grep -q "[^0-9]"; then
print_usage print_usage
exit 1 exit 1
@ -42,10 +49,25 @@ fi
fsMB=$(expr $fsize / 1024 / 1024) fsMB=$(expr $fsize / 1024 / 1024)
if [ "$mode" = "Extend" ]; then
total=$(expr $fsMB + $size) total=$(expr $fsMB + $size)
else
if [ $fsMB -le $size ]; then
echo "File size of $file is less than ${size}MB."
exit 1
fi
total=$(expr $fsMB - $size)
fi
magic=$(hexdump -n3 -e '3/1 "%02X"' $file) magic=$(hexdump -n3 -e '3/1 "%02X"' $file)
if [ "$magic" = "584653" ]; then if [ "$magic" = "584653" ]; then
if [ "$mode" = "Shrink" ]; then
echo "Shrink is not supported for XFS filesystem."
exit 1
fi
if which xfs_growfs >/dev/null 2>&1; then if which xfs_growfs >/dev/null 2>&1; then
cmd=xfs_growfs cmd=xfs_growfs
else else
@ -61,23 +83,26 @@ else
fi fi
fi fi
if [ "$mode" = "Extend" ]; then
echo "Extend dat file... (current is ${fsMB}MB, append ${size}MB, total ${total}MB)" echo "$mode dat file... (current is ${fsMB}MB, append ${size}MB, total ${total}MB)"
dd if=/dev/zero bs=1M count=$size status=none >> "$file" dd if=/dev/zero bs=1M count=$size status=none >> "$file"
sync sync
else
echo "$mode dat file... (current is ${fsMB}MB, reduce ${size}MB, finally ${total}MB)"
fi
freeloop=$(losetup -f) freeloop=$(losetup -f)
losetup $freeloop "$file" losetup $freeloop "$file"
if [ "$cmd" = "resize2fs" ]; then if [ "$cmd" = "resize2fs" ]; then
echo "Extend ext filesystem by resize2fs ..." echo "$mode ext filesystem by resize2fs ..."
echo "resize2fs $freeloop ${total}M" echo "resize2fs $freeloop ${total}M"
e2fsck -f $freeloop e2fsck -f $freeloop
resize2fs $freeloop ${total}M resize2fs $freeloop ${total}M
ret=$? ret=$?
else else
echo "Extend xfs filesystem by xfs_growfs ..." echo "$mode xfs filesystem by xfs_growfs ..."
tmpdir=$(mktemp -d) tmpdir=$(mktemp -d)
mount $freeloop $tmpdir mount $freeloop $tmpdir
xfs_growfs $freeloop xfs_growfs $freeloop
@ -87,6 +112,12 @@ fi
losetup -d $freeloop losetup -d $freeloop
if [ $ret -eq 0 -a "$mode" = "Shrink" ]; then
echo "truncate persistent file ..."
truncate "$file" -s ${total}M
ret=$?
fi
echo "" echo ""
if [ $ret -eq 0 ]; then if [ $ret -eq 0 ]; then
echo "======= SUCCESS =========" echo "======= SUCCESS ========="
@ -94,4 +125,3 @@ else
echo "======= FAILED =========" echo "======= FAILED ========="
fi fi
echo "" echo ""