Skip to content

Instantly share code, notes, and snippets.

@p-kraszewski
Created July 11, 2022 10:31
Show Gist options
  • Save p-kraszewski/ae957412af6f59ce099b2489b159d905 to your computer and use it in GitHub Desktop.
Save p-kraszewski/ae957412af6f59ce099b2489b159d905 to your computer and use it in GitHub Desktop.
LVM2 RAID6 to RAID0 conversion example
#!/bin/bash
NR_DRIVES=5
DRIVE_SIZE=100M
VGNAME=TestVG
LVNAME=TestLV
fail(){
echo "ERROR: $1"
exit 1
}
warn(){
echo "WARNING: $1"
}
case $1 in
create_dev)
COMPS=""
for i in $(seq ${NR_DRIVES}); do
RAW_IMG="DRV_${i}.raw"
LOOP_DEV="/dev/loop${i}"
truncate -s ${DRIVE_SIZE} "${RAW_IMG}" || fail "Can't create image ${RAW_IMG}"
sudo losetup "${LOOP_DEV}" "${RAW_IMG}" || fail "Can't create loopback ${LOOP_DEV}"
sudo pvcreate "${LOOP_DEV}" || fail "Failed to create PV on ${LOOP_DEV}"
echo "Loopback ${LOOP_DEV} active, PV created"
COMPS="${COMPS} ${LOOP_DEV}"
done
sudo vgcreate "${VGNAME}" $COMPS || fail "Failed to create ${VGNAME} VolumeGroup"
echo "VolumeGroup ${VGNAME} created"
;;
make_raid6)
mkdir -p mnt
sudo lvcreate --type raid6 -l 50%FREE --name "${LVNAME}" "${VGNAME}" || fail "Failed to build LVM2 RAID6"
lvs -a -o name,lv_layout,devices "${VGNAME}"
sudo mkfs.ext4 "/dev/${VGNAME}/${LVNAME}" || fail "Failed to format volume"
sudo mount "/dev/${VGNAME}/${LVNAME}" mnt || fail "Failed to mount volume"
sudo cp -v "$0" mnt/testfile || fail "Failed to copy file to volume"
df mnt
sudo umount mnt || fail "Failed to umount volume"
;;
transform_raid0)
lvconvert --type raid0 "${VGNAME}/${LVNAME}" || fail "Stage 1 failed"
lvs -a -o name,lv_layout,devices "${VGNAME}"
echo "Waiting 10s for sync"
sleep 10
lvconvert --type raid0 "${VGNAME}/${LVNAME}" || fail "Stage 2 failed"
lvs -a -o name,lv_layout,devices "${VGNAME}"
echo "Waiting 10s for sync"
sleep 10
sudo mount "/dev/${VGNAME}/${LVNAME}" mnt || fail "Failed to mount volume"
diff -q "$0" mnt/testfile || fail "Copied file differs"
df mnt
sudo umount mnt || fail "Failed to umount volume"
;;
remove_lv)
mkdir -p mnt
sudo lvremove "${VGNAME}/${LVNAME}"
;;
destroy_dev)
sudo vgremove "${VGNAME}" || warn "Failed to destroy ${VGNAME} VolumeGroup"
for i in $(seq ${NR_DRIVES}); do
RAW_IMG="DRV_${i}.raw"
LOOP_DEV="/dev/loop${i}"
[ -e "${LOOP_DEV}" ] && (sudo losetup -d "${LOOP_DEV}" || fail "Failed to teardown loopback ${LOOP_DEV}")
echo "Loopback ${LOOP_DEV} inactive"
rm "${RAW_IMG}" || fail "Failed to delete image ${RAW_IMG}"
echo "Image ${RAW_IMG} removed"
done
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment