Instalujeme FreeBSD do ZFS mirroru

Instalaci FreeBSD do UFS mirroru tu už máme, nyní potřebujeme nainstalovat FreeBSD na ZFS root. Tento proces je podstatně jednodušší, protože bsdinstall od verze FreeBSD 10.0 obsahuje průvodce rozdělení diskem pro ZFS root.

Opět budeme potřebovat minimálně dva disky a instalační médium s FreeBSD 10 a vyšší.

Spuštění instalace

Po naběhnutí instalátoru přejděte do části “Partitioning”, kde vybereme položku “Auto (ZFS)”.

Partitioning

Konfigurace ZFS

Objeví se hlavní nabídka s konfigurací ZFS.

Partitioning

Zvolte položku “Pool Type/Disks” a objeví se další okno, kde vybereme typ vdev (virtual device) “mirror”.

Partitioning

Následně vyberte disky, na které chcete nainstalovat operační systém. V mém případě server obsahuje 14 disků, ale operační systém chci instalovat na disk ada0 a ada1.

Partitioning

Instalátor nás vrátí na výchozí nabídku ZFS konfigurace. Nyní už lze přejít přímo k instalaci. Další možnosti konfigurace nechávám ve výchozím stavu, jenom oddíl swap zvětšuju podle paměti, většinou na 16 GB.

V dalším kroku se instalátor ptá, jestli se vším souhlasíte a zároveň varuje, že odsouhlasením tohoto kroku přijdete o data na vypsaných discích.

Partitioning

Pokud se vším souhlasíte, odklepněte nabídku tlačítkem “YES” a instalace FreeBSD pokračuje automaticky dál.

Poinstalační kontrola

Po řádném ukončení instalátoru by měl operační systém naběhnout bez problémů. Zkontrolujte soubor /etc/sysctl.conf jestli obsahuje parametr vfs.zfs.min_auto_ashift=12 (zarovnání disku na 4K).

Pro inspiraci se můžete podivat na historii příkazů zfs poolu. To se hodí v případě, když chcete rozdělit disk pro ZFS ručně.

root@storage:~ # zpool history
History for 'zroot':
2019-08-15.16:47:36 zpool create -o altroot=/mnt -O compress=lz4 -O atime=off -m none -f zroot mirror ada0p3 ada1p3
2019-08-15.16:47:36 zfs create -o mountpoint=none zroot/ROOT
2019-08-15.16:47:36 zfs create -o mountpoint=/ zroot/ROOT/default
2019-08-15.16:47:36 zfs create -o mountpoint=/tmp -o exec=on -o setuid=off zroot/tmp
2019-08-15.16:47:36 zfs create -o mountpoint=/usr -o canmount=off zroot/usr
2019-08-15.16:47:36 zfs create zroot/usr/home
2019-08-15.16:47:36 zfs create -o setuid=off zroot/usr/ports
2019-08-15.16:47:36 zfs create zroot/usr/src
2019-08-15.16:47:36 zfs create -o mountpoint=/var -o canmount=off zroot/var
2019-08-15.16:47:36 zfs create -o exec=off -o setuid=off zroot/var/audit
2019-08-15.16:47:36 zfs create -o exec=off -o setuid=off zroot/var/crash
2019-08-15.16:47:36 zfs create -o exec=off -o setuid=off zroot/var/log
2019-08-15.16:47:36 zfs create -o atime=on zroot/var/mail
2019-08-15.16:47:36 zfs create -o setuid=off zroot/var/tmp
2019-08-15.16:47:36 zfs set mountpoint=/zroot zroot
2019-08-15.16:47:36 zpool set bootfs=zroot/ROOT/default zroot
2019-08-15.16:47:36 zpool set cachefile=/mnt/boot/zfs/zpool.cache zroot
2019-08-15.16:47:40 zfs set canmount=noauto zroot/ROOT/default
root@storage:~ # zpool status
  pool: zroot
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0

errors: No known data errors

Rozdělení poolu vypadá následovně:

