xinit

出自 Arch Linux 中文维基

摘自 Wikipedia:

xinit 程序允許用戶手動啟動 Xorg 顯示伺服器。startx(1) 腳本是 xinit(1) 的一個前端。

xinit 通常用於啟動窗口管理器桌面環境。雖然您也可以用 xinit 在沒有窗口管理器的情況下運行 GUI 應用程式,但許多圖形應用程式期待一個 EWMH 兼容的窗口管理器。顯示管理器一般都依據 xprofile 為您啟動 Xorg

安裝[編輯 | 編輯原始碼]

安裝 xorg-xinit 包。

配置[編輯 | 編輯原始碼]

xinitstartx 需要一個可選的客戶端程序參數,見 #覆蓋 xinitrc 。 如果您沒有提供參數,它們會尋找 ~/.xinitrc,作為一個shell腳本運行,以啟動客戶程序。

xinitrc[編輯 | 編輯原始碼]

~/.xinitrc 可以方便地在X伺服器啟動時運行依賴於X的程序並設置環境變量。如果它存在於用戶的主目錄中,startxxinit 會執行它。否則 startx 將運行默認的/etc/X11/xinit/xinitrc

注意: xinit 有自己的默認行為,而不是執行該文件。詳見 xinit(1)

這個默認的xinitrc將啟動一個包含 Twmxorg-xclockXterm 的基本環境(假設安裝了必要的軟件包)。因此,要啟動不同的窗口管理器或桌面環境,首先要在主目錄下創建一個默認的 xinitrc 副本。

$ cp /etc/X11/xinit/xinitrc ~/.xinitrc

然後 編輯 該文件,用想要的命令替換默認程序。記住,使用 exec 的命令後面的行將被忽略。例如,要在後台啟動 xscreensaver,然後啟動 openbox,請使用以下命令。

~/.xinitrc
}.
...
xscreensaver &
exec openbox-session
注意: 至少要確保 /etc/X11/xinit/xinitrc 中的最後一個 if 塊出現在您的 ~/.xinitrc 文件中,以確保 /etc/X11/xinit/xinitrc.d 中的腳本有源可循。

在窗口管理器之前啟動的長期運行的程序,如屏保和牆紙程序,必須自己分叉或通過附加 & 符號在後台運行。否則,在執行窗口管理器或桌面環境之前,腳本會停止運行並等待每個程序退出。請注意,有些程序反而不應該被分叉,以避免出現競爭性錯誤,如 xrdb 的情況。在 exec 前綴會將腳本進程替換為窗口管理器進程,這樣,即使該進程分叉到後台,X也不會退出。

xserverrc[編輯 | 編輯原始碼]

xserverrc 文件是一個負責啟動X伺服器的shell腳本。startx "和 "xinit "都會執行 ~/.xserverrc,如果它存在的話,"startx "會使用 /etc/X11/xinit/xserverrc

為了保持 logind會話權限,並防止通過切換終端繞過屏幕鎖定器,Xorg 必須在發生登錄的同一虛擬終端上啟動 [1]。因此建議在 vt$XDG_VTNR文件中指定 ~/.xserverrc

~/.xserverrc
}文件:
#!/bin/sh

exec /usr/bin/Xorg -nolisten tcp "$@" vt$XDG_VTNR

參見 Xserver(1) 中的所有命令行選項列表。

提示:-nolisten local 可以加在 -nolisten tcp 之後,以禁用X11的抽象套接字,幫助隔離。 關於這對X11安全的潛在影響,有一個 簡單背景

另外,如果您想讓X顯示在一個獨立的控制台,而不是調用伺服器的控制台,您可以通過使用 /usr/lib/systemd/systemd-multi-seat-x 提供的X伺服器包裝器實現。為方便起見,可以通過修改 ~/.xserverrc 設置 "xinit "和 "startx "使用該包裝器。

-keeptty選項,重新啟用將X會話的輸出重定向至Xorg日誌文件的功能。詳見 Xorg#重定向Xorg會話日誌。}}

用法[編輯 | 編輯原始碼]

要以普通用戶身份運行 Xorg,請輸入:

$ startx

或者如果配置了 #xserverrc

$ xinit -- :1
注意: xinit 不能處理已啟動的另一個X伺服器的多個顯示。為此,您必須通過附加 --:display_number 來指定顯示,其中 display_number1 或以上。

