vinstaller/main.sh
2022-02-08 20:06:19 +01:00

327 lines
8.7 KiB
Bash
Executable File

#!/bin/bash
PASS="oem"
TIMEZONE="Europe/Berlin"
main="/tmp/vinstall"
target="${main}/target"
tmp_target="${main}/tmp_target"
vars="${target}/tmp/vinstaller/vars"
if [ "${DEBUG}" ]; then
umount -R ${target}/boot/efi ${target}/boot ${target}/tmp/vinstaller/ ${target}/home ${target}
vgchange -an
cryptsetup close /dev/mapper/luks*
rm -rf $main
fi
if [ "${DEBUG}" == "2" ]; then
set -x
fi
mkdir -p ${target} ${tmp_target}
. ./etc/functions
target_phy_disk() {
header "Choose target disk"
local DISKS_DETAILS
local output
DISKS_DETAILS=$(lsblk -l -o KNAME,TYPE,SIZE,MODEL|grep disk)
echo "${DISKS_DETAILS}"
multiplechoice $(echo "${DISKS_DETAILS}"|awk '{print $1}')
TARGET_PHY_DISK="${output}"
}
target_phy_id() {
local i
local f2
for i in $(find /dev/disk/by-id ! -type d | grep -v part); do
if realpath "${i}" | grep -q -i "${TARGET_PHY_DISK}"; then
if echo "${i}" | grep -v "wwn" | grep -q -v "eui"; then
TARGET_PHY_ID="${i}"
f2="1"
fi
fi
done
if [ "$f2" == "1" ]; then
return 0
else
err "no id found"
fi
}
use_efi() {
if test -e /sys/firmware/efi; then
EFI=1
mount -t efivarfs efivarfs /sys/firmware/efi/efivars
else
EFI=0
fi
}
encryption_style() {
ENC=1
header "Choose encryption style"
echo "a) keyfile in initramfs" #bios: 1 uefi: 2
echo "b) no encryption" #bios: 1 uefi: 2
echo "c) no keyfile (double pw enter)" #bios: 1 uefi: 2
#echo "not implemented:"
#echo "d) keyfile on usb" #bios: 1 uefi: 2
#echo "e) unencrypted boot" #bios: 2 uefi: 3 (hier fehlt noch eine)
multiplechoice "a" "b" "c" #"d" "e"
ENCRYPTION_STYLE="${output}"
if [ "${ENCRYPTION_STYLE}" == "b" ]; then
ENC=0
fi
}
hibernation() {
ramsize="$(($(getconf _PHYS_PAGES) * $(getconf PAGE_SIZE) / (1024 * 1024)))"
ramsize="$(awk "BEGIN { printf(\"%.0f\n\", ${ramsize}/1024); }")"
HIBERNATE=1
if [[ "${ramsize}" -lt "2" ]]; then
SWAPSIZE="$(( ramsize * 2 ))"
SWAPSIZE="$(( ramsize * 3 ))"
elif [[ "${ramsize}" -ge "2" ]] && [[ "${ramsize}" -lt "8" ]]; then
SWAPSIZE="${ramsize}"
SWAPSIZE="$(( ramsize * 2 ))"
elif [[ "${ramsize}" -ge "8" ]] && [[ "${ramsize}" -lt "16" ]]; then
SWAPSIZE="${ramsize}"
SWAPSIZE="$(awk "BEGIN { printf(\"%.0f\n\", ${ramsize}*1.5); }")"
elif [[ "${ramsize}" -ge "16" ]]; then
SWAPSIZE="4"
echo "hibernate not recommended, turning off"
HIBERNATE="0"
SWAPSIZE="4"
fi
}
do_partition() {
header "do partition"
start=1
TARGET_PART="1"
if [ "$EFI" == "1" ]; then
parted "${TARGET_PHY_ID}" -s -- mklabel gpt
sleep 2
size=512
parted "${TARGET_PHY_ID}" unit mib -s -- mkpart EFI fat32 "$start" "$(( start + size ))"
parted "${TARGET_PHY_ID}" unit mib -s -- set 1 esp on
sleep 2
start="$(( start + size ))"
parted "${TARGET_PHY_ID}" unit mib -s -- mkpart root ext4 "$start" 100%
mkfs.vfat -I -F32 "${TARGET_PHY_ID}-part1"
TARGET_PART="2"
dd if=/dev/random of="${TARGET_PHY_ID}-part2" bs=512 count=4
else
parted "${TARGET_PHY_ID}" -s -- mklabel msdos
sleep 2
if [ "${ENCRYPTION_STYLE}" == "e" ]; then
size=2048
parted "${TARGET_PHY_ID}" unit mib -s -- mkpart primary ext4 "${start}" "$(( start + size ))"
sleep 2
mkfs.btrfs -q -f "${TARGET_PHY_ID}-part1"
start="$(( start + size ))"
TARGET_PART="2"
fi
parted "${TARGET_PHY_ID}" unit mib -s -- mkpart primary ext4 "$start" -1s
dd if=/dev/random of="${TARGET_PHY_ID}-part${TARGET_PART}" bs=512 count=4
fi
sleep 2
TARGETNAME="$(basename "${TARGET_PHY_ID}-part${TARGET_PART}")"
TARGETNAME_UNDERSCORE="${TARGETNAME//-/_}"
T="${TARGET_PHY_ID}-part${TARGET_PART}"
if [ "${ENCRYPTION_STYLE}" == "a" ] || [ "${ENCRYPTION_STYLE}" == "c" ] || [ "${ENCRYPTION_STYLE}" == "d" ]; then
T="/dev/mapper/luks_${TARGETNAME_UNDERSCORE}"
echo -n "${PASS}" | cryptsetup luksFormat --type luks1 "${TARGET_PHY_ID}-part${TARGET_PART}" -d -
#echo -n "${PASS}" | sudo cryptsetup luksOpen /dev/sdc1 sdc1 -d -
echo -n "${PASS}" | cryptsetup luksOpen "${TARGET_PHY_ID}-part${TARGET_PART}" "luks_${TARGETNAME_UNDERSCORE}" -d -
fi
vgcreate -y --force "vg_${TARGETNAME_UNDERSCORE}" "${T}"
lvcreate -y --name swap -L "${SWAPSIZE}G" "vg_${TARGETNAME_UNDERSCORE}"
lvcreate -y --name root -l 100%FREE "vg_${TARGETNAME_UNDERSCORE}"
mkswap -f "/dev/mapper/vg_${TARGETNAME_UNDERSCORE}-swap"
mkfs.btrfs -q -f "/dev/mapper/vg_${TARGETNAME_UNDERSCORE}-root"
mount "/dev/mapper/vg_${TARGETNAME_UNDERSCORE}-root" "${target}"
btrfs subvol create "${target}/rootfs"
btrfs subvol create "${target}/homefs"
mkdir -p "${target}/system/snapshots/update" "${target}/system/snapshots/regular" "${target}/system/backup"
umount "${target}"
mount "/dev/mapper/vg_${TARGETNAME_UNDERSCORE}-root" "${target}" -o subvol=rootfs
for i in boot home dev proc sys tmp etc var/lib/backup/quelle/rootfs var/lib/backup/ziel var/db; do
mkdir -p "${target}/${i}"
done
mount "/dev/mapper/vg_${TARGETNAME_UNDERSCORE}-root" "${target}/home" -o subvol=homefs
if [ "${EFI}" == "1" ]; then
mkdir -p "${target}/boot/efi"
mount "${TARGET_PHY_ID}-part1" "${target}/boot/efi"
else
if [ "${ENCRYPTION_STYLE}" == "e" ]; then
mkdir -p "${target}/boot" "${target}/var/lib/backup/quelle/bootfs"
mount "${TARGET_PHY_ID}-part1" "${target}/boot"
mkdir -p "${target}/boot/system/snapshots/update" "${target}/boot/system/snapshots/regular" "${target}/boot/system/backup"
btrfs subvol create "${target}/boot/bootfs"
umount "${target}/boot"
mount "${TARGET_PHY_ID}-part1" "${target}/boot" -o subvol=bootfs
fi
fi
}
user() {
header "Username"
input "Username" "voiduser"
USERNAME="${output}"
}
hostname() {
header "Hostname"
input "Hostname" "voidlinux"
HOSTNAME="${output}"
}
base() {
. ./etc/base
packages
reset packages
}
profile() {
for i in $(find ./etc/profile/ -type f|sort); do
profile+=("$(basename "${i}")")
done
if [ "${#profile[@]}" -gt "1" ]; then
header "Select your Profile"
multiplechoice "${profile[@]}"
PROFILE="${output}"
elif [ "${#profile[@]}" -eq "1" ]; then
PROFILE="${profile[0]}"
fi
if ! [ "${#profile[@]}" -eq "0" ]; then
. "./etc/profile/${PROFILE}"
packages
reset packages
cp "./etc/profile/${PROFILE}" "${tmp_target}"
if [ "${need_gfx}" == "1" ]; then
readin gfx
fi
if [ "${need_xserver}" == "1" ]; then
readin xserver
fi
if [ "${need_sound}" == "1" ]; then
readin soundsystem
fi
fi
}
lang() {
header "Sprache"
multiplechoice "de" "en"
LANGUAGE="${output}"
if [ "${LANGUAGE}" == "de" ]; then
L1="de_DE"
L2="de-latin1-nodeadkeys"
fi
}
do_install() {
header "Installation"
mkdir -p "${target}/var/db/xbps/keys"
cp /var/db/xbps/keys/* "${target}/var/db/xbps/keys"
mkdir -p "${target}/etc/xbps.d"
touch "${target}/etc/xbps.d/10-ignore-pkg.conf"
for i in "${ignorepkgs[@]}"; do
echo "ignorepkg=${i}" >> "${target}/etc/xbps.d/10-ignore-pkg.conf"
done
if [ "${DEBUG}" ]; then
xbps-install -S -R https://alpha.de.repo.voidlinux.org/current -r "${target}" "${pkgs[@]}"
else
xbps-install -Sy -R https://alpha.de.repo.voidlinux.org/current -r "${target}" "${pkgs[@]}"
fi
}
do_chroot() {
header "Chroot into new System"
mkdir -p "${target}/tmp/vinstaller/"
mount -t tmpfs -o size=50m tmpfs "${target}/tmp/vinstaller/"
mkdir -p "${target}/tmp/vinstaller/run"
cp ./etc/functions "${target}/tmp/vinstaller/"
cp ./etc/base "${target}/tmp/vinstaller/"
cp -rf "${tmp_target}" "${target}/tmp/vinstaller/run"
echo "USERNAME=${USERNAME}" > "${vars}"
echo "PASS=${PASS}" >> "${vars}"
echo "HOSTNAME=${HOSTNAME}" >> "${vars}"
echo "EFI=${EFI}" >> "${vars}"
echo "LANGUAGE=${LANGUAGE}" >> "${vars}"
echo "L1=${L1}" >> "${vars}"
echo "TARGET_PHY_ID=${TARGET_PHY_ID}" >> "${vars}"
echo "TARGET_PART=${TARGET_PART}" >> "${vars}"
echo "TARGETNAME_UNDERSCORE=${TARGETNAME_UNDERSCORE}" >> "${vars}"
echo "ENCRYPTION_STYLE=${ENCRYPTION_STYLE}" >> "${vars}"
echo "TIMEZONE=${TIMEZONE}" >> "${vars}"
echo "ENC=${ENC}" >> "${vars}"
echo "HIBERNATE=${HIBERNATE}" >> "${vars}"
cat <<EOF > "${target}/tmp/vinstaller/main_chroot"
#!/usr/bin/bash
. /tmp/vinstaller/functions
. /tmp/vinstaller/vars
header base
. /tmp/vinstaller/base
config
reset config
for file in \$(find /tmp/vinstaller/run -type f); do
if grep -q "config()" "\${file}"; then
header \"\$(basename \$file)\"
. \$file
config
reset config
fi
done
EOF
for dir in dev proc sys run; do
mkdir -p "${target}/${dir}"
mount --rbind "/${dir}" "${target}/${dir}"
mount --make-rslave "${target}/${dir}"
done
chmod +x "${target}/tmp/vinstaller/main_chroot"
chroot "${target}" "/tmp/vinstaller/main_chroot"
}
ready() {
header "Ready!!"
echo ""
echo "pakete:"
echo "${pkgs[@]}"
echo ""
echo "vars:"
cat ${vars}
echo ""
}
target_phy_disk
target_phy_id
use_efi
encryption_style
hibernation
readin bootloader
user
lang
hostname
base
profile
readin network
readin printing
do_partition
do_install
do_chroot
ready