LINUX.ORG.RU
ФорумAdmin

Запуск графического ПО в systemd-nspawn

 ,


0

1

Пытаюсь запустить любую команду в systemd-nspawn через systemd-run (что вроде как рекомендуемый вариант), но получаю ошибки вместо запуска (в качестве примера даже env не работает).

$ sudo systemd-run --machine user@container /usr/bin/env
Failed to start transient service unit: Access denied
$ systemd-run --machine user@container /usr/bin/env
Failed to connect to bus: Permission denied
Failed to start transient service unit: Transport endpoint is not connected

В самом контейнере следующее:

Sep 07 12:45:23 container systemd[1]: Started systemd-stdio-bridge.
Sep 07 12:45:23 container dbus-daemon[37]: [system] Activating via systemd: service name='org.freedesktop.home1' unit='dbus-org.freedesktop.home1.service' requested by ':1.46475' (uid=0 pid=371724 comm="(o-bridge)")
Sep 07 12:45:23 container dbus-daemon[37]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.home1.service': Unit dbus-org.freedesktop.home1.service not found.
Sep 07 12:45:23 container (o-bridge)[371724]: pam_unix(login:session): session opened for user user(uid=1000) by user(uid=0)
Sep 07 12:45:23 container systemd-logind[40]: New session 50 of user user.
Sep 07 12:45:23 container systemd[1]: Started Session 50 of User user.
Sep 07 12:45:23 container (sd-pam)[371726]: pam_unix(login:session): session closed for user user
Sep 07 12:45:23 container systemd[1]: run-u46474.service: Deactivated successfully.
Sep 07 12:45:23 container dbus-daemon[37]: [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.46478" (uid=1000 pid=371726 comm="(sd-pam)") interface="org.freedesktop.login1.Manager" member="ReleaseSession" error name="(unset)" requested_reply="0" destination="org.freedesktop.login1" (uid=0 pid=40 comm="/usr/lib/systemd/systemd-logind")
Sep 07 12:45:23 container (sd-pam)[371726]: pam_systemd(login:session): Failed to release session: Access denied
Sep 07 12:45:23 container (sd-pam)[371726]: PAM Attempted to close sd-bus after fork, this should not happen.
Sep 07 12:45:23 container systemd[1]: session-50.scope: Deactivated successfully.
Sep 07 12:45:23 container systemd-logind[40]: Session 50 logged out. Waiting for processes to exit.
Sep 07 12:45:23 container systemd-logind[40]: Removed session 50.

На текущий момент приходится запускать следующим образом:

sudo systemd-run --machine "$id" --remain-after-exit \
	/usr/bin/sudo --user "$user" --login \
	/usr/bin/sh -c "bemenu-run"

Потому что без sudo софт запускается от пользователя root и отсутствуют многие переменные окружения, которые нужны для запуска GUI.
Собственно весь вопрос в том, как в systemd-nspawn правильно запускать приложения от обычного пользователя, при этом не оставляя зависающих процессов (к примеру запустив Firefox через bemenu-run, сам процесс bemenu-run остаётся на месте, чего не происходит про запуске с хоста. Правда я уже не помню как именно запускал, через systemd-run или через machinectl).
Т.е. нужно как-то создать сессию обычного пользователя и из неё уже запустить программу. Но возможно я не совсем понимаю, как оно работает на самом деле.


Ответ на: комментарий от Sorcus

На выбор:

  1. systemd-run --machine user@container --user /usr/bin/env
  2. systemd-run --machine container -p User=user /usr/bin/env

Ты подключаешься к машине как user, а запускать пытаешься системный юнит. Соответственно, это не прокатывает (так же, как если бы ты попытался сделать systemd-run /usr/bin/env локально от имени непривилегированного пользователя).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Я похоже делаю что-то не так, потому что первая команда выдаёт данные хоста, а не контейнера.
А вот вторая команда похоже работает как надо…
Правда успешно запускается только терминал через /usr/bin/foot, а вот вызов терминала через /usr/bin/bemenu-run почему-то срабатывать не хочет без опции --remain-after-exit (новый процесс не успевает запуститься через bemenu?).

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

Хз, у меня работает:

# systemd-run --machine user@arch --user --pipe env
Running as unit: run-u0.service
HOME=/home/user
LANG=C.UTF-8
LOGNAME=user
MAIL=/var/spool/mail/user
PATH=/usr/local/bin:/usr/bin
SHELL=/bin/bash
USER=user
XDG_RUNTIME_DIR=/run/user/1000
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
MANAGERPID=229
INVOCATION_ID=eb2657b83d6447418312499302eda8bf
SYSTEMD_EXEC_PID=245
MEMORY_PRESSURE_WATCH=/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/run-u0.service/memory.pressure
MEMORY_PRESSURE_WRITE=c29tZSAyMDAwMDAgMjAwMDAwMAA=
TERM=tmux-256color

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

Правда успешно запускается только терминал через /usr/bin/foot, а вот вызов терминала через /usr/bin/bemenu-run почему-то срабатывать не хочет без опции –remain-after-exit (новый процесс не успевает запуститься через bemenu?).

Тут я ничего не понял.

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

У меня результаты почему-то очень сильно отличаются.

$ sudo systemd-run --machine user@container --user --pipe hostnamectl
Running as unit: run-u516.service
   Static hostname: (unset)                         
Transient hostname: archlinux
         Icon name: computer-laptop
           Chassis: laptop 💻
  Operating System: Arch Linux                      
            Kernel: Linux 6.4.5-arch1-1
      Architecture: x86-64
$ sudo systemd-run --machine container -p User=user --pipe hostnamectl
Running as unit: run-u61034.service
 Static hostname: container
       Icon name: computer-container
         Chassis: container ☐
  Virtualization: systemd-nspawn
Operating System: Arch Linux                          
          Kernel: Linux 6.4.5-arch1-1
    Architecture: x86-64

По поводу второй части сообщения…
Если я запускаю foot с помощью команды:

$ sudo systemd-run --machine container -p User=user --setenv XDG_RUNTIME_DIR=/run/user/1000 --setenv WAYLAND_DISPLAY=wayland-1 /usr/bin/foot

То всё работает как надо. Терминал успешно запускается внутри контейнера.
Если же я запускаю bemenu-run (меню для запуска программ):

$ sudo systemd-run --machine container -p User=user --setenv XDG_RUNTIME_DIR=/run/user/1000 --setenv WAYLAND_DISPLAY=wayland-1 --pipe /usr/bin/bemenu-run

То меню внутри контейнера запускается нормально. Когда я в нём выбираю foot терминал для запуска, то ничего не происходит.
Но если в systemd-run добавить опцию --remain-after-exit, то терминал через bemenu-run запускается нормально:

sudo systemd-run --machine cd1de544-844b-426f-ad7f-9345ce93e3c5 -p User=sorcus --setenv XDG_RUNTIME_DIR=/run/user/1000 --setenv WAYLAND_DISPLAY=wayland-1 --remain-after-exit /usr/bin/bemenu-run

Возможно это ожидаемое поведение, но в systemd я не спец.

Sorcus
() автор топика
Последнее исправление: Sorcus (всего исправлений: 1)