LINUX.ORG.RU

Как выключить систему

 , , , ,


0

1

Собрал я образ для загрузки по сети.

Образ по размеру больше чем RAM в ПК, поэтому я гружу его в zram и мне нормально.

Но выключить/перезагрузить ПК теперь нормально нельзя.

Посылаю poweroff и на этапе отключения zram получаю out of memmory и на этом выключение останавливается.

PS Знаю про echo b > /proc/sysrq-trigger

Интересуют способы заставить нормально отрабатывать комманды reboot и poweroff и то, что вызывается когда пользователь выключает ПК из интерфейса

PS2 Система manjaro, systemd

PS3 А вот так выглядят free -h, zramctl, df -h сразу после загрузки

[root@linux-525400114e39 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          3,8Gi       1,7Gi       175Mi       1,9Gi       1,9Gi       106Mi
Swap:          11Gi       3,0Gi       8,5Gi
[root@linux-525400114e39 ~]# zramctl 
NAME       ALGORITHM DISKSIZE  DATA  COMPR  TOTAL STREAMS MOUNTPOINT
/dev/zram3 zstd          1,9G    4K    58B     4K       2 [SWAP]
/dev/zram2 zstd          1,9G    4K    58B     4K       2 [SWAP]
/dev/zram1 zstd          3,9G  1,5G   652M 688,4M       2 [SWAP]
/dev/zram0 zstd          3,9G  1,5G 650,5M 687,4M       2 [SWAP]
[root@linux-525400114e39 ~]# df -h
Файловая система                        Размер Использовано  Дост Использовано% Cмонтировано в
dev                                       1,9G            0  1,9G            0% /dev
run                                       2,0G         552K  2,0G            1% /run
tmpfs                                      12G         4,9G  6,7G           43% /
tmpfs                                     2,0G          76K  2,0G            1% /dev/shm
tmpfs                                     2,0G            0  2,0G            0% /sys/fs/cgroup
tmpfs                                     2,0G         4,0K  2,0G            1% /tmp
nas.server.ru:/srv/skel             20G          10G  8,7G           54% /etc/skel
nas.server.ru:/srv/caches/pacman    20G          10G  8,7G           54% /var/cache/pacman/pkg
nas.server.ru:/export/home         40G          13G   25G           35% /nfs/home
tmpfs                                     394M         4,0K  394M            1% /run/user/974
[root@linux-525400114e39 ~]#

Ваша проблема в systemd:

«stopping target swap»

У разработчиков есть резон останавливать swap до выключения, чтобы освободить ФС или LVM (вдруг своп там). Поэтому просто так переписать «/etc/systemd/system/swap.target» не выйдет, у других юнитов может быть завязка на swap.target. Возможно, вам лучше активировать этот своп каким-то отдельным скриптом, а swap.target замаскировать, чтобы systemd ничего со свопом не делал.

mky ★★★★★ ()
Ответ на: комментарий от mky

хм, systemd-swap управляет только половиной swap устройств.

Это видно тут

[root@linux-525400114e39 ~]# systemctl list-dependencies swap.target 
swap.target
● ├─dev-zram2.swap
● └─dev-zram3.swap

Первые 2 подключаются в initrd для возможности загрузки и распаковки rootfs.

Но судя по фото выше именно они и отключаются при Stopped target Swap.

Пробежадся глазами по скрипту, которым systemd отключает swap, не увидел чего-то что бы трогало zram0 и zram1.

Завтра на свежую голову взгляну ещё раз…

Flotsky ()
Ответ на: комментарий от mky

Пересобрал систему выключив systemd-swap.

Проблема осталась.

При этом systemctl stop swap.target не трогает имеющиеся swap разделы и не вызывает ошибку.

А вот systemctl start umount.target приводит к той самой Out of memory. Да, чтобы запустить umount.target я заремарил параметр RefuseManualStart.

Можно подсказок как понять кто завязан на umount.target?

Flotsky ()
Ответ на: комментарий от Flotsky

Сделал костыль mv /usr/bin/swapoff /usr/bin/swapoff_

И вместо swapoff скрипт-пустышку.

Теперь при poweroff systemd заходит дальше.

Reached target Power-Off

Потом вызывается oom-killer.

VM на этом этапе виснет, железные ПК идут дальше и вываливают Kernel panic - not syncing: System is deadlocked on memory

Flotsky ()
Ответ на: комментарий от Flotsky

И вместо swapoff скрипт-пустышку.

Тоже вариант. Наверное, если он будет возвращать «0» (exit status), то FAILED не будет. И при желании, можно скрипт улучшить, чтобы он смотрел pid/имя родительского процесса и игнорировал только systemd, а для прочих процессов вызывал swapoff_ .

Не понятно почему происходит OOM. Вроде к этому моменту память должна быть свободной. Я не знаю как это отлаживать, по идее нужно бы посмотреть в этот момент какие процессы ещё живые и сколько памяти свободно.

Здесь https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html написано, что перед halt вызываются скрипты из /usr/lib/systemd/system-shutdown/, может быть скриптом получится вывести на экран что-нибудь о состоянии памяти и т.д.

P.S. Вобще OOM должен выводить заметно больше инфы, наверное нужно поднять уровень выводимых на консоль сообщений (dmesg -n 8) или попробовать настроить netconsole.

P.P.S. У вас там делается «stop zram-config»?

mky ★★★★★ ()
Ответ на: комментарий от mky

вызываются скрипты из /usr/lib/systemd/system-shutdown/

Что бы я туда ни писал, безрезультатно.

Наверное, если он будет возвращать «0» (exit status), то FAILED не будет

Он и так

#!/bin/sh
exit 0

Всёравно FAILED, наверно потому что с точки зрения systemd zram устройства остались.

У вас там делается «stop zram-config»?

Если вы про то, как я управляю zram, то у меня на этапе initrd

modprobe zram num_devices=2
echo zstd > /sys/block/zram0/comp_algorithm
echo $mem_total > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 100 /dev/zram0
#тоже самое для zram1

Нет никаких скриптов далее это выключающих.

Flotsky ()
Ответ на: комментарий от Flotsky

Поитогу я накостылил вот это:

  • Подменил /usr/bin/swapoff

  • Создал сервис

[Unit]
Description=Run a Bash script at shutdown
DefaultDependencies=no
Before=shutdown.target halt.target
 
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/run_on_shutdown.sh
 
[Install]
WantedBy=halt.target shutdown.target
  • И скрипт /usr/local/sbin/run_on_shutdown.sh:
#!/bin/bash
REBOOT=$( systemctl list-jobs | egrep -q 'reboot.target.*start' && echo "rebooting" || echo "not_rebooting" )
if [ $REBOOT = "not_rebooting" ]; then
    echo b > /proc/sysrq-trigger
fi

Теперь при poweroff оно перезагружается.

Остаётся дописать скриптик чтобы перезагрузка была перезагрузкой, а выключение выключением. И добавить sync && umount сетевых томов перед echo b > /proc/sysrq-trigger

Flotsky ()