Inhaltsverzeichnis

Arch Linux - (manuelle) Minimalinstallation

Bild: Archlinux Logo Im folgenden Artikel wollen wir uns eingehender mit der Installation von Arch Linux befassen. Eine sehr gute Beschreibung was diese Distribution ausmacht, ist im folgenden Artikel Über Arch Linux sehr gut beschrieben. Im Gegensatz zu altbekannten Distributionen verfügt Arch Linux über keinen graphischen Installationsclient; daher muss die Grundinstallation ausschliesslich über die Kommandozeile vorgenommen werden.

In der künftigen Ausprägung unserer Infrastruktur werden wir natürlich mit Hilfe von Ansible automatisiert unsere Hosts und Anwendungen installieren, konfigurieren und auf dem Laufenden halten. Hierzu werden wir uns später ein individuelles Boot-Image initial erzeugen, mit Hilfe dessen wir dann mit dem Orchestrierungswerkzeug Ansible dann weiterarbeiten wollen.

Wir werden also zunächst eine 0815-Installation, die lediglich zur Erstellung eines initialen, auf unsere Bedürfnisse und Rahmenbedingungen zugeschnittenes Boot-ISO-Image erzeugen.

Vorbereitungen / Überlegungen

Die grundsätzliche Herangehensweise bei der Minimalinstallation ist im folgenden Arch Linux WIKI Artikel bzw. hier im Arch Linux Installation Guide grundsätzlich beschrieben.

Download

Von der Downloadseite holen wir uns nun das aktuelle ISO-Image und die zugehörige sha256sums.txt Datei auf unseren Virtualisierungshost mit Hilfe von wget.

 $ wget https://packages.oth-regensburg.de/archlinux/iso/2022.12.01/{archlinux-2022.12.01-x86_64.iso,sha256sums.txt}

Anschliessend überprüfen wir das heruntergeladene ISO-Image auf Integrität.

 $ sha256sum --check sha256sums.txt | grep archlinux-2022.12.01-x86_64.iso

sha256sum: archlinux-x86_64.iso: No such file or directory
sha256sum: archlinux-bootstrap-2022.12.01-x86_64.tar.gz: No such file or directory
sha256sum: archlinux-bootstrap-x86_64.tar.gz: No such file or directory
sha256sum: WARNING: 3 listed files could not be read
archlinux-2022.12.01-x86_64.iso: OK

Das OK zeigt uns, dass mit dem ISO-Image soweit alles in Ordnung ist und wie mit der Installation fortschreiten können. Hierzu verschieben wir das heruntergeladene ISO auf dem Virtualisierungsknoten in das zugehörige Verzeichnis, in dem sich unsere Boot-Images befinden: /var/lib/libvirt/boot/.

 # mv archlinux-2022.12.01-x86_64.iso /var/lib/libvirt/boot/

Die Datei mit den Prüfsummen wird nicht weiter benötigt, daher löschen wir diese wieder.

 # rm sha256sums.txt

virtuellen Host anlegen

Für die Erstellung unseres ganz eigenen Benutzer-/Site-spezifischen Boot-ISO-Images werden wir eine VM1) verwenden, die folgende Eigenschaften hat:

Mit Hilfe des Befehls virt-install erzeugen wir nun unsere temporäre VM auf unserem Virtualisierungs-Server (Wirt).

 # virt-install -n vml000200 --description "Arch-Linux Boot-ISO-Node" --os-type=Linux --os-variant=generic --ram=8192 --vcpus=4 --disk path=/var/lib/libvirt/images/vml000200.img,bus=virtio,size=30 --cdrom /var/lib/libvirt/boot/archlinux-2022.12.01-x86_64.iso --network bridge:br-dmz && virt-viewer --connect qemu:///system vml000200

Bild: Arch Linux Boot Screen

Sobald der Node gestartet wurde, befinden wir uns dann auf der initialen Konsole, von der wir die weitere Konfiguration dann vornehmen werden.