您選擇的窗口管理器(或桌面環境)現在應該可以正確啟動了。

要退出X,請運行您的窗口管理器的退出功能(假設它有的話)。如果它缺乏這樣的功能,請運行。

$ pkill -15 Xorg
注意: pkill 將殺死所有正在運行的X實例。要指定殺死當前虛擬終端上的窗口管理器,請運行:
$ pkill -15 -t tty"$XDG_VTNR" Xorg

另見 signal(7)

技巧和竅門[編輯 | 編輯原始碼]

覆蓋 xinitrc[編輯 | 編輯原始碼]

如果您有一個正常工作的 ~/.xinitrc,但只是想試試其他窗口管理器或桌面環境,您可以通過發出startx,並在後面加上窗口管理器的路徑來運行它,例如。

$ startx /usr/bin/i3

如果二進制文件需要參數,它們需要加引號,以便被識別為startx的第一個參數的一部分。

$ startx "/usr/bin/application --key value "

注意,完整的路徑是必須的。您也可以為 #xserverrc 腳本指定自定義選項,在雙破折號 -- 後加上這些選項。

$ startx /usr/bin/enlightenment -- -br +bs -dpi 96

另請參見 startx(1)

注意: 由於 /etc/X11/xinit/xinitrc.d/ 下的腳本被跳過,環境變量 DISPLAY 可能需要被設置。您可以通過執行DISPLAY=:display_number startx /usr/bin/i3,在所需的顯示器上試用 i3
提示:這可用於啟動常規GUI程序,但沒有任何基本的窗口管理器功能。參見 #在沒有窗口管理器的情況下啟動應用程式在獨立的X顯示屏中運行程序

登錄時自動啟動 X[編輯 | 編輯原始碼]

確保 startx 是正確的配置

在您的 login shell 初始化文件(例如,Bash~/.bash_profileZsh~/.zprofile)中放置以下內容。

if [ -z "${DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then
  exec startx
fi

您可以用 -eq 替換 -le 3 這樣的比較(用於 vt1 到 vt3),如果您想在一個以上的虛擬終端上使用圖形化登錄。

檢測虛擬終端的其他條件包括 "$(tty)" = "/dev/tty1",它不允許與 -le 比較,以及 "$(fgconsole 2>/dev/null || echo -1)" -eq 1,它在 串行控制台 不起作用。

exec 命令確保在X伺服器退出、崩潰或被攻擊者殺死時,用戶被註銷。如果您想承擔風險,在X會話結束時保持登錄狀態,請刪除 exec

參見 Fish_(簡體中文)#登錄_fish_時自動起動_XSystemd_(簡體中文)/User_(簡體中文)#Automatic_login_into_Xorg_without_display_manager

提示:此方法可與 自動登錄到虛擬控制台 相結合。

在桌面環境/窗口管理器之間進行切換[編輯 | 編輯原始碼]

如果您經常在不同的桌面環境或窗口管理器之間切換,使用 顯示管理器 或擴展 ~/.xinitrc 來實現切換是很方便的。

下面的例子展示了如何用一個參數來啟動一個特定的桌面環境或窗口管理器。

~/.xinitrc
...

# 这里 Xfce 保持默认
session=${1:-xfce}

case $session in
    i3|i3wm           ) exec i3;;
    kde               ) exec startplasma-x11;;
    xfce|xfce4        ) exec startxfce4;;
    # No known session, try to run it as command
    *                 ) exec $1;;
esac

要傳遞參數 session

$ xinit session

$ startx ~/.xinitrc session

在沒有窗口管理器的情況下啟動應用程式[編輯 | 編輯原始碼]

可以在沒有窗口管理器的情況下只啟動特定的應用程式,儘管這很可能只對全屏模式下的單個應用程式有用。比如說:

~/.xinitrc
...

exec chromium

另外,也可以像 #覆蓋 xinitrc 中描述的那樣,直接從命令提示符中調用二進制。

使用這種方法,您需要通過自己的配置文件設置每個應用程式的窗口幾何形狀(如果可能的話)。

提示:這對啟動圖形遊戲很有用,排除合成器的開銷有助於提高遊戲的性能。

另請參見顯示管理器#沒有窗口管理啟動應用程式

使用 startx 進行輸出重定向[編輯 | 編輯原始碼]

參見Xorg#重定向Xorg會話日誌了解詳情。