HomeLab cu CachyOS

Despre proiect

CachyOS este o distribuție de Linux orientată spre performanță. Am decis să încerc utilizarea acestei distribuții ca homelab/server.

Îmi place performanța pe care am obținut-o, dar este mult mai greu de adus la starea de server decât o distribuție făcută special pentru astfel de lucruri, migrând de la AlmaLinux.

Diferența constă în modul de administrare web al serverului folosind Cockpit, unde pe Arch suportul este diferit, acesta fiind mai bine orientat spre distribuțiile bazate pe Fedora sau Ubuntu.

Am reușit să folosesc Cockpit și pe Arch în cele din urmă, dar a fost necesar să mă documentez.

Instalare

Mențiune: serverul folosit nu este chiar un server, ci mai mult un calculator thin client utilizat ca homelab.

Acesta nu este un ghid sau tutorial pentru un server de producție și presupune cunoștințe medii despre cum funcționează lucrurile pe Linux, fiind departe de un setup obișnuit.

Legat de instalare: trebuie să luați întotdeauna cea mai recentă versiune a imaginii .iso de pe siteul CachyOS, altfel nu veți putea instala. Nu voi detalia aici cum se creează imaginea .iso sau stick-ul USB, voi explica doar instalarea.

După ce ajungem pe mediul live CachyOS KDE, recomand, dacă schimbați distribuția, să formatați partițiile cu GParted.

Pornirea instalării se face din fereastra de bun venit CachyOS Hello:

  1. Alegeți limba (pentru engleză este American English)

  2. Alegeți bootloaderul, recomand Systemd-boot sau Limine. Verificați tabelul de funcții ale boot managerelor pentru a decide. Pentru server am ales Systemd-boot

  3. Alegeți desktop environment-ul preferat. Pentru server am luat MangoWM, se poate lua orice, îl vom dezactiva mai târziu oricum, dar am ales ceva ușor de folosit; avem nevoie de un mediu grafic ca să utilizăm kernel managerul de la CachyOS (se poate și din linia de comandă, dar nu se știe niciodată când avem nevoie de mediul grafic)

  4. Alegeți pachetele adiționale. Pentru server am mers cu:

    • CachyOS Packages
    • CachyOS shells (fish și zsh)
    • Base-devel + Common packages
    • MangoWM
    • Firefox

    Se pot lua și altele, în funcție de nevoi.

  5. La configurarea locației de instalare, mare grijă la alegerea unității de stocare pe care se face instalarea

După finalizarea instalării, dați restart obligatoriu și deconectați stick-ul USB.

Pașii post-instalare

Kernel-ul de server

Din mediul desktop deschidem Kernel Manager-ul CachyOS, bifăm CachyOS-Server și îl instalăm. După instalare dăm restart și, din meniul de boot, alegem varianta de server; după ce ați ales intrarea, decizia rămâne salvată.

SSH

Activăm SSH ca să putem controla serverul remote. Instrucțiunile le găsiți în [documentația oficială].

După activarea SSH, verificați dacă vă puteți conecta. Odată ce ați reușit să vă conectați, putem dezactiva interfața grafică, nu mai avem nevoie de ea, deoarece deja am configurat kernelul de server:

sudo systemctl stop sddm.service
sudo systemctl disable sddm.service

Removed '/etc/systemd/system/display-manager.service'.

Repornim serverul, va reporni fără interfață grafică și login screen.

Scheduler

Trecem la scheduler, care se ocupă de relația dintre procese și hardware. Recomand să citiți [documentația oficială] pentru mai multe detalii.

Verificăm dacă există un scheduler care rulează în prezent:

scxctl get

no scx scheduler running

Listăm schedulerele disponibile:

scxctl list

supported schedulers: ["beerland", "bpfland", "cake", "cosmos", "flash", "lavd", "pandemonium", "p2dq", "tickless", "rustland", "rusty"]

  • Pentru procesoare fără arhitectură hibridă (fără P-core și E-core), alegeți bpfland pentru server
  • Pentru procesoarele cu P-core și E-core, alegeți lavd cu modul Server (doar în cazul serverului; pentru un calculator/laptop obișnuit îl puteți lăsa pe auto)

Eu am mers pe bpfland, pentru că am un i5 din generația a 8-a:

sudo scxctl start --sched bpfland --mode server

[sudo] password for X
started Bpfland in Server mode

Verificăm dacă s-a aplicat schedulerul:

sudo scxctl get

running Bpfland in Server mode

Lucruri opționale (în funcție de nevoile fiecăruia)

Adăugare unități de stocare suplimentare

