3

Я написал простой файл zram.service, который настроит для меня сжатое пространство подкачки, чтобы не перегрызать слишком много моих дисков. Zram имеют более высокий приоритет, чем другие устройства подкачки.

Проблема в том, что когда я пытаюсь перевести компьютер в спящий режим, он записывает системное состояние в swap, в данном случае это zram, и, поскольку содержимое памяти теряется при исчезновении питания, это, конечно, не работает.

Решение состоит в том, чтобы остановить мой zram.service перед запуском systemctl hibernate и запустить его снова, когда система снова будет работать.

Насколько я выяснил, systemctl hibernate запускает /lib/systemd/system/systemd-hibernate.service. Я скопировал этот сервис в /etc /systemd /system /, чтобы переопределить его, и я, вероятно, смогу заставить это работать, используя раздел 'ExecStartPost =', но я думаю, что должен быть лучший способ остановить сервис systemd, когда другой началось и наоборот.

Редактировать: рабочий сервис zram в системе Debian для тех, кто заинтересован

[Unit]
Description=ZRAM swap
Conflicts=hibernate.service

[Service]
Environment=ZRAM_MEM=1G
Environment=ZRAM_CMPALGO=lz4
Environment=ZRAM_CMPSTREAMS=2


Type=oneshot
User=root
ExecStartPre=/bin/sh -c "/sbin/modprobe zram num_devices=1"
ExecStartPre=/bin/sh -c "echo $ZRAM_CMPALGO >/sys/block/zram0/comp_algorithm"
ExecStartPre=/bin/sh -c "echo $ZRAM_CMPSTREAMS >/sys/block/zram0/max_comp_streams"
ExecStartPre=/bin/sh -c "echo $ZRAM_MEM > /sys/block/zram0/disksize"
ExecStartPre=/bin/sh -c "/sbin/mkswap /dev/zram0"
ExecStart=/sbin/swapon /dev/zram0 -p 10

ExecStop=/sbin/swapoff /dev/zram0
ExecStop=/bin/echo 1 > /sys/block/zram0/reset
ExecStop=/sbin/rmmod zram

RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

1 ответ1

3

Определите Conflicts= в системном файле systemd.

С man-страницы systemd.unit:

конфликты =

Разделенный пробелами список имен устройств. Настраивает отрицательные зависимости требований. Если юнит имеет настройку Conflicts = на другом юните, запуск первого остановит последний и наоборот. Обратите внимание, что этот параметр не зависит и не является ортогональным к зависимостям упорядочения After = и Before =.

Если блок A, конфликтующий с блоком B, планируется запустить в то же время, что и B, транзакция либо завершится неудачно (в случае, когда оба являются обязательными частями транзакции), либо будет изменена на фиксированную (в случае одного или обоих рабочие места не являются обязательной частью сделки). В последнем случае задание, которое не является обязательным, будет удалено, или, если оба не требуются, будет запущен конфликтующий модуль, а конфликтующий блок остановлен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .