Date: 2024-04-07 15:30:07
From: rpt@desudoli.cz
Subject: Void Linux CLI
To: dalnopis@desudoli.cz
Tags: technologie
Desc: Po delší době staronový ponor do tech světa.

Void Linux CLI

Můj zaměstnavatel se mnou zřejmě hraje na šifru mistra Leonarda. Kvůli tomu jsem opět musel opustit předvídatelný svět BSD a vrhnout se do nebezpečných vod Linuxu, neboť požadovanou aplikaci se mi pod FreeBSD nepodařilo zkompilovat. K tomuto experimentu jsem si nakonec vybral Void. Proč? Inu, dosti se podobá BSD.

Velká distra obcházím obloukem. Zkusil jsem Artix, který používá Luke Smith a se kterým jsem měl v minulosti dobrou zkušenost.

Domníval jsem se, že tím budou mé problémy vyřešeny, ale spletl jsem se. Asi byly skvrny na slunci, ale v porovnání s Voidem se Artix zachoval jako splašený kůň. Neměl jsem chuť něco hackovat a tak dostal stabilnější Void Linux přednost.

Na filozofii dělat jednu věc a dělat ji pořádně nejspíš něco bude ;-) Void je samostatné distro, ne nějaký klon. Void používá jen jeden INIT systém, nikoliv půl tuctu. Void nabízí jen jedno desktopové prostředí (DE), nikoliv půl tuctu. Používá jen vlastní balíčky a nikoliv cizí, atd. Výsledkem je stabilita. Alespoň na mých strojích.

Opět jsem si musel leccos oživit a něčemu se přiučit. O to se zde chci nyní podělit.

Live Image

Void nabízí ISO images založené na knihovnách glibc a musl. Glibc je standard, proto moje volba padla na tento obraz. Musl je rychlejší, což už jsem si kdysi ověřil, ale v tuto chvíli mě zajímala hlavně bezproblémovost.

Vývojáři Voidu dále nabízí obrazy „base“ a „xfce“. Pokud chcete mít DE rychle a bezbolestně, Xfce je správná volba. Řekl bych, že ze všech desktopových prostředí je Xfce nejuniverzálnější. Funguje stejně dobře v BSD i na Linuxu a jeho systémové nároky nejsou nijak přehnané. Je to jistota, která nezklame.

Ncurses instalátor je podobný jako u FreeBSD a instalace byla bezproblémová. Xfce je vyladěné a vybavené potřebnými základními programy.

Xfce a Bspwm

Už nějakou dobu mám chuť opět vyzkoušet čistokrevný tiling, ale nechtělo se mi odinstalovávat Xfce, které jsem testoval. DK, poměrně nový tiling window manager, pod Xfce nefungoval dobře, především nefungovaly plochy. Panel neukazoval jejich počet, ani nešly přepínat. Odzkoušené řešení se jmenuje Bspwm. To je zjevně snadněji integrovatelné s moduly Xfce.

Upřímně řečeno, nejsem velký fanda Bspwm. Je to tak trochu autistický program. Velmi sofistikovaný, umožňující nejnemožnější nastavení. V defaultu je tam směrové i časové přepínání oken, přepínání oken v rámci vytvořených větví. Větvový charakter Bspwm toto všechno umožňuje a ještě mnohem víc. Až příliš, možná. Pořád mi připadá, že model master/stack je v prostředí tiling window managerů nejpraktičtější. U DK je master/stack základ, i když umožňuje jednoduché přepínání jiných modelů. Ale abych jenom nekritizoval, Bspwm je také velmi rychlý WM a jeho konfigurace je jednoduchá.

Instalace a nastavení Bspwm je snadné. Stačí zkopírovat 2 konfigurační soubory z /usr/share/examples do ~/.config/bspwm a ~/.config/sxhdrc. Sxhkd je program, kde se nastavují klávesové zkratky pro ovládání Bspwm, protože to defaultně žádné ovládání nemá. Má pouze cosi jako API, tedy řadu příkazů, s jejichž pomocí lze manipulovat s okny, pracovními plochami a monitory. Bez Sxhkd ale nelze tyto příkazy (jednoduše) spouštět. Nepustíme si ani xterm.