Găsiți informația completă în [ghidul oficial].

lsblk ar trebui să vă arate toate unitățile de stocare. Mare grijă la pașii următori: nimeni nu este responsabil dacă vă ștergeți sau deteriorați datele de pe acele unități de stocare (se poate încerca recuperarea, dar nu este 100% garantată fără echipamente specializate sau proceduri complexe).

Ca exemplu, eu voi adăuga un hard disk conectat în interiorul PC-ului, folosit ca homelab server, vizibil ca /dev/sdb. Scriind lsblk în terminal se afișează toate unitățile de stocare și partițiile.

Intrăm să edităm acel hard disk pe care vreau să îl montez (îl voi și curăța înainte):

sudo fdisk /dev/sdb

Câteva comenzi utile în fdisk:

  • m — help general
  • n — adaugă partiție nouă
  • p — afișează partițiile existente
  • w — scrie modificările fizic pe unitatea selectată și iese
  • g — creează o tabelă de partiții GPT nouă și goală (se elimină toate partițiile existente)

Creăm o tabelă de partiții nouă:

Command (m for help): g
Created a new GPT disklabel (GUID: 86F8B266-XXXX-XXXX-XXXX-DEDEBDD1D092).

Verificăm cu p:

Command (m for help): p

Disk /dev/sdb: 931,51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: ST1000DM010-2EP1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 86F8B266-XXXX-XXXX-XXXX-DEDEBDD1D092

Creăm o partiție nouă cu n:

Command (m for help): n
Partition number (1-128, default 1): 1
First sector (2048-1953525134, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953525134, default 1953523711):

Created a new partition 1 of type 'Linux filesystem' and of size 931,5 GiB.

Command (m for help): p
Disk /dev/sdb: 931,51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: ST1000DM010-2EP1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 86F8B266-XXXX-XXXX-XXXX-DEDEBDD1D092

Device     Start        End    Sectors   Size Type
/dev/sdb1   2048 1953523711 1953521664 931,5G Linux filesystem

Scriem modificările cu w:

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Formatăm partiția (eu am ales btrfs, la fel ca pe cealaltă; recomand să citiți ghidul dacă doriți alt format):

sudo mkfs.btrfs /dev/sdb1

btrfs-progs v7.0
See https://btrfs.readthedocs.io for more information.

NOTE: default settings have changed in version 6.19 (supported since linux 6.1):
- enable block-group-tree (-O bgt)

Label:              (null)
UUID:               357972f0-XXXX-XXXX-XXXX-848cf6a5d559
Node size:          16384
Sector size:        4096        (CPU page size: 4096)
Filesystem size:    931.51GiB
Block group profiles:
  Data:             single            8.00MiB
  Metadata:         DUP               1.00GiB
  System:           DUP               8.00MiB
SSD detected:       no
Zoned device:       no
Features:           extref, skinny-metadata, no-holes, free-space-tree, block-group-tree
Checksum:           crc32c
Number of devices:  1
Devices:
  ID        SIZE  PATH
   1   931.51GiB  /dev/sdb1

Acum montăm partițiile. Afișăm partițiile:

lsblk -f

NAME   FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 vfat   FAT32       8563-CE78                               1,8G    11% /boot
└─sda2 btrfs              869c8535-2eea-4c72-bbf7-efdd6ad4b0f3   227,4G     3% /var/log
                                                                               /var/tmp
                                                                               /var/cache
                                                                               /root
                                                                               /home
                                                                               /srv
                                                                               /sdb
└─sdb1 btrfs              357972f0-b06a-4688-a632-848cf6a5d559
zram0  swap   1     zram0 acc9b09f-1897-4ebd-90aa-de1cd99bffec                        [SWAP]

Edităm fișierul fstab, de unde se citește schema de montare a partițiilor la pornire (mare grijă la spațiere):

sudo nano /etc/fstab

La finalul fișierului, înlocuiți UUID-ul din exemplu cu al vostru:

UUID=357972f0-b06a-4688-a632-XXXXXXXX destination btrfs defaults,nofail,rw,user,exec 0 0

Înainte să dați restart, recomand reîncărcarea serviciilor, ca să ne asigurăm că linia adăugată este scrisă corect; altfel riscați ca sistemul să nu mai pornească și să fie nevoie să folosiți mediul live pentru a modifica fișierul sau o altă metodă de acces:

sudo systemctl daemon-reload

Dacă nu apar erori, e bine. Încercăm să montăm acum partițiile conform tabelei:

sudo mount -a

