
Я установил Ubuntu server 16.04 (на самом деле это 3.4.113-sun8i
) с Openbox. и поместил эту команду startx
внутрь /etc/rc.local
, чтобы иметь графику после загрузки. но проблема в том, что он автоматически входит в систему как пользователь root, и из-за этого моя программа C++ работает неправильно (как я уже спрашивал, они говорят, что это потому, что пользователь root не может автоматически запускать некоторые библиотеки, такие как pulseaudio или gtk). И я думаю, что это правильно, потому что я должен запускать их вручную.
Кстати, я ищу способ изменить автологин с пользователя root на обычного пользователя. Как это сделать?
EDIT: моя цель — создать гаджет, пользователи которого могут включать/выключать только физической кнопкой (я имею в виду отсутствие меню, опций и т. д.). Гаджет должен выполнить мой код C++ после загрузки, а код использует библиотеки gtk и pulseaudio.
решение1
Ты мне сказал вдругой комментарийчто ваша система показывает это:
$ systemctl get-default
graphical.target
Итак, измените это на multi-user.target
:
$ sudo systemctl set-default multi-user.target
А multi-user.target запустится на tty1 (Ctrl+Alt+F1):
$ systemctl list-dependencies multi-user.target | grep getty
● ├─getty.target
● │ ├─getty-static.service
● │ └─[email protected]
Итак, переопределяем файл tty1:
$ sudo systemctl edit getty@tty1
С этим содержимым (это m
ваше имя пользователя):
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin m %I $TERM
/sbin/agetty
указанный выше путь может отличаться в вашей системе, убедитесь, что вы указали правильный путь с помощью:
$ type -a agetty
agetty is /sbin/agetty
agetty is /sbin/agetty
Нажмите Esc, затем shift+ z+ , zчтобы сохранить и выйти (эти клавиши предназначены для vim, вы можете запустить их ps a
в другой вкладке терминала во время редактирования, чтобы узнать , какая команда является символической ссылкой в моей системе, ваша система может отличаться).editor /etc/systemd/system/[email protected]/.#override.blahblah
editor
vim.gtk3
$ type -a editor
editor is /usr/bin/editor
editor is /usr/bin/editor
$ realpath /usr/bin/editor
/usr/bin/vim.gtk3
Затем щелкните getty@tty1
и перейдите вниз, вы увидите, что просто добавьте эти строки, чтобы создать эффект переопределения:
$ sudo systemctl cat getty@tty1
...
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin xiaobai %I $TERM
Автоматический вход в систему выполняется --autologin
описанным выше способом, в противном случае вам придется вручную вводить имя пользователя и пароль для входа в tty1 после загрузки.
После входа в tty1 с именем пользователя m
будет выполнен /home/m/.profile, поэтому добавьте эту строку в конец вашего файла /home/m/.profile
:
echo "$DISPLAY" > /tmp/hole1
echo "$XDG_VTNR" > /tmp/hole2
if [ -z "$DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ]; then
echo lolo > /tmp/hole3
exec startx -- -nocursor
fi
echo lili > /tmp/hole4
/tmp/holeN
Вышеприведенный пример предназначен только для отладки, чтобы знать, что он работает должным образом. Например, если /tmp/hole3
он не создан, но /tmp/hole2
был создан, это означает, что вам необходимо cat /tmp/hole2
проверить значение «$XDG_VTNR».
startx
затем выполним /home/m/.xinitrc
, отредактируем его:
$ cat /home/m/.xinitrc
#!/usr/bin/env bash
echo 55 > /tmp/test1
exec openbox-session
echo 55 > /tmp/test2
openbox-session
затем выполнится /home/m/.config/openbox/autostart
, отредактируйте его как обычно:
$ cat /home/m/.config/openbox/autostart
echo 7 > /tmp/yy
/home/m/img &
echo 8 > /tmp/yy2
В конце концов, перезагрузка приведет вас к отображению вашего изображения напрямую, инструкцию выше можно обобщить следующим образом:
многопользовательский.target -> tty1 -> запустить[email protected]-> ExecStart автоматический вход в систему с желаемым именем пользователя -> вошедший в систему выполнит ~/.profile ->
exec startx
-> startx выполнит~/.xinitrc
-> exec openbox-session -> openbox выполнит~/.config/openbox/autostart
->/home/m/img &
откроется всплывающее окно.
[ОБНОВЛЯТЬ]
Я общаюсь с ОП вчат-комната(транскрипт) и решил свою проблему.
rc.local может startx, потому что rc.local запускает startx как root, но ~/.profile не запускает startx как root. Мы делаем это, startx > /tmp/my.log 2>&1
чтобы убедиться, что startx работает правильно, затем /tmp/my.log покажет, что нам нужно проверить /home/m/.local/share/xorg/Xorg.0.log
, и в конце концов я заметил, что первым (EE)
является (EE) open /dev/fb8: Permission denied
.
OP необходимо добавить пользователя m
в группу видео, чтобы получить разрешение при запуске x на доступ к нужному FRAMEBUFFER /dev/fb8.
sudo usermod -a -G audio m
sudo usermod -a -G video m
p/s: Интересно, нужно ли добавлять в аудиогруппу выше.ссылка
решение2
/etc/rc.local
выполняется как пользователь root
. Таким образом, вы должны использовать su -l jdoe -c startx
in rc.local
, предполагая, jdoe
что это пользователь, от имени которого вы хотите запустить Xorg.
Сомневаюсь, что у вас есть systemd, потому что systemd по умолчанию игнорирует все, rc.local
если только вы не обновились с предыдущей версии, в которой не было systemd, и даже в этом случае я не уверен... Я не использую systemd.
Если у вас есть systemd, вам нужно создать файл unit для этого. Для этого есть много ресурсов в сети.
Я поискал в Google по запросу «systemd unit file» и нашел следующее: Поместите следующее в файл: /etc/systemd/system/autologin.service
(предполагается, что systemd находится именно там в вашей системе)
[Unit]
Description=Autologin service
[Service]
Type=fork
user=jdoe
group=users
ExecStart=/path/to/your/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Вам придется адаптировать блок, несколько .... вы, вероятно, не хотите запускать X как jdoe
, а как другой пользователь. Также, users
возможно, это не группа, членом которой является пользователь, и последнее, но не менее важное, /path/to/your/startx
это не путь к вашему startx
... запустите which startx
, чтобы узнать путь.
Далее запускаете sudo systemctl daemon-reload
перезагрузку конфигурации и перезагружаетесь.
EDIT (после комментариев автора):
Вы хотите это:
[Unit]
Description=Autologin service
[Service]
Type=fork
user=m
group=m
ExecStart=/usr/bin/startx
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Если предположить, что вы startx
находитесь в /usr/bin/startx
, то это «должно» сработать.
решение3
Начните с удаления startx
из /etc/rc.local
, затем выясните, какой у вас дисплейный менеджер (скорее всего, lightdm, поскольку вы используете Ubuntu).
Затем ознакомьтесь с настройками служб systemd и диспетчера дисплеев, настройте автоматический вход в диспетчер дисплеев и включите его службу.