====== Ubuntu on ZFS root ======
{{tag>[zfs ubuntu]}}
* https://github.com/zfsonlinux/zfs/wiki/Ubuntu-16.10-Root-on-ZFS
===== Livecd =====
boot live cd and
sudo su
passwd ubuntu
apt-add-repository universe
apt update
apt install openssh-server
# connect from another PC via ssh
apt install --yes debootstrap gdisk zfs-initramfs
===== Disk =====
Reset disk and create GPT partition schema
DISK=/dev/disk/by-id/ata-HFS512G39MND-3510A_FJ64N5235113A4S13
sgdisk --clear -g $DISK
Prepare partitions
# Run this if you need legacy (BIOS) booting:
sgdisk -a1 -n2:34:2047 -t2:EF02 $DISK
# Run this for UEFI booting or raidz pool:
sgdisk -n3:1M:+512M -t3:EF00 $DISK
parted $DISK set 3 bios_grub on # needed for embedding grub in this partition
# and after run these:
sgdisk -n9:-8M:0 -t9:BF07 $DISK
sgdisk -n1:0:0 -t1:BF01 $DISK
Create pool or ...
zpool create -o ashift=12 \
-O atime=off -O canmount=off -O compression=lz4 -O normalization=formD \
-O mountpoint=/ -R /mnt -f \
rpool ${DISK}-part1
... import existing pool
zpool export rpool
zpool import -R /mnt rpool
... umount everything inside /mnt and remove subfolders
zfs mount rpool/ROOT/ubuntu
or create raidz pool
zpool create -O atime=off -O mountpoint=/ -R /mnt -O canmount=off -O compression=lz4 -O normalization=formD -o ashift=12 \
rpool raidz /dev/disk/by-id/ata-ST4000NM0035-1V4107_ZC10????-part1
===== System install =====
create filesystem dataset to act as container
zfs create -o canmount=off -o mountpoint=none rpool/ROOT
create filesystem for root
zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/ubuntu
zfs mount rpool/ROOT/ubuntu
create other filesystems
zfs create -o setuid=off rpool/home
#zfs create -o canmount=off -o setuid=off -o exec=off rpool/var
#zfs create -o com.sun:auto-snapshot=false -o exec=on rpool/var/tmp
If this system will use NFS (locking):
# zfs create -o com.sun:auto-snapshot=false \
-o mountpoint=/var/lib/nfs rpool/var/nfs
deboostrap
DISTRO=xenial
mount -o remount,dev /mnt
debootstrap $DISTRO /mnt
zfs set devices=off rpool
mount --rbind /dev /mnt/dev
mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
chroot /mnt /bin/bash --login
customization
echo 'LANG="en_US.UTF-8"' > /etc/default/locale
dpkg-reconfigure tzdata
dpkg-reconfigure keyboard-configuration
locale-gen it_IT.UTF-8
locale-gen en_US.UTF-8
update-locale LANG=it_IT.UTF-8 LC_MESSAGES=POSIX
DISTRO=xenial
cat > /etc/apt/sources.list < /etc/fstab <
==== GRUB ====
export DISK=/dev/disk/by-id/ata-HFS512G39MND-3510A_FJ64N5235113A4S13
=== UEFI ===
apt install dosfstools
mkdosfs -F 32 -n EFI ${DISK}-part3
mkdir /boot/efi
echo PARTUUID=$(blkid -s PARTUUID -o value ${DISK}-part3) /boot/efi vfat defaults 0 1 >> /etc/fstab
mount /boot/efi
apt install --yes grub-efi-amd64
check
grub-probe /
---> zfs
if error occur upgrade grub to 2.02-beta3 from https://repo.morph027.de/grub/pool/main/g/grub2/
grub-install --target=x86_64-efi --efi-directory=/boot/efi \
--bootloader-id=ubuntu --recheck --no-floppy
verify if "ls /boot/grub/*/zfs.mod"
If you are creating a mirror, repeat the grub-install command for each disk in the pool.
=== legacy MBR ===
apt install --yes grub-pc
grub-install ${DISK}
=== manual grub menu ===
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'Ubuntu artful 17.10' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
insmod part_gpt
insmod zfs
set root='hd1,gpt0'
search --no-floppy --fs-uuid --set=root 3f1e7de17907507c
linux /ROOT/artful@/boot/vmlinuz-4.13.0-16-generic root=ZFS=rpool/ROOT/artful ro
initrd /ROOT/artful@/boot/initrd.img-4.13.0-16-generic
}
=== update grub ===
update-initramfs -c -k all
update-grub
==== exit ====
**disable root password** (re-enabled in phase two below)
passwd --delete root
zfs snapshot rpool/ROOT/ubuntu@install
exit
mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {}
zpool export rpool
reboot
===== Complete system =====
create home filesystem
zfs create -o setuid=off rpool/home
add swap
zfs create -V 4G -b $(getconf PAGESIZE) -o compression=zle \
-o logbias=throughput -o sync=always \
-o primarycache=metadata -o secondarycache=none \
-o com.sun:auto-snapshot=false rpool/swap
mkswap -f /dev/zvol/rpool/swap
echo /dev/zvol/rpool/swap none swap defaults 0 0 >> /etc/fstab
swapon -av
enable power button decomment in /etc/systemd/logind.conf
HandlePowerKey=poweroff
add user
useradd -m scipio
usermod -a -G adm,cdrom,dip,plugdev,sudo,video scipio
passwd scipio
ubuntu standard
apt install --yes ubuntu-standard
ubuntu desktop
apt-get install -y software-properties-common
add-apt-repository ppa:gnome3-team/gnome3-staging
sudo apt install -y ubuntu-gnome-desktop
#apt install --yes ubuntu-desktop
apt-get -y install $(check-language-support -l it)
# HWE support for XENIAL
sudo apt-get install --install-recommends linux-generic-hwe-16.04 xserver-xorg-hwe-16.04
enable network manager on all interfaces (see [[https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1638842|this]]
touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf
disable compression on logs
for file in /etc/logrotate.d/* ; do
if grep -Eq "(^|[^#y])compress" "$file" ; then
sed -i -r "s/(^|[^#y])(compress)/\1#\2/" "$file"
fi
done
after reboot destroy ubuntu@install snapshot
zfs destroy rpool/ROOT/ubuntu@install
disable root password
sudo usermod -p '*' root