root@storage:~ # df -h
Filesystem            Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default     93G    809M     92G     1%    /
devfs                 1.0K    1.0K      0B   100%    /dev
zroot/tmp              92G     88K     92G     0%    /tmp
zroot/usr/home         92G    124K     92G     0%    /usr/home
zroot/usr/ports        92G     88K     92G     0%    /usr/ports
zroot/usr/src          92G     88K     92G     0%    /usr/src
zroot/var/audit        92G     88K     92G     0%    /var/audit
zroot/var/crash        92G     88K     92G     0%    /var/crash
zroot/var/log          92G    152K     92G     0%    /var/log
zroot/var/mail         92G     88K     92G     0%    /var/mail
zroot/var/tmp          92G     88K     92G     0%    /var/tmp
zroot                  92G     88K     92G     0%    /zroot

Nyní máte FreeBSD nainstalovaný na ZFS mirroru. Stačí ho základně nastavit a můžete použít server v produkčním nasazení.

Instalujeme FreeBSD do UFS mirroru

Instalace FreeBSD díky bsdinsallu je jednoduchý proces, kdy během pár minut máte na disku plně funkční operační systém. Pokud ale potřebujete nainstalovat FreeBSD do mirroru (zrcadlení dvou disků) na UFS, potom musíte spustit příkazový řádek a provést některé operace manuálně.

K osvojení této praktiky potřebujete instalační médium s FreeBSD a počítač se dvěma disky. Pojedeme trochu svižněji, ať se u toho moc nezadrbem.

Spuštění instalace

Po naběhnutí instalátoru naskočí uvítací obrazovka. Zvolíme krok pokračovat až do části “Partitioning”, kde vybereme položku “Shell” a spustíme tak příkazový řádek.

Partitioning

Zjištění disků

Seznam všech disků v počítači zjistíme příkazem geom disk list nebo camcontrol devlist.

# camcontrol devlist
<KINGSTON SA400S37120G SBFK59E1>  at scbus1 target 0 lun 0 (pass0, ada0)
<KINGSTON SA400S37120G SBFK1BK1>  at scbus2 target 0 lun 0 (pass1, ada1)
<AHCI SGPIO Enclosure 1.00 0001>  at scbus7 target 0 lun 0 (pass2, ses1)
<USB 2.0 USB Flash Drive 0.00>    at scbus8 target 0 lun 0 (pass3, da0)

Vymázání původních oddílů

Testovací stroj obsahuje dva SATA disky označené jako ada0 a ada1. Na tyto dva disky budeme instalovat operační systém do mirroru. Pokud disky obsahují nějaké oddíly, vymažeme je příkazem gpart destroy.

# gpart destroy -F ada0
# gpart destroy -F ada1

Takto kompletně smažeme disky s primárním i záložním GPT oddílem. Nyní jsou disky připravené k instalaci.

Vytvoření mirroru

Nyní vytvoříme mirror na dvou discích. K tomu potřebujeme načíst jaderný modul geom_mirror.ko. Dále bude následovat příkaz k vytvoření mirroru a jeho pojmenování.

# gmirror load
# gmirror label -v gm0 ada0 ada1

gm0 je název mirroru. Hned po vytvoření mirroru se objeví nové zařízení v /dev/mirror/. Takto je mirror nakonfigurovaný k automatické synchronizaci dat. Parametr -n v příkazu výše zakáže automatickou synchronizaci.

Vytvoření mirroru bez autosynchronizace

Spousta administrátorů nechce autosynchronizaci při výměně vadného disku za nový. K tomu slouží stejný příkaz jako výše, akorát připojíme parametr -n. Tím docílíte, že se disky po výměně nebudou sami synchronizovat.

# gmirror load
# gmirror label -n -v gm0 ada0 ada1

Vytvoření oddílů

V tomto příkladu uvedu klasické rozdělení mirroru na oddíly. Všchny oddíly budou zarovnané na 1 MB, což vyhovuje i 4k diskům, a každý bude mít označení. Poslední oddíl /usr/ vyplňuje zbytek mirroru.

# gpart create -s gpt mirror/gm0
# gpart add -t freebsd-boot -l boot -s 512K mirror/gm0
# gpart add -t freebsd-swap -l swap -s 16g -a 1m mirror/gm0
# gpart add -t freebsd-ufs -l root -s 8g -a 1m mirror/gm0
# gpart add -t freebsd-ufs -l tmp -s 8g -a 1m mirror/gm0
# gpart add -t freebsd-ufs -l var -s 16g -a 1m mirror/gm0
# gpart add -t freebsd-ufs -l usr -a 1m mirror/gm0

Soubor fstab

V návaznosti na rozdělení disku na oddíly vytvoříme soubor /tmp/bsdinstall_etc/fstab, kde specifikujeme místo, kam se mají jednotlivé oddíly připojovat.

