Алексей Владыкин


Отключение автоактивации swap-раздела под systemd

14 ноября 2014 Gentoo

Настраивая шифрование swap-раздела на новом ноуте, столкнулся с проблемой: попытка замапить swap-раздел /dev/sda4 на /dev/mapper/swap при помощи cryptsetup отваливается с ошибкой Device or resource busy. Кто занял раздел? Что делать?

Пошел разбираться. Обнаружил, что /dev/sda4 уже активирован обычным способом (без шифрования), о чем недвусмысленно сообщает вывод команды cat /proc/swaps. При этом вручную я его не активировал, в fstab не прописывал. Но каждый раз после перезагрузки swap-раздел магическим образом оказывается активированным.

Виновником оказался systemd-gpt-auto-generator, который при загрузке сканирует таблицу разделов диска, опознает некоторые стандартные типы разделов, в том числе swap, и создает для них systemd units, которые тут же и стартуют. По задумке, этот генератор позволяет в простых случаях вообще не заполнять fstab, все нужные разделы найдутся и подмонтируются автоматически. Однако для настройки зашифрованного swap-раздела это скорее помеха, чем помощь.

Итак, как же отключить автоматическую активацию swap-раздела? На разнообразных форумах и багтрекерах, где проблема уже обсуждалась, предлагают три решения:

  • выпилить systemd-gpt-auto-generator к чертям

  • замаскировать создаваемый генератором unit-файл (systemctl mask dev-sda4.swap)

  • сменить тип swap-раздела с 8200 на какой-нибудь другой

Недостаток первого решения — выпиливание придется повторять каждый раз при обновлении systemd. Недостаток второго — манипуляцию придется повторять после переустановки ОС или изменения нумерации разделов. Третье решение таких недостатков не имеет, но все же слишком похоже на костыль.

К счастью, покопавшись в исходниках systemd-gpt-auto-generator, удалось найти еще один вариант, который меня полностью устроил. Оказывается, помимо типа, у каждого раздела в GPT есть набор флагов, один из которых называется «do not automount». И генератор смотрит на этот флаг, пропуская помеченные им разделы.

Флаг можно установить при помощи gdisk. В меню gdisk выбираем

x       extra functionality (experts only)

Далее

a       set attributes

Вводим номер раздела и номер устанавливаемого бита в поле флагов — 63:

Partition number (1-7): 4
Known attributes are:
0: system partition
1: hide from EFI
2: legacy BIOS bootable
60: read-only
62: hidden
63: do not automount

Attribute value is 0000000000000000. Set fields are:
  No fields set

Toggle which attribute field (0-63, 64 or <Enter> to exit): 63

После этого сохраняем таблицу разделов

w       write table to disk and exit

и, перезагрузившись, убеждаемся, что swap-раздел больше не активируется.

Дополнение от 2015-04-08. В systemd 219 появилась возможность отключать генераторы, создав пустой файл с именем генератора в директории /etc/systemd/system-generators.

mkdir /etc/systemd/system-generators
ln -s /dev/null /etc/systemd/system-generators/systemd-gpt-auto-generator

К оглавлению блога