Что заставляет мою систему останавливать / зависать / повреждать данные при использовании полного шифрования диска LVM + LUKS под Ubuntu Server?
Краткое изложение проблемы
После включения опции полного шифрования диска LUKS / dm-crypt, доступной через установщик Ubuntu, производительность дискового ввода-вывода абсолютно ужасна. Запись на диск зависает/зависает в системе. Данные, считанные с диска, кажутся поврежденными.
Если я не использую LUKS/dm-crypt, то у меня вообще нет никаких проблем. Все работает стабильно и производительно. Я понимаю, что шифрование влияет на производительность. Я ожидаю более низкой производительности, а не многоминутных зависаний системы и повреждения данных.
У меня никогда раньше не было столько проблем с полностью чистой установкой Ubuntu. Я не против ошибиться в чем-то. Я просто хочу, чтобы мои вещи работали!
Обе системы, перечисленные ниже, затронуты этой проблемой. Все эксперименты проводились на системе Ryzen. i5 практически ничего не делал в течение 2 лет, поэтому я просто никогда не замечал проблемы до сих пор.
Система №1 (работает в основном без дела около 2 лет)
- Сервер Ubuntu 20.04.3 ЛТС
- Intel i5-3570
- 8 ГБ ОЗУ, без ECC
- Твердотельный накопитель Kingston A400 SATA 120 ГБ
- Memtest86+ или Prime95 не сообщили об ошибках
Система №2 (новая система, в которой впервые была обнаружена проблема)
- Сервер Ubuntu 22.04 LTS
- AMD Райзен 5 5600
- 32 ГБ ОЗУ, ECC
- Твердотельный накопитель Kingston A400 SATA 120 ГБ
- Memtest86+ или Prime95 не сообщили об ошибках
Действия по воспроизведению
- Установите Ubuntu 20.04 LTS или 22.04 LTS
- Во время установки при настройке диска выберите следующие параметры
- Использовать весь диск
- Настройте этот диск как группу LVM
- Зашифровать группу LVM с помощью LUKS
- Разверните раздел, содержащий
/
поэтому он занимает все доступное свободное место в группе LVM - После установки и загрузки используйте SSH/samba/USB/что угодно, чтобы передать большой файл на диск ОС
Ожидание
- Записывайте большие файлы (более ~ 6 ГБ) на диск без зависания системы.
- Прочитать файлы с диска и не допустить их повреждения
реальность
Все эти проблемы были обнаружены в системе Ryzen. Однажды я протестировал большую нагрузку ввода-вывода в системе i5 и смог воспроизвести проблему. Я недостаточно смел, чтобы продвигать его дальше, чтобы не повредить диск ОС и не пришлось его перестраивать.
- Запись больших файлов замораживает систему до такой степени, что работает только консольное эхо. команды не выполняются. даже
ls
ничего не вернет. Передачи SSH останавливаются, истекают по времени и завершаются ошибкой. - iotop говорит, что по крайней мере один рабочий поток kcryptd достигает 99% нагрузки ввода-вывода, а затем зависает на несколько минут (похоже на 2-3 минуты)
- Большие файлы, считываемые с диска, кажутся поврежденными. Я переместил образ виртуальной машины, и он не мог работать более нескольких секунд без сбоя из-за повреждения внутренней файловой системы. После нескольких перезагрузок
apt
начал жаловаться на сломанные пакеты. Сетевое соединение перестало появляться. В конце концов система вызвала панику ядра, и я сдался. - Довольно странно,
reboot
фактически не перезагружается. Система будет зависать с черным экраном после выключения ОС. Свет и вентиляторы остаются включенными. Кнопка сброса шасси в этом состоянии не работает. Я должен вытащить кабель питания из стены, чтобы все снова заработало.
Обратите внимание, что ни одна из этих проблем не возникает, если ОС установлена без LUKS/dm-crypt. Это включает в себя странную проблему с зависшими перезагрузками.
Также обратите внимание, что я пытался запустить Windows 10 + BitLocker в системе Ryzen, и проблем не было.
Дополнительная информация
Я сделал все это на новой системе Ryzen с Ubuntu 22.04 LTS.
- Я попытался установить
cryptsetup --allow-discards --perf-no_read_workqueue --perf-no_write_workqueue --persistent refresh
думая, что это было вызвано какой-то странностью с дешевым SSD. Это помогло повысить производительность записи, но чтение по-прежнему выглядит поврежденным. - Пробовал полную чистую переустановку без лишних приложений. Только базовая ОС и iotop. Нет обновлений. Проблема сохраняется.
- Я заменил Kingston SSD на заведомо исправный вращающийся жесткий диск на 7200 об/мин. SATA 2.5" 320 ГБ без SMR. Полная чистая переустановка. Проблема не устранена.
- Я заменил твердотельный накопитель Kingston на заведомо исправный накопитель NVMe, Samsung SSD 970 EVO Plus. Полная чистая переустановка. Проблема сохраняется.
- Заменил кабели SATA, хотя без шифрования все работает нормально. Проблема сохраняется.
- Все накопители, участвовавшие в этом бардаке, прошли бэдблоки и тесты SMART.
На данный момент я серьезно рассматриваю возможность вернуться к Windows 10 + BitLocker, потому что я не знаю, что еще делать.
Ссылки
- Как устранить проблему производительности дискового ввода-вывода, которая может быть связана с dm-crypt/LUKS?где я получил
cryptsetup
совет указан выше. - https://ubuntuforums.org/showthread.php?t=2474486 — мой массивный текстовый пост на форумах Ubuntu. Обратите внимание, что я делаю много ссылок на VirtualBox в этой теме, но VirtualBox не является причиной, о чем свидетельствует тот факт, что проблема все еще сохраняется при чистой установке Ubuntu 22.04 без установленного VirtualBox. Я просто работал с VirtualBox, когда возникла проблема.
1 ответ
Оказывается, две проблемы, работающие вместе, усложняют мою жизнь.
Первый выпуск: Ubuntu/Fedora/Linux в целом
Ubuntu поставляется с включенными рабочими очередями ввода-вывода dm-crypt. Очевидно, эти очереди написаны не очень хорошо. Ядро ждет, пока они не заполнятся или почти не заполнятся, прежде чем пытаться сбросить их на диск, а когда несколько очередей борются за доступ к диску, диск умирает под нагрузкой, и система зависает.
Но "Рееееее!", вы скажете, "Это не то, что происходит, очереди идеальны и ничего нельзя написать-" пофиг, я не разработчик ядра, все что я знаю это то что я вижу в iotop, и тот факт, что система жестко блокируется, когда я пишу много материала на диск. Этого не происходит, когда система работает без шифрования. Очереди dm-crypt сломаны. Конец истории.
Если вы не согласны со мной, вы можете прочитать, что Cloudflare сказал об этом. https://blog.cloudflare.com/speeding-up-linux-disk-encryption/
В любом случае, отключение очередей «решило» проблему. Вы можете увидеть команду, которую я использовал для этого, в исходном сообщении выше.
Второй выпуск: VirtualBox
Этот билет: https://www.virtualbox.org/ticket/10031?cversion=0&cnum_hist=14
... работает уже более 10 лет. Исходя из этой информации, я предполагаю, что VBox не очень терпим к задержке ввода-вывода и в конечном итоге сдается, если доступ к хранилищу хоста занимает слишком много времени. Эмулятор / гипервизор VBox / что бы это ни было, возвращается к гостевой виртуальной машине и говорит: «Извините, я не могу читать или записывать диск».
Как виртуальная машина справляется с виртуализированным уровнем ввода-вывода, который ведет себя как неисправный жесткий диск? Это не так. Он тут же взрывается на атомы, как супергерой, оказавшийся не на той стороне щелчка Таноса.
Я «исправил» это, сбросив VirtualBox и переключившись на KVM. Теперь я использую virt-manager через SSH с X-forwarder для выполнения своих задач. KVM гораздо более терпим к медленному вводу-выводу хоста, что делает его идеальным вариантом для LUKS.
Переключение на КВМ
Файлы VirtualBox .vdi легко конвертируются в формат .qcow2. Существует бесконечное количество руководств о том, как это сделать.
Пользовательский интерфейс virt-manager отлично работает по SSH с включенной x-forwarding.
USB-переход на гостевую виртуальную машину тоже работает нормально. Возможно, вам придется отредактировать правила udev, если ваши разрешения не настроены правильно. Опять же, есть масса информации об этом, которую легко найти через Google.
Если вы хотите сделать такой же переход из VirtualBox, но хотите, чтобы ваши мостовые сетевые адаптеры на гостевых виртуальных машинах были подключены напрямую к сети (как и я), вам необходимо соответствующим образом изменить настройки сетевого плана. Вот пример из моего собственного файла конфигурации:
network:
version: 2
renderer: networkd
ethernets:
eno1:
match:
name: eno1
dhcp4: no
optional: yes
bridges:
br0:
macaddress: 74:46:a0:b4:39:b9
dhcp4: yes
interfaces:
- eno1
Установите MAC-адрес моста на MAC-адрес вашей физической сетевой карты, если вы не хотите испортить статические сопоставления DHCP.