
3.4.113-sun8i
私はOpenboxを使ってUbuntuサーバー16.04(実際は )をインストールしました。そして、起動後にグラフィックを表示するためにこのコマンドをstartx
中に入れました/etc/rc.local
。しかし、問題は自動的にrootユーザーとしてログインすることであり、このため私のC++プログラムが正しく動作しません(以前尋ねたように、rootユーザーはpulseaudioやgtkなどの一部のライブラリを自動的に起動できないためだと言われています)。そして、私はそれらを手動で起動する必要があるのでそれが正しいと思います。
ちなみに、自動ログインをルートから非ルートユーザーに変更する方法を探しています。どうすればいいでしょうか?
編集: 私の目標はガジェットを構築することです。ユーザーは物理ボタンでのみオン/オフを切り替えることができます (メニューやオプションなどはありません)。ガジェットは起動後に私の 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
次に cat を実行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
作成されている場合は、「$XDG_VTNR」の値を確認する必要があることを意味しますcat /tmp/hole2
。
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
結局、再起動すると、イメージが直接表示されます。上記の手順は次のように要約できます。
multi-user.target -> tty1 -> 実行[メールアドレス]-> 希望のユーザー名で ExecStart 自動ログインを実行します -> ログインすると ~/.profile が実行されます ->
exec startx
-> startx が実行されます~/.xinitrc
-> exec openbox-session -> openbox が実行されます~/.config/openbox/autostart
->/home/m/img &
ポップアップが表示されます。
[アップデート]
私はOPとチャットするチャットルーム(トランスクリプト)して問題を解決しました。
rc.local は startx を root として実行するため、startx は可能ですが、~/.profile は startx を root として実行しません。startx がstartx > /tmp/my.log 2>&1
正しく実行されるようにするには、/tmp/my.log に を確認する必要があることが示され/home/m/.local/share/xorg/Xorg.0.log
、最終的に最初の に気付きまし(EE)
た(EE) open /dev/fb8: Permission denied
。
m
OP は、startx が目的の FRAMEBUFFER /dev/fb8 にアクセスするときに権限を取得するために、ユーザーをビデオ グループに追加する必要があります。
sudo usermod -a -G audio m
sudo usermod -a -G video m
p/s: 上記のオーディオ グループに追加する必要があるかどうか疑問です。参照
答え2
/etc/rc.local
はユーザー として実行されますroot
。したがって、が Xorg を起動するユーザーであると仮定して、su -l jdoe -c startx
を使用する必要があります。rc.local
jdoe
systemd がインストールされているかどうかは疑問です。systemd は、systemdrc.local
がインストールされていない以前のバージョンからアップグレードしない限り、デフォルトで無視します。また、その場合でも、確信はありません... 私は systemd を実行していません。
systemd を使用している場合は、そのためのユニット ファイルを作成する必要があります。これについては、オンラインで多くのリソースが提供されています。
Google で「systemd ユニット ファイル」を検索したところ、次の内容が見つかりました。ファイルに次の内容を入力します/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
て構成を再ロードし、再起動します。
編集(OPからのコメントに従って):
あなたはこれを求めている:
[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
、次にどのディスプレイ マネージャーを使用しているかを確認します (Ubuntu を使用している場合は、おそらく lightdm です)。
次に、systemd サービスとディスプレイ マネージャーの構成を読み、ディスプレイ マネージャーで自動ログインを構成して、そのサービスを有効にします。