Festplatte formatieren

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.

Datenträger partitionieren

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).

Partitionierung auf EFI-Systemen
GPT




/dev/sda1
ESP
▤▤▤□
□□□□
□□□□
□□□□
/dev/sda2
Root
▤▤▤▤▤▤▤▤
▤▤▤□□□□□
□□□□□□□□
□□□□□□□□
/dev/sda3
Swap
□□□□
□□□□
□□□□
□□□□

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

Blockgeräte auflisten

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

Virtuelles Blockgerät erzeugen

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

Daten redundant speichern

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.

RAID5-Array mit 3 aktiven Festplatten und einem Ersatz
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.conf
MAILADDR EmailAddress ARRAY /dev/md/name metadata=1.2 UUID=Uuid name=Name

Logische Volumen verwalten

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.

Verbund mit 3 Datenträgern
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:

pvcreate
markiert physische Volumen als Teil eines Verbunds
pvresize
aktualisiert Größe des physischen Volumens
pvremove
entfernt physische Volumen
vgcreate
fasst phyisische Volumen zu einer Volumengruppe zusammen
vgextend
erweitert eine Volumengruppe um weitere physische Volumen
vgreduce
verteilt Daten auf andere physische Volumen um
vgremove
entfernt ein physisches Volumen aus einer Volumengruppe
lvcreate
erzeugt ein logisches Volumen
lvextend
vergrößert ein logisches Volumen
lvreduce
verkleinert ein logisches Volumen
lvremove
entfernt ein logisches Volumen

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

Partition verschlüsseln

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.

Partitionierung mit Verschlüsselung
GPT




/dev/sda1
ESP
▤▤▤□
□□□□
□□□□
□□□□
/dev/sda2
LUKS




/dev/mapper/root
▤▤▤▤▤▤▤▤
▤▤▤□□□□□
□□□□□□□□
□□□□□□□□
/dev/sda3
/dev/mapper/swap
□□□□
□□□□
□□□□
□□□□

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

Literatur

  1. Debian Forum: Cryptsetup mit systemd und Schlüssel auf externem USB-Stick
  2. Benjamin: Using a YubiKey as a second factor for LUKS, InfoSec Handbook, 2019
  3. Freedesktop: The Discoverable Partitions Specification
  4. Sebastian Strassner: Software RAID mit MDADM verwalten, Thomas-Krenn Wiki