Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
This commit is contained in:
Georg Pfuetzenreuter 2022-11-29 12:27:06 +01:00
commit 15042704b9
Signed by: Georg
GPG Key ID: 1ED2F138E7E6FF57
8 changed files with 277 additions and 0 deletions

12
README.md Normal file
View File

@ -0,0 +1,12 @@
This houses scripts to install openSUSE from within another GNU/Linux distribution. Useful for VPS hosting providers not offering an option to upload custom ISO images.
Example for OVH's Debian based "rescue system":
```
./boostrap-ovh.sh /dev/sdb bios toor unlock
```
Where `/dev/sdb` is the disk to install the system on (it will be wiped), `bios` is the boot mode (alternative would be `efi`), `toor` is the root passphrase, and `unlock` is the LUKS passphrase.
There is lots to be improved in the bootstrap script to make it more universal - currently it's assuming a configuration I personally like.
Known bugs:
- after the first boot, the crypto disk might not be found - reboot, ./rescue.sh, `dracut '' $kernel -f`, reboot

5
bootstrap-ovh.sh Normal file
View File

@ -0,0 +1,5 @@
#!/bin/sh
set -Ceux
apt install -y btrfs-progs cryptsetup zypper
./bootstrap.sh "$1" "$2" "$3" "$4"

177
bootstrap.sh Executable file
View File

@ -0,0 +1,177 @@
#!/bin/sh
set -Ceu
disk="$1"
mode="$2"
rootpass="$3"
lukspass="$4"
if [ -z "$disk" ]
then
echo 'Please specify a disk.'
exit 1
fi
if [ ! -b "$disk" ]
then
echo 'Specified disk cannot possibly be a disk.'
exit 1
fi
if [ -z "$mode" ]
then
mode='bios'
fi
if [ "$mode" = 'efi']
then
if [ ! -d "$fstab-mode" ]
then
echo 'Please provide your own fstab script.'
exit 1
fi
fi
if ! command -v mkfs.btrfs
then
echo 'BtrFS progs not installed.'
exit 1
fi
if ! command -v zypper
then
echo 'Zypper not installed.'
exit 1
fi
if ! command -v cryptsetup
then
echo 'Cryptsetup not installed.'
exit 1
fi
bios='1'
boot='2'
swap='3'
root='4'
echo 'Wiping your data ...'
fdisk -w always "$disk" < "fdisk-$mode"
echo 'Formatting encrypted partitions ...'
./makeluks.sh "$disk" "$lukspass"
echo 'Creating filesystems ...'
mkfs.btrfs -f "${disk}${boot}"
mkfs.btrfs /dev/mapper/cr_root
echo 'Mount root ...'
mount /dev/mapper/cr_root /mnt
echo 'Creating subvolumes ...'
./makesubvols.sh
btrfs subvolume set-default $(btrfs subvolume list /mnt | grep "@/.snapshots/1/snapshot" | grep -oP '(?<=ID )[0-9]+') /mnt
echo 'Remounting root ...'
umount /mnt
mount /dev/mapper/cr_root /mnt
echo 'Creating directory structure ...'
set -x
mkdir /mnt/.snapshots
mkdir /mnt/home
mkdir /mnt/opt
mkdir /mnt/root
mkdir /mnt/srv
mkdir /mnt/tmp
mkdir /mnt/usr
mkdir /mnt/usr/local
mkdir /mnt/var
set +x
echo 'Mounting subvolumes ...'
./mountsubvols.sh
echo 'Mounting boot ...'
mkdir /mnt/boot
mount "${disk}${boot}" /mnt/boot
mkdir /mnt/boot/grub2
mkdir /mnt/boot/grub2/i386-pc
echo 'Mounting slaves ...'
for dir in proc sys dev run
do
mkdir "/mnt/$dir"
done
mount --types proc /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --make-rslave /mnt/sys
mount --rbind /dev /mnt/dev
mount --make-rslave /mnt/dev
mount --bind /run /mnt/run
mount --make-slave /mnt/run
echo 'Enabling swap partition ...'
mkswap /dev/mapper/cr_swap
swapon /dev/mapper/cr_swap
echo 'Bootstrapping packages ...'
zypper --root /mnt ar --refresh https://download.opensuse.org/distribution/leap/15.4/repo/oss/ OSS
zypper --root /mnt ref
zypper -n --root /mnt in --no-recommends \
kernel-default grub2 zypper vim-small shadow util-linux wicked iputils btrfsprogs openssh-server dmraid openSUSE-release openSUSE-build-key ca-certificates
echo 'Generating fstab ...'
rootuuid="$(blkid -o value -s UUID /dev/mapper/cr_root)"
swapuuid="$(blkid -o value -s UUID /dev/mapper/cr_swap)"
bootuuid="$(blkid -o value -s UUID ${disk}${boot})"
tee /mnt/etc/fstab <<EOF
UUID=$rootuuid / btrfs defaults 0 0
UUID=$bootuuid /boot btrfs defaults 0 0
#UUID=$swapuuid swap swap defaults 0 0
UUID=$rootuuid /.snapshots btrfs subvol=/@/.snapshots 0 0
UUID=$rootuuid /var btrfs subvol=/@/var 0 0
UUID=$rootuuid /usr/local btrfs subvol=/@/usr/local 0 0
UUID=$rootuuid /tmp btrfs subvol=/@/tmp 0 0
UUID=$rootuuid /srv btrfs subvol=/@/srv 0 0
UUID=$rootuuid /root btrfs subvol=/@/root 0 0
UUID=$rootuuid /opt btrfs subvol=/@/opt 0 0
UUID=$rootuuid /home btrfs subvol=/@/home 0 0
EOF
echo 'Generating crypttab ...'
rawswapuuid="$(blkid -o value -s UUID ${disk}${swap})"
tee /mnt/etc/crypttab <<EOF
cr_swap UUID=$rawswapuuid /dev/urandom swap
EOF
echo 'Writing network configuration ...'
tee /mnt/etc/sysconfig/network/ifcfg-eth0 <<EOF
BOOTPROTO=dhcp
STARTMODE=auto
EOF
echo 'Installing bootloader ...'
kernel="$(ls /mnt/lib/modules)"
sed -i -e 's/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="splash=verbose loglevel=3"/' /mnt/etc/default/grub
chroot /mnt <<EOS
dracut '' $kernel
grub2-install $disk
grub2-mkconfig -o /boot/grub2/grub.cfg
echo 'Setting root passphrase ...'
echo 'root:$rootpass' | chpasswd
echo 'Enabling sshd ...'
systemctl enable sshd
EOS
if [ "$mode" = 'efi' ]; then
echo 'Installing shim ...'
chroot /mnt <<EOS
shim-install --config-file=/boot/grub2/grub.cfg
EOS
fi
echo 'Entering chroot for manual tasks ...'
chroot /mnt
echo 'Unmounting ...'
umount -R /mnt
cryptsetup luksClose cr_root
cryptsetup luksClose cr_swap

