1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00
lvm2/test/shell/fsadm-crypt.sh
David Teigland 264827cb98 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-09-13 15:15:05 -05:00

615 lines
14 KiB
Bash

#!/usr/bin/env bash
# Copyright (C) 2008-2017 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
test_description='Exercise fsadm filesystem resize on crypt devices'
SKIP_WITH_LVMPOLLD=1
# FIXME: cannot use brd (ramdisk) - lsblk is NOT listing it
# so lsblk usage should be replaced
export LVM_TEST_PREFER_BRD=0
. lib/inittest
aux prepare_vg 1 1300
# set to "skip" to avoid testing given fs and test warning result
# i.e. check_reiserfs=skip
check_ext2=
check_ext3=
check_xfs=
check_reiserfs=
check_cryptsetup=
DROP_SYMLINK=
CRYPT_NAME="$PREFIX-tcrypt"
CRYPT_DEV="$DM_DEV_DIR/mapper/$CRYPT_NAME"
CRYPT_NAME2="$PREFIX-tcrypt2"
CRYPT_DEV2="$DM_DEV_DIR/mapper/$CRYPT_NAME2"
CRYPT_NAME_PLAIN="$PREFIX-tcryptp"
CRYPT_DEV_PLAIN="$DM_DEV_DIR/mapper/$CRYPT_NAME_PLAIN"
FORMAT_PARAMS="-i1"
PWD1="93R4P4pIqAH8"
PWD2="mymJeD8ivEhE"
PWD3="ocMakf3fAcQO"
SKIP_DETACHED=
if which cryptsetup ; then
# use older format luks1 - otherwise the test would need to pass password everywhere...
case $(cryptsetup --version) in
"cryptsetup 2"*) FORMAT_PARAMS="$FORMAT_PARAMS --type luks1" ;;
esac
else
check_cryptsetup=${check_cryptsetup:-cryptsetup}
fi
which mkfs.ext2 || check_ext2=${check_ext2:-mkfs.ext2}
which mkfs.ext3 || check_ext3=${check_ext3:-mkfs.ext3}
which fsck.ext3 || check_ext3=${check_ext3:-fsck.ext3}
which mkfs.xfs || check_xfs=${check_xfs:-mkfs.xfs}
which xfs_check || {
which xfs_repair || check_xfs=${check_xfs:-xfs_repair}
}
grep xfs /proc/filesystems || check_xfs=${check_xfs:-no_xfs}
which mkfs.reiserfs || check_reiserfs=${check_reiserfs:-mkfs.reiserfs}
which reiserfsck || check_reiserfs=${check_reiserfs:-reiserfsck}
modprobe reiserfs || true
grep reiserfs /proc/filesystems || check_reiserfs=${check_reiserfs:-no_reiserfs}
vg_lv=$vg/$lv1
vg_lv2=$vg/${lv1}bar
vg_lv3=$vg/${lv1}plain
dev_vg_lv="$DM_DEV_DIR/$vg_lv"
dev_vg_lv2="$DM_DEV_DIR/$vg_lv2"
dev_vg_lv3="$DM_DEV_DIR/$vg_lv3"
mount_dir="mnt"
test ! -d "$mount_dir" && mkdir "$mount_dir"
crypt_close() {
aux udev_wait
cryptsetup remove "$1"
if [ "$?" -eq 0 -a -n "$DROP_SYMLINK" ]; then
rm -f "$DM_DEV_DIR/mapper/$1"
fi
}
cleanup_mounted_and_teardown()
{
umount "$mount_dir" || true
crypt_close $CRYPT_NAME > /dev/null 2>&1 || true
crypt_close $CRYPT_NAME2 > /dev/null 2>&1 || true
crypt_close $CRYPT_NAME_PLAIN > /dev/null 2>&1 || true
aux teardown
}
fscheck_ext3()
{
fsck.ext3 -p -F -f "$1"
}
fscheck_xfs()
{
if which xfs_repair ; then
xfs_repair -n "$1"
else
xfs_check "$1"
fi
}
fscheck_reiserfs()
{
reiserfsck --check -p -f "$1" </dev/null
}
check_missing()
{
local t
eval "t=\$check_$1"
test -z "$t" && return 0
test "$t" = skip && return 1
echo "WARNING: fsadm test skipped $1 tests, $t tool is missing."
# trick to get test listed with warning
# should false;
return 1
}
get_crypt_kname() {
lsblk -r -n -o KNAME,NAME | grep "$1" | cut -d ' ' -f 1
}
# $1 device
# $2 pass
crypt_format() {
echo "$2" | cryptsetup luksFormat $FORMAT_PARAMS "$1"
}
# $1 device
# $2 pass
# $3 name
crypt_open() {
local kname=
echo "$2" | cryptsetup luksOpen "$1" "$3"
test -L "$DM_DEV_DIR/mapper/$3" || {
kname=$(get_crypt_kname $3)
ln -s "/dev/$kname" "$DM_DEV_DIR/mapper/$3"
DROP_SYMLINK=1
}
}
# $1 data device
# $2 pass
# $3 name
# $4 header
crypt_open_detached() {
local kname=
echo "$2" | cryptsetup luksOpen --header "$4" "$1" "$3" || return $?
test -L "$DM_DEV_DIR/mapper/$3" || {
kname=$(get_crypt_kname $3)
ln -s "/dev/$kname" "$DM_DEV_DIR/mapper/$3"
DROP_SYMLINK=1
}
}
# $1 device
# $2 pass
# $3 name
crypt_open_plain() {
local kname=
echo "$2" | cryptsetup create "$3" "$1"
test -L "$DM_DEV_DIR/mapper/$3" || {
kname=$(get_crypt_kname $3)
ln -s "/dev/$kname" "$DM_DEV_DIR/mapper/$3"
DROP_SYMLINK=1
}
}
# $1 device
# $2 type
create_crypt_device()
{
crypt_format "$dev_vg_lv" $PWD1
crypt_open "$dev_vg_lv" $PWD1 "$CRYPT_NAME"
crypt_format "$dev_vg_lv2" $PWD2
if crypt_open_detached "$dev_vg_lv3" "$PWD2" "$PREFIX-test" "$dev_vg_lv2"; then
crypt_close "$PREFIX-test"
else
SKIP_DETACHED=1
fi
}
which lsblk > /dev/null || skip
check_missing cryptsetup || skip
vgchange -s 128k
lvcreate -n $lv1 -L25M $vg
lvcreate -n ${lv1}bar -L335M $vg
lvcreate -n ${lv1}plain -L335M $vg
create_crypt_device
trap 'cleanup_mounted_and_teardown' EXIT
# $1 LVM backend (vg/lv name)
# $2 LVM backend device (/dev/vg/lv)
# $3 active dm-crypt device (/dev/mapper/some_name )
test_ext2_resize() {
mkfs.ext2 -b4096 -j "$3"
fsadm --lvresize resize $1 30M
# Fails - not enough space for 4M fs
not fsadm -y --lvresize resize "$2" 4M
lvresize -L+10M --fs resize_fsadm $1
lvreduce -L10M --fs resize_fsadm $1
fscheck_ext3 "$3"
mount "$3" "$mount_dir"
not fsadm -y --lvresize resize $1 4M
echo n | not lvresize -L4M --fs resize_fsadm -n $1
lvresize -L+20M --fs resize_fsadm -n $1
umount "$mount_dir"
fscheck_ext3 "$3"
}
test_ext2_small_shrink() {
mkfs.ext2 "$3"
lvresize -L-1 --fs resize_fsadm $1
lvresize -L-1 --fs resize_fsadm $1
fscheck_ext3 "$3"
}
test_ext3_resize() {
mkfs.ext3 -b4096 -j "$3"
fsadm --lvresize resize $1 30M
# Fails - not enough space for 4M fs
not fsadm -y --lvresize resize "$2" 4M
lvresize -L+10M --fs resize_fsadm $1
lvreduce -L10M --fs resize_fsadm $1
fscheck_ext3 "$3"
mount "$3" "$mount_dir"
lvresize -L+10M --fs resize_fsadm $1
not fsadm -y --lvresize resize $1 4M
echo n | not lvresize -L4M --fs resize_fsadm -n $1
lvresize -L+20M --fs resize_fsadm -n $1
lvresize -L-10M --fs resize_fsadm -y $1
umount "$mount_dir"
}
test_ext3_small_shrink() {
mkfs.ext3 "$3"
lvresize -L-1 --fs resize_fsadm $1
lvresize -L-1 --fs resize_fsadm $1
fscheck_ext3 "$3"
}
test_xfs_resize() {
mkfs.xfs -f "$3"
fsadm --lvresize resize $1 330M
# Fails - not enough space for 4M fs
lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
fscheck_xfs "$3"
mount "$3" "$mount_dir"
lvresize -L+10M --fs resize_fsadm -n $1
umount "$mount_dir"
fscheck_xfs "$3"
}
test_xfs_small_shrink() {
mkfs.xfs -f "$3"
not lvresize -L-1 --fs resize_fsadm $1
fscheck_xfs "$3"
}
test_reiserfs_resize() {
mkfs.reiserfs -s 513 -f "$3"
fsadm --lvresize resize $1 30M
lvresize -L+10M --fs resize_fsadm $1
fsadm --lvresize -y resize $1 10M
fscheck_reiserfs "$3"
mount "$3" "$mount_dir"
fsadm -y --lvresize resize $1 30M
umount "$mount_dir"
fscheck_reiserfs "$3"
}
test_reiserfs_small_shrink() {
mkfs.reiserfs -s 513 -f "$3"
lvresize -y -L-1 --fs resize_fsadm $1
lvresize -y -L-1 --fs resize_fsadm $1
fscheck_reiserfs "$3"
}
# $1 LVM backend (vg/lv name)
# $2 LVM backend device (/dev/vg/lv)
# $3 active dm-crypt device (/dev/mapper/some_name )
# $4 active dm-crypt name ( some_name )
test_ext2_inactive() {
crypt_open "$2" $PWD2 "$4"
mkfs.ext2 -b4096 -j "$3"
crypt_close "$4"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
crypt_open "$2" $PWD2 "$4"
fscheck_ext3 "$3"
crypt_close "$4"
}
test_ext3_inactive() {
crypt_open "$2" $PWD2 "$4"
mkfs.ext3 -b4096 -j "$3"
crypt_close "$4"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
crypt_open "$2" $PWD2 "$4"
fscheck_ext3 "$3"
crypt_close "$4"
}
test_xfs_inactive() {
crypt_open "$2" $PWD2 "$4"
mkfs.xfs -f "$3"
crypt_close "$4"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
crypt_open "$2" $PWD2 "$4"
fscheck_xfs "$3"
crypt_close "$4"
}
test_reiserfs_inactive() {
crypt_open "$2" $PWD2 "$4"
mkfs.reiserfs -s 513 -f "$3"
crypt_close "$4"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
crypt_open "$2" $PWD2 "$4"
fscheck_reiserfs "$3"
crypt_close "$4"
}
# $1 LVM backend (vg/lv name)
# $2 LVM backend device (/dev/vg/lv)
# $3 active dm-crypt device (/dev/mapper/some_name )
# $4 active dm-crypt name ( some_name )
test_ext2_plain() {
mkfs.ext2 -b4096 -j "$3"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
fscheck_ext3 "$3"
fsadm --cryptresize resize $3 30M
fsadm --cryptresize resize $3 35M
fscheck_ext3 "$3"
mount "$3" "$mount_dir"
not fsadm -y --cryptresize resize $3 4M
umount "$mount_dir"
fscheck_ext3 "$3"
crypt_close "$4"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
crypt_open_plain "$2" $PWD3 "$4"
fscheck_ext3 "$3"
}
test_ext3_plain() {
mkfs.ext3 -b4096 -j "$3"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
fscheck_ext3 "$3"
fsadm --cryptresize resize $3 30M
fsadm --cryptresize resize $3 35M
fscheck_ext3 "$3"
mount "$3" "$mount_dir"
not fsadm -y --cryptresize resize $3 4M
umount "$mount_dir"
fscheck_ext3 "$3"
crypt_close "$4"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
crypt_open_plain "$2" $PWD3 "$4"
fscheck_ext3 "$3"
}
test_xfs_plain() {
mkfs.xfs -f "$3"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
fscheck_xfs "$3"
lvresize -f -L+10M $1
fsadm --cryptresize resize $3 345M
# no shrink support in xfs
not fsadm --cryptresize resize $3 35M
fscheck_xfs "$3"
crypt_close "$4"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
crypt_open_plain "$2" $PWD3 "$4"
fscheck_xfs "$3"
lvresize -f -L320M $1
}
test_reiserfs_plain() {
mkfs.reiserfs -s 513 -f "$3"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L-10M --fs resize_fsadm $1
fscheck_reiserfs "$3"
fsadm -y --cryptresize resize $3 30M
fsadm -y --cryptresize resize $3 35M
fscheck_reiserfs "$3"
crypt_close "$4"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
crypt_open_plain "$2" $PWD3 "$4"
fscheck_reiserfs "$3"
}
# $1 LVM header backend (vg/lv name)
# $2 LVM hedaer backend device (/dev/vg/lv)
# $3 active dm-crypt device (/dev/mapper/some_name )
# $4 active dm-crypt name ( some_name )a
test_ext2_detached() {
mkfs.ext2 -b4096 -j "$3"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
fscheck_ext3 "$3"
}
test_ext3_detached() {
mkfs.ext3 -b4096 -j "$3"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
fscheck_ext3 "$3"
}
test_xfs_detached() {
mkfs.xfs -f "$3"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
fscheck_xfs "$3"
}
test_reiserfs_detached() {
mkfs.reiserfs -s 513 -f "$3"
not fsadm --lvresize resize $1 30M
not lvresize -L+10M --fs resize_fsadm $1
not lvreduce -L10M --fs resize_fsadm $1
fscheck_reiserfs "$3"
}
if check_missing ext2; then
test_ext2_resize "$vg_lv" "$dev_vg_lv" "$CRYPT_DEV"
lvresize --fs ignore -y -L25M $vg_lv
cryptsetup resize $CRYPT_NAME
test_ext2_inactive "$vg_lv2" "$dev_vg_lv2" "$CRYPT_DEV2" "$CRYPT_NAME2"
crypt_open_plain "$dev_vg_lv3" $PWD3 "$CRYPT_NAME_PLAIN"
test_ext2_plain "$vg_lv3" "$dev_vg_lv3" "$CRYPT_DEV_PLAIN" "$CRYPT_NAME_PLAIN"
crypt_close "$CRYPT_NAME_PLAIN"
lvresize --fs ignore -y -L100M $vg_lv
cryptsetup resize $CRYPT_NAME
test_ext2_small_shrink "$vg_lv" "$dev_vg_lv" "$CRYPT_DEV"
lvresize --fs ignore -y -L25M $vg_lv
cryptsetup resize $CRYPT_NAME
if [ -z "$SKIP_DETACHED" ]; then
crypt_open_detached "$dev_vg_lv3" $PWD2 "$CRYPT_NAME2" "$dev_vg_lv2"
test_ext2_detached "$vg_lv2" "$dev_vg_lv2" "$CRYPT_DEV2" "$CRYPT_NAME2"
crypt_close "$CRYPT_NAME2"
fi
fi
if check_missing ext3; then
test_ext3_resize "$vg_lv" "$dev_vg_lv" "$CRYPT_DEV"
lvresize --fs ignore -y -L25M $vg_lv
cryptsetup resize $CRYPT_NAME
test_ext3_inactive "$vg_lv2" "$dev_vg_lv2" "$CRYPT_DEV2" "$CRYPT_NAME2"
crypt_open_plain "$dev_vg_lv3" $PWD3 "$CRYPT_NAME_PLAIN"
test_ext3_plain "$vg_lv3" "$dev_vg_lv3" "$CRYPT_DEV_PLAIN" "$CRYPT_NAME_PLAIN"
crypt_close "$CRYPT_NAME_PLAIN"
lvresize --fs ignore -y -L100M $vg_lv
cryptsetup resize $CRYPT_NAME
test_ext3_small_shrink "$vg_lv" "$dev_vg_lv" "$CRYPT_DEV"
lvresize --fs ignore -y -L25M $vg_lv
cryptsetup resize $CRYPT_NAME
if [ -z "$SKIP_DETACHED" ]; then
crypt_open_detached "$dev_vg_lv3" $PWD2 "$CRYPT_NAME2" "$dev_vg_lv2"
test_ext3_detached "$vg_lv2" "$dev_vg_lv2" "$CRYPT_DEV2" "$CRYPT_NAME2"
crypt_close "$CRYPT_NAME2"
fi
fi
if check_missing xfs; then
lvresize -f -L310M $vg_lv
cryptsetup resize $CRYPT_NAME
test_xfs_resize "$vg_lv" "$dev_vg_lv" "$CRYPT_DEV"
lvresize --fs ignore -y -L325M $vg_lv
cryptsetup resize $CRYPT_NAME
test_xfs_inactive "$vg_lv2" "$dev_vg_lv2" "$CRYPT_DEV2" "$CRYPT_NAME2"
crypt_open_plain "$dev_vg_lv3" $PWD3 "$CRYPT_NAME_PLAIN"
test_xfs_plain "$vg_lv3" "$dev_vg_lv3" "$CRYPT_DEV_PLAIN" "$CRYPT_NAME_PLAIN"
crypt_close "$CRYPT_NAME_PLAIN"
lvresize --fs ignore -y -L310M $vg_lv
cryptsetup resize $CRYPT_NAME
test_xfs_small_shrink "$vg_lv" "$dev_vg_lv" "$CRYPT_DEV"
lvresize --fs ignore -y -L25M $vg_lv
cryptsetup resize $CRYPT_NAME
if [ -z "$SKIP_DETACHED" ]; then
crypt_open_detached "$dev_vg_lv3" $PWD2 "$CRYPT_NAME2" "$dev_vg_lv2"
test_xfs_detached "$vg_lv2" "$dev_vg_lv2" "$CRYPT_DEV2" "$CRYPT_NAME2"
crypt_close "$CRYPT_NAME2"
fi
fi
if check_missing reiserfs; then
test_reiserfs_resize "$vg_lv" "$dev_vg_lv" "$CRYPT_DEV"
lvresize --fs ignore -y -L25M $vg_lv
cryptsetup resize $CRYPT_NAME
test_reiserfs_inactive "$vg_lv2" "$dev_vg_lv2" "$CRYPT_DEV2" "$CRYPT_NAME2"
crypt_open_plain "$dev_vg_lv3" $PWD3 "$CRYPT_NAME_PLAIN"
test_reiserfs_plain "$vg_lv3" "$dev_vg_lv3" "$CRYPT_DEV_PLAIN" "$CRYPT_NAME_PLAIN"
crypt_close "$CRYPT_NAME_PLAIN"
lvresize --fs ignore -y -L100M $vg_lv
cryptsetup resize $CRYPT_NAME
test_reiserfs_small_shrink "$vg_lv" "$dev_vg_lv" "$CRYPT_DEV"
lvresize --fs ignore -y -L25M $vg_lv
cryptsetup resize $CRYPT_NAME
if [ -z "$SKIP_DETACHED" ]; then
crypt_open_detached "$dev_vg_lv3" $PWD2 "$CRYPT_NAME2" "$dev_vg_lv2"
test_reiserfs_detached "$vg_lv2" "$dev_vg_lv2" "$CRYPT_DEV2" "$CRYPT_NAME2"
crypt_close "$CRYPT_NAME2"
fi
fi
crypt_close "$CRYPT_NAME"
vgremove -ff $vg