Bild: Arch Linux Konsole

Erstkonfiguration

wir sind bereits als Benutzter root angemeldet und können nun manuell alle erforderlichen Konfigurationsschritte vornehmen. Hierbei orientieren wir uns im Grossen und Ganzen der Musterbeschreibung des Arch Linux WIKIs.

Tastaturlayout

Nach dem initialen Start des Default-ISO-Images wird standardmässig ein US/Englisches-Tastaturlayout verwendet. Dies ändern wir nun zu aller erst einmal auf ein deutsches Tastaturlayout ab, da wir in aller Regel mit diesem besser zu Recht kommen.

root@archiso ~ # loadkeys de-latin1-nodeadkeys

Festplatten partitionieren

Bevor wir nun mit der eigentlichen Installation und Konfiguration unserer Minimalinstallation fortfahren können, müssen wir den Diskspace unseren Anforderungen gemäss erst einmal aufteilen. Aktuell ist unsere virtuelle Festplatte noch unberührt, was auch folgender Aufruf zeigt.

root@archiso ~ # fdisk -l | grep -i 'Disk /dev/vd'
Disk /dev/vda: 30 GiB, 32212254720 bytes, 62914560 sectors

Folgendes Beispiel wollen wir für die Partitionierung und Belegung als Basis verwenden:

Phyische Festplatte / LVM Größe Mount-Point Datei-System
/dev/vda
/dev/vda1 1 GB /boot ext4
/dev/vda2
/dev/mapper/archlinux-swap 2 GB swap
/dev/mapper/archlinux-root 10 GB / ext4
/dev/mapper/archlinux-home 10 GB /home ext4
/dev/mapper/archlinux-var 3 GB /var ext4
/dev/mapper/archlinux-var_log 3 GB /var/log ext4

Zum Partitionieren verwenden wir den Befehl fdisk.

root@archiso ~ # fdisk /dev/vda
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x6469dd09.

Command (m for help):

Hier legen wir nun unsere erste Partition mit dem Kommando n an. Entsprechend unseren Vorstellungen der obigen Tabelle beantworten wir alle weiteren Fragen.

Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-62914559, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62914559, default 62914559): +1024M

Created a new partition 1 of type 'Linux' and of size 512.5 KiB.

Command (m for help):

Für unser LVM legen wir auch gleich sofort die zweite Partition wiederum mit dem Kommando n an.

 Command (m for help):
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (2-4, default 2): 
First sector (3073-62914559, default 4096): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4096-62914559, default 62914559): 

Created a new partition 2 of type 'Linux' and of size 30 GiB.

Command (m for help):

Da wir bei der zweiten Partition aber später ein LVM anlegen werden, müssen wir den Default-Typ der zweiten Partition entsprechend abändern auf 8e. Hierzu benutzen wir das Kommando t.

 Command (m for help):
Partition number (1,2, default 2): 2
Hex code or alias (type L to list all): 8e

Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help):

Bevor wir nun unsere Änderungen auf Platte persistieren, kontrollieren wir nochmal kurz unsere Angaben mit dem Kommando p.

 Command (m for help):
Disk /dev/vda: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6469dd09

Device     Boot Start      End  Sectors   Size Id Type
/dev/vda1        2048     3072     1025 512.5K 83 Linux
/dev/vda2        4096 62914559 62910464    30G 8e Linux LVM

Wir speichern und verlassen nun das Programm fdisk durch Eingabe des Kommandos w.

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

Logical Volume LVM anlegen

Gemäss unserer Überlegung (siehe obige Tabelle mit den Partitionierungen) wollen wir nun auf dem Device /dev/sda2 ein LVM anlegen.

Physisches Volume anlegen

Zunächst legen wir das benötigte physisches volume zur Nutzung durch ein LVM mit nachfolgendem Befehl an:

root@archiso ~ # pvcreate /dev/vda2
  Physical volume "/dev/vda2" successfully created.

