ubuntu-20.04: Installation script.
This commit is contained in:
parent
2aa2229c5e
commit
095166fe6d
236
ubuntu-20.04/install-zfs-luks.sh
Normal file
236
ubuntu-20.04/install-zfs-luks.sh
Normal file
|
@ -0,0 +1,236 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Boot Live CD
|
||||||
|
# Start terminal
|
||||||
|
# sudo su -
|
||||||
|
# apt update
|
||||||
|
# apt install openssh-server
|
||||||
|
# passwd ubuntu
|
||||||
|
|
||||||
|
password=${password:-MyLUKSPassword}
|
||||||
|
hostname=${hostname:-myhostname}
|
||||||
|
DISK=${DISK:-/dev/disk/by-id/ata-ST1000LM024_HN-M101MBB_S2R8JX0D400082}
|
||||||
|
|
||||||
|
export password
|
||||||
|
export DISK
|
||||||
|
|
||||||
|
install_build_software() {
|
||||||
|
apt-add-repository universe
|
||||||
|
apt update
|
||||||
|
apt install --yes debootstrap gdisk zfs-initramfs cryptsetup-bin
|
||||||
|
}
|
||||||
|
|
||||||
|
partitiondisk() {
|
||||||
|
sgdisk --zap-all $DISK
|
||||||
|
sgdisk -n2:1M:+512M -t2:EF00 $DISK
|
||||||
|
sgdisk -a 4096 -n3:0:+2G -t3:BF01 $DISK
|
||||||
|
# TODO better way to find the max size rounded to 8192
|
||||||
|
sgdisk -a 4096 -n4:0:1953521663 -t4:8300 $DISK
|
||||||
|
fdisk -l $DISK
|
||||||
|
# Needed for partitiontable to be visible
|
||||||
|
sleep 5
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_zpool_for_boot() {
|
||||||
|
zpool create -f -o ashift=12 -d \
|
||||||
|
-o feature@async_destroy=enabled \
|
||||||
|
-o feature@bookmarks=enabled \
|
||||||
|
-o feature@embedded_data=enabled \
|
||||||
|
-o feature@empty_bpobj=enabled \
|
||||||
|
-o feature@enabled_txg=enabled \
|
||||||
|
-o feature@extensible_dataset=enabled \
|
||||||
|
-o feature@filesystem_limits=enabled \
|
||||||
|
-o feature@hole_birth=enabled \
|
||||||
|
-o feature@large_blocks=enabled \
|
||||||
|
-o feature@lz4_compress=enabled \
|
||||||
|
-o feature@spacemap_histogram=enabled \
|
||||||
|
-o feature@userobj_accounting=enabled \
|
||||||
|
-o overlay=on \
|
||||||
|
-O acltype=posixacl -O canmount=off -O compression=lz4 -O devices=off \
|
||||||
|
-O normalization=formD -O relatime=on -O xattr=sa \
|
||||||
|
-O mountpoint=/ -R /mnt bpool ${DISK}-part3
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_zpool_for_root() {
|
||||||
|
cryptsetup luksClose luks1
|
||||||
|
echo "$password" | cryptsetup -y -v luksFormat --sector-size 4096 \
|
||||||
|
--pbkdf-memory 4000000 --pbkdf argon2id --iter-time 3000 \
|
||||||
|
${DISK}-part4
|
||||||
|
echo "$password" | cryptsetup luksOpen ${DISK}-part4 luks1
|
||||||
|
zpool create -o ashift=12 \
|
||||||
|
-O acltype=posixacl -O canmount=off -O compression=lz4 \
|
||||||
|
-O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa \
|
||||||
|
-O mountpoint=/ -R /mnt rpool /dev/mapper/luks1
|
||||||
|
}
|
||||||
|
|
||||||
|
create_zfs_mounts() {
|
||||||
|
zfs create -o canmount=off -o mountpoint=none rpool/ROOT
|
||||||
|
zfs create -o canmount=off -o mountpoint=none bpool/BOOT
|
||||||
|
|
||||||
|
zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/ubuntu
|
||||||
|
zfs mount rpool/ROOT/ubuntu
|
||||||
|
|
||||||
|
zfs create -o canmount=noauto -o mountpoint=/boot bpool/BOOT/ubuntu
|
||||||
|
zfs mount bpool/BOOT/ubuntu
|
||||||
|
}
|
||||||
|
|
||||||
|
bootstrap_debian() {
|
||||||
|
debootstrap focal /mnt
|
||||||
|
# Do not allow device files in rpool (why?)
|
||||||
|
zfs set devices=off rpool
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
make_stage2() {
|
||||||
|
cat <<_stage2_eof >/mnt/stage2.sh
|
||||||
|
set_hostname() {
|
||||||
|
echo $hostname > etc/hostname
|
||||||
|
echo 127.0.1.1 $hostname >> etc/hosts
|
||||||
|
}
|
||||||
|
|
||||||
|
add_apt_sources() {
|
||||||
|
perl -pe 's/\s*$/\n/' <<EOF > etc/apt/sources.list
|
||||||
|
deb http://archive.ubuntu.com/ubuntu focal main universe
|
||||||
|
deb-src http://archive.ubuntu.com/ubuntu focal main universe
|
||||||
|
|
||||||
|
deb http://security.ubuntu.com/ubuntu focal-security main universe
|
||||||
|
deb-src http://security.ubuntu.com/ubuntu focal-security main universe
|
||||||
|
|
||||||
|
deb http://archive.ubuntu.com/ubuntu focal-updates main universe
|
||||||
|
deb-src http://archive.ubuntu.com/ubuntu focal-updates main universe
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ln -s /proc/self/mounts /etc/mtab
|
||||||
|
apt update
|
||||||
|
|
||||||
|
locale-gen --purge "en_US.UTF-8"
|
||||||
|
update-locale LANG=en_US.UTF-8 LANGUAGE=en_US
|
||||||
|
dpkg-reconfigure --frontend noninteractive locales
|
||||||
|
|
||||||
|
#dpkg-reconfigure tzdata
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
install_initrd_tools() {
|
||||||
|
apt install --yes nano
|
||||||
|
apt install linux-modules-5.4.0-26-generic
|
||||||
|
apt install --yes --no-install-recommends linux-image-generic
|
||||||
|
apt install --yes zfs-initramfs
|
||||||
|
apt install --yes grub-efi-amd64
|
||||||
|
}
|
||||||
|
|
||||||
|
install_luks() {
|
||||||
|
apt install --yes cryptsetup
|
||||||
|
# Add LUKS device for root in /etc/crypttab
|
||||||
|
echo luks1 UUID=$(blkid -s UUID -o value ${DISK}-part4) none \
|
||||||
|
luks,discard,initramfs > /etc/crypttab
|
||||||
|
}
|
||||||
|
|
||||||
|
install_efi() {
|
||||||
|
umount /boot/efi
|
||||||
|
apt install dosfstools
|
||||||
|
mkdosfs -F 32 -s 1 -n EFI ${DISK}-part2
|
||||||
|
mkdir -p /boot/efi
|
||||||
|
echo PARTUUID=$(blkid -s PARTUUID -o value ${DISK}-part2) \
|
||||||
|
/boot/efi vfat nofail,x-systemd.device-timeout=1 0 1 >> /etc/fstab
|
||||||
|
mount /boot/efi
|
||||||
|
apt install --yes grub-efi-amd64-signed shim-signed
|
||||||
|
}
|
||||||
|
|
||||||
|
install_zfs_systemd_service() {
|
||||||
|
perl -pe 's/\s*$/\n/' <<EOF > /etc/systemd/system/zfs-import-bpool.service
|
||||||
|
[Unit]
|
||||||
|
DefaultDependencies=no
|
||||||
|
Before=zfs-import-scan.service
|
||||||
|
Before=zfs-import-cache.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/sbin/zpool import -N -o cachefile=none bpool
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=zfs-import.target
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl enable zfs-import-bpool.service
|
||||||
|
}
|
||||||
|
|
||||||
|
adduser_group() {
|
||||||
|
addgroup --system lpadmin
|
||||||
|
addgroup --system sambashare
|
||||||
|
echo "root:$password" | chpasswd
|
||||||
|
}
|
||||||
|
|
||||||
|
install_grub() {
|
||||||
|
grub-probe /boot
|
||||||
|
|
||||||
|
echo "### These are OK:"
|
||||||
|
echo " cryptsetup: ERROR: Couldn't resolve device rpool/ROOT/ubuntu"
|
||||||
|
echo " cryptsetup: WARNING: Couldn't determine root device"
|
||||||
|
update-initramfs -c -k all
|
||||||
|
|
||||||
|
(
|
||||||
|
echo GRUB_TERMINAL=console
|
||||||
|
echo GRUB_TIMEOUT=5
|
||||||
|
echo 'GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/ubuntu"'
|
||||||
|
echo GRUB_TIMEOUT_STYLE=''
|
||||||
|
echo 'GRUB_CMDLINE_LINUX_DEFAULT=""'
|
||||||
|
echo GRUB_TIMEOUT=5
|
||||||
|
) >>/etc/default/grub
|
||||||
|
|
||||||
|
update-grub
|
||||||
|
|
||||||
|
grub-install --target=x86_64-efi --efi-directory=/boot/efi \
|
||||||
|
--bootloader-id=ubuntu --recheck --no-floppy
|
||||||
|
}
|
||||||
|
|
||||||
|
ready_for_first_boot() {
|
||||||
|
zpool export bpool
|
||||||
|
zpool export rpool
|
||||||
|
echo "Now reboot"
|
||||||
|
echo "You may have to do this on first boot"
|
||||||
|
echo " zpool import -f bpool"
|
||||||
|
echo " zpool import -f rpool"
|
||||||
|
}
|
||||||
|
|
||||||
|
stage2() {
|
||||||
|
set_hostname
|
||||||
|
add_apt_sources
|
||||||
|
install_initrd_tools
|
||||||
|
install_luks
|
||||||
|
install_efi
|
||||||
|
install_zfs_systemd_service
|
||||||
|
adduser_group
|
||||||
|
install_grub
|
||||||
|
ready_for_first_boot
|
||||||
|
}
|
||||||
|
|
||||||
|
stage2
|
||||||
|
_stage2_eof
|
||||||
|
}
|
||||||
|
|
||||||
|
stage1() {
|
||||||
|
install_build_software
|
||||||
|
partitiondisk
|
||||||
|
setup_zpool_for_boot
|
||||||
|
setup_zpool_for_root
|
||||||
|
create_zfs_mounts
|
||||||
|
bootstrap_debian
|
||||||
|
make_stage2
|
||||||
|
}
|
||||||
|
|
||||||
|
doall() {
|
||||||
|
stage1
|
||||||
|
mount --rbind /dev /mnt/dev
|
||||||
|
mount --rbind /proc /mnt/proc
|
||||||
|
mount --rbind /sys /mnt/sys
|
||||||
|
chroot /mnt /usr/bin/env DISK=$DISK bash -x /stage2.sh
|
||||||
|
|
||||||
|
umount /mnt/boot || umount -l /mnt/boot
|
||||||
|
zpool export bpool || zpool export -f bpool
|
||||||
|
umount /mnt || umount -l /mnt
|
||||||
|
zpool export rpool || zpool export -f rpool
|
||||||
|
}
|
Loading…
Reference in a new issue