LVM Notes#
Commands to manipulate LVM resources from physical volumes (PV) and volume groups (VG) to logical volume (LV)
| pvcreate - pvremove Λ
| vgcreate - vgremove |
| vgextend - vgreduce |
V lvcreate - lvremove |
Clone a Logical Volume#
#!/bin/bash
# Usage: ./clone_lv SOURCE TARGET_VG TARGET_LV_NAME
set -euo pipefail
src=$1
dest_vg=$2
dest_name=$3
target=/dev/${dest_vg}/${dest_name}
# make sure target does not exist, because dd is destructive :>
[[ ! -f $target ]]
bytes=$(lvs --noheadings --units b -o seg_size $src | awk '{ print $1 }')
lvcreate --name $dest_name --size $bytes $dest_vg
time dd if=$src of=$target bs=4M
Add physical volume#
create partition, then set to 8e, then print and write. Remember that empty newlines use the default.
fdisk /dev/sdb
n
p
1
p
t
8e
p
w
partprobe
fdisk -l /dev/sdb
# error: "Can't open /dev/sdb1 exclusively. Mounted filesystem?"
# fuk it. too lazy
reboot
Create the physical volume
pvcreate /dev/sdb1
Make a new logical volume from half of the physical volume /dev/sdb1
.
Remember that extending is easy, but reducing is hard.
vgcreate ssd /dev/sdb1
lvcreate --name ssd --extents 50%VG ssd
lvs
Mapper device is /dev/mapper/${vg}-${lv}
, e.g.:
fdisk -l /dev/mapper/ssd-ssd
Create FS, mount this thing, set permissions
mkfs.ext4 -L ssd /dev/mapper/ssd-ssd
mkdir -p /media/ssd
mount /dev/mapper/ssd-ssd /media/ssd/
df /media/ssd/
chown felix:felix /media/ssd
umount /media/ssd/
fstab
cat <<'EOF' >> /etc/fstab
/dev/mapper/ssd-ssd /media/ssd ext4 defaults 0 1
EOF
mount /media/ssd
df /media/ssd
Move Volume to Another Server#
LVM Snapshots for Backups#
You can use them to get consistent backups of data in use. As TLDP states:
A snapshot volume is a special type of volume that presents all the data that was in the volume at the time the snapshot was created.
This means that a snapshot “must be large enough to hold all the changes that are likely to happen to the original volume during the lifetime of the snapshot”.
It also implies that snapshots should be as short lived as possible. So given the following steps we want to minimize the duration of the backup step:
create snapshot
backup
remove snapshot
First, let’s set up our test case, that is: a logical volume prod
that we will
write to during the backup process. I am using my ssd
volume group:
lvcreate --size 3G --name prod ssd
mkfs.ext4 /dev/ssd/prod
mkdir /mnt/prod_live
mount /dev/ssd/prod /mnt/prod_live
while true; do date > /mnt/prod_live/t; sleep 5; done
We expect writes in the order of a few bytes, so 10MiB should be plenty of space
lvcreate --extents 10%ORIGIN --snapshot --name bak_prod /dev/ssd/prod
mkdir /mnt/bak_prod
mount /dev/ssd/bak_prod /mnt/bak_prod
Let’s have a look. Note the columns “Origin” and “Data%” of lvs
.
Also, /mnt/bak_prod/t
does not change while /mnt/prod_live/t
does.
lvs
diff /mnt/prod_live/t /mnt/bak_prod/t
Create the backup the way you like, e.g.
tar -czf /tmp/prod_backup_$(date +%F).gz -C /mnt/bak_prod/ .
tar -tf /tmp/prod_backup_*.gz
Remove the snapshot:
umount /mnt/bak_prod/
lvremove /dev/ssd/bak_prod