Volume Gruppe anlegen

Als nächstes definieren wir eine volume groups mit dem Namen archlinux zur Nutzung durch ein LVM mit nachfolgendem Befehl:

root@archiso ~ # vgcreate archlinux /dev/vda2
  Volume group "archlinux" successfully created

Logische Volumes anlegen

Nun fehlen nur noch die logical volumes die wir nun noch einzeln hinzufügen.

root@archiso ~ # lvcreate --name swap -L2048M archlinux
  Logical volume "swap" created.
root@archiso ~ # lvcreate --name root -L10240M archlinux
  Logical volume "root" created.
root@archiso ~ # lvcreate --name home -L10240M archlinux
  Logical volume "home" created.
root@archiso ~ # lvcreate --name var -L3072M archlinux
  Logical volume "var" created.
root@archiso ~ # lvcreate --name var_log -L3072M archlinux
  Logical volume "var_log" created.

Wir haben also nunmehr unsere virtuelle Festplatte wie folgt aufgeteilt:

root@archiso ~ # lsblk /dev/vda
NAME                  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
vda                   254:0    0    30G  0 disk 
├─vda1                254:1    0 512.5K  0 part 
└─vda2                254:2    0    30G  0 part 
  ├─archlinux-swap    252:0    0     2G  0 lvm  
  ├─archlinux-root    252:1    0    10G  0 lvm  
  ├─archlinux-home    252:2    0    10G  0 lvm  
  ├─archlinux-var     252:3    0     3G  0 lvm  
  └─archlinux-var_log 252:4    0     3G  0 lvm

Dateisysteme formatieren

Bevor wir unseren neuen virtuellen Host mit Leben befüllen, müssen wir natürlich noch die Dateusysteme, die wir gerade angelegt haben, entsprechend unseren Vorüberlegungen formatieren.

root@archiso ~ # mkfs.ext4 /dev/vda1
mke2fs 1.46.5 (30-Dec-2021)

Filesystem too small for a journal
Creating filesystem with 512 1k blocks and 64 inodes

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done
root@archiso ~ # mkswap /dev/mapper/archlinux-swap
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=d2e654c4-c2d5-4f61-aec1-cb0e48ebb6b3
root@archiso ~ # mkfs.ext4 /dev/mapper/archlinux-root
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 570c15a5-e96e-45e1-925d-ace2e3d3e6c7
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@archiso ~ # mkfs.ext4 /dev/mapper/archlinux-home
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 25c16c5b-7389-47be-85e5-06e93e301879
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@archiso ~ # mkfs.ext4 /dev/mapper/archlinux-var
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 786432 4k blocks and 196608 inodes
Filesystem UUID: e8e25e17-b8e2-471f-b582-7fc1a43439d0
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@archiso ~ # mkfs.ext4 /dev/mapper/archlinux-var_log
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 786432 4k blocks and 196608 inodes
Filesystem UUID: c1ffbcd2-ba87-4f36-9345-39fe135007e3
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

Partitionen einhängen

Nun ist es an der Zeit, dass wir unsere Dateisysteme an Ort und Stelle einbinden - sprich mounten: Zunächst mounten wir unsere root-Partition /dev/mapper/archlinux-root auf den Mount-Point /mnt.

root@archiso ~ # mount /dev/mapper/archlinux-root /mnt

Bevor wir die zugehörigen Partitionen einhängen können, müssen wir die entsprechenden Mountpoints für /boot, /home und /var erst anlegen.

root@archiso ~ # mkdir /mnt/{boot,home,var}

Nun können wir mit dem Mounten unserer Partitionen fortfahren. Als erstes mounten wir /boot.

root@archiso ~ # mount /dev/vda1 /mnt/boot

Als nächstes aktivieren wir unsere SWAP_Partition.

root@archiso ~ # swapon /dev/mapper/archlinux-swap

Anschliessend folgen die restlichen Mount-Points aus dem LVM:

