#!/usr/bin/env bash # Copyright (C) 2020 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='devices file' . lib/inittest aux prepare_devs 7 RUNDIR="/run" test -d "$RUNDIR" || RUNDIR="/var/run" PVS_ONLINE_DIR="$RUNDIR/lvm/pvs_online" VGS_ONLINE_DIR="$RUNDIR/lvm/vgs_online" PVS_LOOKUP_DIR="$RUNDIR/lvm/pvs_lookup" _clear_online_files() { # wait till udev is finished aux udev_wait rm -f "$PVS_ONLINE_DIR"/* rm -f "$VGS_ONLINE_DIR"/* rm -f "$PVS_LOOKUP_DIR"/* } wipe_all() { aux wipefs_a "$dev1" aux wipefs_a "$dev2" aux wipefs_a "$dev3" aux wipefs_a "$dev4" aux wipefs_a "$dev5" aux wipefs_a "$dev6" aux wipefs_a "$dev7" } # The tests run with system dir of "/etc" but lvm when running # normally has cmd->system_dir set to "/etc/lvm". DFDIR="$LVM_SYSTEM_DIR/devices" mkdir -p $DFDIR || true DF=$DFDIR/system.devices # # Test with use_devicesfile=0 (no devices file is being applied by default) # aux lvmconf 'devices/use_devicesfile = 0' wipe_all rm -f $DF pvcreate $dev1 not ls $DF wipe_all rm -f $DF vgcreate $vg1 $dev1 not ls $DF wipe_all rm -f $DF # create one VG in a non-system devices file vgcreate --devicesfile test.devices $vg1 $dev1 vgextend --devicesfile test.devices $vg1 $dev2 cat $DFDIR/test.devices grep $dev1 $DFDIR/test.devices grep $dev2 $DFDIR/test.devices not ls $DFDIR/system.devices # create two VGs outside the special devices file vgcreate $vg2 $dev3 $dev4 vgcreate $vg3 $dev5 $dev6 not grep $dev3 $DFDIR/test.devices not grep $dev5 $DFDIR/test.devices not ls $DFDIR/system.devices PVID1=`pvs $dev1 --noheading -o uuid | tr -d - | awk '{print $1}'` PVID2=`pvs $dev2 --noheading -o uuid | tr -d - | awk '{print $1}'` PVID3=`pvs $dev3 --noheading -o uuid | tr -d - | awk '{print $1}'` PVID4=`pvs $dev4 --noheading -o uuid | tr -d - | awk '{print $1}'` PVID5=`pvs $dev5 --noheading -o uuid | tr -d - | awk '{print $1}'` PVID6=`pvs $dev6 --noheading -o uuid | tr -d - | awk '{print $1}'` lvcreate -l4 -an -i2 -n $lv1 $vg1 lvcreate -l4 -an -i2 -n $lv2 $vg2 lvcreate -l4 -an -i2 -n $lv3 $vg3 cat $DFDIR/test.devices grep $PVID1 $DFDIR/test.devices grep $PVID2 $DFDIR/test.devices not grep $PVID3 $DFDIR/test.devices not grep $PVID4 $DFDIR/test.devices not grep $PVID5 $DFDIR/test.devices not grep $PVID6 $DFDIR/test.devices not ls $DFDIR/system.devices # verify devices file is working vgs --devicesfile test.devices $vg1 not vgs --devicesfile test.devices $vg2 # devicesfile and devices cannot be used together not vgs --devicesfile test.devices --devices $dev1,$dev1 $vg1 # verify correct vgs are seen / not seen when devices are specified vgs --devices $dev1,$dev2 $vg1 vgs --devices $dev3,$dev4 $vg2 vgs --devices $dev5,$dev6 $vg3 not vgs --devices $dev1,$dev2 $vg2 not vgs --devices $dev1,$dev2 $vg3 not vgs --devices $dev1,$dev2 $vg2 not vgs --devices $dev5,$dev6 $vg2 not vgs --devices $dev1,$dev2 $vg3 not vgs --devices $dev3,$dev4 $vg3 vgs --devices $dev1,$dev2 |tee out grep $vg1 out not grep $vg2 out not grep $vg3 out vgs --devices $dev3,$dev4 |tee out not grep $vg1 out grep $vg2 out not grep $vg3 out # verify correct pvs are seen / not seen when devices are specified pvs --devices $dev1,$dev2 $dev1 $dev2 pvs --devices $dev3,$dev4 $dev3 $dev4 pvs --devices $dev5,$dev6 $dev5 $dev6 not pvs --devices $dev1,$dev2 $dev3 $dev4 not pvs --devices $dev1,$dev2 $dev5 $dev6 not pvs --devices $dev3,$dev4 $dev1 $dev2 $dev5 $dev6 pvs --devices $dev1,$dev2 |tee out grep $dev1 out grep $dev2 out not grep $dev3 out not grep $dev4 out not grep $dev5 out not grep $dev6 out pvs --devices $dev3,$dev4 |tee out not grep $dev1 out not grep $dev2 out grep $dev3 out grep $dev4 out not grep $dev5 out not grep $dev6 out # verify correct lvs are activated / not activated when devices are specified vgchange --devices $dev1,$dev2 -ay check lv_field $vg1/$lv1 lv_active "active" check lv_field $vg2/$lv2 lv_active "" check lv_field $vg3/$lv3 lv_active "" vgchange --devices $dev1,$dev2 -an check lv_field $vg1/$lv1 lv_active "" vgchange --devices $dev3,$dev4 -ay check lv_field $vg1/$lv1 lv_active "" check lv_field $vg2/$lv2 lv_active "active" check lv_field $vg3/$lv3 lv_active "" vgchange --devices $dev3,$dev4 -an check lv_field $vg2/$lv2 lv_active "" # verify devices covering multiple vgs vgs --devices $dev1,$dev2,$dev3,$dev4 $vg1 $vg2 |tee out grep $vg1 out grep $vg2 out not grep $vg3 out vgs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 $vg1 $vg2 $vg3 |tee out grep $vg1 out grep $vg2 out grep $vg3 out # verify vgs seen when incomplete devices are specified vgs --devices $dev1 $vg1 vgs --devices $dev3 $vg2 vgs --devices $dev5 $vg3 # incomplete vg because of --devices is the same as vg incomplete because # of missing device not lvcreate --devices $dev1 -l1 $vg1 not lvchange --devices $dev1 -ay $vg1/$lv1 not lvextend --devices $dev1 -l+1 $vg1/$lv1 not vgremove --devices $dev1 $vg1 not lvcreate --devices $dev3 -l1 $vg2 not lvchange --devices $dev3 -ay $vg2/$lv2 not lvextend --devices $dev3 -l+1 $vg2/$lv2 not vgremove --devices $dev3 $vg2 # verify various commands with --devices for vg in a devicesfile not lvcreate --devices $dev1,$dev2 -l1 -n $lv2 -an $vg1 $dev7 lvcreate --devices $dev1,$dev2 -l1 -n $lv2 -an $vg1 lvs --devices $dev1,$dev2 $vg1/$lv2 lvextend --devices $dev1,$dev2 -l2 $vg1/$lv2 lvchange --devices $dev1,$dev2 -ay $vg1/$lv2 lvchange --devices $dev1,$dev2 -an $vg1/$lv2 lvremove --devices $dev1,$dev2 $vg1/$lv2 vgchange --devices $dev1,$dev2 -ay $vg1 vgchange --devices $dev1,$dev2 -an $vg1 not vgextend --devices $dev1,$dev2 $vg1 $dev7 vgextend --devices $dev1,$dev2,$dev7 $vg1 $dev7 vgreduce --devices $dev1,$dev2,$dev7 $vg1 $dev7 vgexport --devices $dev1,$dev2 $vg1 vgimport --devices $dev1,$dev2 $vg1 not pvremove --devices $dev1,$dev2 $dev7 not pvcreate --devices $dev1,$dev2 $dev7 not vgcreate --devices $dev1,$dev2 $vg7 $dev7 pvremove --devices $dev7 $dev7 pvcreate --devices $dev7 $dev7 vgcreate --devices $dev7 $vg7 $dev7 vgremove --devices $dev7 $vg7 pvremove --devices $dev7 $dev7 # verify various commands with --devices for vg not in a devicesfile not lvcreate --devices $dev3,$dev4 -l1 -n $lv4 -an $vg2 $dev7 lvcreate --devices $dev3,$dev4 -l1 -n $lv4 -an $vg2 lvs --devices $dev3,$dev4 $vg2/$lv4 lvextend --devices $dev3,$dev4 -l2 $vg2/$lv4 lvchange --devices $dev3,$dev4 -ay $vg2/$lv4 lvchange --devices $dev3,$dev4 -an $vg2/$lv4 lvremove --devices $dev3,$dev4 $vg2/$lv4 vgchange --devices $dev3,$dev4 -ay $vg2 vgchange --devices $dev3,$dev4 -an $vg2 not vgextend --devices $dev3,$dev4 $vg2 $dev7 vgextend --devices $dev3,$dev4,$dev7 $vg2 $dev7 vgreduce --devices $dev3,$dev4,$dev7 $vg2 $dev7 vgexport --devices $dev3,$dev4 $vg2 vgimport --devices $dev3,$dev4 $vg2 not pvremove --devices $dev3,$dev4 $dev7 not pvcreate --devices $dev3,$dev4 $dev7 not vgcreate --devices $dev3,$dev4 $vg7 $dev7 pvremove --devices $dev7 $dev7 pvcreate --devices $dev7 $dev7 vgcreate --devices $dev7 $vg7 $dev7 vgremove --devices $dev7 $vg7 pvremove --devices $dev7 $dev7 # verify pvscan with devices file and devices list # arg not in devices file _clear_online_files pvscan --devicesfile test.devices --cache -aay $dev3 not ls "$RUNDIR/lvm/pvs_online/$PVID3" pvscan --devicesfile test.devices --cache -aay $dev4 not ls "$RUNDIR/lvm/pvs_online/$PVID4" check lv_field $vg1/$lv1 lv_active "" check lv_field $vg2/$lv2 lv_active "" # arg in devices file _clear_online_files pvscan --devicesfile test.devices --cache $dev1 pvscan --devicesfile test.devices --cache $dev2 ls "$RUNDIR/lvm/pvs_online/$PVID1" ls "$RUNDIR/lvm/pvs_online/$PVID2" # autoactivate with devices file _clear_online_files pvscan --devicesfile test.devices --cache -aay $dev1 pvscan --devicesfile test.devices --cache -aay $dev2 check lv_field $vg1/$lv1 lv_active "active" vgchange -an $vg1 # autoactivate with no devices file _clear_online_files pvscan --cache -aay $dev3 pvscan --cache -aay $dev4 check lv_field $vg2/$lv2 lv_active "active" vgchange -an $vg2 # arg not in devices list _clear_online_files pvscan --devices $dev1,$dev2 --cache $dev3 not ls "$RUNDIR/lvm/pvs_online/$PVID3" pvscan --devices $dev4 --cache $dev3 not ls "$RUNDIR/lvm/pvs_online/$PVID3" pvscan --devices $dev5 --cache $dev3 not ls "$RUNDIR/lvm/pvs_online/$PVID3" # arg in devices list _clear_online_files pvscan --devices $dev3 --cache -aay $dev3 pvscan --devices $dev4 --cache -aay $dev4 check lv_field $vg2/$lv2 lv_active "active" vgchange -an $vg2 # verify --devicesfile and --devices are not affected by a filter # hide_dev excludes using existing filter aux hide_dev $dev2 aux hide_dev $dev4 pvs --devicesfile test.devices $dev1 pvs --devicesfile test.devices $dev2 not pvs --devicesfile test.devices $dev3 not pvs --devicesfile test.devices $dev4 pvs --devices $dev1 $dev1 pvs --devices $dev2 $dev2 pvs --devices $dev3 $dev3 pvs --devices $dev4 $dev4 pvs --devices $dev5 $dev5 pvs --devices $dev1,$dev2,$dev3,$dev4,$dev5 $dev1 $dev2 $dev3 $dev4 $dev5 | tee out grep $dev1 out grep $dev2 out grep $dev3 out grep $dev4 out grep $dev5 out vgchange --devices $dev1,$dev2 -ay $vg1 check lv_field $vg1/$lv1 lv_active "active" lvchange --devices $dev1,$dev2 -an $vg1/$lv1 vgchange --devices $dev3,$dev4 -ay $vg2 check lv_field $vg2/$lv2 lv_active "active" lvchange --devices $dev3,$dev4 -an $vg2/$lv2 aux unhide_dev $dev2 aux unhide_dev $dev4 vgchange --devicesfile "" -an vgremove --devicesfile "" -y $vg1 vgremove --devicesfile "" -y $vg2 vgremove --devicesfile "" -y $vg3 # # Test with use_devicesfile=1 (system devices file is in use by default) # aux lvmconf 'devices/use_devicesfile = 1' DF="$DFDIR/system.devices" touch $DF # create one VG in a non-system devices file vgcreate --devicesfile test.devices $vg1 $dev1 $dev2 # create one VG in the default system devices file vgcreate $vg2 $dev3 $dev4 # create one VG in neither devices file vgcreate --devicesfile "" $vg3 $dev5 $dev6 lvcreate --devicesfile test.devices -l4 -an -i2 -n $lv1 $vg1 lvcreate -l4 -an -i2 -n $lv2 $vg2 lvcreate --devicesfile "" -l4 -an -i2 -n $lv3 $vg3 # system.devices only sees vg2 vgs |tee out not grep $vg1 out grep $vg2 out not grep $vg3 out not vgs $vg1 vgs $vg2 not vgs $vg3 pvs |tee out not grep $dev1 out not grep $dev2 out grep $dev3 out grep $dev4 out not grep $dev5 out not grep $dev6 out # test.devices only sees vg1 vgs --devicesfile test.devices |tee out grep $vg1 out not grep $vg2 out not grep $vg3 out pvs --devicesfile test.devices |tee out grep $dev1 out grep $dev2 out not grep $dev3 out not grep $dev4 out not grep $dev5 out not grep $dev6 out # no devices file sees all vgs --devicesfile "" |tee out grep $vg1 out grep $vg2 out grep $vg3 out vgs --devicesfile "" $vg1 vgs --devicesfile "" $vg2 vgs --devicesfile "" $vg3 pvs --devicesfile "" |tee out grep $dev1 out grep $dev2 out grep $dev3 out grep $dev4 out grep $dev5 out grep $dev6 out vgchange -ay lvs --devicesfile test.devices -o active $vg1/$lv1 |tee out not grep active out lvs -o active $vg2/$lv2 |tee out grep active out lvs --devicesfile "" -o active $vg3/$lv3 |tee out not grep active out vgchange -an lvs -o active $vg2/$lv2 |tee out not grep active out vgchange --devicesfile test.devices -ay lvs --devicesfile test.devices -o active $vg1/$lv1 |tee out grep active out lvs -o active $vg2/$lv2 |tee out not grep active out lvs --devicesfile "" -o active $vg3/$lv3 |tee out not grep active out vgchange --devicesfile test.devices -an lvs --devicesfile test.devices -o active $vg1/$lv1 |tee out not grep active out # --devices overrides all three cases: # always gives access to the specified devices # always denies access to unspecified devices vgs --devices $dev1,$dev2 $vg1 vgs --devices $dev3,$dev4 $vg2 vgs --devices $dev5,$dev6 $vg3 pvs --devices $dev1 $dev1 pvs --devices $dev3 $dev3 pvs --devices $dev5 $dev5 not pvs --devices $dev1 $dev1 $dev2 |tee out grep $dev1 out not grep $dev2 out not pvs --devices $dev3 $dev3 $dev4 |tee out grep $dev3 out not grep $dev4 out not pvs --devices $dev5 $dev1 $dev2 $dev3 $dev4 $dev5 |tee out grep $dev5 out not grep $dev1 out not grep $dev2 out not grep $dev3 out not grep $dev4 out not grep $dev6 out pvs --devices $dev1,$dev2,$dev3,$dev4,$dev5 $dev5 |tee out grep $dev5 out not grep $dev1 out not grep $dev2 out not grep $dev3 out not grep $dev4 out not grep $dev6 out pvs --devices $dev1,$dev2,$dev3,$dev4,$dev5 $dev1 $dev2 $dev3 $dev4 $dev5 |tee out grep $dev1 out grep $dev2 out grep $dev3 out grep $dev4 out grep $dev5 out vgchange --devices $dev1,$dev2 -ay lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active | grep active |tee out grep $lv1 out not grep $lv2 out not grep $lv3 out vgchange --devices $dev1,$dev2 -an lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active | tee out not grep active out vgchange --devices $dev3,$dev4 -ay lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active | grep active |tee out not grep $lv1 out grep $lv2 out not grep $lv3 out vgchange --devices $dev3,$dev4 -an lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active |tee out not grep active out vgchange --devices $dev5,$dev6 -ay lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active | grep active |tee out not grep $lv1 out not grep $lv2 out grep $lv3 out vgchange --devices $dev5,$dev6 -an lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active |tee out not grep active out lvcreate --devices $dev1,$dev2 -l1 -an -n $lv4 $vg1 lvremove --devices $dev1,$dev2 $vg1/$lv4 lvcreate --devices $dev3,$dev4 -l1 -an -n $lv4 $vg2 lvremove --devices $dev3,$dev4 $vg2/$lv4 lvcreate --devices $dev5,$dev6 -l1 -an -n $lv4 $vg3 lvremove --devices $dev5,$dev6 $vg3/$lv4 not vgchange --devices $dev1,$dev2 -ay $vg2 not vgchange --devices $dev1,$dev2 -ay $vg3 not vgchange --devices $dev3,$dev4 -ay $vg1 not vgchange --devices $dev3,$dev4 -ay $vg3 not vgchange --devices $dev5,$dev6 -ay $vg1 not vgchange --devices $dev5,$dev6 -ay $vg2 not lvcreate --devices $dev1,$dev2 -an -l1 $vg2 not lvcreate --devices $dev1,$dev2 -an -l1 $vg3 not lvcreate --devices $dev3,$dev4 -an -l1 $vg1 not lvcreate --devices $dev3,$dev4 -an -l1 $vg3 not lvcreate --devices $dev5,$dev6 -an -l1 $vg1 not lvcreate --devices $dev5,$dev6 -an -l1 $vg2 # autoactivate devs in default devices file _clear_online_files pvscan --cache -aay $dev3 pvscan --cache -aay $dev4 check lv_field $vg2/$lv2 lv_active "active" vgchange -an $vg2 pvscan --cache -aay $dev1 not ls "$RUNDIR/lvm/pvs_online/$PVID1" pvscan --cache -aay $dev2 not ls "$RUNDIR/lvm/pvs_online/$PVID2" pvscan --cache -aay $dev5 not ls "$RUNDIR/lvm/pvs_online/$PVID5" _clear_online_files pvscan --devices $dev3 --cache -aay $dev3 pvscan --devices $dev3,$dev4 --cache -aay $dev4 lvs --devices $dev3,$dev4 -o active $vg2/$lv2 | grep active vgchange --devices $dev3,$dev4 -an $vg2 not vgchange -ay $vg1 vgchange --devicesfile test.devices -ay $vg1 lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active | grep active |tee out grep $lv1 out not grep $lv2 out not grep $lv3 out vgchange -ay $vg2 lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active | grep active |tee out grep $lv1 out grep $lv2 out not grep $lv3 out not vgchange -ay $vg3 vgchange --devicesfile "" -ay $vg3 lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active | grep active |tee out grep $lv1 out grep $lv2 out grep $lv3 out vgchange -an lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active | grep active |tee out grep $lv1 out not grep $lv2 out grep $lv3 out vgchange -ay lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active | grep active |tee out grep $lv1 out grep $lv2 out grep $lv3 out vgchange --devicesfile "" -an lvs --devices $dev1,$dev2,$dev3,$dev4,$dev5,$dev6 -o name,active |tee out not grep active out not vgremove $vg1 not vgremove $vg3 vgremove -y $vg2 vgremove --devicesfile test.devices -y $vg1 vgremove --devicesfile "" -y $vg3 # # Test when system.devices is created by lvm # # no pvs exist, pvcreate creates DF, e.g. system installation wipe_all rm -f $DF pvcreate $dev1 ls $DF grep $dev1 $DF # no pvs exist, vgcreate creates DF, e.g. system installation wipe_all rm -f $DF vgcreate $vg1 $dev1 ls $DF grep $dev1 $DF # no pvs exist, touch DF, pvcreate uses it wipe_all rm -f $DF touch $DF pvcreate $dev1 grep $dev1 $DF # no vgs exist, touch DF, vgcreate uses it wipe_all rm -f $DF touch $DF vgcreate $vg1 $dev1 grep $dev1 $DF # vgs exist, pvcreate/vgcreate do not create DF wipe_all rm -f $DF vgcreate $vg1 $dev1 ls $DF rm $DF pvcreate $dev2 not ls $DF vgcreate $vg3 $dev3 not ls $DF # vgs exist, pvcreate/vgcreate --devicesfile system.devices creates DF wipe_all rm -f $DF vgcreate $vg1 $dev1 ls $DF rm $DF pvcreate --devicesfile system.devices $dev2 ls $DF grep $dev2 $DF rm $DF vgcreate --devicesfile system.devices $vg3 $dev3 ls $DF grep $dev3 $DF # pvcreate/vgcreate always create non-system DF if it doesn't exist wipe_all rm -f $DF vgcreate $vg1 $dev1 rm $DF rm $DFDIR/test.devices pvcreate --devicesfile test.devices $dev2 grep $dev2 $DFDIR/test.devices rm $DFDIR/test.devices vgcreate --devicesfile test.devices $vg3 $dev3 grep $dev3 $DFDIR/test.devices