Základní instalace Debianu na BTRFS

Základní instalace OS Debian na BTRFS.

Jak nainstalovat Debian 10 s využitím BTRFS.

Warning

U všech příkazů platí: dvakrát měř, jednou řež!

HW

Systém budeme instalovat na dva identické disky, s využitím Linuxového SW Raidu 1 s BTRFS systémem nad tímto RAIDem.

Note

Nebudeme využívat BTRFS RAID "like" systém, ale starý dobrý SW Raid pomocí mdadm.

Příprava

V instalačním procesu systému musíme nastavit oddíly pro RAID 1. Potom nastavíme souborové systémy a přípojné body pro tyto oddíly.

  1. Vytvoříme první primární oddíl na začátku disku ve velikosti 500MB jako fyzický svazek pro RAID (využije se pro boot, EXT2).
  2. Vytvoříme drudý primární oddíl na začátku disku ve velikosti 95% (nebo 100% - dle uvážení) jako fyzický svazek pro RAID (využije se na zbytek systému, BTRFS)

První RAID svazek zformátujeme jako ext2, připojený k /boot a dáme mu název BOOT. Druhý RAID svazek zformátujeme jako BTRFS žurnálovací systém, připojený k / a dáme mu název SYSTEM.

Note

Jako příznak nastavíme u obou oddílů noatime.

Rozložení disku by mělo vypadat nějak takto:

/images/instalace_debian/disk01.png /images/instalace_debian/disk02.png /images/instalace_debian/disk03.png /images/instalace_debian/disk04.png

Note

Nebudeme vytvořet žádný oddíl pro SWAP, protože použijeme ZRAM swapping - nastavíme to později.

/images/instalace_debian/disk05.png

Dokončíme instalaci základního systému, a nainstalujeme Grub na první disky. Nerestartujeme v tuto chvíli!, ale vrátíme se v instalaci do příkazové řádky a nainstalujeme Grub na druhý disk.

Rozložení disku

Proces vytvoření je celkem snadný:

#!/bin/bash

# 1. Mount the disk
mount /dev/md1 /mnt

# 2. Create snapshot of the current root / as a subvolume
btrfs subvolume snapshot /mnt /mnt/@root

# Create other subvolumes for:
# * variable files
btrfs subvolume create /mnt/@var
# * home directories
btrfs subvolume create /mnt/@home
# * lxc containers
btrfs subvolume create /mnt/@lxc
# * postgresql database
btrfs subvolume create /mnt/@database
# * tmp
btrfs subvolume create /mnt/@tmp
# * snapshots
btrfs subvolume create /mnt/@snapshots

Kontrola, zda jsou poddíly vytvořeny:

# btrfs subvolume list /mnt

Příkaz by měl vypsat něco jako toto:

ID 259 gen 3522 top level 5 path @root
ID 260 gen 3523 top level 5 path @var
ID 261 gen 3524 top level 5 path @home
ID 262 gen 3525 top level 5 path @lxc
ID 263 gen 3526 top level 5 path @database
ID 264 gen 3527 top level 5 path @mail
ID 264 gen 3528 top level 5 path @tmp
ID 265 gen 3529 top level 5 path @snapshots

Note

Pododdíl tmp byl vytvořen pro to, aby dočasné soubory nebyly součástí snapshotů @root pododdílu. Snapshoty @tmp pododdílu se nebudeme nikdy vytvářet, protože všechny soubory s adresáři tmp jsou dočasné.

Editace fstab

Upravíme soubor /mnt/@root/etc/fstab a změníme takto:

# /etc/fstab: static file system information.
# <file system> <mount point>   <type>  <options>    <dump>  <pass>
# / was on /dev/sda1 during installation

LABEL=SYSTEM /               btrfs   subvol=@root,noatime,defaults        0       0
LABEL=SYSTEM /var            btrfs   subvol=@var,noatime,defaults         0       0
LABEL=SYSTEM /home           btrfs   subvol=@home,noatime,defaults        0       0
LABEL=SYSTEM /lxc            btrfs   subvol=@lxc,noatime,defaults         0       0
LABEL=SYSTEM /database       btrfs   subvol=@database,noatime,defaults    0       0
LABEL=SYSTEM /tmp            btrfs   subvol=@tmp,noatime,defaults         0       0
LABEL=SYSTEM /.snapshots     btrfs   subvol=@snapshots,noatime,defaults   0       0

# Boot partition
LABEL=BOOT   /boot           ext2    noatime,defaults                     0       2

Aktualizace Grubu

Upravíme /mnt/@root/etc/default/grub a změníme:

# Add rootflags:
GRUB_CMDLINE_LINUX_DEFAULT="quiet rootflags=subvol=@root"

Attention!

Pozor! Upravujeme GRUB ve vytvořeném snapshotu, který přestane být identický s /etc/default/grub, proto se musíme chrootnout - viz níže!

Přesun adresářů na nové místo

#!/bin/bash

cd /

# move everything to new locations
mv home/* @home
mv var/* @var

# prepare directories which will be used as mounting points
mkdir -p /mnt/@root/{lxc,database,.snapshots}

# We need to update tmp permissions:
chmod 1777 /mnt/@root/tmp

# prepare the chroot:
for i in /boot /dev /dev/pts /proc /sys /run; do mount --bind $i /mnt/@root/$i; done

# chroot
chroot /mnt/@root
mount /

update-grub
# install grub to both disks
grub-install /dev/sda
grub-install /dev/sdb

Nyní restartujeme, systém by měl nabootovat do @root pododdílu. Oveříme to pomocí:

mount

Ve výpisu připojených oddílů by měl být kořenový / připojen z @root pododdílu. Ostatní oddíly také.

Úklid

Warning

Pozor! Pokud není všechno v tomto kroku ok, nepokračuj!

Smažeme starou hierarchii, který byla vytvořena během úvodní instalace systému:

#!/bin/bash

# Cleanup!
# Execute only if everything is ok!

mount /dev/md1 /mnt

cd /mnt

# remove all except our subvolumes
ls -1 . | egrep -v '@' | xargs echo
# list one by one, inverse match @, execute rm -rf
ls -1 . | egrep -v '@' | xargs rm -rf

umount /mnt
# check filesystem
btrfs filesystem df /
Data, single: total=1.53GiB, used=811.14MiB
System, single: total=4.00MiB, used=16.00KiB
Metadata, single: total=264.00MiB, used=30.06MiB
GlobalReserve, single: total=16.00MiB, used=0.00B

UEFI

Co když ale používám UEFI a legacy mód nemám dostupný nebo ho nechci použít?

Rozdělení disků

Disky rozdělím stejně, jenon na každém disku vytvořím jako první UEFI oddíl ve formátu FAT32. Něco jako:

/images/instalace_debian/disk06_uefi.png

Z principu jak UEFI funguje, nemůžu použít jednoduché řešení s RAID1, ale musím data kopírovat ručně na oba disky. Jak to ale udělat aby se to nepokazilo? Na to jsem nepřišel a raději jedu v legacy módu .)