Differenze tra le versioni di "Appunti Arch Linux"
Riga 1 254: | Riga 1 254: | ||
=== Installazione === | === Installazione === | ||
Installare ed abilitare Snap | Installare ed abilitare Snap | ||
− | $ yay -S snapd | + | $ [https://aur.archlinux.org/packages/yay yay] -S snapd |
$ sudo ln -s /var/lib/snapd/snap /snap | $ sudo ln -s /var/lib/snapd/snap /snap | ||
$ sudo systemctl start snapd.service | $ sudo systemctl start snapd.service |
Versione delle 00:19, 7 mar 2023
Arch Linux è una distribuzione Linux leggera e veloce; ma la cui installazione, configurazione e amministrazione avviene prevalentemente da terminale attraverso la modifica manuale di file di configurazione testuali.
Fornisce, seguendo un modello di distribuzione detto "rolling-release", l'ultima versione stabile della maggior parte del software opensource disponibile per Linux. Dato che è in costante aggiornamento non richiede periodici passaggi da una versione stabile alla successiva. Il lato negativo di tutto questo è che ogni aggiornamento (soprattutto: kernel, driver video e librerie) potrebbe potenzialmente determinare problemi talmente gravi al sistema da renderlo inutilizzabile. Accorgimenti come lo snapshot periodico del filesystem riescono, per fortuna, a contrastare l'impatto di questi inconvenienti.
Installazione
Guida
Supporti
- ISO ufficiale archlinux-x86_64.iso
- ISO con supporto per lo ZFS archlinux-archzfs-linux.iso
- ISO con installer grafico Calamares ALCI
- ISO live CD/USB con interfaccia Xfce, utile per operazioni di ripristino o installazione SystemRescue:
ISO personalizzata
Con archiso è possibile creare un'immagine con pacchetti aggiuntivi rispetto a quelli contenuti nella versione ufficiale.
# pacman -S archiso
Copiare il contenuto del pacchetto in una directory di lavoro, es.: /root/media
# cp -r /usr/share/archiso/configs/releng /root/media
Se volessimo aggiungere il supporto ad un pacchetto non contenuto nei repository ufficiali come, per esempio, lo ZFS occorrerebbe:
- Importare la chiave pubblica del suo repository
# curl -L https://archzfs.com/archzfs.gpg | pacman-key -a - # pacman-key --lsign-key $(curl -L https://git.io/JsfVS)
- Modificare le seguenti righe al file pacman.conf di archiso per aggiungere il repository
[archzfs] SigLevel = Never Server = https://archzfs.com/$repo/$arch
- Aggiungere le seguenti righe al file packages.x86_64 per aggiungere i pacchetti che ci interessa installare
zfs-utils zfs-dkms net-tools
- Se volessimo creare una versione live di una macchina, comprensiva di tutti i suoi pacchetti, potremmo semplicemente aggiungerli al file packages.x86_64
# pacman -Qq >> /path/packages.x86_64
- Lanciare lo script per creare l'ISO
# ./build.sh -v
L'immagine sarà generata nella directory /root/media/out
Preparazione del disco
Su Linux si può scegliere (salvo casi estremamente particolari) tra due tipi di tabella delle partizioni
- msdos (Master Boot Record o più semplicemente MBR)
- GPT (GUID Partition Table)
In linea generale è consigliabile di scegliere il GPT perché è un formato più moderno ed ha meno limitazioni rispetto all'MBR risalente ai tempi dell'MS-DOS.
I casi in cui è preferibile utilizzare la tabella msdos sono:
- dual-boot con Windows (32-bit o 64-bit) con la scheda madre in modalità Legacy BIOS
- in schede madri molto datate il BIOS potrebbe non supportare lo schema GPT (esiste comunque un trucco per aggirare l'ostacolo)
Vantaggi di GPT su MBR:
- offre un sistema di denominazione delle partizioni indipendente dal filesystem (PARTLABEL, PARTUUID)
- supera il concetto di partizione primaria ed estesa (su MBR il numero massimo di partizioni primarie, quelle su cui si può installare un sistema operativo è limitato a 4). Su GPT, nella configurazione standard, si possono definire fino a 128 partizioni.
- la grandezza massima di un disco è di 2 ZiB, mentre su MBR 2 TiB
- permette di fare a meno della tradizionale partizione di /boot con i filesystem BTRFS e ZFS in modo da semplificare la gestione degli snapshot.
Schede madri BIOS
Creare due partizioni.
- BIOS GRUB Partition: concettualmente l'equivalente dell'MBR dei sistemi GPT. A differenza di quest'ultimo, la cui dimensione è di soli 512 byte, la BIOS GRUB Partition può però essere sufficientemente grande da contenere i driver per il supporto di un filesystem come ZFS o BTRFS. Il contenuto di questa partizione cambia esclusivamente nei rari casi di upgrade del GRUB perché non vi risiedono né kernel né ramdisk.
- Linux filesystem: successivamente da formattare col filesystem di nostra scelta: BTRFS, ZFS, ext4, XFS, JFS.
Partizionamento
Col seguente comando verrà creata la partizione BIOS GRUB (EF02) a partire dal 1MB, della grandezza di 64MB; il resto del disco resterà disponibile per il filesystem di Linux.
Se avete più dischi da utilizzare in raid, questa operazione andrà ripetuta per ciascun disco.
# sgdisk \ --new=1:2048:133120 --typecode=1:EF02 --change-name=1:"GRUB" \ --largest-new=2 --typecode=2:8300 --change-name=2:"ROOT" /dev/sda
La seconda partizione dovrà poi essere formattata con uno dei filesystem supportati da Linux (ext4, btrfs, xfs...)
# mkfs.btrfs /dev/sda2
Schede madri UEFI
Creare due partizioni.
- EFI: è una partizione in formato FAT32 necessaria per l'avvio dei sistemi operativi nei PC con schede madri UEFI.
- Linux filesystem: successivamente da formattare col filesystem di nostra scelta: BTRFS, ZFS, ext4, XFS, JFS.
Partizionamento
Col seguente comando verrà creata la partizione EFI (EF00) a partire dal 1MB, della grandezza di 512MB; il resto del disco resterà disponibile il filesystem di Linux.
# sgdisk \ --new=1:2048:1064960 --typecode=1:EF00 --change-name=1:"efi" \ --largest-new=2 --typecode=2:8300 --change-name=2:"ROOT" /dev/sda
La partizione EFI dovrà poi essere formattata in FAT32
# mkfs.vfat -T32 /dev/sda1
La seconda partizione dovrà poi essere formattata con uno dei filesystem supportati da Linux (ext4, btrfs, xfs...)
# mkfs.btrfs /dev/sda2
Filesystem
Su Linux, a seconda di ciò di cui abbiamo bisogno, è possibile scegliere tra numerosi filesystem. Le principali opzioni sono le seguenti:
- BTRFS: supporta nativamente sottovolumi, snapshot ed il raid 0, 1 e 5; ma non la crittografia.
- EXT4: il FS storico di Linux, evoluzione di ext3. Supporta nativamente la crittografia dei dati, ma non gestisce autonomamente né RAID, né snapshots.
- ZFS: non è supportato direttamente da Linux, ha bisogno di un driver esterno per funzionare e ciò, per gli utenti meno smaliziati, potrebbe complicare le operazioni di ripristino di sistema in caso di problemi. Supporta il raid 0, 1 e z (una variante del raid5 che permette, grazie ad un meccanismo di scrittura dei dati detta "write-atomicity" di evitare la perdita di dati anche in caso di improvviso spegnimento improvviso del computer), gli snapshot, i sottovolumi e la cifratura dei dati. Non è però possibile modificare la composizione di un raid una volta creato.
- XFS + LVM: accoppiare il filesystem xfs al gestore di volumi di LVM è il modo con cui RedHat (IBM) ha scelto di implementare le funzionalità di raid e snapshots nella propria distribuzione.
BTRFS
Creazione del filesystem
# mkfs.btrfs /dev/partizione
Montaggio del filesystem
# mount -o compress=lzo /dev/partizione /mnt/punto_mount
(Si consiglia di usare l'opzione di compressione del filesystem per migliorare le performance ed ottimizzare l'utilizzo dello spazio)
Subvolumi
- Creare un subvolume
# btrfs subvolume create subvolume
- Controllare i subvolumi presenti sul sistema
# btrfs subvolume list /
In una tipica installazione Ubuntu avremo un output di questo tipo
ID 257 gen 9755 top level 5 path @ ID 292 gen 7624 top level 5 path @home
@ è il nome del subvolume contenente la root / del filesystem @home è il nome del subvolume della /home
Montaggio di un subvolume
# mount -o subvol=subvolume /dev/partizione /mnt/punto_mount
fstab
Normalmente la root di sistema viene collocata in un subvolume (es.: @), per poter effettuare opzioni di snapshot etc e consigliabile montare il filesystem con l'opzione subvolid=0. Nella directory di mount saranno visibili tutti i subvolumi e le snapshot della partizione e sarà quindi possibile effettuare tutte le operazioni indicate nei passaggi successivi.
Ecco un /etc/fstab di esempio
LABEL=ROOT / btrfs defaults,compress=lzo,subvol=@ 0 0 LABEL=ROOT /home btrfs defaults,compress=lzo,subvol=@home 0 0 LABEL=ROOT /mnt/btrfs btrfs defaults,noauto,subvolid=0,compress=lzo 0 0
Montando la partizione con label ROOT su /mnt/btrfs saranno visibili tutti i subvolumi.
Conversione da Ext3/4 a Btrfs
# btrfs-convert /dev/partizione
Automaticamente è creata una snapshot contenente il vecchio filesystem (/ext2_saved)
In caso di problemi può essere montata col comando
# mount -t btrfs -o subvol=ext2_saved /dev/xxx /ext2_saved # mount -t ext3 -o loop,ro /ext2_saved/image /ext3
Se tutto è andato a buon fine può invece essere eliminata
# btrfs subvolume delete /ext2_saved
Riparazione di un filesystem danneggiato
- Direttamente sul filesystem montato
# btrfs scrub start -B /dev/partizione
o anche direttamente sulla root
# btrfs scrub start -B /
- Sul disco smontato
# btrfs check --repair /dev/partizione
Quote
Per limitare le dimensioni di un subvolume è possibile abilitare la gestione delle quote.
Utilizzare il seguente comando su un filesystem btrfs appena creato e privo di subvolumi
# btrfs quota enable volume
Se invece le quote non sono state abilitate subito su tutto il filesystem è necessario creare un qgroup (quota group) per ogni subvolume utilizzando il rispettivo ID e successivamente fare una scansione delle quote.
# btrfs subvolume list <path> | cut -d' ' -f2 | xargs -I{} -n1 btrfs qgroup create 0/{} <path> # btrfs quota rescan <path>
Assegnare una quota limite ad un subvolume
# btrfs qgroup limit size /volume/subvolume
Es.:
# btrfs qgroup limit 20g /mnt/@ # btrfs qgroup limit 100g /mnt/@home
Scoprire la quantità di spazio utilizzata da un subvolume
# btrfs qgroup show <path>
Snapshots
Data la natura instabile delle distribuzioni rolling-release come Arch Linux ritengo praticamente obbligatorio per la partizione di / l'utilizzo di un filesystem che supporti gli snapshot.
- Effettuare uno snapshot
# btrfs subvolume snapshot @ rootsnap
Nell'esempio abbiamo effettuato il backup del filesystem di root e l'abbiamo chiamato rootsnap
- Montare un subvolume/snapshot
# mount -t btrfs -o subvol=rootsnap /dev/partizione /mnt/snapshot
- Cancellare un subvolume/snapshot
# btrfs subvolume delete rootsnap
Backup
Le snapshot possono essere salvate su un disco esterno, a patto che questo abbia un file system btrfs. L'operazione di trasferimento può essere effettuata soltanto su snapshot in sola lettura. Si ipotizza che il proprio disco di sistema sia montato in /mnt/btrfs ed il disco esterno in /mnt/ext
- Creare la snapshot in sola lettura (opzione -r) oppure impostare il flag di sola lettura ad una snapshot già fatta
btrfs subvolume snapshot -r @root @root-yymmdd-ro btrfs property set /mnt/btrfs/@root-yymmdd-ro ro true
- Trasferire la snapshot sul disco esterno.
btrfs send /mnt/btrfs/@root-yymmdd-ro | btrfs receive /mnt/ext
- Quando necessario, ripristinare la snapshot
btrfs send /mnt/ext/@root-yymmdd-ro | btrfs receive /mnt/btrfs/
- Eventualmente, rinominare la snapshot e reimpostare i privilegi di scrittura
mv /mnt/ext/{@root-yymmdd-ro,@root} btrfs property set /mnt/btrfs/@root ro false
RAID
Tipologie e caratteristiche dei raid supportati
Confronto tra varie tecnologie di raid
RAID | Redundancy Copies | Redundancy Parity | Redundancy Striping | Spazio utilizzato | Min/max n. dischi |
---|---|---|---|---|---|
disco singolo | 1 | 100% | 1/N | ||
RAID0 | 1 | 1 to N | 100% | 1/N | |
RAID1 | 2 | 50% | 2/N | ||
RAID1C3 | 3 | 33% | 3/N | ||
RAID1C4 | 4 | 25% | 4/N | ||
RAID10 | 2 | 1 to N | 50% | 2/N | |
RAID5 | 1 | 1 | 2 to N-1 | (N-1)/N | 2/N |
RAID6 | 1 | 2 | 3 to N-2 | (N-2)/N | 3/N |
RAID 0
# mkfs.btrfs -d raid0 /dev/sda1 /dev/sdb1
Montare il raid
# mount /dev/sda1 /mnt
(È equivalente a mount /dev/sdb1 /mnt, il sistema riconosce che è presente un raid 0 e provvede al montaggio corretto dei dischi)
Verifica del montaggio
# btrfs filesystem show /mnt
Label: none uuid: 4714fca3-bfcb-4130-ad2f-f560f2e12f8e Total devices 2 FS bytes used 27.75GiB devid 1 size 136.72GiB used 17.03GiB path /dev/sda1 devid 2 size 136.72GiB used 17.01GiB path /dev/sdb1
Aggiungere una partizione
# btrfs device add /dev/sdc1 /mnt
# btrfs filesystem show /mnt Label: none uuid: 4714fca3-bfcb-4130-ad2f-f560f2e12f8e Total devices 3 FS bytes used 27.75GiB devid 1 size 136.72GiB used 17.03GiB path /dev/sda1 devid 2 size 136.72GiB used 17.01GiB path /dev/sdb1 devid 3 size 136.72GiB used 0.00 path /dev/sdc1
Adesso è necessario effettuare una redistribuzione dei dati sui tre dischi
# btrfs balance start -d -m /mnt
# btrfs filesystem show /mnt Label: none uuid: 4714fca3-bfcb-4130-ad2f-f560f2e12f8e Total devices 3 FS bytes used 27.78GiB devid 1 size 136.72GiB used 10.03GiB path /dev/sda1 devid 2 size 136.72GiB used 10.03GiB path /dev/sdb1 devid 3 size 136.72GiB used 11.00GiB path /dev/sdc1
Rimuovere un device
# btrfs device delete /dev/sdb1 /mnt
L'operazione può impiegare parecchio tempo e per andare a buon fine sui dischi rimanenti deve essere rimasto sufficiente spazio libero da ospitare i dati contenuti nel device che vogliamo togliere dal raid.
RAID 1
Creazione di un raid1 ex novo
Copiare la tabella delle partizioni da sda a sdb
# sfdisk -d /dev/sda | sfdisk /dev/sdb
Creare il raid
# mkfs.btrfs -d raid1 -m raid1 /dev/sda1 /dev/sdb1
Aggiungere un mirror ad un disco esistente
# btrfs device add /dev/sdb1 /punto_di_mount # btrfs balance start -dconvert=raid1 -mconvert=raid1 /punto_di_mount
GRUB
Se si utilizza un raid1 per la partizione di sistema / e si vuole rendere Linux avviabile automaticamente anche in caso di danneggiamento o mancanza di uno dei due dischi del raid occorrerà che sul secondo disco sia clonata la partizione EFI o BIOS GRUB (es.: /dev/sda1) e che vi sia installato il bootloader.
# dd if=/dev/sda1 of=/dev/sdb1 # grub-install /dev/sdb
Sostituzione device danneggiato
Verificare qual è il disco che dà dei problemi
# mount /dev/sda1 /punto_di_mount -o degraded # btrfs device stats /punto_di_mount # btrfs filesystem show /punto_di_mount # btrfs device usage
Ipotizzando che 1 sia l'ID del disco danneggiato secondo i comandi dati in precedenza
# btrfs replace start 1 /dev/sdc1 /punto_di_mount
Per monitorare lo stato di ripristino del raid
# btrfs replace status /punto_di_mount
In alcuni casi potrebbe essere necessario montare il filesystem in modalità degraded (con l'opzione -o degraded) e lanciare il successivo comando per eliminare definitivamente il device dal raid.
# btrfs device delete missing /mnt
RAID 5
ATTENZIONE il raid5 su BTRFS è considerato sicuro
# mkfs.btrfs -d raid5 -m raid5 /dev/sda1 /dev/sdb1 /dev/sdc1
Conversione di un raid a raid5
# btrfs balance start -dconvert=raid5 -mconvert=raid5 /punto_di_mount
RAID 1C
RAID 1C3
Se si desiderano le caratteristiche di un raid5 su un sistema a 3 dischi è preferibile utilizzare una modalità chiamata raid1c3
Per creare ex novo il raid1c3
# mkfs.btrfs -d raid1c3 -m raid1c3 /dev/sda1 /dev/sdb1 /dev/sdc1
Per convertire a raid1c3
# btrfs balance start -dconvert=raid1c3 -mconvert=raid1c3 /storage-btrfs/
RAID 1C4
Se si desiderano le caratteristiche di un raid5 su un sistema a 4 dischi è preferibile utilizzare una modalità chiamata raid1c4.
Per creare ex novo il raid1c3
# mkfs.btrfs -d raid1c4 -m raid1c4 /dev/sda1 /dev/sdb1 /dev/sdc1
Per convertire a raid1c4
# btrfs balance start -dconvert=raid1c4 -mconvert=raid1c4 /storage-btrfs/
ZFS
Comandi per ottenere informazioni utili sul filesystem e sui pool
zfs list zpool status zpool list
Creare un pool su un disco
zpool create "pool" sda
Creare un pool su una partizione
zpool create "pool" sda2
Creare un pool in raid0
zpool create "pool" /dev/sdb /dev/sdc
Creare un pool in raid1
zpool create "pool" mirror /dev/sdb /dev/sc
Creare un pool raid5 su più dischi
zpool create "pool" raidz /dev/sdb /dev/sdc /dev/sdd
Creare un pool raid5 su immagini
zpool create "pool" raidz /path/1.img /path/2.img /path/3.img
- Sostituire disco in raid
Rimuovere il disco da sostituire
zpool offline disco1
Inserire il nuovo disco
zpool replace "pool" disco1 zpool online disco1
- Utilizza un altro disco montato al posto di quello danneggiato
zpool replace "pool" disco1 disco2
Aggiungere uno o più dischi ad un pool
zpool add "pool" mirror disco3 disco4 zpool add "pool" raidz disco3 disco4 disco5
Rimuovere disco1 da pool se aggiunto erroneamente
zpool remove "pool" disco1
Importare un pool
zpool import "pool"
Aggiungere pool alla cache per auto-import e mount (abilitare i vari demoni zfs)
zpool set cachefile=/etc/zfs/zpool.cache "pool"
oppure si possono caricare i mountpoint in modalità egacy dall'fstab
zfs create -o mountpoint=legacy "pool"/directory
Aggiungere la compressione
zfs get compression "pool" zfs set compression=lz4 "pool"
Vedere le proprietà di uno zpool
zfs get all zpool
Root filesystem
Per poter installare Arch con arch-chroot su zfs
# zpool create rpool sda2 # zfs create -o mountpoint=legacy rpool/ROOT # zpool set bootfs=rpool/ROOT rpool # mount -t zfs rpool/ROOT /mnt
rpool è il nome che abbiamo voluto dare al volume contenente il filesystem di sistema
Se volessimo aggiungere altri pool es.:
# zfs create rpool/home # zfs create rpool/usr/src # zfs create rpool/var # zfs create rpool/srv
Configurare la cache degli zpool
# zpool set cachefile=/etc/zfs/rpool.cache rpool
Copiare il file di cache nel sistema dove dovremo eseguire il chroot per l'installazione.
# mkdir -p /mnt/etc/zfs # cp /etc/zfs/rpool.cache /mnt/etc/zfs/rpool.cache
Installare il sistema di base
# pacstrap /mnt base base-devel net-tools
Eseguire il chroot per procedere con l'installazione
# arch-chroot /mnt
Configurare il mountpoint su fstab /etc/fstab
rpool/ROOT / zfs noatime 0 0
Editare il file /etc/mkinitcpio.conf aggiungendo zfs prima del filesystem
HOOKS="base udev autodetect modconf block keyboard zfs filesystems"
Abilitare il servizio ZFS all'avvio
# systemctl enable zfs.service
Uscire dal chroot e terminazione dell'installazione
# exit # zfs unmount -a # zfs set mountpoint=/ rpool # cp /etc/zfs/rpool.cache /mnt/etc/zfs/rpool.cache # zpool export rpool # reboot
Per limitare l'utilizzo di RAM a 2 Gib si può modificare
# echo "options zfs zfs_arc_max=2147483648" > /etc/modprobe.d/zfs.conf
GRUB
#Grub entry menuentry 'Arch Linux'{ insmod gzio insmod part_gpt insmod zfs set root='hd0,gpt2' linux /ROOT@/boot/vmlinuz-linux zfs_force=1 zfs=bootfs root=ZFS=rpool/ROOT rw quiet initrd /ROOT@/boot/initramfs-linux.img }
Hostid
Abilitato il servizio zfs, dopo il primo reboot, per evitare problemi, è necessario specificare l'hostid e rigenerare il ramdisk.
# hostid > /etc/hostid # mkinitcpio -p linux
Snapshots
Snapshot del volume root
# zfs snapshot rpool/ROOT@snapshot-2023-03-07
Snapshot ricorsivo di tutti i volumi contenuti in rpool
# zfs snapshot -r rpool@snapshot-2023-03-07
Lista degli snapshot presenti
# zfs list -t snapshot
Ripristino dello snapshot
# zfs rollback rpool@snapshot-2023-03-07
Invio via SSH di una snapshot
# zfs send rpool/ROOT@snapshot-2023-03-07| ssh user zfs recv tank/backups/rootzfs
Backup locale di una snapshot
# zfs send rpool | gzip > zfs_backup.gz
ZFS Cifrato
https://wiki.archlinux.org/title/ZFS#Native_encryption
Cache
Utilizzare un moderno disco a stato solido può essere una soluzione economica per velocizzare un pool, eventualmente anche raid
# zpool add -f rpool cache /dev/sdd1 # zpool add -f rpool log /dev/sdd2
Alternative
RAID mdadm
Era possibile effettuare RAID via software su Linux anche prima dell'avvento di filesystem di nuova generazione come btrfs o zfs. Per fare ciò è possibile utilizzare l'utitity mdadm
.
Vedere l'organizzazione della tabella delle partizioni dei dischi
$ lsblk
sda 8:16 0 447.1G 0 disk ├─sda1 8:17 0 500M 0 part ├─sda2 8:18 0 16G 0 part [SWAP] └─sda3 8:19 0 430.6G 0 part / sdb 8:32 1 3.7G 0 disk ├─sdb1 8:33 1 3.5G 0 part ├─sdb2 8:34 1 239M 0 part [SWAP] └─sdb3 8:19 0 430.6G 0 part /
Nell'esempio ci sono due dischi (sda, sdb) contenenti 3 partizioni: EFI, SWAP e Linux.
RAID 0
Creare un volume md3 che costituito dalla somma delle due partizioni sda3 e sdb3
# mdadm --create --verbose /dev/md3 --level=0 --raid-devices=2 /dev/sda3 /dev/sdb3
Verificare che il raid funzioni correttamente
# mdadm --detail /dev/md0
Utilizzare il nuovo volume md3, formattato col filesystem XFS, per una nuova installazione di Arch Linux (montandolo in /mnt)
# mkfs.xfs /dev/md3 # mount /dev/md3 /mnt/
RAID 1
Creare un volume md3 mirror delle due partizioni sda3 e sdb3
# mdadm --create /dev/md3 /dev/sda3 /dev/sdb3 --level=1 --raid-devices=2
RAID 5
Creare un volume md3 con un raid5, ovviamente stavolta occorreranno almeno 3 dischi es.: sda3, sdb3, sdc3.
Per creare tre partizioni tutte della stessa dimensione è possibile copiare su sdb e sdc la tabella delle partizioni di sda
# sfdisk -d /dev/sda | sfdisk /dev/sdb # sfdisk -d /dev/sda | sfdisk /dev/sdc
Creare l'array in raid5
# mdadm --create /dev/md/md3 /dev/sda1 /dev/sdb1 /dev/sdc1 --level=5 --raid-devices=3 --bitmap=internal
Modificare l'array
È possibile passare da raid1 a raid5
# mdadm --grow /dev/md3 --level=5 # mdadm --grow /dev/md3 --add /dev/sdc3 --raid-devices=3
Accorgersi di un guasto
Nei raid 1 e 5 in caso di danneggiamento di un disco sarà possibile sostituirlo e ricostruire l'array senza perdere dati. Nell'ipotesi di avere un guasto su sdb in un raid1 comparirà qualcosa di simile a questo eseguendo cat /proc/mdstat
md3 : active raid1 sda3[1] blocks [2/2] [U_]
invece che
md3 : active raid1 sda3[1] sdb3[0] 262016 blocks [2/2] [UU]
Rimuovere il disco danneggiato dal RAID
Si dovrà marcare sdb3 come danneggiata e andrà rimossa dall'array.
# mdadm --manage /dev/md3 --fail /dev/sdb3 # mdadm --manage /dev/md3 --remove /dev/sdb3
Se avessimo più array (es. md1, md2...) contenenti partizioni del disco sdb (sdb1, sdb2...), l'operazione andrebbe ripetuta per ciascuno di essi es.:
# mdadm --manage /dev/md1 --fail /dev/sdb1 # mdadm --manage /dev/md1 --remove /dev/sdb1
# cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid5] [raid4] [raid6] [raid10] md0 : active raid1 sda3[0] 24418688 blocks [2/1] [U_]
unused devices: <none>
Sostituzione del disco danneggiato
Spegnere il computer, rimuovere il disco guasto e collegarne al suo posto uno funzionante.
NB: il nuovo disco dovrà essere di dimensioni uguali o maggiori del disco sostituito
Installato il nuovo disco, riaccendere il PC, loggarsi come root e ricreare sul nuovo sdb le stesse partizioni presenti su sda:
# sfdisk -d /dev/sda | sfdisk /dev/sdb # fdisk -l (per controllare che le partizioni siano uguali)
Ripristino del RAID 1
Aggiungere /dev/sdb3 a /dev/md3
# mdadm --manage /dev/md3 --add /dev/sdb3
Se avessimo più array (es. md1, md2...) contenenti partizioni del disco sdb (sdb1, sdb2...), l'operazione andrebbe ripetuta per ciascuno di essi es.:
# mdadm --manage /dev/md1 --add /dev/sdb1
Controllare che tutto sia andato a buon fine
# cat /proc/mdstat
Cifratura
Cryptsetup
EncFS
EXT4 fscrypt
Fscrypt su ext4
LVM
Il Logical Volume Manager (LVM o gestore logico dei volumi) è un software per la gestione dei dischi che permette di superare le limitazioni legate al normale partizionamento di questi ultimi. Si tratta di una specie di strato che si va a frapporre tra il dispositivo fisico ed il filesystem. Permette di gestire dinamicamente l'aggiunta, la rimozione o il ridimensionamento dello spazio di archiviazione; nonché la possibilità di effettuare snapshot di backup dei volumi.
LVM è un prodotto oltremodo maturo, disponibile per Linux sin dal kernel 2.4, per questa ragione distribuzioni orientate al mercato aziendale come RedHat lo hanno scelto, accoppiandolo a XFS o ext4, come soluzione predefinita per implementare la maggior parte delle caratteristiche fornite dai moderni filesystem come BTRFS o ZFS
LVM si basa sui seguenti concetti
- Physical Volumes (PV): rappresentano qualsiasi disco si voglia inizializzare ("formattare") come sottosistema LVM
# pvcreate /dev/sda1 # pvcreate /dev/sdb3 # pvcreate /dev/sdc # pvdisplay
- Volume Groups (VG): sono costituiti da physical volumes e rappresentano la capacità totale delle risorse di un LVM
# vgcreate vg0 /dev/sda1 /dev/sdb3 /dev/sdc # vgdisplay vg0
- Logical Volumes (LV): utilizzano le risorse messe a disposizione dai volume groups. Possono essere inizializzati anche con proprietà di RAID o cache.
# lvcreate -L 10G -n home vg0 # lvdisplay /dev/vg0/home
Oppure nel caso volessimo fare un raid5
# lvcreate -n lvr5 –type raid5 -L 10G -i 3 vg0 -n nome del volume –type raid5 tipo di raid -L dimensione massima della grandezza del raid -i numero dei physical volumes che si vogliono utilizzare
Per formattare il volume logico appena creato
# mkfs -t ext4 /dev/vg0/lvr5
Per aggiungere un disco ad un Volume Groups
# vgextend vg0 /dev/sdb2
Snapshot
Creare uno snapshot della del volume logico /home che potrà contenere fino ad un massimo di 5 GiB di dati modificati rispetto all'originale
# lvcreate --size 5G --snapshot --name homesnap20230306 /dev/vg0/home
Ripristinare il volume logico ricaricando lo snapshot
# lvconvert --merge /dev/vg0/homesnap20230306
Nel caso il logical volume sia attivo il merging avverrà col prossimo riavvio e lo snapshot sparirà.
Cache
Utilizzare un moderno disco a stato solido può essere una soluzione economica per velocizzare un LV.
Convertire il disco a PV ed aggiungerlo al preesistente VG
# pvcreate /dev/discoSSD # vgextend vg0 /dev/discoSSD
Aggiungere la cache al LV
# lvcreate --type cache --cachemode writethrough -l 100%FREE -n root_cachepool vg0/home /dev/discoSSD
Rimuovere la cache dal LV
# lvconvert --uncache vg0/home
Boot loader
È possibile scegliere tra più bootloader: GRUB, Lilo, Syslinux o addirittura il bootloader integrato del systemd (systemd-boot). Ma dato che GRUB è utilizzabile pressoché in ogni circostanza: schede madri BIOS, UEFI; Secure Boot, hard disk, floppy, CD-ROM... in questa guida mi limiterò alla sua configurazione, tralasciando le alternative.
Sistema con BIOS
# pacman -S grub # grub-mkconfig -o /boot/grub/grub.cfg # grub-install /dev/sda
Sistema UEFI
# pacman -S grub # mkdir /boot/EFI # mount /dev/sda1 /boot/EFI # grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --recheck --debug # grub-mkconfig -o /boot/grub/grub.cfg
Gestione snapshot BTRFS
Manuale
Editare /etc/grub.d/40_custom (o crearlo) e aggiungere quanto segue per permettere l'avvio della snapshot rootsnap
menuentry 'Linux snapshot' { insmod gzio insmod part_gpt insmod btrfs set root='hd1,gpt3' linux /rootsnap/boot/vmlinuz-linux root=/dev/partizione rw rootflags=subvol=rootsnap quiet initrd /rootsnap/boot/initramfs-linux.img }
dopodichè aggiornare la configurazione di GRUB con
# grub-mkconfig -o /boot/grub/grub.cfg
Automatico
Per facilitare la gestione lei sottovolumi e delle snapshot del BTRFS Arch offre il pacchetto grub-btrfs, la sua installazione provvederà ad aggiungere tutti i sottovolumi contenenti un sistema Linux al menu di grub.
# pacman -S grub-btrfs
Ogni volta che si vorrà aggiornare grub con nuovi subvolumi basterà dare il seguente comando
# grub-mkconfig -o /boot/grub/grub.cfg
Ripristinare GRUB
Aggiornando la propria distribuzione Linux, il proprio boot loader o installando un altro sistema operativo (es. Windows) può capitare di sovrascrivere il MBR.
Avviare il computer con un liveCD/DVD o USB:
Ipotizziamo di avere una partizione / chiamata /dev/sda2 e nessuna /boot
Creiamo i seguenti mount point
# sudo su # cd /mnt # mkdir sda2 # mount /dev/sda2 /mnt/sda2
Se utilizziamo una scheda madre UEFI andrà montata anche la partizione efi (solitamente è la prima partizione del disco sda1)
# mount /dev/sda2 /mnt/sda2/boot/efi
Se necessario editiamo il file di configurazione di grub
# nano /mnt/sda2/boot/grub/grub.cfg
arch-chroot
Se stiamo utilizzando un sistema basato su Arch Linux, utilizzando l'utility arch-chroot presente nel pacchetto arch-install-scripts potremo automatizzare il processo di chroot con un solo comando
# arch-chroot /mnt/sda2
Manuale
# mount --rbind /dev /mnt/sda2/dev # mount -t proc /proc /mnt/sda2/proc # mount -t sysfs /sys /mnt/sda2/sys/
Eseguiamo il vero e proprio chroot in /dev/sda2
# chroot /mnt/sda2
Reinstallazione
# grub-mkconfig -o /boot/grub/grub.cfg # grub-install /dev/sda
Riavvio del sistema
Usciamo dal chroot, smontiamo la partizione e riavviamo il sistema
# exit # umount /mnt/sda1/proc # umount /mnt/sda1/dev # umount /mnt/sda1 # systemctl reboot
Networking
Manuale
net-tools
Storica serie di utility per gestire le interface di rete, presente da decenni nell'installazione base della maggior parte delle distribuzioni Linux, ma attualmente considerata obsoleta. Tra i suoi comandi principali: arp, hostname, ifconfig, iptunnel netstat e route.
Attivare l'interfaccia di rete eth0 ed assegnarle l'indirizzo ip 192.168.0.2
# ifconfig eth0 192.168.0.2 up
Disattivare l'interfaccia di rete eth0
# ifconfig eth0 down
Assegnare manualmente un gateway (es.: 192.168.0.1) alla rete
# route add default gw 192.168.0.1
Ovviamente occorrerà aggiungere un server DNS al file /etc/resolv.conf
per la risoluzione degli indirizzi.
iproute2
net-tools | iproute2 | Note |
---|---|---|
ifconfig | ip addr, ip link | Address and link configuration |
route | ip route | Routing tables |
arp | ip neigh | Neighbors |
iptunnel | ip tunnel | Tunnels |
nameif, ifrename | ip link set name | Rename network interfaces |
ipmaddr | ip maddr | Multicast |
netstat | ss, ip route | Show various networking statistics |
brctl | bridge | Handle bridge addresses and devices |
Elencare gli indirizzi IP:
# ip addr
Mostra le informazioni di una specifica interfaccia di rete
# ip addr show eth0
Aggiungere un indirizzo all'interfaccia eth0:
# ip addr add 192.0.2.10/24 dev eth0
Cancellare un indirizzo associato all'interfaccia eth0:
# ip addr delete 192.0.2.10/24 dev eth0
Attivare l'interfaccia eth0:
# ip link set dev eth0 up
Disattivare l'interfaccia eth0:
# ip link set dev eth0 down
Svuotare la cache arp per tutte le interfacce:
# ip neigh flush all
Aggiungere una rotta che passa per gateway 192.0.2.1
#ip route add default via 192.168.0.1
Aggiungere una rotta che passa per gateway 192.168.2.1 per l'interfaccia 10.0.2.0
# ip route add 10.0.2.1/24 via 192.168.0.1 dev enp0s3
Aggiungere una rotta che passa per gateway 192.168.2.1 per l'interfaccia 10.0.2.0
# ip route del 10.0.2.0/24 via 192.168.0.1 dev enp0s3
Mostrare la tabella di routing
# ip route show
Systemd
systemd-networkd è un demone, parte di systemd, che gestisce la configurazione della rete.
Esempi di configurazione
Per prima cosa sarà necessario abilitare il servizio
# systemctl start systemd-networkd.service
DHCP
/etc/systemd/network/20-wired.network
[Match] Name=enp1s0 [Network] DHCP=yes
IP statico
/etc/systemd/network/20-wired.network
[Match] Name=enp1s0 [Network] Address=10.1.10.9/24 Gateway=10.1.10.1 DNS=10.1.10.1
Wireless adapter
Per potersi connettere a connessioni WIFI è necessario installare e configurare un'ulteriore applicazione dedicata come iwd o wpa_supplicant per l'autenticazione alla rete.
/etc/systemd/network/25-wireless.network
[Match] Name=wlp2s0 [Network] DHCP=yes IgnoreCarrierLoss=3s
Rinominare l'interfaccia di rete
Invece che impostare una regola su udev è possibile usare un file di testo .link nel seguente modo
/etc/systemd/network/10-ethusb0.link
[Match] MACAddress=12:34:56:78:90:ab [Link] Description=USB to Ethernet Adapter Name=ethusb0
Wifi
Programmi | WEXT | nl80211 | WEP | WPA |
---|---|---|---|---|
wireless_tools | Sì | No | Sì | No |
iw | No | Sì | Sì | No |
wpa_supplicant | Sì | Sì | No | Sì |
iwd/iwgtk | No | Sì | No | Sì |
NetworkManager
NetworkManager è una utility che si è imposta come standard per la configurazione della reti Linux (LAN e Wifi)
Si compone di un demone, un'interfaccia da riga di comando (nmcli) ed un'interfaccia di configurazione basata su un menu testuale (nmtui).
I principali desktop enviroment come GNOME e KDE Plasma possiedono una utility grafica che consente loro di configurare graficamente le reti basandosi su NetworkManager.
Installazione
# pacman -S networkmanager # systemctl enable NetworkManager # systemctl start NetworkManager
Configurazione
- Menu di configurazione: qualora si utilizzi un sistema privo di interfaccia grafica e si desideri configurare una rete wifi si consiglia caldamente l'utilizzo dell'applicazione
nmtui
- Per chi dovesse prediligere la configurazione manuale:
nmcli
Alternative
Condividere la connessione
Abilitazione del forwarding dei pacchetti
$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward
Per rendere il forwarding definitivo editare il file /etc/sysctl.conf modificando come segue il parametro net.ipv4.ip_forward:
net.ipv4.ip_forward = 1
Mascheramento dei pacchetti
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
eth0 non è un parametro fisso, identifica l'interfaccia con la quale il PC si connette ad Internet
Per applicare automaticamente tale regola ad ogni riavvio
# iptables-save > /etc/iptables.ipv4.nat # iptables-restore < /etc/iptables.ipv4.nat
Moduli kernel
Assicurarsi che siano caricati i seguenti moduli:
# modprobe ip_tables # modprobe ip_conntrack # modprobe iptable_nat # modprobe ipt_MASQUERADE
Condivisione tramite rete ethernet
Configurazione scheda di rete interna
Assegnare un IP statico alla scheda ethernet con la quale si vuol condividere la connessione.
# ifconfig eth1 192.168.5.1 netmask 255.255.255.0 up
Per rendere tale configurazione permanente sarà necessario editare il file /etc/network/interfaces ed aggiungere la seguente configurazione
auto eth1 iface eth1 inet static address 192.168.5.1 netmask 255.255.255.0
Condivisione tramite rete WI-FI
Configurazione scheda wireless
Se non si desidera cifrare la rete e proteggerla con una password sarà sufficiente eseguire questi comandi.
# iwconfig wlan0 mode Master # iwconfig wlan0 ESSID ReteGOLEM # iwconfig wlan0 enc off # ifconfig wlan0 192.168.5.1 netmask 255.255.255.0 up
Per rendere tale configurazione permanente sarà necessario editare il file /etc/network/interfaces ed aggiungere la seguente configurazione
iface wlan0 inet loopback address 192.168.5.1 netmask 255.255.255.0
Proteggere la connessione WI-FI
Installare il programma hostapd
# pacman -S hostapd
Configurare hostapd modificando /etc/hostapd/hostapd.conf
# Interfaccia di rete interface=wlan0 # Driver della scheda wifi usata (non tutte le schede sono supportate) driver=nl80211 # Nome della rete (SSID) ssid=ReteGOLEM hw_mode=g # Canale di trasmissione channel=6 macaddr_acl=0 # Righe per la protezione auth_algs=1 ignore_broadcast_ssid=0 wpa=2 # Password del wifi wpa_passphrase=password wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
Editare il file /etc/default/hostapd per impostare hostapd.conf come file di configurazione predefinito, modificando la riga DAEMON_CONF="":
DAEMON_CONF="/etc/hostapd/hostapd.conf"
Assegnazione automatica degli IP ai client
# pacman -S dhcp
Editare /etc/dhcpd.conf aggiungendo la configurazione per la rete interna (es.: eth1 o wlan0):
subnet 192.168.5.0 netmask 255.255.255.0 { range 192.168.5.100 192.168.5.200; option domain-name-servers 8.8.8.8; }
VPN
OpenVPN
https://wiki.archlinux.org/title/OpenVPN
L2TP/IPsec VPN
https://wiki.archlinux.org/title/Openswan_L2TP/IPsec_VPN_client_setup
Container
Toolbox
Toolbox è un tool che permette di creare ed utilizzare container che si integrano col sistema host accedendo ad ogni sua risorsa: directory home dell'utente, X11/Wayland, networking, periferiche esterne. Tutto senza dover mettere mano a nessun file di configurazione. È il modo più semplice per di integrare più distribuzioni all'interno di una stessa macchina Linux.
Immagini
- https://github.com/toolbx-images/images Container contenenti le principali distribuzioni
Comandi
Creare un container
$ toolbox create -i quay.io/toolbx-images/rhel-toolbox:9.1 -c redhat
Entrare in un container
$ toolbox enter redhat
Fermare un container
$ podman stop nome_macchina
Rimuovere un container
$ toolbox rm -f redhat
Rimuovere un container e la sua immagine
$ toolbox rmi redhat
Esaminare la lista dei container e delle immagini disponibili
$ toolbox list
Permettere agli utenti non root di utilizzare i container
$ sudo sh -c 'echo "username:100000:65536" >> /etc/subuid' $ sudo sh -c 'echo "username:100000:65536" >> /etc/subgid'
Abilitare l'host al forwarding di X11 per le applicazioni che richiedono Xorg
# xhost +
Eseguire un comandi all'interno di un container
$ toolbox run -c redhat libreoffice
LXC
Linux Container (LXC) permette di virtualizzare uno o più container Linux su un singolo host LXC, gestendone virtualmente RAM, CPU, socket e rete.
È estremamente utile quando si ha bisogno di isolare dei servizi dal sistema host: es.: server web, imap, smtp...
Installazione
Installare LXC
# pacman -S lxc lxc-templates lxcfs lxd
Comandi
Lista dei container installati
lxc-ls -f
Installare un container scegliendo l'immagine dalla lista di quelli disponibili
lxc-create -n playtime -t download
Se sapete già di quale container avete bisogno sarà possibile scaricarlo direttamente
lxc-create -n playtime -t download -- --dist archlinux --release current --arch amd64
Far partire il container chiamato debian
lxc-start debian
Entrare dentro il container chiamato debian
lxc-attach debian
Fermare l'esecuzione del container chiamato debian
lxc-stop debian
Rimuovere il container chiamato debian
lxc-destroy debian
Eseguire un comando dentro il container chiamato debian
lxc-attach --name debian nano
Rete Bridge
Nel caso si debbano usare servizi da tenere esposti su Internet potrebbe essere conveniente utilizzare una rete bridge piuttosto che NAT.
Configurazione rete bridge.
Alternative
Fonti software alternative
Nella rara eventualità che si necessiti di un programma non presente né nei repository ufficiali, né su AUR è possibile optare per una delle seguenti opzioni.
AppImage
Scaricate qualsiasi pacchetto disponibile su appimage.github.io e rendetelo eseguibile.
$ chmod a+x nomeprogramma.AppImage
Non resta che eseguirlo col seguente comando o con un doppio click
$ ./nomeprogramma.AppImage
Flatpak
Concepito per essere una sorta di Google Play Store per GNOME, è possibile installare programmi provenienti da flatpak utilizzando i normali gestori grafici di pacchetti basati su packagekit come Gnome Software o Discover di Plasma.
Installazione
# pacman -S flatpak
Abilitazione del repository ufficiale del progetto (software di terze parti potrebbe richiedere di aggiungere altri repository)
# flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
Elenca i repository disponibili.
$ flatpak remotes
Installa un'applicazione (es.: libreoffice)
$ flatpak install flathub org.libreoffice.LibreOffice
Esegue un'applicazione (es.: libreoffice)
$ flatpak run org.libreoffice.LibreOffice
Disinstalla un'applicazione mantenendo i dati.
$ flatpak uninstall <nome app>
Disinstalla un'applicazione eliminando i dati (nella home utente .var/app/).
$ flatpak uninstall <nome app> --delete-data
Elimina i dati di tutte le applicazioni disinstallate (nella home utente .var/app/).
$ flatpak uninstall --delete-data
Disinstalla tutte le applicazioni flatpak installate sul sistema.
$ flatpak uninstall --all
Cerca ed esegue aggiornamenti per le applicazioni installate.
$ flatpak update
Aggiorna una singola applicazione.
$ flatpak update <nome app>
Elenca tutte le applicazioni flatpak installate sul sistema.
$ flatpak list --app
Elenca i runtime installati.
$ flatpak list --runtime
Visualizzare le informazioni sulle applicazioni in esecuzione.
$ flatpak ps
Termina un'applicazione bloccata o danneggiata (l'ID dell'istanza si può ottenere dal comando precedente).
$ flatpak kill <id istanza>
Tenta la riparare dei pacchetti danneggiati. Necessita dei privilegi di amministrazione.
$ flatpak repair
Nix
Nix package manager è il gestore di pacchetti utilizzato su NixOS. È possibile però utilizzarlo su qualsiasi distribuzione Linux affiancandone il gestore di pacchetti predefinito.
Nix analizza le istruzioni di compilazione (riproducibili) specificate in un file secondo il suo linguaggio di espressione, i risultati di questa compilazione sono archiviati secondo indirizzi univoci identificati da un hash e completi del loro intero albero delle dipendenze. Si crea così un archivio immutabile di pacchetti che consente aggiornamenti atomici, rollback e installazione simultanea di diverse versioni di un pacchetto.
Installazione
Single-user installation
$ sudo install -d -m755 -o $(id -u) -g $(id -g) /nix $ sh <(curl -L https://nixos.org/nix/install) --no-daemon
Aggiungere la riga seguente al .bashrc
o al file di configurazione della vostra shell per poter utilizzare i comandi Nix
$ source $HOME/.nix-profile/etc/profile.d/nix.sh
Canali
Il software è distribuito attraverso in repository chiamati canali nei quali può essere disponibile in forma già precompilata binary cache o come sorgente da compilare. Questi canali determinano la versione dei pacchetti disponibili categorizzandoli nei rami stabile ed instabile.
Ecco di seguito i comandi principali per gestire questi canali
Lista dei canali configurati
$ nix-channel --list
Aggiungere il canale principale (nixos)
$ nix-channel --add https://nixos.org/channels/channel-name nixos
Aggiungere altri canali
$ nix-channel --add https://some.channel/url my-alias
Rimuovere un canale
$ nix-channel --remove channel-alias
Aggiornare un canale
$ nix-channel --update channel-alias
Aggiornare tutti i canali
$ nix-channel --update
Comandi
Cercare un pacchetto
$ nix search nixpkgs packagename
Installare un pacchetto
$ nix-env -iA packagename
Vedere i pacchetti installati
$ nix-env -q
Disinstallare un pacchetto
$ nix-env -e packagename
Aggiornare tutti i pacchetti
$ nix-env -u
Snap
È gestore di pacchetti ed un formato per la distribuzione di software ideato da Canonical Ltd. per Ubuntu, ma che adesso può essere utilizzato anche su altre distribuzioni. Consente di installare un'applicazione completa di tutte le sue librerie isolandola dal resto del sistema operativo. Si evitano così possibili conflitti tra applicazioni, permettendo la coesistenza di più versioni di uno stesso programma o libreria.
Su Arch è disponibile su AUR: snapd
Installazione
Installare ed abilitare Snap
$ yay -S snapd $ sudo ln -s /var/lib/snapd/snap /snap $ sudo systemctl start snapd.service $ sudo systemctl enable snapd.service
Comandi
Cercare un programma
$ snap find nomeprogramma
Installare un programma
$ sudo snap install nomeprogramma
Rimuovere un programma
$ sudo snap remove nomeprogramma
Vedere i programmi installati
$ snap list
Aggiornare manualmente i pacchetti snap
# snap refresh
Systemd
systemd-resolved — network name resolution; systemd-timesyncd — system time synchronization across the network; systemd/Journal — system logging systemd/Timers — alternative to cron