From 6a92f155a4539cc2f2024582caa4c3f19e6ee68c Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Fri, 7 Sep 2018 12:12:20 +0200 Subject: [PATCH] TT#11444 New partition schema, switching to GPT + supporting EFI (optional) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Requested features: * switch from msdos partition table to GPT * (optional) support for (U)EFI * use a new LVM partition layout, with option to rollback/install/upgrade via second rootfs partition (which is called "fallback" in this implementation) * drop swap partition Note: * we no longer support msdos partition tables but GPT only, as (U)EFI systems can only boot from GPT (and not from BIOS/legacy boot), while BIOS systems can also boot from GPT * https://wiki.archlinux.org/index.php/Partitioning + https://wiki.archlinux.org/index.php/GRUB provide a decent overview, if you're not familiar with BIOS/GPT/(U)EFI New partition layout: * 1st partition: 1M BIOS boot, for BIOS/GPT (legacy) boot - this allows fallback to grub-pc package (needs to be partition type GUID 21686148-6449-6E6F-744E-656564454649 AKA set to bios_grub with parted, then installing grub to disk so it properly embeds core.img, can be done from a rescue/live system) * 2nd partition: ~500MB EFI System, for UEFI/GPT boot - used as /boot/efi, iff EFI support is available * 3rd partition: LVM with: - /dev/mapper/ngcp-root with 5GB (rootfs target) + /dev/mapper/ngcp-fallback with 5GB (for rollback/install/upgrade) - 10% or >=500MB unassigned of the remaining space (whatever is bigger) - /dev/mapper/ngcp-data data partition with rest of available disk space, used as /ngcpdata on system Old layout with a 16GB disk for NGCP systems: | # lsblk | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT | sda 8:0 0 16G 0 disk | └─sda1 8:1 0 16G 0 part | ├─ngcp-root 254:0 0 14.3G 0 lvm / | └─ngcp-swap 254:1 0 1004M 0 lvm [SWAP] | # pvs | PV VG Fmt Attr PSize PFree | /dev/sda1 ngcp lvm2 a-- 16.00g 764.00m | # vgs | VG #PV #LV #SN Attr VSize VFree | ngcp 1 2 0 wz--n- 16.00g 764.00m | # lvs | LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert | root ngcp -wi-ao---- 14.27g | swap ngcp -wi-ao---- 1004.00m New layout with a 16GB disk (+ EFI support) for NGCP systems: | # lsblk | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT | sda 8:0 0 16G 0 disk | |-sda1 8:1 0 1M 0 part | |-sda2 8:2 0 486M 0 part /boot/efi | `-sda3 8:3 0 15.5G 0 part | |-ngcp-root 254:0 0 5G 0 lvm / | |-ngcp-fallback 254:1 0 5G 0 lvm | `-ngcp-data 254:2 0 5G 0 lvm /ngcpdata | # pvs | PV VG Fmt Attr PSize PFree | /dev/sda3 ngcp lvm2 a-- 15.52g 564.00m | # vgs | VG #PV #LV #SN Attr VSize VFree | ngcp 1 3 0 wz--n- 15.52g 564.00m | # lvs | LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert | data ngcp -wi-ao---- 4.97g | fallback ngcp -wi-a----- 5.00g | root ngcp -wi-ao---- 5.00g Change-Id: I39206b225edb25fd1e27de49a818ad7a54532f82 --- templates/scripts/includes/deployment.sh | 137 +++++++++++++++-------- 1 file changed, 89 insertions(+), 48 deletions(-) diff --git a/templates/scripts/includes/deployment.sh b/templates/scripts/includes/deployment.sh index 9d2a3c5..e16feb5 100755 --- a/templates/scripts/includes/deployment.sh +++ b/templates/scripts/includes/deployment.sh @@ -66,6 +66,7 @@ VAGRANT=false ADJUST_FOR_LOW_PERFORMANCE=false ENABLE_VM_SERVICES=false FILESYSTEM="ext4" +ROOTFS_SIZE="5G" GPG_KEY_SERVER="pool.sks-keyservers.net" DEBIAN_REPO_HOST="debian.sipwise.com" DEBIAN_REPO_TRANSPORT="https" @@ -328,6 +329,20 @@ wait_exit() { exit "${e_code}" } +# check for EFI support, if not present try to enable it +efi_support() { + if lsmod | grep -q efivars ; then + echo "EFI support detected." + return 0 + fi + + if modprobe efivars &>/dev/null ; then + echo "EFI support enabled now." + return 0 + fi + + return 1 +} # }}} ################################################### @@ -524,6 +539,10 @@ if checkBootParam 'ngcpmcast=' ; then MCASTADDR=$(getBootParam ngcpmcast) fi +if checkBootParam "rootfssize=" ; then + ROOTFS_SIZE=$(getBootParam rootfssize) +fi + if checkBootParam ngcphalt ; then HALT=true fi @@ -881,6 +900,11 @@ if "$LOGO" ; then if [ -n "$NGCP_PPA" ] ; then PPA_INFO="| PPA: ${NGCP_PPA} " fi + if efi_support ; then + EFI_INFO="| EFI support" + else + EFI_INFO="| no EFI support" + fi # color echo -ne "\ec\e[1;32m" clear @@ -892,7 +916,7 @@ if "$LOGO" ; then echo "$CPU_INFO CPU(s) | ${RAM_INFO}kB RAM | $CHASSIS" echo "" echo "Install ngcp: $NGCP_INSTALLER | $INSTALLER_TYPE" - echo "Installing $SP_VERSION_STR platform | Debian: $DEBIAN_RELEASE $PPA_INFO" + echo "Installing $SP_VERSION_STR platform | Debian: $DEBIAN_RELEASE $EFI_INFO $PPA_INFO" echo "Install IP: $INSTALL_IP | Started deployment at $DATE_INFO" # number of lines echo -ne "\e[10;0r" @@ -924,13 +948,6 @@ echo "root:sipwise" | chpasswd ## partition disk set_deploy_status "disksetup" -# 2000GB = 2097152000 blocks in /proc/partitions - so make a rough estimation -if [ "$(awk "/ ${DISK}$/ {print \$3}" /proc/partitions)" -gt 2000000000 ] ; then - TABLE=gpt -else - TABLE=msdos -fi - if "$NGCP_INSTALLER" ; then VG_NAME="ngcp" else @@ -970,51 +987,68 @@ set_up_partition_table() { blockdevice="/dev/${DISK}" echo "Creating partition table" - parted -a optimal -s "${blockdevice}" mklabel "$TABLE" + parted -a optimal -s "${blockdevice}" mklabel gpt - parted -a optimal -s "${blockdevice}" mkpart primary 2048s 100% - parted -a optimal -s "${blockdevice}" set 1 lvm on + # BIOS boot with GPT + parted -a optimal -s "${blockdevice}" mkpart primary 2048s 2M + parted -a optimal -s "${blockdevice}" set 1 bios_grub on + parted -a optimal -s "${blockdevice}" "name 1 'BIOS Boot'" + + # EFI boot with GPT + parted -a optimal -s "${blockdevice}" mkpart primary 2M 512M + parted -a optimal -s "${blockdevice}" "name 2 'EFI System'" + parted -a optimal -s "${blockdevice}" set 2 boot on + EFI_PARTITION="${blockdevice}"2 + + parted -a optimal -s "${blockdevice}" mkpart primary 512M 100% + parted -a optimal -s "${blockdevice}" "name 3 'Linux LVM'" + parted -a optimal -s "${blockdevice}" set 3 lvm on echo "Creating PV + VG" - pvcreate -ff -y "${blockdevice}"1 - vgcreate "${VG_NAME}" "${blockdevice}"1 + pvcreate -ff -y "${blockdevice}"3 + vgcreate "${VG_NAME}" "${blockdevice}"3 vgchange -a y "${VG_NAME}" } create_ngcp_partitions() { - local memory swap_size - - memory=$(awk '/MemTotal:/ {print $2}' /proc/meminfo) - swap_size=$(( memory / 2 / 1024)) # 50% of RAM in MB - - # rootfs - local vg_free rootfs_size - vg_free=$(vgs "${VG_NAME}" -o vg_free --noheadings --nosuffix --units B) - rootfs_size=$(( (vg_free - ( swap_size * 1024 * 1024 )) * 19 / 20 / 1024 / 1024 )) # 95% of free space, excl. swap (in MB) - echo "Creating LV root with ${rootfs_size}M" - lvcreate --yes -n root -L "${rootfs_size}M" "${VG_NAME}" + # root + echo "Creating LV 'root' with ${ROOTFS_SIZE}" + lvcreate --yes -n root -L "${ROOTFS_SIZE}" "${VG_NAME}" echo "Creating ${FILESYSTEM} filesystem on /dev/${VG_NAME}/root" mkfs."${FILESYSTEM}" -FF /dev/"${VG_NAME}"/root - # swap - echo "Creating LV swap with ${swap_size}" - lvcreate --yes -n swap -L "${swap_size}M" "${VG_NAME}" + # fallback + echo "Creating LV 'fallback' with ${ROOTFS_SIZE}" + lvcreate --yes -n fallback -L "${ROOTFS_SIZE}" "${VG_NAME}" + + echo "Creating ${FILESYSTEM} filesystem on /dev/${VG_NAME}/fallback" + mkfs."${FILESYSTEM}" -FF /dev/"${VG_NAME}"/fallback - echo "Creating swap space on /dev/${VG_NAME}/swap" - mkswap /dev/"${VG_NAME}"/swap + # data + local vg_free data_size unassigned + vg_free=$(vgs "${VG_NAME}" -o vg_free --noheadings --nosuffix --units B) + data_size=$(( vg_free * 18 / 20 )) # 90% of free space (in MB) + unassigned=$(( vg_free - data_size )) + # make sure we have 10% or at least 500MB unassigned space + if [[ "${unassigned}" -lt 524288000 ]] ; then # 500MB + data_size=$(( vg_free - 524288000 )) + fi + + local data_size_mb + data_size_mb=$(( data_size / 1024 / 1024 )) + echo "Creating LV data with ${data_size_mb}M" + lvcreate --yes -n data -L "${data_size_mb}M" "${VG_NAME}" + + echo "Creating ${FILESYSTEM} on /dev/${VG_NAME}/data" + mkfs."${FILESYSTEM}" -FF /dev/"${VG_NAME}"/data # used later by installer ROOT_FS="/dev/mapper/${VG_NAME}-root" - SWAP_PARTITION="/dev/mapper/${VG_NAME}-swap" + DATA_PARTITION="/dev/mapper/${VG_NAME}-data" } create_debian_partitions() { - local memory swap_size - - memory=$(awk '/MemTotal:/ {print $2}' /proc/meminfo) - swap_size=$(( memory / 2 / 1024)) # 50% of RAM in MB - # rootfs local root_size=8G echo "Creating LV root with ${root_size}" @@ -1023,16 +1057,8 @@ create_debian_partitions() { echo "Creating ${FILESYSTEM} on /dev/${VG_NAME}/root" mkfs."${FILESYSTEM}" -FF /dev/"${VG_NAME}"/root - # swap - echo "Creating LV swap with ${swap_size}" - lvcreate --yes -n swap -L "${swap_size}M" "${VG_NAME}" - - echo "Creating swap on /dev/${VG_NAME}/swap" - mkswap /dev/"${VG_NAME}"/swap - # used later by installer ROOT_FS="/dev/mapper/${VG_NAME}-root" - SWAP_PARTITION="/dev/mapper/${VG_NAME}-swap" } display_partition_table() { @@ -1064,7 +1090,6 @@ lvm_setup() { # used later by installer ROOT_FS="/dev/mapper/${VG_NAME}-root" - SWAP_PARTITION="/dev/mapper/${VG_NAME}-swap" # restore original options/behavior eval "$saved_options" @@ -1147,6 +1172,15 @@ case "$DEBIAN_RELEASE" in ;; esac +if [[ -n "${EFI_PARTITION}" ]] ; then + if efi_support ; then + echo "EFI support present, enabling EFI support within grml-debootstrap" + EFI_OPTION="--efi ${EFI_PARTITION}" + else + echo "EFI support NOT present, not enabling EFI support within grml-debootstrap" + fi +fi + # install Debian # shellcheck disable=SC2086 echo y | grml-debootstrap \ @@ -1160,6 +1194,7 @@ echo y | grml-debootstrap \ --defaultinterfaces \ -r "$DEBIAN_RELEASE" \ -t "$ROOT_FS" \ + $EFI_OPTION \ --password 'sipwise' 2>&1 | tee -a /tmp/grml-debootstrap.log if [ "${PIPESTATUS[1]}" != "0" ]; then @@ -1169,6 +1204,10 @@ fi sync mount "$ROOT_FS" "$TARGET" +if [ -n "${DATA_PARTITION}" ] ; then + mkdir -p "${TARGET}/ngcpdata" +fi + # MT#7805 if "$NGCP_INSTALLER" ; then cat << EOT | augtool --root="$TARGET" @@ -1181,11 +1220,13 @@ fi # TT#41500: Make sure the timezone setup is coherent grml-chroot "$TARGET" dpkg-reconfigure --frontend=noninteractive tzdata -# provide useable swap partition -echo "Enabling swap partition $SWAP_PARTITION via /etc/fstab" -cat >> "${TARGET}/etc/fstab" << EOF -$SWAP_PARTITION none swap sw,pri=0 0 0 +# provide useable /ngcpdata partition +if [ -n "${DATA_PARTITION}" ] ; then + echo "Enabling ngcpdata partition ${DATA_PARTITION} via /etc/fstab" + cat >> "${TARGET}/etc/fstab" << EOF +${DATA_PARTITION} /ngcpdata auto noatime 0 0 EOF +fi # get rid of automatically installed packages chroot $TARGET apt-get --purge -y autoremove