Итак, уже более полугода назад зарелизилась Slackware-15.0, естественно, я её тут же накотил. И через некоторое время, как только у меня дошли руки до стендов на centos-7, я обнаружил, что есть какие-то сложности в процессе запуска lxc-контейнеров. Они элементарно не взлетают. Точнее, не взлетает systemd.
Я не большой фанат этой темы, но время от времени бывает нужно запустить что-то в контейнере и чтобы особо не страдать можно взять либо убунту, либо центос. Как правило я беру последний. Как-то оно постабильнее работает и разных "странностей" в центоси не столько, сколько их унаследовала убунта от дебиана.
Итак проблема: systemd не взлетает и жалуется на невозможность смонтировать cgroup-ы. С формальной точки зрения, они уже должны быть смонтированы. Более подробный анализ нам выдаёт, что systemd ищест свои cgroup по именти в параметрах монтирования - а именно name=systemd.
Смотрим в /sys/fs/cgroup и видим, что systemd - это симлинк на elogind. А cgroup в этот каталог смонтирована с name=elogind. Интересная история. Заглядываем в стартовые скрипты, что там? а там у нас прекрасное: /etc/rc.d/rc.elogind как раз-таки и проставляет этот симлинк. Там есть ещё какая-то магия в каталоге /run, но это нас мало волнует.
Придётся править /etc/rc.d/rc.elogind. Замечу, что в slackware правка стартовых скриптов - это вроде как норм тема. С точки зрения "паппетования" таких изменений эта вещь проблематичная, т.к. подразумевается, что в один файл можно внести несколько разных изменений, а всякие паппеты-солты-шефы-ансиблы обожают либо шаблонизировать файл, либо приносить его целиком, а не менять кусочек файла. Хотя такая тема как-будто есть в ансибле и в солте. Итак, к делу:
--- rc.elogind 2021-03-03 22:25:19.000000000 +0300
+++ rc.elogind.new 2022-09-12 00:35:03.043380226 +0300
@@ -22,10 +22,9 @@
if [ ! -d /run/user ]; then
mkdir -p /run/user
fi
- if [ ! -d /run/systemd ]; then
- mkdir -p /run/elogind /sys/fs/cgroup/elogind
- ( cd /run; rm -rf systemd; ln -sf elogind systemd; )
- ( cd /sys/fs/cgroup; rm -rf systemd; ln -sf elogind systemd; )
+ if [ ! -d /run/elogind ]; then
+ mkdir -p /run/systemd /sys/fs/cgroup/elogind
+ ( cd /run; rm -rf elogind; ln -sf systemd elogind; )
fi
if pgrep -l -F /run/elogind.pid 2>/dev/null | grep -q elogind; then
echo "Elogind is already running"
После внесения этих изменений достаточно ребутнуться и по идее всё заработает.