Nyní je třeba říci Xfce, že chceme používat Bspwm. Xfce se naštěstí skládá z víceméně samostatých modulů, jako většina DE v unixovském prostředí. Window manager v Xfce se nazývá xfwm4. Ten je třeba vypnout v Session and Startup.

Aby se navzájem nepletly klávesové zkratky ovládající Bspwm, je třeba zrušit Xfce hotkeys. Jinak nebude Sxhkd nebude fungovat. Všechny hotkeys se dají jednoduše označit vše a vymazat. Tlačítko „Default“ umí vrátit všechny klávesové zkratky zpátky.

Xfce nemá vlastní display manager, takže se často používá LightDM. Stejnou volbu učinili i vývojáři Void Linux. Odtud se spouští session (přihlášení) a volíme vždy Xfce, ačkoliv LightDM může nabízet i Bspwm. Ostatní volby ignorovat, nebudou fungovat (některé?) moduly Xfce.

Pokud chceme změnit defaultní wallpaper, lze to provést např. s pomocí programu wallpaper. Příkaz xwallpaper --center /cesta/k/obrazku.png je potřeba dát na konec konfigu ~/.config/bspwm/bspwmrc. To nastaví wallpaper po přihlášení, ale v samotném session manageru může nadále zůstává defaultní pozadí Xfce (to s myší). Je třeba editovat soubor /etc/lightdm/lightdm-gtk-greeter. Někde na konci jsou proměnné background a user-background. Zde je třeba nastavit hodnoty user-background=false a background=/cesta/k/obrazku.png. Tak se objeví stejný wallpaper už při spuštění LightDM.

Kombinace Xfce panelu a Bspwm je docela použitelná, ale míra integrace není úplná. Asi je možné doladit jisté nedokonalosti. To však nebyl můj cíl.

Jak zastřihovat bonsai?

Cílem bylo DK na pokud možno minimalistickém podstavci základní instalace Void Linux v šifrovaném ZFS.

Šifrování na notebooku považuju za nezbytnost a ZFS umožňuje snapshots, velice jednoduchý způsob, jak dělat otisky stavu systému v čase, ke kterým je možné se později, v případě potřeby, vrátit. Nepovedený upgrade či nechtěné rm -rf se tak dají krásně vrátit zpátky. Mimochodem, ZFS je nejlépe integrované pod FreeBSD a v Linuxu je tak trochu popelka. Void Linux je jedno z mála dister, kde má ZFS téměř prvotřídní podporu.

Malý problém je v tom, že nelze použít standardní ncurses instalátor. Ten totiž neumí ani šifrování, ani ZFS. Takže je třeba na to jít pěkně po staru, s pomocí programu chroot, jako při instalaci Arch Linuxu.

ZFS a krypto

Nebudu zde popisovat, jak se instaluje Void Linux se ZFS. Toho se už zhostil Unixsheikh a lépe to určitě nesvedu.

Doplním jedinou věc, která v jeho tutoriálu chybí: je potřeba vytvořit soubor /boot/syslinux/syslinux.cfg. Bez něho nelze nabootovat. Naštěstí je jeho syntax velmi jednoduchý. V podstatě jen říká bootloaderu, kde najde vmlinuz a initramfs. Pozor, dle Unixsheikhova návodu jsou oba soubory v adresáři /boot/syslinux/zfsbootmenu. Viz zde.

Nejjednodušší obsah je zhruba tento:

DEFAULT Linux
SAY Now booting the kernel from SYSLINUX...
LABEL Linux
KERNEL zfsbootmenu/vmlinuz-2.3.0_2
APPEND ro root=/dev/sda1 initrd=zfsbootmenu/initramfs-2.3.0_2.img

Většina linuxových distribucí používá GRUB, ale zde nabootujeme přes „ZFSBootMenu“, linuxovský bootloader inspirovaný FreeBSD.

Nastavení konzole

