From c5f487ff971f36494e77023b6b1a3682bb491905 Mon Sep 17 00:00:00 2001 From: Ralf Zerres Date: Sun, 26 Jan 2020 23:19:07 +0100 Subject: [PATCH] arch-create-system Signed-off-by: Ralf Zerres --- usr/bin/arch-create-system | 1033 ++++++++++++++++++------------------ 1 file changed, 526 insertions(+), 507 deletions(-) diff --git a/usr/bin/arch-create-system b/usr/bin/arch-create-system index aaac46d..6cf0d32 100755 --- a/usr/bin/arch-create-system +++ b/usr/bin/arch-create-system @@ -89,296 +89,307 @@ check_prerequisites () { } create_bootloader () { - # Needs to be executed in chroot environment (target) - cmd="bootctl --path=boot install" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + local cmd - cmd="bootctl status" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + # Needs to be executed in chroot environment (target) + cmd="bootctl --path=boot install" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi + + cmd="bootctl status" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi } create_btrfs () { - local LABEL=$1 - local PREFIX=${2:-BTRFS} - local MOUNT_POINT=$3 + local LABEL=$1 + local PREFIX=${2:-BTRFS} + local MOUNT_POINT=$3 + local cmd + if [ $dryrun -eq 1 ]; then + printf "${BLUE}Would prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" \ + "$LABEL" + else + printf "${BLUE}Prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" \ + "$LABEL" + fi + + if [ -h /dev/disk/by-partlabel/$LABEL ]; then + + # create filesystem + cmd="mkfs -t btrfs --force \ + --label $PREFIX-$LABEL \ + --data single \ + --metadata single \ + /dev/disk/by-partlabel/$LABEL" + cmd=`echo $cmd | tr -s "[:blank:]"` if [ $dryrun -eq 1 ]; then - printf "${BLUE}Would prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" \ - "$LABEL" + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" \ + "$cmd" else - printf "${BLUE}Prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" \ - "$LABEL" + eval "$cmd" fi - if [ -h /dev/disk/by-partlabel/$LABEL ]; then - - # create filesystem - cmd="mkfs -t btrfs --force \ - --label $PREFIX-$LABEL \ - --data single \ - --metadata single \ - /dev/disk/by-partlabel/$LABEL" - cmd=`echo $cmd | tr -s "[:blank:]"` - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" \ - "$cmd" - else - eval "$cmd" - fi - - if [ ! -d $MOUNT_POINT ]; then - cmd="mkdir -p $MOUNT_POINT" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" \ - "$cmd" - else - eval "$cmd" - fi - fi + if [ ! -d $MOUNT_POINT ]; then + cmd="mkdir -p $MOUNT_POINT" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" \ + "$cmd" + else + eval "$cmd" + fi fi + fi } create_disk () { - local TARGET=$1 - local LABEL=$2 - local PREFIX=$3 - local NR_PARTITIONS=${4:-1} + local TARGET=$1 + local LABEL=$2 + local PREFIX=$3 + local NR_PARTITIONS=${4:-1} - local MOUNT_TARGET=/mnt - local SGDISK="/usr/bin/sgdisk" - local PARTITION=1 + local MOUNT_TARGET=/mnt + local SGDISK="/usr/bin/sgdisk" + local PARTITION=1 - # test if block-device is available - test -b $TARGET || exit 1 + local cmd - printf "${BLUE}Prepare disc ${GREEN}'%s'${NO_COLOR}\n" "$TARGET" + # test if block-device is available + test -b $TARGET || exit 1 - # Cleanup disk and create GPT-Partition - cmd="sgdisk --zap-all $TARGET" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + printf "${BLUE}Prepare disc ${GREEN}'%s'${NO_COLOR}\n" "$TARGET" + + # Cleanup disk and create GPT-Partition + cmd="sgdisk --zap-all $TARGET" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi + + while expr $PARTITION '<=' $NR_PARTITIONS >>/dev/null; do + if [ $PARTITION '=' 1 ] && [ $NR_PARTITIONS '>' 1 ]; then + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would create ${GREEN}UEFI-Partition '%s'${NO_COLOR}\n" $PARTITION + else + # create UEFI partitions + sgdisk --new=$PARTITION:2048:+512M $TARGET + + # assign label + sgdisk --change-name=$PARTITION:$disk_label_uefi $TARGET + + # adapt partition-type + sgdisk --typecode=$PARTITION:EF00 $TARGET + fi + + PARTITION=$(expr $PARTITION + 1) + continue else - eval "$cmd" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would create ${GREEN}OS-Partition '%s'${NO_COLOR}\n" $PARTITION + else + # create partitions + sgdisk --new=$PARTITION $TARGET + + # assign label + sgdisk --change-name=$PARTITION:${LABEL} $TARGET + + # adapt partition-type + sgdisk --typecode=$PARTITION:8300 $TARGET + fi + + PARTITION=$(expr $PARTITION + 1) fi + done - while expr $PARTITION '<=' $NR_PARTITIONS >>/dev/null; do - if [ $PARTITION '=' 1 ] && [ $NR_PARTITIONS '>' 1 ]; then - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would create ${GREEN}UEFI-Partition '%s'${NO_COLOR}\n" $PARTITION - else - # create UEFI partitions - sgdisk --new=$PARTITION:2048:+512M $TARGET - - # assign label - sgdisk --change-name=$PARTITION:$disk_label_uefi $TARGET - - # adapt partition-type - sgdisk --typecode=$PARTITION:EF00 $TARGET - fi - - PARTITION=$(expr $PARTITION + 1) - continue - else - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would create ${GREEN}OS-Partition '%s'${NO_COLOR}\n" $PARTITION - else - # create partitions - sgdisk --new=$PARTITION $TARGET - - # assign label - sgdisk --change-name=$PARTITION:${LABEL} $TARGET - - # adapt partition-type - sgdisk --typecode=$PARTITION:8300 $TARGET - fi - - PARTITION=$(expr $PARTITION + 1) - fi - done - - # dump settings - cmd="sgdisk -p $TARGET" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would print created partition table for target ${GREEN}'%s'${NO_COLOR}\n" $TARGET - else - eval "$cmd" - fi + # dump settings + cmd="sgdisk -p $TARGET" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would print created partition table for target ${GREEN}'%s'${NO_COLOR}\n" $TARGET + else + eval "$cmd" + fi } create_fs_structure () { - local LABEL=$1 - local PREFIX=${2:-BTRFS} - local MOUNT_POINT=$3 - local SUBVOL=$4 + local LABEL=$1 + local PREFIX=${2:-BTRFS} + local MOUNT_POINT=$3 + local SUBVOL=$4 - printf "${BLUE}Prepare filesystem structure${GREEN}'subvol=%s'${NO_COLOR}\n" \ - "$SUBVOL" - cmd="mount_target $MOUNT_POINT /dev/disk/by-partlabel/$LABEL btrfs $SUBVOL" + local cmd + + printf "${BLUE}Prepare filesystem structure${GREEN}'subvol=%s'${NO_COLOR}\n" \ + "$SUBVOL" + cmd="mount_target $MOUNT_POINT /dev/disk/by-partlabel/$LABEL btrfs $SUBVOL" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi + + if [ $LABEL="OS" ]; then + printf "${BLUE}Create target filesystem structure${NO_COLOR}\n" + + cmd="mkdir -p $MOUNT_POINT/var/lib" if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" else - eval "$cmd" + eval "$cmd" fi - - if [ $LABEL="OS" ]; then - printf "${BLUE}Create target filesystem structure${NO_COLOR}\n" - - cmd="mkdir -p $MOUNT_POINT/var/lib" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi - - for subdir in log cache; do - cmd="btrfs subvolume create $MOUNT_POINT/var/$subdir" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi - done - - # Subvolumes storing custom data - printf "${BLUE} - Create btrfs subvolumes${NO_COLOR}\n" - - for subvol in boot root home data var/lib/machines; do - cmd="btrfs subvolume create $MOUNT_POINT/$subvol" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" \ - "$cmd" - else - eval "$cmd" - fi - done - - create_swapfs $PREFIX $MOUNT_POINT - fi - - cmd="umount $MOUNT_POINT" - if [ $dryrun -eq 1 ]; then + for subdir in log cache; do + cmd="btrfs subvolume create $MOUNT_POINT/var/$subdir" + if [ $dryrun -eq 1 ]; then printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else + else eval "$cmd" - fi + fi + done + + # Subvolumes storing custom data + printf "${BLUE} - Create btrfs subvolumes${NO_COLOR}\n" + + for subvol in boot root home data var/lib/machines; do + cmd="btrfs subvolume create $MOUNT_POINT/$subvol" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" \ + "$cmd" + else + eval "$cmd" + fi + done + + create_swapfs $PREFIX $MOUNT_POINT + fi + + cmd="umount $MOUNT_POINT" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi } create_network_stack () { - # Needs to be executed in chroot environment (target) - systemctl enable systemd-networkd.service - systemctl enable systemd-resolved.service - systemctl enable dropbear.service + # Needs to be executed in chroot environment (target) + systemctl enable systemd-networkd.service + systemctl enable systemd-resolved.service + systemctl enable dropbear.service - rm /etc/resolv.conf - ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf + rm /etc/resolv.conf + ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf } create_swapfs () { - local PREFIX=$1 - local MOUNT_POINT=$2 + local PREFIX=$1 + local MOUNT_POINT=$2 - printf "${BLUE}Create target swapfs${NO_COLOR}\n" + local cmd - # create a subvolume for the swapfs file - cmd="btrfs subvol create $MOUNT_POINT/swap" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + printf "${BLUE}Create target swapfs${NO_COLOR}\n" + # create a subvolume for the swapfs file + cmd="btrfs subvol create $MOUNT_POINT/swap" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi - # Disable COW functionality for Subvolume swap - cmd="chattr +C $MOUNT_POINT/swap" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - chmod 0700 $MOUNT_POINT/swap - fi + # Disable COW functionality for Subvolume swap + cmd="chattr +C $MOUNT_POINT/swap" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + chmod 0700 $MOUNT_POINT/swap + fi - # prepare the swapfile (size: 2x RAM) - RamSize=`cat /proc/meminfo | gawk 'NR==1 {print $2}'` - SwapSize=$(expr 2 '*' $RamSize) - SwapFile=$MOUNT_POINT/swap/swapfile + # prepare the swapfile (size: 2x RAM) + RamSize=`cat /proc/meminfo | gawk 'NR==1 {print $2}'` + SwapSize=$(expr 2 '*' $RamSize) + SwapFile=$MOUNT_POINT/swap/swapfile - cmd="fallocate --length $SwapSize $SwapFile" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - touch $SwapFile - chmod 0600 $SwapFile - eval "$cmd" - fi + cmd="fallocate --length $SwapSize $SwapFile" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + touch $SwapFile + chmod 0600 $SwapFile + eval "$cmd" + fi - # create the swap filesystem - cmd="mkswap --label $PREFIX-Swap $SwapFile" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + # create the swap filesystem + cmd="mkswap --label $PREFIX-Swap $SwapFile" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi } create_fat () { - local LABEL=$1 - local PREFIX=${2:-BTRFS} - local MOUNT_POINT=$3 + local LABEL=$1 + local PREFIX=${2:-BTRFS} + local MOUNT_POINT=$3 + local cmd + + if [ $dryrun -eq 1 ]; then + printf "${BLUE}Would prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" "$LABEL" + else + printf "${BLUE}Prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" "$LABEL" + fi + + if [ -h /dev/disk/by-partlabel/$LABEL ]; then + # create filesystem + cmd="mkfs -t fat \ + -F 32 \ + -n $LABEL \ + /dev/disk/by-partlabel/$LABEL" + cmd=`echo $cmd | tr -s "[:blank:]"` if [ $dryrun -eq 1 ]; then - printf "${BLUE}Would prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" "$LABEL" + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" else - printf "${BLUE}Prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" "$LABEL" - fi - - if [ -h /dev/disk/by-partlabel/$LABEL ]; then - # create filesystem - cmd="mkfs -t fat \ - -F 32 \ - -n $LABEL \ - /dev/disk/by-partlabel/$LABEL" - cmd=`echo $cmd | tr -s "[:blank:]"` - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + eval "$cmd" fi + fi } create_vfat () { - local LABEL=$1 - local PREFIX=${2:-BTRFS} - local MOUNT_POINT=$3 + local LABEL=$1 + local PREFIX=${2:-BTRFS} + local MOUNT_POINT=$3 + local cmd + + if [ $dryrun -eq 1 ]; then + printf "${BLUE}Would prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" "$LABEL" + else + printf "${BLUE}Prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" "$LABEL" + fi + + if [ -h /dev/disk/by-partlabel/$LABEL ]; then + # create filesystem + cmd="mkfs -t vfat \ + -n $PREFIX-$LABEL \ + /dev/disk/by-partlabel/$LABEL" + cmd=`echo $cmd | tr -s "[:blank:]"` if [ $dryrun -eq 1 ]; then - printf "${BLUE}Would prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" "$LABEL" + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" else - printf "${BLUE}Prepare filesystem ${GREEN}'%s'${NO_COLOR}\n" "$LABEL" - fi - - if [ -h /dev/disk/by-partlabel/$LABEL ]; then - # create filesystem - cmd="mkfs -t vfat \ - -n $PREFIX-$LABEL \ - /dev/disk/by-partlabel/$LABEL" - cmd=`echo $cmd | tr -s "[:blank:]"` - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + eval "$cmd" fi + fi } die () { @@ -394,6 +405,8 @@ get_config_id () { local config_json=${configfile:-$config_json} local config_id=${1} + local cmd + if [ $verbose -ge 1 ]; then printf "${BLUE}get_config_id ...${NO_COLOR}\n" fi @@ -410,23 +423,21 @@ get_config_id () { | .ConfigId as \config_id \ | select(. == \"${ConfigId}\") \ | \$ConfigName' - ${config_json}" + ${config _json}" - cmd="jq --monochrome-output --ascii-output ' .ConfigEnvironment[] \ - | .ConfigName ' \ - ${config_json}" - config_names=$(eval $cmd) - config_names=$(echo $config_names | sed -e 's/\n//g') + config_name=$(eval $cmd) + config_name=$(echo $config_names | sed -e 's/\n//g') if [ $verbose -ge 2 ]; then - printf "${MAGENTA}Config environment names: ${GREEN}'%s'${NO_COLOR}\n" \ - "$config_names" + printf "${MAGENTA}Config environment id: ${GREEN}'%s'${NO_COLOR}\n" \ + "$config_name" fi } get_config_name () { local config_json=${configfile:-$config_json} - local disk_name=${1} + local config_name=${1} + local cmd if [ $verbose -ge 1 ]; then printf "${BLUE}get_config_name ...${NO_COLOR}\n" @@ -443,17 +454,18 @@ get_config_name () { cmd="jq --monochrome-output --ascii-output ' .ConfigEnvironment[] \ | .ConfigName ' \ ${config_json}" - config_names=$(eval $cmd) - config_names=$(echo $config_names | sed -e 's/\n//g') + config_name=$(eval $cmd) + config_name=$(echo $config_names | sed -e 's/\n//g') if [ $verbose -ge 2 ]; then - printf "${MAGENTA}Config environment names: ${GREEN}'%s'${NO_COLOR}\n" \ - "$config_names" + printf "${MAGENTA}Config environment name: ${GREEN}'%s'${NO_COLOR}\n" \ + "$config_name" fi } get_config_names () { - local config_json=${configfile:-$config_json} + local config_json=${config_file:-$config_json} + local cmd if [ $verbose -ge 1 ]; then printf "${BLUE}get_config_names ...${NO_COLOR}\n" @@ -477,6 +489,8 @@ get_config_names () { get_config_disk_names () { local config_json=${config_file:-$config_json} + local cmd + if [ $verbose -ge 1 ]; then printf "${BLUE}get_config_disk_names ...${NO_COLOR}\n" fi @@ -512,126 +526,130 @@ get_config_disk_names () { } mount_target_filesytems () { - local LABEL=$1 - local MOUNT_POINT=$2 + local LABEL=$1 + local MOUNT_POINT=$2 - printf "${BLUE}Install target system ${GREEN}'%s' -> '%s'${NO_COLOR}\n" "$LABEL" "$MOUNT_POINT" + printf "${BLUE}Install target system ${GREEN}'%s' -> '%s'${NO_COLOR}\n" "$LABEL" "$MOUNT_POINT" - mount_target $MOUNT_POINT /dev/disk/by-partlabel/$LABEL btrfs root + mount_target $MOUNT_POINT /dev/disk/by-partlabel/$LABEL btrfs root - for subdir in boot data home swap var/log var/cache var/lib/machines; do - mkdir -p $MOUNT_POINT/$subdir - done + for subdir in boot data home swap var/log var/cache var/lib/machines; do + mkdir -p $MOUNT_POINT/$subdir + done - mount_target $MOUNT_POINT/boot /dev/disk/by-partlabel/$disk_label_uefi fat - mount_target $MOUNT_POINT/data /dev/disk/by-partlabel/$disk_label_data btrfs / - mount_target $MOUNT_POINT/var/cache /dev/disk/by-partlabel/$LABEL btrfs var/cache - mount_target $MOUNT_POINT/var/lib/machines /dev/disk/by-partlabel/$disk_label_machines btrfs / - mount_target $MOUNT_POINT/var/log /dev/disk/by-partlabel/$LABEL btrfs var/log + mount_target $MOUNT_POINT/boot /dev/disk/by-partlabel/$disk_label_uefi fat + mount_target $MOUNT_POINT/data /dev/disk/by-partlabel/$disk_label_data btrfs / + mount_target $MOUNT_POINT/var/cache /dev/disk/by-partlabel/$LABEL btrfs var/cache + mount_target $MOUNT_POINT/var/lib/machines /dev/disk/by-partlabel/$disk_label_machines btrfs / + mount_target $MOUNT_POINT/var/log /dev/disk/by-partlabel/$LABEL btrfs var/log } install_target_packages () { - local LABEL=$1 + local LABEL=$1 - printf "${BLUE}Install target packages ${GREEN}'%s' -> '%s'${NO_COLOR}\n" \ - "$LABEL" "$MOUNT_POINT" + local cmd - # Update available packages - cmd="pacman -Sy" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + printf "${BLUE}Install target packages ${GREEN}'%s' -> '%s'${NO_COLOR}\n" \ + "$LABEL" "$MOUNT_POINT" - # Basic packages - cmd="pacstrap $MOUNT_POINT arch-install-scripts base btrfs-progs intel-ucode linux linux-firmware dosfstools iptables-nft man sudo" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + # Update available packages + cmd="pacman -Sy" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi - # Hyper-V packages - cmd="pacstrap $MOUNT_POINT hyperv" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + # Basic packages + cmd="pacstrap $MOUNT_POINT arch-install-scripts base btrfs-progs intel-ucode linux linux-firmware dosfstools iptables-nft man sudo" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi - # SSH-Daemon, FileManager and Editor - cmd="pacstrap $MOUNT_POINT dropbear vim mc bash-completion n" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + # Hyper-V packages + cmd="pacstrap $MOUNT_POINT hyperv" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi - cmd="cp $packagename $MOUNT_POINT/usr/bin/" - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + # SSH-Daemon, FileManager and Editor + cmd="pacstrap $MOUNT_POINT dropbear vim mc bash-completion n" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi + + cmd="cp $packagename $MOUNT_POINT/usr/bin/" + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi } install_target () { - # Needs to be executed in chroot environment (target) - prepare_mount_units + # Needs to be executed in chroot environment (target) + prepare_mount_units - prepare_network_units - create_network_stack + prepare_network_units + create_network_stack - prepare_bootloader - create_bootloader + prepare_bootloader + create_bootloader - prepare_locale $label_prefix + prepare_locale $label_prefix - #systemctl enable hvkvpdaemon.service - #systemctl enable hvvssdaemon.service + #systemctl enable hvkvpdaemon.service + #systemctl enable hvvssdaemon.service - # if you dislike systemd mount units - #genfstab / >/etc/fstab + # if you dislike systemd mount units + #genfstab / >/etc/fstab - # return to calling process - exit 0 + # return to calling process + exit 0 } mount_target () { - local MOUNT_POINT=$1 - local DEV_NAME=$2 - local FS_TYPE=$3 - local FS_SUBVOL=$4 + local MOUNT_POINT=$1 + local DEV_NAME=$2 + local FS_TYPE=$3 + local FS_SUBVOL=$4 - case $FS_TYPE in - "btrfs") - if [ -h $DEV_NAME ]; then - cmd="mount -t $FS_TYPE \ - -o subvol=$FS_SUBVOL \ - $DEV_NAME \ - $MOUNT_POINT" - printf "${BLUE}mounting subvol ${GREEN}'%s' ${BLUE}of ${GREEN}'%s' ${BLUE}at ${GREEN}'%s${NO_COLOR}\n" \ - "$FS_SUBVOL" "$DEV_NAME" "$MOUNT_POINT" - fi - ;; - "vfat") - if [ -h $DEV_NAME ]; then - cmd="mount -t $FS_TYPE \ - $DEV_NAME \ - $MOUNT_POINT" - printf "${BLUE}mounting ${GREEN}'%s' ${BLUE}at ${GREEN}'%s${NO_COLOR}\n" \ - "$DEV_NAME" "$MOUNT_POINT" - fi - ;; - esac + local cmd - cmd=`echo $cmd | tr -s "[:blank:]"` - if [ $dryrun -eq 1 ]; then - printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" - else - eval "$cmd" - fi + case $FS_TYPE in + "btrfs") + if [ -h $DEV_NAME ]; then + cmd="mount -t $FS_TYPE \ + -o subvol=$FS_SUBVOL \ + $DEV_NAME \ + $MOUNT_POINT" + printf "${BLUE}mounting subvol ${GREEN}'%s' ${BLUE}of ${GREEN}'%s' ${BLUE}at ${GREEN}'%s${NO_COLOR}\n" \ + "$FS_SUBVOL" "$DEV_NAME" "$MOUNT_POINT" + fi + ;; + "vfat") + if [ -h $DEV_NAME ]; then + cmd="mount -t $FS_TYPE \ + $DEV_NAME \ + $MOUNT_POINT" + printf "${BLUE}mounting ${GREEN}'%s' ${BLUE}at ${GREEN}'%s${NO_COLOR}\n" \ + "$DEV_NAME" "$MOUNT_POINT" + fi + ;; + esac + + cmd=`echo $cmd | tr -s "[:blank:]"` + if [ $dryrun -eq 1 ]; then + printf "${MAGENTA}Would run ${GREEN}'%s'${NO_COLOR}\n" "$cmd" + else + eval "$cmd" + fi } parse_config_file () { @@ -834,184 +852,183 @@ parse_params () { prepare_bootloader () { - # check for accessible uefi partition - ls /sys/firmware/efi/efivars > /dev/null - if [ $? -eq 0 ]; then - printf "UEFI Environmint is ok'\n" + # check for accessible uefi partition + ls /sys/firmware/efi/efivars > /dev/null + if [ $? -eq 0 ]; then + printf "UEFI Environmint is ok'\n" - mkdir -p /boot/loader/entries + mkdir -p /boot/loader/entries - printf '%s\n' \ - "default arch" \ - "timeout 3" \ - "editor yes" \ - "console-mode max" \ - > /boot/loader/loader.conf + printf '%s\n' \ + "default arch" \ + "timeout 3" \ + "editor yes" \ + "console-mode max" \ + > /boot/loader/loader.conf - printf '%s\n' \ - "default arch" \ - "title Arch Linux (Mainline)" \ - "linux /vmlinuz-linux" \ - "initrd /intel-ucode.img" \ - "initrd /initramfs-linux.img" \ - "options rootflags=subvol=root root=LABEL=BTRFS-OS" \ - > /boot/loader/entries/arch.conf + printf '%s\n' \ + "default arch" \ + "title Arch Linux (Mainline)" \ + "linux /vmlinuz-linux" \ + "initrd /intel-ucode.img" \ + "initrd /initramfs-linux.img" \ + "options rootflags=subvol=root root=LABEL=BTRFS-OS" \ + > /boot/loader/entries/arch.conf - bootctl status - fi + bootctl status + fi } prepare_locale () { - local LABEL=$1 + local LABEL=$1 - hostnamectl set-hostname $LABEL-lin01 - localectl set-keymap de-latin1-nodeadkeys + hostnamectl set-hostname $LABEL-lin01 + localectl set-keymap de-latin1-nodeadkeys } prepare_mount_units () { - printf '%s\n' \ - "[Unit]" \ - "Description=root-Snapshots (btrfs)" \ - "Documentation=man:systemd.mount(5)" \ - "DefaultDependencies=yes" \ - "Before=local-fs.target" \ - "" \ - "[Mount]" \ - "#What=LABLE=$disk_label_root" \ - "What=UUID=$disk_uuid_root" \ - "Where=/.snapshots" \ - "Type=btrfs" \ - "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=root_snapshots" \ - "" \ - "[Install]" \ - "WantedBy=multi-user.target" \ - > /etc/systemd/system/\x2esnapshots.mount + printf '%s\n' \ + "[Unit]" \ + "Description=root-Snapshots (btrfs)" \ + "Documentation=man:systemd.mount(5)" \ + "DefaultDependencies=yes" \ + "Before=local-fs.target" \ + "" \ + "[Mount]" \ + "#What=LABLE=$disk_label_root" \ + "What=UUID=$disk_uuid_root" \ + "Where=/.snapshots" \ + "Type=btrfs" \ + "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=root_snapshots" \ + "" \ + "[Install]" \ + "WantedBy=multi-user.target" \ + > /etc/systemd/system/\x2esnapshots.mount - printf '%s\n' \ - "[Unit]" \ - "Description=Caching (btrfs)" \ - "Documentation=man:systemd.mount(5)" \ - "DefaultDependencies=yes" \ - "Before=local-fs.target" \ - "" \ - "[Mount]" \ - "#What=LABLE=$disk_label_root" \ - "What=UUID=$disk_uuid_root" \ - "Where=/var/cache" \ - "Type=btrfs" \ - "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=var/cache" \ - "" \ - "[Install]" \ - "WantedBy=multi-user.target" \ - > /etc/systemd/system/var-cache.mount + printf '%s\n' \ + "[Unit]" \ + "Description=Caching (btrfs)" \ + "Documentation=man:systemd.mount(5)" \ + "DefaultDependencies=yes" \ + "Before=local-fs.target" \ + "" \ + "[Mount]" \ + "#What=LABLE=$disk_label_root" \ + "What=UUID=$disk_uuid_root" \ + "Where=/var/cache" \ + "Type=btrfs" \ + "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=var/cache" \ + "" \ + "[Install]" \ + "WantedBy=multi-user.target" \ + > /etc/systemd/system/var-cache.mount - printf '%s\n' \ - "[Unit]" \ - "Description=data (btrfs)" \ - "Documentation=man:systemd.mount(5)" \ - "DefaultDependencies=yes" \ - "Before=local-fs.target" \ - "" \ - "[Mount]" \ - "#What=LABLE=$disk_label_data" \ - "What=UUID=$disk_uuid_data" \ - "Where=/data" \ - "Type=btrfs" \ - "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=data" \ - "" \ - "[Install]" \ - "WantedBy=multi-user.target" \ - > /etc/systemd/system/data.mount + printf '%s\n' \ + "[Unit]" \ + "Description=data (btrfs)" \ + "Documentation=man:systemd.mount(5)" \ + "DefaultDependencies=yes" \ + "Before=local-fs.target" \ + "" \ + "[Mount]" \ + "#What=LABLE=$disk_label_data" \ + "What=UUID=$disk_uuid_data" \ + "Where=/data" \ + "Type=btrfs" \ + "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=data" \ + "" \ + "[Install]" \ + "WantedBy=multi-user.target" \ + > /etc/systemd/system/data.mount - printf '%s\n' \ - "[Unit]" \ - "Description=Home (btrfs)" \ - "Documentation=man:systemd.mount(5)" \ - "DefaultDependencies=yes" \ - "Before=local-fs.target" \ - "" \ - "[Mount]" \ - "#What=LABLE=$disk_label_home" \ - "What=UUID=$disk_uuid_home" \ - "Where=/home" \ - "Type=btrfs" \ - "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=home" \ - "" \ - "[Install]" \ - "WantedBy=multi-user.target" \ - > /etc/systemd/system/home.mount + printf '%s\n' \ + "[Unit]" \ + "Description=Home (btrfs)" \ + "Documentation=man:systemd.mount(5)" \ + "DefaultDependencies=yes" \ + "Before=local-fs.target" \ + "" \ + "[Mount]" \ + "#What=LABLE=$disk_label_home" \ + "What=UUID=$disk_uuid_home" \ + "Where=/home" \ + "Type=btrfs" \ + "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=home" \ + "" \ + "[Install]" \ + "WantedBy=multi-user.target" \ + > /etc/systemd/system/home.mount - printf '%s\n' \ - "[Unit]" \ - "Description=Logging (btrfs)" \ - "Documentation=man:systemd.mount(5)" \ - "DefaultDependencies=yes" \ - "Before=local-fs.target" \ - "" \ - "[Mount]" \ - "#What=LABLE=$disk_label_log" \ - "What=UUID=$disk_uuid_log" \ - "Where=/var/log" \ - "Type=btrfs" \ - "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=var/log" \ - "" \ - "[Install]" \ - "WantedBy=multi-user.target" \ - > /etc/systemd/system/var-log.mount + printf '%s\n' \ + "[Unit]" \ + "Description=Logging (btrfs)" \ + "Documentation=man:systemd.mount(5)" \ + "DefaultDependencies=yes" \ + "Before=local-fs.target" \ + "" \ + "[Mount]" \ + "#What=LABLE=$disk_label_log" \ + "What=UUID=$disk_uuid_log" \ + "Where=/var/log" \ + "Type=btrfs" \ + "Options=defaults,discard,space_cache,autodefrag,compress=lzo,subvol=var/log" \ + "" \ + "[Install]" \ + "WantedBy=multi-user.target" \ + > /etc/systemd/system/var-log.mount } prepare_network_units () { - printf '%s\n' \ - "[Match]" \ - "Name=eth0" \ - "" \ - "[Network]" \ - "Description=Slave Bridge-Interface" \ - "Bridge=bridge-lan" \ - > /etc/systemd/network/70-eth0-bridge-slave.netdev + printf '%s\n' \ + "[Match]" \ + "Name=eth0" \ + "" \ + "[Network]" \ + "Description=Slave Bridge-Interface" \ + "Bridge=bridge-lan" \ + > /etc/systemd/network/70-eth0-bridge-slave.netdev - printf '%s\n' \ - "[Match]" \ - "#Host=Lin01" \ - "#Architecture=x86_64" \ - "" \ - "[NetDev]" \ - "Description=Bridge for Containers" \ - "Name=bridge-lan" \ - "Kind=bridge" \ - > /etc/systemd/network/80-bridge-lan.netdev + printf '%s\n' \ + "[Match]" \ + "#Host=Lin01" \ + "#Architecture=x86_64" \ + "" \ + "[NetDev]" \ + "Description=Bridge for Containers" \ + "Name=bridge-lan" \ + "Kind=bridge" \ + > /etc/systemd/network/80-bridge-lan.netdev - printf '%s\n' \ - "[Match]" \ - "Name=bridge-lan" \ - "Driver=bridge" \ - "" \ - "[Network]" \ - "Description=Bridge for Containers" \ - "IPForward=yes" \ - "IPMasquerqade=yes" \ - "LinkLocalAddressisng=yes" \ - "IPv6AcceptRA=yes" \ - "IgnoreCarrierLoss=yes" \ - > /etc/systemd/network/80-bridge-lan.network + printf '%s\n' \ + "[Match]" \ + "Name=bridge-lan" \ + "Driver=bridge" \ + "" \ + "[Network]" \ + "Description=Bridge for Containers" \ + "IPForward=yes" \ + "IPMasquerqade=yes" \ + "LinkLocalAddressisng=yes" \ + "IPv6AcceptRA=yes" \ + "IgnoreCarrierLoss=yes" \ + > /etc/systemd/network/80-bridge-lan.network } prepare_target_disks () { - create_disk ${disk_dev_root} $disk_label_root $label_prefix 2 - create_disk ${disk_dev_machines} $disk_label_machines $label_prefix - create_disk ${disk_dev_data} $disk_label_data $label_prefix + create_disk ${disk_dev_root} $disk_label_root $label_prefix 2 + create_disk ${disk_dev_machines} $disk_label_machines $label_prefix + create_disk ${disk_dev_data} $disk_label_data $label_prefix } prepare_target_filesystems () { - create_fat $disk_label_uefi $label_prefix $mount_point - create_btrfs $disk_label_root $label_prefix $mount_point - create_btrfs $disk_label_machines $label_prefix $mount_point - create_btrfs $disk_label_data $label_prefix $mount_point + create_fat $disk_label_uefi $label_prefix $mount_point + create_btrfs $disk_label_root $label_prefix $mount_point + create_btrfs $disk_label_machines $label_prefix $mount_point + create_btrfs $disk_label_data $label_prefix $mount_point - create_fs_structure $disk_label_root $label_prefix $mount_point / + create_fs_structure $disk_label_root $label_prefix $mount_point / } - show_config () { if [ $verbose -ge 1 ]; then printf "${BLUE}$progname (runtime arguments) ...${NO_COLOR}\n" @@ -1027,8 +1044,8 @@ show_config () { printf " Label Machines: '%s'\n" "$disk_label_machines" fi if [ ${#disk_dev_data} -gt 1 ]; then - printf " Target Data: '%s'\n" "$disk_dev_data" - printf " Label DATA: '%s'\n" "$disk_label_data" + printf " Target Data: '%s'\n" "$disk_dev_data" + printf " Label DATA: '%s'\n" "$disk_label_data" fi options="verbose_level=$verbose" @@ -1040,22 +1057,20 @@ show_config () { } usage () { - cat < Specify the partion label prefix - -t, --disk_dev_root Specify the blockdevice for the target OS (e.g /dev/sda) - --disk_dev_machines Specify the blockdevice for containers/machines (e.g /dev/sdb) - --disk_dev_data Specify the blockdevice to store data (e.g /dev/sdc) - -v, --verbose Be verbose on what's going on (min: --verbose=0, max: --verbose=3) - --version show program version -EOF - + printf '%s\n' \ + "$progname $version" \ + "Usage: $progname [options]" \ + "Options:" \ + " -c, --config Read config parameters from given file" \ + " --color Enable colored output messages" \ + " --dry-run perform a trial run (no changes are written)" \ + " --mountpoint Specify MountPoint preparing targets OS-Disk" \ + " --label_prefix Specify the partion label prefix" \ + " -t, --disk_dev_root Specify the blockdevice for the target OS (e.g /dev/sda)" \ + " --disk_dev_machines Specify the blockdevice for containers/machines (e.g /dev/sdb)" \ + " --disk_dev_data Specify the blockdevice to store data (e.g /dev/sdc)" \ + " -v, --verbose Be verbose on what's going on (min: --verbose=0, max: --verbose=3)" \ + " --version show program version" exit 0 } @@ -1073,7 +1088,9 @@ parse_params $@ # commandline options handled with priority parse_config_file -#show_config +show_config + +printf "${MAGENTA}cmd: ${GREEN}'%s'${NO_COLOR}\n" "$cmd" case $cmd in get-config-name) @@ -1088,6 +1105,7 @@ case $cmd in fi ;; get-config-names) + #echo $config_names get_config_names if [ $? -gt 0 ]; then exit 1 @@ -1112,6 +1130,7 @@ case $cmd in fi ;; get-config-partition_names) + echo get_config_partition_names ;; install-target) @@ -1121,7 +1140,7 @@ case $cmd in mount_target_filesystems install_target_packages - exit 0 + #exit 0 # change new root to target cmd="arch-chroot $MOUNT_POINT arch-create-system install_target" if [ $dryrun -eq 1 ]; then