root@archiso ~ # mount /dev/mapper/archlinux-home /mnt/home
root@archiso ~ # mount /dev/mapper/archlinux-var /mnt/var

Bevor wir nun noch die letzte Partition für das Verzeichnis /var/log mounten können, müssen wir das betreffende Verzeichnis noch anlegen.

root@archiso ~ # mkdir /mnt/var/log

Zu guter Letzt können wir nun auch noch den letzte Mount-Point für /var/log einhängen:

root@archiso ~ # mount /dev/mapper/archlinux-var_log /mnt/var/log

Somit haben wir nun folgenden Endstand in Sachen Partitionierung und Dateisysteme.

root@archiso ~ # lsblk /dev/vda
NAME                  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
vda                   254:0    0    30G  0 disk 
├─vda1                254:1    0 512.5K  0 part /mnt/boot
└─vda2                254:2    0    30G  0 part 
  ├─archlinux-swap    252:0    0     2G  0 lvm  [SWAP]
  ├─archlinux-root    252:1    0    10G  0 lvm  /mnt
  ├─archlinux-home    252:2    0    10G  0 lvm  /mnt/home
  ├─archlinux-var     252:3    0     3G  0 lvm  /mnt/var
  └─archlinux-var_log 252:4    0     3G  0 lvm  /mnt/var/log

Basissystem einrichten

Mit Hilfe von pacstrap installieren wir nun unser Basissystem.

root@archiso ~ # pacstrap /mnt base base-devel dnsutils linux-lts linux-firmware lvm2 man-db man-pages openssh python sshpass tree vi vim

System einrichten

fstab generieren

Im nächsten Schritt erzeugen wir die Konfigurationsdatei /etc/fstab in unserer temporären Installationsumgebung.

 root@archiso ~ # genfstab -Up /mnt > /mnt/etc/fstab

arch-chroot /mnt

Wie in der Beispielsdokumentation angegeben können wir nun für die weitere Konfiguration in die Chailroot-Umgebung unserer Muster-VM wechseln.

root@archiso ~ # arch-chroot /mnt/
[root@archiso /]#

Wie sehen hier durch den geänderten Boot-Prompt, dass wir uns nunmehr in der Chailroot-Umgebung unserer Muster-VM befinden, von wo aus wir die weiteren Schritte abarbeiten können.

Hostname ändern

Zunächst setzen wir den Hostnamen für unsere Muster-/Test-VM.

[root@archiso /]# echo archlinux > /etc/hostname

Spracheinstellungen setzen

Unser System soll mit der Systemsprache English-US und UTF-8 ausgestattet werden. Dies erreichen wir mit folgendem Befehl:

[root@archiso /]# echo LANG=en_US.UTF-8 > /etc/locale.conf

Anschließend kommentieren wir in der Datei /etc/locale.gen die beiden Einträge für en_US.UTF-8 UTF-8 und en_US ISO-8859-1 in dem wir bei diesen jeweils das Kommentarzeichen # entfernen.

[root@archiso /]# vim /etc/locale.gen

Unsere Änderungen können wir bei Bedarf auch nochmals kontrollieren bevor wir diese aktivieren.

[root@archiso /]# grep -Ev '(^#|^$)' /etc/locale.gen
en_US.UTF-8 UTF-8  
en_US ISO-8859-1

Unsere Änderungen aktivieren wir nun noch im System.

[root@archiso /]# locale-gen
Generating locales...
  en_US.UTF-8... done
  en_US.ISO-8859-1... done
Generation complete.

mkinitcpio konfigurieren

mkinitcpio muss via /etc/mkinitcpio.conf für die Benutzung unserer LVMs noch konfiguriert, sprich bei den HOOKS das Keyword lvm2 ergänzt werden, damit die Maschine später ordnungsgemäss booten kann.

[root@archiso /]# vim /etc/mkinitcpio.conf
/etc/mkinitcpio.conf
...
 