21
fdisk-bios Normal file
View File

@ -0,0 +1,21 @@
g
n
1
+1M
t
4
n
2
+512M
n
3
+1G
n
4
p
w

12
makeluks.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/sh
set -Ceux
partswap="${1}3"
partroot="${1}4"
lukspass="$2"
echo "$lukspass" | cryptsetup -q luksFormat "$partswap"
echo "$lukspass" | cryptsetup -q luksFormat "$partroot"
echo "$lukspass" | cryptsetup -q luksOpen "$partswap" cr_swap
echo "$lukspass" | cryptsetup -q luksOpen "$partroot" cr_root

15
makesubvols.sh Executable file
View File

@ -0,0 +1,15 @@
#!/bin/sh
set -Ceux
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@/.snapshots
mkdir /mnt/@/.snapshots/1
btrfs subvolume create /mnt/@/.snapshots/1/snapshot
btrfs subvolume create /mnt/@/home
btrfs subvolume create /mnt/@/opt
btrfs subvolume create /mnt/@/root
btrfs subvolume create /mnt/@/srv
btrfs subvolume create /mnt/@/tmp
mkdir /mnt/@/usr/
btrfs subvolume create /mnt/@/usr/local
btrfs subvolume create /mnt/@/var

11
mountsubvols.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/sh
set -Ceux
mount /dev/mapper/cr_root /mnt/.snapshots -o subvol=@/.snapshots
mount /dev/mapper/cr_root /mnt/home -o subvol=@/home
mount /dev/mapper/cr_root /mnt/opt -o subvol=@/opt
mount /dev/mapper/cr_root /mnt/root -o subvol=@/root
mount /dev/mapper/cr_root /mnt/srv -o subvol=@/srv
mount /dev/mapper/cr_root /mnt/tmp -o subvol=@/tmp
mount /dev/mapper/cr_root /mnt/usr/local -o subvol=@/usr/local
mount /dev/mapper/cr_root /mnt/var -o subvol=@/var

24
rescue.sh Normal file
View File

@ -0,0 +1,24 @@
#!/bin/sh
set -Ceu
cryptsetup luksOpen "$1" cr_root
mount /dev/mapper/cr_root /mnt
mount /dev/mapper/cr_root /mnt/.snapshots -o subvol=@/.snapshots
mount /dev/mapper/cr_root /mnt/home -o subvol=@/home
mount /dev/mapper/cr_root /mnt/opt -o subvol=@/opt
mount /dev/mapper/cr_root /mnt/root -o subvol=@/root
mount /dev/mapper/cr_root /mnt/srv -o subvol=@/srv
mount /dev/mapper/cr_root /mnt/tmp -o subvol=@/tmp
mount /dev/mapper/cr_root /mnt/usr/local -o subvol=@/usr/local
mount /dev/mapper/cr_root /mnt/var -o subvol=@/var
mount "$2" /mnt/boot
mount --types proc /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --make-rslave /mnt/sys
mount --rbind /dev /mnt/dev
mount --make-rslave /mnt/dev
mount --bind /run /mnt/run
mount --make-slave /mnt/run
chroot /mnt