TT#11444 New partition schema, switching to GPT + supporting EFI (optional)

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
changes/07/23307/11
Michael Prokop 8 years ago
parent 8d86272571
commit 6a92f155a4

@ -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

Loading…
Cancel
Save