##   NOTE: If you have /usr on a separate partition, you MUST include the
#    usr and fsck hooks.
HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block lvm2 filesystems fsck)
 
...

Kernel-Image erzeugen

Nun erzeugen wir das initiale Ramdisk Environment indem wir die initramfs-Erstellung wie folgt anstossen:

[root@archiso /]# mkinitcpio -p linux-lts

Root-Passwort setzen

Unser System-User root benötigt natürlich auch noch ein passendes Root-passwort, welches wir nun setzen.

[root@archiso /]# passwd
New password: 
Retype new password: 
passwd: password updated successfully

Keyboardlayout setzen

Das deutsche Tastaturlayout de-latin1-nodeadkeys setzen wir nun permanent.

[root@archiso /]# echo KEYMAP=de-latin1-nodeadkeys > /etc/vconsole.conf

Ebenso definieren wir noch die Schriftart der shell / console fest:

[root@archiso /]# echo FONT=lat9w-16 >> /etc/vconsole.conf

Bootloader konfigurieren und einrichten

Zum Starten unserer Muster-Test-VM wollen wir auf den „Bootloader“ GRUB zurück greifen. Diesen instllieren wir nun mit Hilfe des Paketmanagers pacman.

[root@archiso /]# pacman -S --noconfirm grub 

Da wir per BIOS booten wollen, ist es nötig dass GRUB in den MBR2) geschrieben wird, dies erreichen wir mit folgendem Befehl.

[root@archiso /]# grub-install /dev/vda

Da wir beim Hoch- und Runterfahren des Servers sehen wollen was im Detail passiert oder eben nicht passen wir die GRUB Boot Loader Konfiguration noch ein klein wenig an. Ebenso wollen wir unsere alt gewohnte Bezeichnungen unserer Netzwerkinterfaces beibehalten.

[root@archiso /]# vim /etc/default/grub
/etc/default/grub
...
 
# GRUB boot loader configuration
 
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 net.ifnames=0"
GRUB_CMDLINE_LINUX=""
 
# Preload both GPT and MBR modules so that they are not missed
GRUB_PRELOAD_MODULES="part_gpt part_msdos lvm"
 
...

Zu guter Letzt müssen wir noch die GRUB-Konfiguration generieren:

[root@archiso /]# grub-mkconfig -o /boot/grub/grub.cfg

chroot verlassen

Am Ende unserer manuellen Konfiguration können wir nun die Chailroot-Umgebung mit dem Befehl exit verlassen.

[root@archiso /]# exit
exit
arch-chroot /mnt/  19.29s user 11.98s system 0% cpu 1:01:43.33 total

Reboot

Nun ist es an der Zeit unsere Muster-Test-VM neu zu starten.

root@archiso ~ # reboot

Bild: Arch Linux Boot Screen

nach kurzer Zeit steht unsere Muster-Test-VM bereit.

Bild: Arch Linux Muster-Test-VM

Zwischenergebnis

Wichtig:

Wir werden natürlich nicht jedes mal beim Bau einer virtuellen Maschine diese per Hand auf Basis dieser Musterlösung aus dem WIKI via cut 'n' paste manuell erstellen sondern dies mit Hilfe eines Ansible-Playbooks automatisiert erledigen lassen. Hierzu demnächst mehr ⇒ FIXME :!:

Muster-Test-VM zurückbauen

Nach getaner Arbeit benötigen wir zur gegebenen Zeit unsere Test-Maschine nicht mehr. Wir können diese daher wie gewohnt herunterfahren …

 # virsh shutdown vml000200

… oder natürlich auch auf die „harte Tour“:

 # virsh destroy vml000200

Anschliessend löschen wir die VM samt ihrem zugehörigen Image vom System.

 # virsh undefine vml000200 --remove-all-storage
Domain vml000200 has been undefined
Volume 'vda'(/var/lib/libvirt/images/vml000200.img) removed.

Links

1)
Virtuelle Maschine
2)
Master Boot Record