Arch Linux - (manuelle) Minimalinstallation
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:
- Name der VM:
vml000200
- Beschreibung:
Arch-Linux Boot-ISO-Node
- RAM:
8 GB
- CPU:
4
- Disk:
30G
/dev/vda1 1 GB /boot ext4
/dev/vda2
/dev/mapper/archlinux-swap 2 GB [SWAP] 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 2 GB /var/log ext4
- Boot-Image:
archlinux-2022.12.01-x86_64.iso
- Netzwerk:
br-dmz
- Bei der Installation soll der
virt-viewer
automatisch gestartet werden.
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
Sobald der Node gestartet wurde, befinden wir uns dann auf der initialen Konsole, von der wir die weitere Konfiguration dann vornehmen werden.
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
nach kurzer Zeit steht unsere Muster-Test-VM bereit.
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 ⇒
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.