Zatímco OpenBSD nabízí po instalaci víceméně plnohodnotný systém, Void Linux je v podstatě holá kostra. Kromě roota zatím neexistuje žádný uživatel, nejsou spuštěny takřka žádné služby (v BSD daemoni), není instalován grafický systém (Xorg, Wayland), žádné audio, dokonce ani networking nefunguje. To je z velké části také dáno tím, že jsme instalovali ručně.

Na OpenBSD bych se snažil maximálně využít všeho, co čistá instalace nabízí, což není nic víc a nic méně než grafický desktop. Vzhledem k orientaci OpenBSD na zabezpečení systému je zcela přiměřenou strategií instalovat co nejméně balíčků třetích stran. V zásadě stačí nainstalovat browser, provést konfiguraci systému a jedeme.

Naopak ve Voidu je třeba začít úplně od píky a je zcela na místě využít bohaté nabídky softwaru z jejich repozitářů. Má to své výhody: člověk se leccos naučí o fungování operačního systému, což je jediný důvod, proč jsem kdy uvažoval o instalaci Gentoo Linuxu.

Pojďme tedy na věc.

Shell

First things first. Konzole a shell nejsou totéž. Defaultní rootovský shell je ve Voidu dash. Je to rychlý, ale velmi jednoduchý shell. Chceme-li alespoň historii, je dobré změnit rootovský shell na bash s pomocí programu chsh, což je v unixovském prostředí standard. Alespoň dočasně, pokud je to bezpečnostní riziko, což asi je. Brzy to oceníme, neboť většinu následujících úprav provádíme jako root.

# chsh  /* spusť a následuj bílého králíka */

Snapshot

Po prvním nabootování je vhodné udělat ZFS snapshot a následně hned po updatu systému. Nyní můžeme zkoušet nevídané i neslýchané a pak se znovu vrátit na začátek, bude-li třeba. Příkazy kopíruju z Unixsheikhova tutoriálu.

# zfs list -t all
# zfs snapshot zroot/ROOT/void@$(date +%Y-%m-%d-%H%M)

Služby

Spouštění služeb (daemonů) má na svědomí @em runit, iniciační program (init) a spouštěč služeb. Spouštění služeb je v rámci runitu neuvěřitelně jednoduché, pouhé vytvoření měkkého symlinku služby do příslušného adresáře. Navíc značně urychluje nabíhání systému (oproti systemd). Runit byl jedném z důvodů, proč moje volba padla na Void Linux. Spustíme tedy služby dhcpcd a sshd.

# ln -s /etc/sv/dhcpcd /var/service
# ln -s /etc/sv/sshd /var/service
# sv status sshd    /* oveří stav služby sshd */
# sv status dhcpcd  /* oveří stav služby dhcpcd */

Chceme-li službu zase zrušit stačí symlink z dané složky vymazat.

Update a instalace programů

Nyní můžeme provést update systému (Void je tzv. rolling release). Je možné změnit repo na nějaké geograficky bližší. Jak, to ponechám na zvědavosti čtenáře. Také nainstalujeme pár šikovných aplikací.

# xbps-install -Su                   /* update systému */
# xbps-install -S tmux neovim links2 /* užitečné aplikace */
# xbps-install -S xtools             /* nadstavba xbps */
# xbps-query -Rs            /* hledání v repo */
# xbps-remove -o            /* odinstalace, včetně závislostí */

Program xcheckrestart je součástí xtools. Restartuje služby v případě změn, což xbps samotné neudělá.

Zakládání uživatelů

Dále vytvoříme uživatele a nastavíme mu správcovská práva. K tomu slouží univerzální unixovský program.

# useradd -m -G wheel,lp,audio,video -s /bin/bash -p  

Heslo lze změnit pomocí programu passwd.

Čeština v TTY

Na řadě je čeština v konzoli. Proč se obtěžovat? Nezapomeňme, že dosud není instalován Xorg, nemůžeme spouštět GUI programy, ani xterm. Nemůžeme si dělat korektní poznámky. V konzoli se dá i docela dobře žít, je-li člověk pousteník (zdravíme -prahou-). I když člověk není tak spartánského ducha, stále je dobré se v TTY alespoň orientovat.

Takže zpátky k počeštění konzole. V OpenBSD je to problém, v Linuxu nikoliv. Potřebujeme nastavit správný font, správné rozložení klávesnice, správný mód konzole a jako správní vi-lains prohodit klávesy Caps Lock a Escape.

Nejprve fonty. V TTY se používají bitmapové fonty, kde se, zjednodušeně řečeno, pro každou velikost písma používá jiný bitmapový obrázek. Zde použijeme velikost „16“. Dále je tu problém českých znaků. Znaková sada „latin1“ znamená Západoevropské jazyky, „latin2“ je pro Středoevropské. Náš font tedy musí mít v názvu „latin2“ a „16“. Z dostupných fontů je to „lat2-16“ nebo „Lat2-Terminus16“. Terminus zní jako dobrá volba.

Nyní, když umíme zobrazovat správné znaky, musíme naučit naši klávesnici je vyvolat. Existuje několik českých rozložení klávesnice, např. základní cz, ale mě osobně připadá nejvhodnější české programátorské cz-lat2-prog, neboť defaultně ukazuje americkou klávesnici a na českou se přepíná pomocí pravé klávesy Alt (kudos -prahou-). Jde samozřejmě o QWERTY.

Teď vyzkoušíme, zda vybrané nastavení funguje.

# loadkeys cz-lat2-prog              /* rozložení klávesnice */
# setfont lat2-16 -m 8859-2          /* použitelný font */
# setfont Lat2-Terminus16 -m 8859-2  /* klasika font */

Pokud ano, trvalé nastavení lze provést v souboru /etc/rc.conf, kde už příslušné řádky FONT a KEYMAP jsou, avšak zakomentované.

Pod defaultním vi používá Void Linux editor nvi, další dědictví BSD. Bez vi a jeho klonů si práci v terminálu nedovedu představit a i v samotném terminálu preferuju tzv. vi mód. A protože Escape hraje ve vi zásadní úlohu, je lepší mít ho víc po ruce a ne někde v rohu klávesnice. Jednou z možností je prohodit Escape s klávesou Caps Lock. Jak to udělat?

# dumpkeys > backup.kmap   /* záloha aktuálního rozložení kláves */
$ showkey                  /* většinou vrací Escape=1, CapsLock=58 */
# dumpkeys | grep 1 | more /* zjistí název příslušného znaku, */
# dumpkeys | grep 58       /* pravděpodobně `Escape` a `Caps_Lock` */

Nejprve zazálohujeme aktuální rozložení kláves. Program showkey nás vyzve ke stisknutí požadovaných kláves a vrátí příslušné číslo klávesy. Následně najdeme, co se v aktuálním rozložení kláves pod tímto číslem ukrývá. Nakonec vytvoříme soubor s novým rozložením kláves. Nazvěme ho třeba swap_escape.kmap a bude obsahovat následující (hodnoty vycházejí ze zjištěného).

keymaps 0-127
keycode   1 = Caps_Lock
keycode  58 = Escape

Jak vidno, není třeba přepisovat celé rozložení. Přehození vyzkoušíme takto:

# loadkeys swap_escape_capslock.kmap

Escape lze vyzkoušet pomocí Ctrl-V a ESC (nové). Mělo by vrátit ^[. Bude-li fungovat, trvalou změnu provedeme v souboru /etc/rc.local následujícím způsobem.

# osobni nastaveni
set -o vi
/usr/bin/loadkeys /home/user/cesta/k/swap_escape.kmap

To be continued…

Unix-poustevník zde může také skončit. Má k dispozici tmux, jenž dokáže v TTY částečně simulovat okna. (N)vi je součástí základní instalace, neovim k dispozici v repozitářích, pokud potřebujeme sofistikovanější editor. A pak je tu links2, textový browser, se kterým sice nenakoupíme v eshopu, ani neodešleme platbu v bance, ale to poustevníci beztak nedělají. Kolega má na svých stránkách několik šikovných tutoriálů na links2 (chystá i něco většího) nebo přehrávání videa s pomocí mpv.

Přiznám se, že přehrávat video ve voidovském TTY jsem zatím nezkoušel. Ale ve FreeBSD to fungovalo.

V pokračování se podíváme na slavné GUI.

EOF