Festplatten speichern Daten in linear adressierbaren Blöcken zu je 512 Oktetten und erlauben so einen wahlfreien Zugriff. Daher nennt man sie auch Blockgeräte. Solche Speichermedien kann man wiederum in Partitionen unterteilen oder zu logischen Volumen zusammenfassen.
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
Der verfügbare Speicherplatz wird in Partitionen für Bootloader, Betriebssystem und Auslagerungsspeicher aufgeteilt. Zwecks Abwärtskompatibilität enthält der erste Block einen MBR. Rechner mit EFI Firmware bevorzugen eine GUID-Partitionstabelle (GPT) und eine Systempartition (ESP) mit FAT-Dateisystem. Die folgenden 32 Blöcke beschreiben bis zu 128 Partitionen. Die erste Partition sollte bei Block 2048 (1 Megabyte) beginnen.
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
Nach Änderung an der Partitionstabelle sollte man den Kernel darüber informieren.
partprobe -s /dev/sda: gpt partitions 1 2 3
Cryptsetup verwendet den Device Mapper des Linux-Kernels für 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.
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 / btrfs 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 Volumens (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 | Verstecktes Volumen 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 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
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/loop0 ▤▥▦□□□ |
/dev/loop1 ▥▦▤□□□ |
/dev/loop2 ▦▤▥□□□ |
/dev/loop3 □□□□□□ |
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/loop0 /dev/loop1 /dev/loop2 \ --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/loop3
Defekte Festplatte entfernen
mdadm /dev/md/name --fail /dev/loop0 --remove /dev/loop0
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 Speichermedien zu einer Volumengruppe zusammen,
auf der man wiederum Logische Volumen anlegt,
die sich im Rahmen der verfügbaren Gesamtkapazität
im laufenden Betrieb vergrößern und verkleinern lassen.
Das Paket lvm2
enthält die Programme für die Verwaltung.
Logische Volumen | /dev/vg0/lvmail ▤▤▤▤▤▤□□□□ |
□□□□□□ |
||
---|---|---|---|---|
Volumengruppe | /dev/vg0 | |||
Physische Volumen | /dev/loop0 ▤▤□□□□□□ |
/dev/loop1 ▤▤□□□□□□ |
/dev/loop2 ▤▤□□□□□□ |
Mit den Kommandos pvs
, vgs
und lvs
verschaffen wir uns einen Überblick.
apt install lvm2 pvs PV VG Fmt Attr PSize PFree /dev/loop0 vg0 lvm2 a-- 120,00g 80,00g /dev/loop1 vg0 lvm2 a-- 120,00g 120,00g /dev/loop2 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 lvmail vg0 -wi-a----- 40,00g
Das Kommando pvcreate
markiert physische Volumen als Teil eines Verbunds.
Folgende Schritte fassen Speichermedien zu einer Volumengruppe zusammen,
erzeugen darin ein logisches Volumen und darin wiederum ein Dateisystem.
pvcreate /dev/loop0 /dev/loop1 vgcreate vg0 /dev/loop0 /dev/loop1 lvcreate --size=120G --name=lvmail vg0 mkfs.ext4 /dev/vg0/lvmail
Speichermedium markieren, hinzufügen und logisches Volumen auf maximale Größe ausdehnen.
pvcreate /dev/loop2 vgextend vg0 /dev/loop2 lvextend resizefs --size +100%FREE /dev/vg0/lvmail
Logisches Volumen verkleinern, Daten umverteilen und Speichermedium entfernen.
lvreduce --resizefs --size 100G /dev/vg0/lvmail pvmove /dev/loop2 vgreduce vg0 /dev/loop2 vgremove vg0 /dev/loop2