lvresize: add new options and defaults for fs handling
The new option "--fs String" for lvresize/lvreduce/lvextend
controls the handling of file systems before/after resizing
the LV. --resizefs is the same as --fs resize.
The new option "--fsmode String" can be used to control
mounting and unmounting of the fs during resizing.
Possible --fs values:
checksize
Only applies to reducing size; does nothing for extend.
Check the fs size and reduce the LV if the fs is not using
the affected space, i.e. the fs does not need to be shrunk.
Fail the command without reducing the fs or LV if the fs is
using the affected space.
resize
Resize the fs using the fs-specific resize command.
This may include mounting, unmounting, or running fsck.
See --fsmode to control mounting behavior, and --nofsck to
disable fsck.
resize_fsadm
Use the old method of calling fsadm to handle the fs
(deprecated.) Warning: this option does not prevent lvreduce
from destroying file systems that are unmounted (or mounted
if prompts are skipped.)
ignore
Resize the LV without checking for or handling a file system.
Warning: using ignore when reducing the LV size may destroy the
file system.
Possible --fsmode values:
manage
Mount or unmount the fs as needed to resize the fs,
and attempt to restore the original mount state at the end.
nochange
Do not mount or unmount the fs. If mounting or unmounting
is required to resize the fs, then do not resize the fs or
the LV and fail the command.
offline
Unmount the fs if it is mounted, and resize the fs while it
is unmounted. If mounting is required to resize the fs,
then do not resize the fs or the LV and fail the command.
Notes on lvreduce:
When no --fs or --resizefs option is specified:
. lvextend default behavior is fs ignore.
. lvreduce default behavior is fs checksize
(includes activating the LV.)
With the exception of --fs resize_fsadm|ignore, lvreduce requires
the recent libblkid fields FSLASTBLOCK and FSBLOCKSIZE.
FSLASTBLOCK*FSBLOCKSIZE is the last byte used by the fs on the LV,
which determines if reducing the fs is necessary.
2022-06-14 23:20:21 +03:00
#!/usr/bin/env bash
# Copyright (C) 2007-2016 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
SKIP_WITH_LVMPOLLD = 1
. lib/inittest
aux prepare_vg 3 256
2022-10-10 21:25:50 +03:00
which mkfs.xfs || skip
2022-09-13 23:37:10 +03:00
# Tests require a libblkid version that shows FSLASTBLOCK
lvcreate -n $lv1 -L 300 $vg
mkfs.xfs -f " $DM_DEV_DIR / $vg / $lv1 "
blkid -p " $DM_DEV_DIR / $vg / $lv1 " | grep FSLASTBLOCK || skip
lvchange -an $vg
lvremove $vg /$lv1
lvresize: add new options and defaults for fs handling
The new option "--fs String" for lvresize/lvreduce/lvextend
controls the handling of file systems before/after resizing
the LV. --resizefs is the same as --fs resize.
The new option "--fsmode String" can be used to control
mounting and unmounting of the fs during resizing.
Possible --fs values:
checksize
Only applies to reducing size; does nothing for extend.
Check the fs size and reduce the LV if the fs is not using
the affected space, i.e. the fs does not need to be shrunk.
Fail the command without reducing the fs or LV if the fs is
using the affected space.
resize
Resize the fs using the fs-specific resize command.
This may include mounting, unmounting, or running fsck.
See --fsmode to control mounting behavior, and --nofsck to
disable fsck.
resize_fsadm
Use the old method of calling fsadm to handle the fs
(deprecated.) Warning: this option does not prevent lvreduce
from destroying file systems that are unmounted (or mounted
if prompts are skipped.)
ignore
Resize the LV without checking for or handling a file system.
Warning: using ignore when reducing the LV size may destroy the
file system.
Possible --fsmode values:
manage
Mount or unmount the fs as needed to resize the fs,
and attempt to restore the original mount state at the end.
nochange
Do not mount or unmount the fs. If mounting or unmounting
is required to resize the fs, then do not resize the fs or
the LV and fail the command.
offline
Unmount the fs if it is mounted, and resize the fs while it
is unmounted. If mounting is required to resize the fs,
then do not resize the fs or the LV and fail the command.
Notes on lvreduce:
When no --fs or --resizefs option is specified:
. lvextend default behavior is fs ignore.
. lvreduce default behavior is fs checksize
(includes activating the LV.)
With the exception of --fs resize_fsadm|ignore, lvreduce requires
the recent libblkid fields FSLASTBLOCK and FSBLOCKSIZE.
FSLASTBLOCK*FSBLOCKSIZE is the last byte used by the fs on the LV,
which determines if reducing the fs is necessary.
2022-06-14 23:20:21 +03:00
mount_dir = "mnt_lvresize_cr"
mkdir -p " $mount_dir "
# dm-crypt device on lv
cr = " $PREFIX - $lv -cr "
# lvextend ext4 on LUKS1
lvcreate -n $lv -L 256M $vg
echo 93R4P4pIqAH8 | cryptsetup luksFormat -i1 --type luks1 " $DM_DEV_DIR / $vg / $lv "
echo 93R4P4pIqAH8 | cryptsetup luksOpen " $DM_DEV_DIR / $vg / $lv " $cr
mkfs.ext4 /dev/mapper/$cr
mount /dev/mapper/$cr " $mount_dir "
dd if = /dev/zero of = " $mount_dir /zeros1 " bs = 1M count = 200 conv = fdatasync
df --output= size " $mount_dir " | tee df1
lvextend -L+200M --fs resize $vg /$lv
check lv_field $vg /$lv lv_size "456.00m"
df --output= size " $mount_dir " | tee df2
not diff df1 df2
umount " $mount_dir "
cryptsetup close $cr
lvchange -an $vg /$lv
lvremove $vg /$lv
# lvreduce ext4 on LUKS1
lvcreate -n $lv -L 456M $vg
echo 93R4P4pIqAH8 | cryptsetup luksFormat -i1 --type luks1 " $DM_DEV_DIR / $vg / $lv "
echo 93R4P4pIqAH8 | cryptsetup luksOpen " $DM_DEV_DIR / $vg / $lv " $cr
mkfs.ext4 /dev/mapper/$cr
mount /dev/mapper/$cr " $mount_dir "
dd if = /dev/zero of = " $mount_dir /zeros1 " bs = 1M count = 200 conv = fdatasync
df --output= size " $mount_dir " | tee df1
lvresize -L-100M --yes --fs resize $vg /$lv
check lv_field $vg /$lv lv_size "356.00m"
df --output= size " $mount_dir " | tee df2
not diff df1 df2
umount " $mount_dir "
cryptsetup close $cr
lvchange -an $vg /$lv
lvremove $vg /$lv
# lvextend xfs on LUKS1
lvcreate -n $lv -L 256M $vg
echo 93R4P4pIqAH8 | cryptsetup luksFormat -i1 --type luks1 " $DM_DEV_DIR / $vg / $lv "
echo 93R4P4pIqAH8 | cryptsetup luksOpen " $DM_DEV_DIR / $vg / $lv " $cr
mkfs.xfs /dev/mapper/$cr
mount /dev/mapper/$cr " $mount_dir "
dd if = /dev/zero of = " $mount_dir /zeros1 " bs = 1M count = 200 conv = fdatasync
df --output= size " $mount_dir " | tee df1
lvextend -L+200M --fs resize $vg /$lv
check lv_field $vg /$lv lv_size "456.00m"
df --output= size " $mount_dir " | tee df2
not diff df1 df2
umount " $mount_dir "
cryptsetup close $cr
lvchange -an $vg /$lv
lvremove $vg /$lv
# lvreduce xfs on LUKS1
lvcreate -n $lv -L 456M $vg
echo 93R4P4pIqAH8 | cryptsetup luksFormat -i1 --type luks1 " $DM_DEV_DIR / $vg / $lv "
echo 93R4P4pIqAH8 | cryptsetup luksOpen " $DM_DEV_DIR / $vg / $lv " $cr
mkfs.xfs /dev/mapper/$cr
mount /dev/mapper/$cr " $mount_dir "
dd if = /dev/zero of = " $mount_dir /zeros1 " bs = 1M count = 200 conv = fdatasync
df --output= size " $mount_dir " | tee df1
# xfs cannot be reduced
not lvresize -L-100M --yes --fs resize $vg /$lv
check lv_field $vg /$lv lv_size "456.00m"
df --output= size " $mount_dir " | tee df2
diff df1 df2
umount " $mount_dir "
cryptsetup close $cr
lvchange -an $vg /$lv
lvremove $vg /$lv
# lvextend ext4 on plain crypt (no header)
lvcreate -n $lv -L 256M $vg
echo 93R4P4pIqAH8 | cryptsetup create $cr " $DM_DEV_DIR / $vg / $lv "
mkfs.ext4 /dev/mapper/$cr
mount /dev/mapper/$cr " $mount_dir "
dd if = /dev/zero of = " $mount_dir /zeros1 " bs = 1M count = 200 conv = fdatasync
df --output= size " $mount_dir " | tee df1
# fails when no fs is found for --fs resize
not lvextend -L+200M --yes --fs resize $vg /$lv
check lv_field $vg /$lv lv_size "256.00m"
df --output= size " $mount_dir " | tee df2
diff df1 df2
umount " $mount_dir "
cryptsetup close $cr
lvchange -an $vg /$lv
lvremove $vg /$lv
# lvreduce ext4 on plain crypt (no header)
lvcreate -n $lv -L 456M $vg
echo 93R4P4pIqAH8 | cryptsetup create $cr " $DM_DEV_DIR / $vg / $lv "
mkfs.ext4 /dev/mapper/$cr
mount /dev/mapper/$cr " $mount_dir "
dd if = /dev/zero of = " $mount_dir /zeros1 " bs = 1M count = 200 conv = fdatasync
df --output= size " $mount_dir " | tee df1
# fails when no fs is found for --fs resize
not lvresize -L-100M --yes --fs resize $vg /$lv
check lv_field $vg /$lv lv_size "456.00m"
df --output= size " $mount_dir " | tee df2
diff df1 df2
umount " $mount_dir "
cryptsetup close $cr
lvchange -an $vg /$lv
lvremove $vg /$lv
# test with LUKS2?
vgremove -ff $vg