Переезд с HDD на SSD — и заодно шифрование LUKS

Сервер у меня жил на старом HDD, и это чувствовалось во всём: контейнеры стартовали медленно, база отвечала с ленцой, а сам диск по ночам тарахтел так, что слышно из другой комнаты. Купил SSD. И раз уж всё равно переезжать с нуля, решил сразу включить шифрование диска через LUKS — чтобы, если железо однажды уведут или я отнесу его в ремонт, данные не утекли вместе с ним.

Сначала готовлю SSD. Создаю на нём раздел и накатываю LUKS:

sudo cryptsetup luksFormat /dev/sdb1
# YES, придумываем пароль
sudo cryptsetup open /dev/sdb1 cryptdata
sudo mkfs.ext4 /dev/mapper/cryptdata
sudo mount /dev/mapper/cryptdata /mnt/ssd

Теперь /dev/mapper/cryptdata — это расшифрованный том, с которым работаешь как с обычным разделом. Под капотом всё на диске лежит зашифрованным.

Перенос данных — через rsync, чтобы сохранить права, владельцев и симлинки. Сервисы перед этим гашу, иначе утащу базу в неконсистентном состоянии:

docker compose -f /app/paperless/docker-compose.yml down   # и остальные стеки
sudo rsync -aAXv --info=progress2 /app/ /mnt/ssd/app/

Флаги тут важные: -a тянет права и время, -A ACL, -X расширенные атрибуты. Для контейнерных томов это критично — иначе потом ловишь permission denied на ровном месте.

Дальше — чтобы том сам подключался при загрузке. Прописываю его в /etc/crypttab и /etc/fstab. Сначала узнаю UUID раздела:

sudo blkid /dev/sdb1
# UUID="xxxx-xxxx-..."
# /etc/crypttab
cryptdata  UUID=xxxx-xxxx-...  none  luks
# /etc/fstab
/dev/mapper/cryptdata  /app  ext4  defaults  0  2

И тут главный вопрос, на котором спотыкаются все: как разблокировать диск при загрузке. С none в crypttab система при старте просит пароль. На обычном десктопе — без проблем, ввёл с клавиатуры. Но у меня сервер стоит без монитора, и тянуться к нему при каждой перезагрузке — так себе удовольствие.

Я оставил ввод пароля, но через консоль по сети. На сервере поднят dropbear-initramfs — это крошечный SSH-сервер, который живёт ещё до загрузки основной системы, в initramfs. После ребута я захожу на него с ноута и ввожу пароль LUKS:

ssh -p 222 root@192.168.1.10
# попадаю в initramfs
cryptroot-unlock
# вводим пароль -> система продолжает загрузку

Да, это значит, что полностью автономно после отключения света сервер не поднимется — он будет ждать, пока я введу пароль. Для меня это осознанный компромисс: смысл шифрования как раз в том, что без пароля диск не открыть, даже забрав его. Хранить ключ на самой машине рядом с диском — это как запереть дверь и приклеить ключ к косяку.

Что в итоге. SSD оживил сервер до неузнаваемости: контейнеры стартуют мгновенно, база летает, тишина в комнате. А LUKS дал спокойствие — теперь украденный или потерянный диск это просто кусок зашифрованного мусора, а не мой архив документов и бэкапов нараспашку. Переезд занял вечер, и ни о чём не жалею.