
我已經用Openbox安裝了Ubuntu伺服器16.04(實際上是3.4.113-sun8i
)。並將此命令放入startx
其中/etc/rc.local
以在啟動後顯示圖形。但問題是它會自動以root用戶身份登錄,因此,我的C++程式無法正常工作(正如我之前問的,他們說這是因為root用戶無法自動啟動一些庫,如pulseaudio或gtk) 。我認為這是正確的,因為我應該手動啟動它們。
順便說一句,我正在尋找一種將自動登入從 root 使用者更改為非 root 使用者的方法。我該怎麼做?
編輯:我的目標是建立一個小工具,用戶只能透過實體按鈕開啟/關閉它(我的意思是沒有選單、選項等)。小工具必須在啟動後執行我的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保存並退出(此鍵用於 vim,您可以在編輯時在其他終端選項卡中運行以了解其命令是,其中是我係統中的符號鏈接,您的系統可能會有所不同)。zzps 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
然後 catgetty@tty1
並導航到底部,您會知道它只需附加此行即可實現覆蓋效果:
$ sudo systemctl cat getty@tty1
...
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin xiaobai %I $TERM
自動登入透過--autologin
上面完成,否則您需要在開機後手動輸入使用者名稱和密碼登入tty1。
使用 username 登入 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 -> 運行[電子郵件受保護]-> ExecStart 使用所需的使用者名稱自動登入 -> 登入後將執行 ~/.profile ->
exec startx
-> startx 將執行~/.xinitrc
-> exec openbox-session -> openbox 將執行~/.config/openbox/autostart
->/home/m/img &
將彈出。
[更新]
rc.local 能夠啟動 x,因為 rc.local 以 root 身分執行 startx,但 ~/.profile 不以 root 身分執行 startx。我們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,則需要為此建立一個單元檔案。網路上有很多這方面的資源。
我在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
您將不得不在某種程度上調整該單元......您可能不想以jdoe
另一個用戶的身份啟動X。另外,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
from /etc/rc.local
,然後找出您擁有的顯示管理器(最有可能是 lightdm,因為您使用的是 Ubuntu)。
然後閱讀 systemd 服務和顯示管理器配置,在顯示管理器上配置自動登入並啟用其服務。