Dacă nu se afișează nimic, înseamnă că s-au montat. Recomand să verificați și în folderul unde e montată partiția, sau cu lsblk, dacă apare calea corectă.

În cazul meu, listez folderele din locul unde am ales să pun HDD-ul:

lsdrwxr-xr-x   - root       15 mai 20:18  HDD0

Se observă că este deținut de root, ceea ce e bine. Transferăm unitatea de stocare pe userul nostru, ca să putem folosi partiția ușor (schimbați user cu userul vostru):

sudo chown -hR user HDD0/

Verificăm dacă apare unde trebuie în lista de unități de stocare:

lsblk

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 238,5G  0 disk
├─sda1   8:1    0     2G  0 part /boot
└─sda2   8:2    0 236,5G  0 part /var/log
                                 /var/tmp
                                 /var/cache
                                 /root
                                 /home
                                 /srv
sdb      8:16   0 931,5G  0 disk
└─sdb1   8:17   0 931,5G  0 part /home/X/HDD0
zram0  253:0    0  29,7G  0 disk [SWAP]

Interfață web pentru management remote (Cockpit)

Instalăm Cockpit:

sudo pacman -S cockpit

Activăm serviciul, ca să pornească odată cu sistemul:

sudo systemctl enable --now cockpit.socket

Created symlink '/etc/systemd/system/sockets.target.wants/cockpit.socket' → '/usr/lib/systemd/system/cockpit.socket'.

Verificăm dacă funcționează corect:

sudo systemctl status cockpit.socket

● cockpit.socket - Cockpit Web Service Socket
     Loaded: loaded (/usr/lib/systemd/system/cockpit.socket; enabled; preset: disabled)
     Active: active (listening) since Fri 2026-05-15 21:04:24 EEST; 1min 48s ago
Invocation: fd22636edcba457c84d71f5eede26733
   Triggers: ● cockpit.service
       Docs: man:cockpit-ws(8)
     Listen: [::]:9090 (Stream)
    Process: 7379 ExecStartPost=/usr/share/cockpit/issue/update-issue localhost (code=exited, status=0/SUCCESS)
    Process: 7386 ExecStartPost=/bin/ln -snf active.issue /run/cockpit/issue (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 36466)
     Memory: 1M (peak: 3.8M)
        CPU: 25ms
     CGroup: /system.slice/cockpit.socket

mai 15 21:04:24 DobaiZone systemd[1]: Starting Cockpit Web Service Socket...
mai 15 21:04:24 DobaiZone systemd[1]: Listening on Cockpit Web Service Socket.

Un lucru foarte important este firewallul. Verificăm cu:

sudo ufw status numbered

Permitem portul pentru Cockpit, ca să putem accesa interfața de pe alt calculator/laptop:

sudo ufw allow 9090

Rule added
Rule added (v6)

Verificăm regulile curente:

To                         Action      From
--                         ------      ----
[ 2] 9090                  ALLOW IN    Anywhere
[ 3] 9090 (v6)              ALLOW IN    Anywhere (v6)

Ștergem regula de IPv6, dacă nu o folosim:

sudo ufw delete 3

Deleting:
 allow 9090
Proceed with operation (y|n)? y
Rule deleted (v6)

Pentru a nu se mai crea reguli de IPv6, recomand să schimbați configul lui ufw. La finalul fișierului adăugați IPV6=no, ca să îl dezactivați complet:

sudo nano /etc/ufw/ufw.conf

Docker

Resurse utile: [Arch Wiki - Docker], [Docker Wiki].

sudo pacman -S docker

Pentru docker-compose:

sudo pacman -S docker-compose

Pentru a porni odată cu sistemul:

sudo systemctl enable docker.service

Pentru a porni la prima utilizare a serviciului (pornire container):

sudo systemctl enable docker.socket

Am ales să activez serviciul, pentru că vreau să pornească de fiecare dată când serverul pornește. Verificăm statusul (dacă ați activat socket, înlocuiți service cu socket):

sudo systemctl status docker.service

○ docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
     Active: inactive (dead)
TriggeredBy: ○ docker.socket
       Docs: https://docs.docker.com

Pornim serviciul:

sudo systemctl start docker.service

Și gata, Docker este funcțional.

Module Cockpit

Modulele pentru Cockpit pe Arch pe care le folosesc eu:

sudo pacman -S cockpit-docker
sudo pacman -S cockpit-files
sudo pacman -S cockpit-storaged
sudo pacman -S cockpit-packagekit
paru cockpit-pacman


Dacă apar probleme sau aveți nevoie de ajutor, vă aștept pe Matrix-ul Linux România sau aici, pe forum.