Festplatten speichern Daten in linear adressierbaren Blöcken zu je 512 Oktetten und erlauben einen wahlfreien Zugriff. Einen solchen Datenträger nennt man daher auch Blockgerät. Blockgeräte kann man wiederum in Partitionen unterteilen oder zu Logischen Volumen zusammenfassen.
Rechner mit EFI-Firmware brauchen eine GUID-Partitionstabelle (GPT). Zwecks Abwärtskompatibilität enthält der erste Block einen MBR. Die folgenden 32 Blöcke beschreiben bis zu 128 Partitionen. Für die Installation von Debian teilen wir den restlichen Speicherplatz auf in Partitionen für Bootloader, Betriebssystem und Auslagerungsspeicher. Die erste Partition beginnt bei Block 2048 (1 Megabyte).
Das Programm fdisk
kann Partitionstabellen erzeugen,
anzeigen und ändern.
fdisk -l /dev/sda Number Start (sector) End (sector) Size Code Name 1 2048 1050624 512.0 MiB EF00 esp 2 1052672 470898687 194.5 GiB 8300 root 3 470898688 500117503 8.0 GiB 8200 swap
Das Programm parted
kann die Größe von
Dateisystemen ändern und Partitionen verschieben.
parted /dev/sda unit MiB print Number Start End Size File system Name Flags 1 1,00MiB 513MiB 512MiB fat16 esp boot, esp 2 45057MiB 244198MiB 199141MiB root 3 514MiB 8706MiB 8192MiB swap
Größe ändern
parted /dev/sda resizepart 2 100%
Nach Änderung an der Partitionstabelle sollte man den Kernel darüber informieren.
partprobe -s /dev/sda: gpt partitions 1 2 3
Der Kernel stellt Blockgeräte unter /sys/class/block
zur Verfügung und der udev(7)
Daemon legt dynamisch die
Gerätedateien unter /dev
an. Die erste Festplatte heißt
/dev/sda
, die Zweite /dev/sdb
und so fort.
Partitionen bekommen noch ihre Nummer angehängt. Eine Übersicht der
verfügbaren Blockgeräte liefert das Programm lsblk
.
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 238,5G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:3 0 194,5G 0 part / └─sda3 8:2 0 8G 0 part [SWAP]
Das Programm skdump
aus dem Paket Paket
libatasmart-bin
liest die
SMART-Werte
der Festplatte aus.
skdump /dev/sda Device: sat16:/dev/sda SMART Disk Health Good: yes …
Das Programm hdparm
verwendet
SATA-Funktionen,
um die Leistung zu messen und Einstellungen zu optimieren.
hdparm -Tt /dev/sda /dev/sda: Timing cached reads: 2942 MB in 2.00 seconds = 1471.23 MB/sec Timing buffered disk reads: 400 MB in 3.00 seconds = 133.30 MB/sec
Zu Testzwecken kann auch eine Datei als virtuelles Blockgerät (loopback-device) dienen. Das folgende Beispiel erzeugt eine 256 Megabyte große Datei, registriert diese als virtuelles Blockgerät, erzeugt darin eine Partitionstabelle und in der primären Partition ein Dateisystem, welches schlußendlich eingehängt wird.
dd if=/dev/zero of=disk.img bs=1M count=256 losetup /dev/loop0 disk.img parted --script /dev/loop0 mktable msdos mkpart primary 2048s 100% mkfs.ext4 /dev/loop0p1 mount /dev/loop0p1 /mnt lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 256M 0 loop └─loop0p1 259:4 0 255M 0 part /mnt
Mehrere Festplatten lassen sich via
Device Mapper
zu einer Einheit verbinden. Je nach
RAID-Level
kann man auf Sicherheit durch Redundanz oder Geschwindigkeit durch Verteilung optimieren.
Das Paket mdadm
enthält die Programme für die Verwaltung.
Volumengruppe | /dev/md/name ▤▥▤▥□□□□□□□□ |
|||
---|---|---|---|---|
Physische Volumen | /dev/sda ▤▥▦□□□ |
/dev/sdb ▥▦▤□□□ |
/dev/sdc ▦▤▥□□□ |
/dev/sdd □□□□□□ |
Mit dem Kommando mdadm
verschaffen wir
uns einen Überblick über die Konfiguration und den
Gesundheitszustand des Verbunds.
apt install mdadm mdadm --examine --scan ARRAY /dev/md/name metadata=1.2 UUID=Uuid name=Name mdadm --detail /dev/md/name …
Verbund erzeugen
mdadm --create /dev/md/name /dev/sda /dev/sdb /dev/sdc \ --level=5 --raid-devices=3 --bitmap=internal
Level | Platten | Bezeichnung | Beschreibung |
0 | 2 | Striping | Geschwindigkeit |
1 | 2 | Mirroring | Ausfallsicherheit |
5 | 3 | Parität | Eine Platte darf ausfallen |
6 | 4 | Doppelte P. | Zwei Platten dürfen ausfallen |
10 | 4 | Kombination aus Level 0 und 1 |
Frische Festplatte als Reserve einbinden
mdadm /dev/md/name --add /dev/sdd
Defekte Festplatte entfernen
mdadm /dev/md/name --fail /dev/sda --remove /dev/sda
Konfigurationsdatei erzeugen
/usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf
/etc/mdadm/mdadm.confMAILADDR EmailAddress ARRAY /dev/md/name metadata=1.2 UUID=Uuid name=Name
Der Logical Volume Manager (LVM) fasst Datenträger aller Art (PV) zu einer Volumengruppe (VG) zusammen, auf der man wiederum Logische Volumen (LV) anlegt, die sich im Rahmen der verfügbaren Gesamtkapazität im laufenden Betrieb vergrößern und verkleinern lassen.
Logische Volumen | /dev/vg0/lv0 ▤▤▤▤▤▤□□□□ |
|||
---|---|---|---|---|
Volumengruppe | /dev/vg0 | |||
Physische Volumen | /dev/sda ▤▤□□□□□□ |
/dev/sdb ▤▤□□□□□□ |
/dev/sdc ▤▤□□□□□□ |
Das Paket lvm2
enthält die Programme für die Verwaltung.
Mit den Kommandos pvs
, vgs
und lvs
verschaffen wir uns einen Überblick.
apt install lvm2 pvs PV VG Fmt Attr PSize PFree /dev/sda vg0 lvm2 a-- 120,00g 80,00g /dev/sdb vg0 lvm2 a-- 120,00g 120,00g /dev/sdc vg0 lvm2 a-- 120,00g 120,00g vgs VG #PV #LV #SN Attr VSize VFree vg0 3 1 0 wz--n- 360,00g 320,00g lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv0 vg0 -wi-a----- 40,00g
Weiterhin stehen folgende Kommandos zur Verfügung:
Das folgende Beispiel fasst zwei Datenträger zu einer Volumengruppe zusammen, erzeugt darin ein logisches Volumen und darin wiederum ein Dateisystem.
pvcreate /dev/sda /dev/sdb vgcreate vg0 /dev/sda /dev/sdb lvcreate --size=120G --name=lv0 vg0 mkfs.ext4 /dev/vg0/lv0
Logisches Volumen auf weiteren Datenträger ausdehnen:
pvcreate /dev/sdc vgextend vg0 /dev/sdc lvextend resizefs --size +100%FREE /dev/vg0/lv0
Logisches Volumen verkleinern, Daten umverteilen und Datenträger entfernen:
lvreduce --resizefs --size 100G /dev/vg0/lv0 pvmove /dev/sdc vgreduce vg0 /dev/sdc vgremove vg0 /dev/sdc
Der Device Mapper des Linux-Kernels erlaubt eine transparente Verschlüsselung von Blockgeräten. LUKS definiert eine Datenstruktur für die Ablage von Metadaten wie Algorithmus, Streuverfahren, Länge und Betriebsmodus sowie 8 Plätze für den mit verschiedenen Passphrasen geschützten Hauptschlüssel. Der Auslagerungsspeicher wird in diesem Beispiel bei jedem Systemstart mit einem zufälligen neuen Schlüssel gesichert und braucht daher keine Metadaten.
Beim Start des Rechners liest
cryptdisks_start(6)
die Konfigurationsdatei
/etc/crypttab
, fragt den Benutzer nach der
Passphrase, entsperrt die aufgeführten Partitionen
und stellt sie als Blockgerät unter
/dev/mapper/Name
zur Verfügung.
/etc/crypttab# Name Device Keyfile Options root /dev/sda2 none luks,discard swap /dev/sda3 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256
Diese Namen verwenden wir auch in der Dateisystemtabelle.
/etc/fstab# What Where Type Options Dump Pass /dev/sda1 /boot/efi vfat umask=0077 0 0 /dev/mapper/root / ext4 noatime 0 0 /dev/mapper/swap none swap sw 0 0
Option | Beschreibung | ||
Verschlüsselung | |||
---|---|---|---|
cipher=Algorithm | Verschlüsselungs-Algorithmus | ||
size=Bits | Bitlänge des Schlüssels | ||
hash=Algorithm | Streufunktion für Passwörter | ||
offset=Blocks | Versatz innerhalb des Datenträgers (512-Oktett-Blöcke) | ||
skip=Blocks | Versatz innerhalb der verschlüsselten Daten | ||
LUKS | |||
luks | LUKS-Modus verwenden | ||
header=File | LUKS-Header auf separatem Gerät | ||
key-slot=1 | Index des zu verwendenden Schlüssels | ||
TrueCrypt | |||
verycrypt | VeraCrypt-Modus verwenden | ||
tcrypt | TrueCrypt-Modus verwenden | ||
tcrypt-hidden | Versteckten Datenträger verwenden | ||
tcrypt-keyfile=File | Pfad der Schlüsseldatei | ||
tcrypt-system | Systemverschlüsselungs-Modus verwenden | ||
Allgemein | |||
x-systemd.device-timeout= | Wartezeit für Systemd | ||
timeout=0 | Wartezeit auf Passworteingabe | ||
tries=3 | Anzahl der Versuche bei Passworteingabe | ||
verify | Doppelte Eingabe des Passworts verlangen | ||
discard | TRIM-Befehle an die SSD durchreichen | ||
noauto | Gerät nicht automatisch öffnen | ||
nofail | Nicht warten | ||
readonly | Gerär nur lesbar öffnen | ||
swap | Gerät als Auslagerungsspeicher formatieren | ||
tmp | Gerät als Zwischenspeicher formatieren |
Normalerweise legt man die verschlüsselten Partitionen schon während der Installation an. Nachträglich geht dies mit:
apt install cryptsetup cryptsetup luksFormat /dev/sda2 --cipher aes-xts-plain64 --key-size 512 --pbkdf pbkdf2 cryptsetup luksOpen /dev/sda2 root mkfs.ext4 /dev/mapper/root mount /dev/mapper/root /mnt
Den Header kann man sich ansehen mit
cryptsetup luksDump /dev/sda2
Neue Passphrasen lassen sich vergeben mit
cryptsetup luksChangeKey /dev/sda2 --key-slot=0
Optional kann man die verschlüsselte Partition auch mit einem Krypto-Gerät wie dem YubiKey öffnen. Auf dem YubiKey konfigurieren wir den Slot 2 für das Challange-Response-Verfahren und hinterlegen die Challange im Slot 7 des LUKS-Headers.
apt install yubikey-{luks,personalization} ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -oserial-api-visible yubikey-luks-enroll -d /dev/mapper/root
In der Kryptotabelle ergänzen wir ein Skript zur Entschlüsselung.
/etc/crypttab# Name Device Keyfile Options root /dev/sda2 none luks,discard,keyscript=/usr/share/yubikey-luks/ykluks-keyscript swap /dev/sda3 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256
Schließlich aktualisieren wir die Initiale Ramdisk.
echo "RESUME=none" > /etc/initramfs-tools/conf.d/resume update-initramfs -u update-grub