Skip to content

Instantly share code, notes, and snippets.

@jability
Created November 22, 2023 13:44
Show Gist options
  • Save jability/76afac7b24dc5f99295e7e7f0556ce4a to your computer and use it in GitHub Desktop.
Save jability/76afac7b24dc5f99295e7e7f0556ce4a to your computer and use it in GitHub Desktop.
Alpine LVM UEFI/GPT Installation
#!/bin/sh
## wrapper to only show given device
_blkid() {
blkid | grep "^$1:"
}
## if given device have an UUID display it, otherwise return the device
uuid_or_device() {
local i=
# NO_DISK_UUID can be set to a list of space-separated devices to avoid using UUIDs
for i in $NO_DISK_UUID; do
if [ "$i" = "$1" ]; then
echo "$1" && return 0
fi
done
case "$1" in
/dev/md*) echo "$1" && return 0 ;;
esac
for i in $(_blkid "$1"); do
case "$i" in
UUID=*) eval $i ;;
esac
done
if [ -n "$UUID" ]; then
echo "UUID=$UUID"
else
echo "$1"
fi
}
DEVICE="/dev/sda"
MNT="/mnt"
PART_BOOT="${DEVICE}1"
PART_LVM="${DEVICE}2"
## install filesystem tools
apk add \
e2fsprogs \
e2fsprogs-extra \
dosfstools \
sfdisk \
util-linux \
lvm2 \
grub-efi
modprobe vfat
## environment
export USE_EFI="1"
export DISKLABEL="gpt"
export BOOTFS="vfat"
export ROOTFS="ext4"
export SWAP_SIZE=2048
export BOOT_SIZE=512
swapoff -a
wipefs -a ${DEVICE} && partprobe
## create gpt partitions
# [--EFI-BOOT-STUB--|--SWAP--|--ROOTFS--]
sfdisk --quiet --wipe-partitions always --label gpt ${DEVICE} <<EOB
label: ${DISKLABEL}
1M,${BOOT_SIZE}M,C12A7328-F81F-11D2-BA4B-00A0C93EC93B,*
,,E6D6D379-F507-44C2-A23C-238F2A3DF928
EOB
## create fat32 efi-boot filesystem
mkfs.vfat -F 32 ${PART_BOOT}
## create swap filesystem
sed -i -e /swap/d /etc/fstab
mkswap ${PART_SWAP}
printf "%s\t%s\t\t%s\t%s 0 0\n" "$(uuid_or_device ${PART_SWAP})" "none" "swap" "sw" >>/etc/fstab
swapon -a
rc-update --quiet add swap boot
## create lvm
pvcreate /dev/sda2
vgcreate vg /dev/sda2
lvcreate -L 2G vg -n swap
lvcreate -L 15G vg -n root
lvcreate -L 5G vg -n home
lvcreate -L 20G vg -n var
lvcreate -L 20G vg -n logs
lvcreate -L 80G vg -n docker
# mount working directories
mkswap /dev/vg/swap
mkfs.ext4 /dev/vg/root
mkfs.ext4 /dev/vg/home
mkfs.ext4 /dev/vg/var
mkfs.ext4 /dev/vg/logs
mkfs.ext4 /dev/vg/docker
mkdir -p ${MNT}
mount -t ext4 /dev/vg/root ${MNT}
mkdir -p ${MNT}/home
mkdir -p ${MNT}/var
mount -t ext4 /dev/vg/home ${MNT}/home
mount -t ext4 /dev/vg/var ${MNT}/var
mkdir -p ${MNT}/var/log
mkdir -p ${MNT}/var/lib/docker
mount -t ext4 /dev/vg/logs ${MNT}/var/log
mount -t ext4 /dev/vg/docker ${MNT}/var/lib/docker
## mount boot directories
mkdir -p ${MNT}/boot/efi
mount -t vfat ${PART_BOOT} ${MNT}/boot/efi
swapon /dev/vg/swap
## install alpine to disk
setup-disk -m sys ${MNT}
## unmount properly all working directories
umount ${MNT}/efi/boot
umount ${MNT}/var/lib/docker
umount ${MNT}/var/log
umount ${MNT}/home
umount ${MNT}/var
umount ${MNT}
swapoff -a
vgchange -a n
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment