From 2f5a4b6660ae93dd93e158d5f2ba84aa93153f2a Mon Sep 17 00:00:00 2001 From: Michael Prokop Date: Tue, 17 Apr 2018 23:32:07 +0200 Subject: [PATCH] TT#28952 Drop usage of fai-setup-storage fai-setup-storage has no real advantage over plain parted usage for us nowadays, instead we can avoid depending on it by using the plain tools. For ngcp systems reproduce the same setup, for plain Debian installations use a static size of 8GB for rootfs. This makes installations more flexible for us. Change-Id: I5e03ad0a5dd3dac7cc547b8cdc64277db4af4c22 --- templates/scripts/includes/deployment.sh | 192 +++++++++++++++-------- 1 file changed, 127 insertions(+), 65 deletions(-) diff --git a/templates/scripts/includes/deployment.sh b/templates/scripts/includes/deployment.sh index 4d3a7f2..ad2fb76 100644 --- a/templates/scripts/includes/deployment.sh +++ b/templates/scripts/includes/deployment.sh @@ -203,32 +203,6 @@ install_sipwise_key() { debootstrap_sipwise_key } -install_fai_setup_storage () { - echo "Installing fai-setup-storage (it is missed on GRML 'small')" - - if [ "$(dpkg-query -f "\${db:Status-Status} \${db:Status-Eflag}" -W fai-setup-storage 2>/dev/null)" = 'installed ok' ]; then - echo "fai-setup-storage is already installed, nothing to do about it." - return 0 - fi - - # use temporary apt database for speed reasons - local TMPDIR - TMPDIR=$(mktemp -d) - mkdir -p "${TMPDIR}/etc/preferences.d" "${TMPDIR}/statedir/lists/partial" \ - "${TMPDIR}/cachedir/archives/partial" - echo "deb http://${DEBIAN_REPO_HOST}/debian/ ${DEBIAN_RELEASE} main contrib non-free" > \ - "${TMPDIR}/etc/sources.list" - - DEBIAN_FRONTEND='noninteractive' apt-get -o dir::cache="${TMPDIR}/cachedir" \ - -o dir::state="${TMPDIR}/statedir" -o dir::etc="${TMPDIR}/etc" \ - -o dir::etc::trustedparts="/etc/apt/trusted.gpg.d/" update - - DEBIAN_FRONTEND='noninteractive' apt-get -o dir::cache="${TMPDIR}/cachedir" \ - -o dir::etc="${TMPDIR}/etc" -o dir::state="${TMPDIR}/statedir" \ - -o dir::etc::trustedparts="/etc/apt/trusted.gpg.d/" \ - -y --no-install-recommends install fai-setup-storage -} - install_package_git () { echo "Installing package git (it is missed on GRML 'small')" @@ -1138,7 +1112,6 @@ echo "root:sipwise" | chpasswd ## partition disk set_deploy_status "disksetup" -install_fai_setup_storage # 2000GB = 2097152000 blocks in /proc/partitions - so make a rough estimation if [ "$(awk "/ ${DISK}$/ {print \$3}" /proc/partitions)" -gt 2000000000 ] ; then @@ -1148,65 +1121,148 @@ else fi if "$LVM" ; then - # make sure lvcreate understands the --yes option - lv_create_opts='' - lvm_version=$(dpkg-query -W -f="\${Version}\n" lvm2) || die "Unknown package lvm2" - setupstorage_version=$(dpkg-query --show --showformat="\${Version}" fai-setup-storage) || die "Unknown package fai-setup-storage" - - if dpkg --compare-versions "$setupstorage_version" ge 5.0 ; then - logit "Installed fai-setup-storage version ${setupstorage_version} doesn't need the LVM '--yes' workaround." - elif dpkg --compare-versions "$lvm_version" lt 2.02.106 ; then - logit "Installed lvm2 version ${lvm_version} doesn't need the '--yes' workaround." - else - logit "Enabling '--yes' workaround for lvm2 version ${lvm_version}." - lv_create_opts='lvcreateopts="--yes"' - fi - if "$NGCP_INSTALLER" ; then VG_NAME="ngcp" else VG_NAME="vg0" fi +fi - cat > /tmp/partition_setup.txt << EOF -disk_config ${DISK} disklabel:${TABLE} bootable:1 -primary - 4096- - - +clear_partition_table() { + local blockdevice + blockdevice="/dev/${DISK}" -disk_config lvm -vg ${VG_NAME} ${DISK}1 -${VG_NAME}-root / -95% ext3 rw -${VG_NAME}-swap swap RAM:50% swap sw $lv_create_opts -EOF + echo "Wiping disk signatures from ${blockdevice}" + wipefs -a "${blockdevice}" + + # make sure parted doesn't fail if LVM is already present + blockdev --rereadpt "$blockdevice" + for disk in "$blockdevice"* ; do + existing_pvs=$(pvs "$disk" -o vg_name --noheadings 2>/dev/null || true) + if [ -n "$existing_pvs" ] ; then + for pv in $existing_pvs ; do + logit "Getting rid of existing VG $pv on partition $part" + vgremove -ff "$pv" + done + fi - # make sure setup-storage/parted doesn't fail if LVM is already present - blockdev --rereadpt "/dev/${DISK}" - for disk in "/dev/${DISK}"* ; do logit "Removing possibly existing LVM/PV label from $disk" pvremove "$disk" --force --force --yes || true done + dd if=/dev/zero of="/dev/${DISK}" bs=1M count=1 blockdev --rereadpt "/dev/${DISK}" +} - export LOGDIR='/tmp/setup-storage' - mkdir -p $LOGDIR +set_up_partition_table() { + clear_partition_table - # /usr/lib/fai/fai-disk-info is available as of FAI 4.0, - # older versions shipped /usr/lib/fai/disk-info which doesn't - # support the partition setup syntax we use in our setup - if ! [ -x /usr/lib/fai/fai-disk-info ] ; then - die "You are using an outdated ISO, please update it to have fai-setup-storage >=4.0.6 available." - fi + local blockdevice + blockdevice="/dev/${DISK}" + + echo "Creating partition table" + parted -a optimal -s "${blockdevice}" mklabel "$TABLE" + + parted -a optimal -s "${blockdevice}" mkpart primary 2048s 100% + parted -a optimal -s "${blockdevice}" set 1 lvm on + + echo "Creating PV + VG" + pvcreate -ff -y "${blockdevice}"1 + vgcreate "${VG_NAME}" "${blockdevice}"1 + vgchange -a y "${VG_NAME}" +} + +create_ngcp_partitions() { + local memory swap_size - disklist=$(/usr/lib/fai/fai-disk-info | sort) - export disklist - PATH=/usr/lib/fai:${PATH} setup-storage -f /tmp/partition_setup.txt -X || die "Failure during execution of setup-storage" + 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}" + + 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}" + + echo "Creating swap space 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" +} -else # no LVM - parted -s -a optimal "/dev/${DISK}" mktable "$TABLE" || die "Failed to set up partition table" +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}" + lvcreate --yes -n root -L "${root_size}" "${VG_NAME}" + + 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() { + local blockdevice + blockdevice="/dev/${DISK}" + + echo "Displaying partition table for reference:" + parted -s "${blockdevice}" unit GiB print + lsblk "${blockdevice}" +} + +lvm_setup() { + local saved_options + saved_options="$(set +o)" + # be restrictive in what we execute + set -euo pipefail + + if "$NGCP_INSTALLER" ; then + VG_NAME="ngcp" + set_up_partition_table + create_ngcp_partitions + display_partition_table + else + VG_NAME="vg0" + set_up_partition_table + create_debian_partitions + display_partition_table + fi + + # 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" +} + +plain_disk_setup() { + parted -s -a optimal "/dev/${DISK}" mktable "${TABLE}" || die "Failed to set up partition table" # hw-raid with rootfs + swap partition parted -s -a optimal "/dev/${DISK}" 'mkpart primary ext4 2048s 95%' || die "Failed to set up primary partition" parted -s -a optimal "/dev/${DISK}" 'mkpart primary linux-swap 95% -1' || die "Failed to set up swap partition" @@ -1221,6 +1277,12 @@ else # no LVM # for later usage in /etc/fstab use /dev/disk/by-label/ngcp-swap instead of /dev/${DISK}2 SWAP_PARTITION="/dev/disk/by-label/ngcp-swap" +} + +if "$LVM" ; then + lvm_setup +else # no LVM + plain_disk_setup fi # otherwise e2fsck fails with "need terminal for interactive repairs"