/dev/gpt/swap   none    swap    sw  0   0
/dev/gpt/root   /       ufs     rw  1   1
/dev/gpt/tmp    /tmp    ufs     rw  2   2
/dev/gpt/var    /var    ufs     rw  2   2
/dev/gpt/usr    /usr    ufs     rw  2   2

Boot loader

Nyní máme mirror připravený k použití. Musíme jenom určit, odkud bude operační systém bootovat.

# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 mirror/gm0
partcode written to mirror/gm0p1
bootcode written to mirror/gm0

Vytvoření souborového systému

V případě SSD disku použijeme parametr -t kvůli funkci TRIM, u normálních disků parametr -t vynecháme. Parametr -U je pro povolení soft updates a parametr -L root je pojmenování oddílu.

# newfs -t -U -L root /dev/gpt/root
# newfs -t -U -L tmp /dev/gpt/tmp
# newfs -t -U -L var /dev/gpt/var
# newfs -t -U -L usr /dev/gpt/usr

Připojení souborového systému

Instalátor předpokládá, že se souborový systém nachází v adresáři /mnt. Nejřív musíme připojit root oddíl.

# mount /dev/gpt/root /mnt

Pak vytvoříme jednotlivé adresáře.

# mkdir /mnt/tmp
# mkdir /mnt/var
# mkdir /mnt/usr

Které následně připojíme.

# mount /dev/gpt/tmp /mnt/tmp
# mount /dev/gpt/var /mnt/var
# mount /dev/gpt/usr /mnt/usr

Nyní máme manuální rozdělení disku pro mirror hotové. Napište do příkazového řádku exit a instalace bude automaticky pokračovat.

Poinstalační nastavení

Pokud proběhla instalace bez potíží, dostanete se na obrazovku s názvem “Manual Configuration”.

Manual Configuration

Zde odpovíme “Yes” a spustíme opět příkazový řádek. Zajistíme, aby se načítal gmirror modul při nabíhání operačního systému.

# echo 'geom_mirror_load="YES"' >> /boot/loader.conf

Volitelně můžeme přidat řádek do souboru /etc/periodic.conf, abychom byli informováni emailu o stavu našeho mirroru (musíte mít nastavený odesílání emailů).

# echo 'daily_status_gmirror_enable="YES"' >> /etc/periodic.conf

Zkontrolujte, zda jsou disky synchronizované. Poté stačí do příkazové řádky napsat exit a následně vyberte z nabídky reboot.

Výměna vadného disku

V tomto příkladu předpokládejme, že vadný disk je ada1 a jméno gmirroru je gm0. Dávejte opravdu dobrý pozor, jaký disk selhal a dvakrát si rozmyslete, než začnete psát následující příkazy.

Vyměňte vadný disk za nový stejné nebo větší velikosti a ujistěte se, že nový disk je prázdný a bez rozdělení na oddíly.

# gpart show ada1

V případě potřeby vymažte metadata na disku.

# gpart destroy -F ada1

Po vyměnení vadného disku by se měla spustit synchronizace automaticky. Pokuď ne, musíte spustit synchronizaci ručně příkazama:

# gmirror forget gm0
# gmirror insert gm0 ada1

Počkejte, až se zesynchronizují oba disky. Stav zjistíte příkazem gmirror status. Po synchronizaci máte opět plně funkční systém.

Zajímavé odkazy

Synchronizujte soubory pomocí Rsync a SSH

Představte si situaci, že máte server, na který chcete nahrávat soubory a nechce se vám instalovat FTP servery a podobné monstra. Potřebujete jednoduchý nástroj s podporou šifrování. Právě k tomu slouží kombinace programů rsync a ssh.

Instalace

root@client:~ # cd /usr/ports/net/rsync
root@client:~ # make install clean

Připomínám, že rsync musí být nainstalovaný na obou strojích zároveň.

Použití

$ rsync -avz -e ssh /home/tonda/www/ tonda@10.1.1.1:/usr/local/www/

Parametry -avz zajišťují přenos všech souborů z daného adresáře na vzdálený stroj. Soubory jsou přenášené v tzv. “archive” módu, kdy se zachovávájí všechny parametry souborů jako jsou symbolické linky, oprávnění, majitel, atd. Při přenosu je použita komprimace (parametr z). Parametr -e spustí secure shell.