Skip to content

Instantly share code, notes, and snippets.

@biggers
Created September 1, 2017 13:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save biggers/eeb3bf7e0ef8efa3626cd6db18442f26 to your computer and use it in GitHub Desktop.
Save biggers/eeb3bf7e0ef8efa3626cd6db18442f26 to your computer and use it in GitHub Desktop.
simple Linux volume mgmt example / recipe(s) - LVM
-*-sh-*-
Various bits, pieces, notes -- on using Linux Volume (Disk) Mgmt,
on various Linux distros
"A Debian Grimoire - LVM: Logical Volume Management, Version 2"
http://deb.riseup.net/storage/lvm2/
### -------- growing filesystem(s) - EXT3
VG=saucyvg ## LVM2 volume-group
LVNAME=dockerlv
INCR=30000 ## (add 5GB)
LV=/dev/$VG/$LVNAME ## LVM2 logical volume (block-device)
# FS=/home/zope/$LVNAME ## our Web site
sudo lvextend -L +${INCR}M $LV ## add $INCR MB, to $LV filesystem
sudo resize2fs $LV
# sudo umount $LV ## OPTIONAL: filesystem-check, for integrity
# sudo sudo e2fsck -f $LV
# sudo mount $LV
## -------- creating a MySQL filesystem,
# using a new logical volume - ** EXT4 **
sudo lvs
sudo vgs # NOTE "VFree" ... remaining free space, for LVs
VG=sysvg00
## LVNAME=mysql_var
## USERG=mysql.mysql
LVNAME=mysqllv
USERG=root.wheel
FS=/var/lib/mysql
FS_T=ext4
# NOTE: space is limited on 160GB drive! ...size in MBytes
SZ=8000
LV=/dev/$VG/$LVNAME
sudo lvcreate -n${LVNAME} -L${SZ} $VG
# "...Rounding up size to full physical extent N.NN GB"
# " Logical volume "XXX" created"
## make sure 'lvcreate' worked...
sudo lvscan -v
## make the EXT4 filesystem on $LV
sudo mkdir -p $FS
sudo mke2fs -t $FS_T -j -O dir_index $LV
sudo mount -o noatime,data=journal $LV $FS
## Fix permissions, for mysql-user $FS...
cd $FS; sudo chown -R $USERG $FS
sudo chmod 2775 $FS
ls -ld $FS ## note new permissions
cd /root
## create a FSTAB entry
sudo cp -p /etc/fstab /etc/fstab.prev # we BACKUP /etc/fstab **FIRST**
sudo tee -a /etc/fstab <<EOF
$LV $FS $FS_T defaults,noatime,data=journal 1 2
EOF
# test new /etc/fstab...
cd /
sudo umount $FS
sudo mount -a
### ---- creating a VolumeGroup, w/ LogicalVols, filesystems: EXT3
VG=sysvg00
# (list of PVs) PV="/dev/hda8 /dev/hda9 /dev/hda10 /dev/hda11 /dev/hda12"
PV="/dev/sda4"
# sudo umount /data
# sudo cp -p /etc/fstab /etc/fstab.0
# sudo sed --in-place ':/dev/md2:d' /etc/fstab
## (LVM) initialize new PhysVolume(s)
sudo pvcreate -v $PV
sudo pvs
## create a new VolumeGroup, with "N" Physical Volume(s)
sudo vgcreate -v $VG $PV
function creat_lvm_fs()
{
set -x
# creat_lvm_fs sysvg zope 6000 # /home/zope
vg=$1
lvname=$2
size=$3
fs=$4
LV=/dev/$vg/$lvname
sudo lvcreate -n${lvname} -L${size} $vg || return
# "...Rounding up size to full physical extent N.NN GB"
# " Logical volume "XXX" created"
sudo lvscan -v # make sure 'lvcreate' worked...
sudo mkfs.ext4 -j -O dir_index $LV # make ext4 journaled FS on LV
# 'dir_index' & 'data=writeback' for ext3 with tune2fs consistently
# and significantly improves ext3, and mostly surpasses reiser3 FS
# sudo tune2fs -O dir_index -o +journal_data $LV
if [ "$fs" != "" ]; then
sudo mkdir -p $fs
mount $LV $fs
## for MySQL user $FS...
cd $fs; sudo chown -R mysql.mysql $fs
sudo chmod 755 $fs
# !!BACKUP!! /etc/fstab **FIRST**
sudo cp -p /etc/fstab /etc/fstab.prev
sudo tee -a /etc/fstab <<EOF
$LV $fs ext4 defaults,noatime,data=journal 1 2
EOF
# test new /etc/fstab...
cd /
sudo umount $fs
sudo mount -a
fi
}
VG=sysvg00
creat_lvm_fs $VG mintroot 10G /local/mint/root
creat_lvm_fs $VG minthome 5G /local/mint/home
creat_lvm_fs $VG git 5G /local/mint/git
### ---- "clone" a LogicalVolume (all metadata) ... onto another VG/LV
function creat_lv_clone()
{
vg=$1
lvname=$2
size=$3
LV=/dev/$vg/$lvname
FS=/mnt/backups/$lvname
size=$(echo "$size/2" | bc)
sudo lvcreate -n${lvname} -L${size}K $vg || return
sudo mke2fs -q -j $LV ## make ext3-journaled FS on LV
sudo mkdir -p $FS ## make a "backup LV mount-point" and test it...
mount $LV $FS
mount -l | grep ${vg}-${lvname}
lvdisplay -c $LV
umount $LV
}
# lvdisplay -c | grep sciice
# creat_lv_clone sysvg64b sciice 12582912
### ---- "copy" a LogicalVolume / filesystem - copy all *real* data
function creat_lv_copy()
{
#set -x
fs=$1
vg=$2
lvname=$3
LV=/dev/$vg/$lvname
BK=/mnt/backups/$lvname
mount $LV $BK || return
mount -l | grep ${vg}-${lvname}
(cd $fs; pwd; tar --one-file-system -cf - . | tar -C $BK -xf -)
df -h | fgrep $lvname
umount $LV
}
### ---- "sync-up" a LogicalVolume / filesystem - to another backup LV/fs
function sync_lv()
{
fs=$1
vg=$2
lvname=$3
LV=/dev/$vg/$lvname
BK=/mnt/backups/$lvname
mount $LV $BK || return
mount -l | grep ${vg}-${lvname}
(cd $fs; pwd; rsync --dry-run --one-file-system -av --delete . $BK)
df -h | fgrep $lvname
umount $LV
}
# creat_lv_copy /home/zope/projmgmt datavg00b pmgmt
# creat_lv_copy /home/zope/sciice sysvg64b sciice
# sync_lv /var/repos datavg00b hg_repos
# creat_lv_copy /home/zope/ccbc_prod datavg00b ccbc_prod
# creat_lv_copy /home/zope/ccbc_prod_data datavg01b ccbc_prod_data
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment