This commit is contained in:
Jan Beníček 2025-07-02 17:31:50 +02:00
parent 7a0090efa7
commit af256190a9

149
install.sh Normal file
View file

@ -0,0 +1,149 @@
#!/bin/bash
set -euo pipefail
### === Uživatelské proměnné === ###
DISK1="/dev/sdX" # např. /dev/sda nebo /dev/nvme0n1
DISK2="/dev/sdY" # např. /dev/sdb nebo /dev/nvme1n1
HOSTNAME="zfs-server"
ZFS_POOL="rpool"
ZFS_BOOTFS="ubuntu-noble"
ZBM_VERSION="2.4.0"
MOUNTPOINT="/mnt"
UBUNTU_SUITE="noble"
TIMEZONE="Europe/Prague"
LOCALE="cs_CZ.UTF-8"
KEYMAP="cz"
DEBIAN_MIRROR="http://cz.archive.ubuntu.com/ubuntu"
### ============================ ###
ZFS_OPTS_POOL="-o ashift=12 -o autotrim=on"
ZFS_OPTS_DATASETS="-O acltype=posixacl -O xattr=sa -O compression=zstd -O relatime=on -O normalization=formD -O dnodesize=auto -O atime=off -O mountpoint=none -O canmount=off"
echo "== Čištění disků =="
for DISK in "$DISK1" "$DISK2"; do
sgdisk --zap-all "$DISK"
dd if=/dev/zero of="$DISK" bs=512 count=2048
wipefs -a "$DISK"
done
echo "== Vytváření GPT tabulky a oddílů =="
for DISK in "$DISK1" "$DISK2"; do
sgdisk -n1:1M:+1G -t1:EF00 -c1:"EFI System Partition" "$DISK"
sgdisk -n2:0:0 -t2:BF00 -c2:"ZFS root" "$DISK"
done
PART1_DISK1=$(ls ${DISK1}* | grep -E "${DISK1}p?1$")
PART1_DISK2=$(ls ${DISK2}* | grep -E "${DISK2}p?1$")
PART2_DISK1=$(ls ${DISK1}* | grep -E "${DISK1}p?2$")
PART2_DISK2=$(ls ${DISK2}* | grep -E "${DISK2}p?2$")
echo "== Formátování EFI oddílů =="
mkfs.vfat -F32 -n EFI "$PART1_DISK1"
mkfs.vfat -F32 -n EFI "$PART1_DISK2"
echo "== Vytváření ZFS poolu ($ZFS_POOL) =="
zpool create -f $ZFS_OPTS_POOL $ZFS_OPTS_DATASETS \
-R "$MOUNTPOINT" \
"$ZFS_POOL" mirror "$PART2_DISK1" "$PART2_DISK2"
zfs create "$ZFS_POOL/ROOT"
zfs create -o mountpoint=/ "$ZFS_POOL/ROOT/$ZFS_BOOTFS"
zfs create -o mountpoint=/home "$ZFS_POOL/home"
zfs create -o mountpoint=/var "$ZFS_POOL/var"
zfs create -o mountpoint=/var/log "$ZFS_POOL/var/log"
zfs create -o mountpoint=/var/tmp "$ZFS_POOL/var/tmp"
zfs create -o mountpoint=/var/cache "$ZFS_POOL/var/cache"
zfs create -o mountpoint=/var/lib "$ZFS_POOL/var/lib"
zfs create -o mountpoint=/srv "$ZFS_POOL/srv"
zfs create -o mountpoint=/tmp "$ZFS_POOL/tmp"
zfs set canmount=noauto "$ZFS_POOL/ROOT/$ZFS_BOOTFS"
zfs mount "$ZFS_POOL/ROOT/$ZFS_BOOTFS"
mkdir -p "$MOUNTPOINT"/{boot/efi,home,var/log,var/tmp,var/cache,var/lib,srv,tmp}
echo "== Montování EFI oddílů =="
mount "$PART1_DISK1" "$MOUNTPOINT/boot/efi"
echo "== Bootstrap Ubuntu base systému =="
debootstrap --components=main,universe --arch=amd64 "$UBUNTU_SUITE" "$MOUNTPOINT" "$DEBIAN_MIRROR"
echo "== Příprava chroot prostředí =="
mount --rbind /dev "$MOUNTPOINT/dev"
mount --rbind /proc "$MOUNTPOINT/proc"
mount --rbind /sys "$MOUNTPOINT/sys"
cp /etc/resolv.conf "$MOUNTPOINT/etc/"
cat <<EOF > "$MOUNTPOINT/root/post-chroot.sh"
#!/bin/bash
set -e
export HOSTNAME="$HOSTNAME"
export ZFS_POOL="$ZFS_POOL"
export ZFS_BOOTFS="$ZFS_BOOTFS"
export TIMEZONE="$TIMEZONE"
export LOCALE="$LOCALE"
export KEYMAP="$KEYMAP"
export ZBM_VERSION="$ZBM_VERSION"
echo "\$HOSTNAME" > /etc/hostname
ln -sf /usr/share/zoneinfo/\$TIMEZONE /etc/localtime
apt update
apt install -y locales keyboard-configuration console-setup
sed -i "s/# \$LOCALE UTF-8/\$LOCALE UTF-8/" /etc/locale.gen
locale-gen
update-locale LANG=\$LOCALE
echo "KEYMAP=\$KEYMAP" > /etc/vconsole.conf
apt install -y linux-image-generic zfs-initramfs zfsutils-linux zfs-zed \
dosfstools grub-efi-amd64 shim-signed efibootmgr curl
zfs set canmount=noauto \$ZFS_POOL/ROOT/\$ZFS_BOOTFS
zfs mount \$ZFS_POOL/ROOT/\$ZFS_BOOTFS
zfs set mountpoint=/ \$ZFS_POOL/ROOT/\$ZFS_BOOTFS
zpool set bootfs=\$ZFS_POOL/ROOT/\$ZFS_BOOTFS \$ZFS_POOL
useradd -m -s /bin/bash ubuntu
echo "ubuntu:ubuntu" | chpasswd
adduser ubuntu sudo
echo "⚠️ Výchozí heslo pro uživatele 'ubuntu' je 'ubuntu'. Změň ho po restartu."
echo "== Instalace GRUB na oba disky =="
grub-install --target=x86_64-efi --efi-directory=/boot/efi \
--removable --recheck --bootloader-id=ubuntu
update-grub
echo "== Instalace ZFSBootMenu (volitelný fallback) =="
mkdir -p /boot/efi/EFI/ZBM
curl -L https://github.com/zbm-dev/zfsbootmenu/releases/download/v\$ZBM_VERSION/zfsbootmenu-efi-\$ZBM_VERSION-x86_64.EFI -o /boot/efi/EFI/ZBM/ZBM.EFI
cat <<GRUBENTRY >> /etc/grub.d/40_custom
menuentry "ZFSBootMenu" {
insmod part_gpt
insmod fat
insmod chain
search --no-floppy --label EFI --set=root
chainloader /EFI/ZBM/ZBM.EFI
}
GRUBENTRY
update-grub
echo "== Hotovo. Nyní spusť: exit && umount a export poolu"
EOF
chmod +x "$MOUNTPOINT/root/post-chroot.sh"
echo
echo "=========================="
echo "✅ Chroot a konfigurace:"
echo "sudo chroot $MOUNTPOINT /bin/bash"
echo "/root/post-chroot.sh"
echo
echo "Poté ukonči chroot a spusť:"
echo "umount -l $MOUNTPOINT/dev $MOUNTPOINT/proc $MOUNTPOINT/sys $MOUNTPOINT/boot/efi"
echo "zpool export $ZFS_POOL"
echo "=========================="