Получение Ubuntu 16.04 в корне ZFS на выделенном сервере Hetzner
К настоящему времени вполне возможно запустить Ubuntu 16.04 на root-fs ZFS. Ubuntu 16.04 имеет ZFS в менеджере пакетов по умолчанию, и с такими руководствами нетрудно начать.
Однако все руководства, которые я видел, требуют загрузки с установочного образа Ubuntu. Для выделенного сервера Hetzner это необычная процедура установки, так как она требует, чтобы инженеры посетили сервер и подключили удаленный KVM.
По умолчанию выделенные серверы загружаются в спасательную систему, которая позволяет устанавливать различные дистрибутивы Linux с помощью сценария 'installiamge'. Однако этот скрипт пока не поддерживает ZFS.
Как получить выделенный сервер Hetzner, работающий в корне ZFS?
2 ответа
Основная идея состоит в том, чтобы установить Ubuntu в небольшой раздел на жестком диске, разделить жесткий диск, чтобы использовать оставшееся место для ZFS, а затем скопировать установку. Я в основном использую это руководство по инструкции, как это сделать.
Ленивый, а опыт работы с Ansible? Я написал небольшой стек сценариев для автоматизации этих шагов. Они доступны на: https://github.com/tijszwinkels/hetzner-ubuntu-16.04-zfs-root-ansible/blob/master/hetzner-ubuntu-16.04.yml Будьте осторожны, эти сценарии предполагают, что хост загружается в спасательная система Hetzner, и они будут стирать ваши диски в качестве первого шага. Используйте на свой риск!
# SSH into the host.
# Wipe the drives. Assuming SSDs on 'sda' and 'sdb'.
/sbin/blkdiscard /dev/sda
/sbin/blkdiscard /dev/sdb
# Install Ubuntu 16.04 on a 4G partition using the Hetzner 'installimage' script
/root/.oldroot/nfs/install/installimage -a -n my-hostname -r yes -l 1 -p /:ext4:4G -K /root/.ssh/robot_user_keys -i /root/.oldroot/nfs/install/../images/Ubuntu-1604-xenial-64-minimal.tar.gz
# Reboot the system.
/sbin/shutdown -r now
# Wait for the host to come back up, and SSH in.
# Install the 'parted' parition editor
apt-get update && apt-get install -y parted
# Run parted on the first drive, create a partition in all remaining space. (UNTESTED!)
sudo parted /dev/sda
(parted) mkpart primary 4097MB -1s
(parted) quit
# Run parted on the second drive, create a partition in all remaining space. (UNTESTED!)
sudo parted /dev/sdb
(parted) mkpart primary 4097MB -1s
(parted) quit
# Install required ZFS packages
apt-get install -y zfs-dkms zfs-initramfs
# Create a ZFS pool named 'tank'
# Please note that I'm using the /dev/disk/by-id interface. This is more resilient than /dev/sda and /dev/sdb
zpool create -f -o ashift=13 -O atime=off -O dedup=off -O compression=lz4 tank mirror `ls /dev/disk/by-id/ata-*-part2`
# Create OS partiton
zfs create tank/os
# Rsync the current system to the new partition.
rsync -a --one-file-system / /tank/os/
# Chroot into the system
cd /tank/os
mount --bind /dev dev
mount --bind /proc proc
mount --bind /sys sys
mount --bind /run run
chroot .
# Install GRUB into the drives
export ZPOOL_VDEV_NAME_PATH=YES
update-grub
grub-install /dev/sda
grub-install /dev/sdb
Теперь у вас должен быть выделенный сервер Hetzner, который с радостью загружается в Ubuntu 16.04 с корневой файловой системой ZFS. Удачи!
Великолепный гид, спасибо @TinkerTank.
Если вы используете один из более новых серверов NVMe и следуете этому руководству, вы можете использовать эти шаги и имена устройств:
# Boot into rescue from Robot
# SSH into the host.
# Wipe the drives. Assuming SSDs on 'sda' and 'sdb'.
# For SSD Servers
#/sbin/blkdiscard /dev/sda
#/sbin/blkdiscard /dev/sdb
# For NVMe Servers
/sbin/blkdiscard /dev/nvme0n1
/sbin/blkdiscard /dev/nvme1n1
# Install Ubuntu 16.04 on a 16G partition using the Hetzner 'installimage' script
# For Ubuntu 18.04 it should be this, but FAILS TO BOOT
#/root/.oldroot/nfs/install/installimage -a -n my-hostname -r yes -l 1 -p /:ext4:16G -K /root/.ssh/robot_user_keys -i /root/.oldroot/nfs/install/../images/Ubuntu-1804-bionic-64-minimal.tar.gz
# For Ubuntu 16.04:
/root/.oldroot/nfs/install/installimage -a -n my-hostname -r yes -l 1 -p /:ext4:16G -K /root/.ssh/robot_user_keys -i /root/.oldroot/nfs/install/../images/Ubuntu-1604-xenial-64-minimal.tar.gz
# Press x to continue immediately or wait a few seconds...
# Reboot the system.
#/sbin/shutdown -r now
reboot
# Wait for the host to come back up, and SSH in.
# Update the server
apt update
apt upgrade
# Create a partition on first disk with all the remaining space.
fdisk /dev/nvme0n1
# Press n then accept all defaults and save with w
# Create a partition on the second disk with all remaining space.
fdisk /dev/nvme1n1
Press n then accept all defaults and save with w
reboot
# Install required ZFS packages
apt install zfsutils-linux
# Create a ZFS pool named 'tank'
# Please note that I'm using the /dev/disk/by-id interface. This is more resilient than /dev/sda and /dev/sdb
# For SSD servers @hetznet: zpool create -f -o ashift=13 -O atime=off -O dedup=off -O compression=lz4 tank mirror `ls /dev/disk/by-id/ata-*-part2`
# For NVMe servers:
zpool create -f -o ashift=13 -O atime=off -O dedup=off -O compression=lz4 tank mirror nvme0n1p2 nvme1n1p2
# Create OS partition
zfs create tank/os
# Rsync the current system to the new partition.
rsync -a --one-file-system / /tank/os/
# Chroot into the system
cd /tank/os
mount --bind /dev dev
mount --bind /proc proc
mount --bind /sys sys
mount --bind /run run
chroot .
# Install GRUB into the drives
export ZPOOL_VDEV_NAME_PATH=YES
update-grub
# For SSD Servers:
#grub-install /dev/sda
#grub-install /dev/sdb
# For NVMe servers:
grub-install /dev/nvme0n1p2
grub-install /dev/nvme1n1p2
exit
reboot
Теперь у вас должен быть выделенный сервер Hetzner, который с радостью загружается в Ubuntu 16.04 с корневой файловой системой ZFS. Удачи!
Работает без проблем на Ubuntu 16.04, не загружается на Ubuntu 18.04. Кто-нибудь знает почему и как это решить?
Обратите внимание: вместо 4 ГБ пространства на жестком диске, указанного в исходном руководстве, я запускаю исходную ОС на разделе 16 ГБ. Более новые серверы поставляются как минимум с 2 x 512 ГБ NVMe, поэтому вы можете преобразовать эти 2 x 16 разделов в 2 x 16 ГБ SWAP-разделы, которые ядро Linux будет разделять самостоятельно (быстрее, чем при использовании одного отдельного раздела Raid).