xinit

提供: ArchWiki
2021年7月25日 (日) 09:54時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎設定: 英語版より記事を追加)
ナビゲーションに移動 検索に移動

関連記事

~/.xinitrc ファイルは xinitstartx によって読み込まれるシェルスクリプトです。主として、X サーバーが起動した時にデスクトップ環境ウィンドウマネージャなどのプログラムを起動するのに使われます (デーモンの起動や環境変数のセットなど)。xinitstartx プログラムは X Window System を起動させ、X を直接 /etc/init から起動できないシステムや複数のウィンドウシステムを使っている環境で、一番最初のクライアントプログラムとして動作します。

~/.xinitrc の主要な仕事の一つは、/usr/bin/startx/usr/bin/xinit プログラムが実行されたときに X Window System のためにどのクライアントを呼び出すか指定することです。様々な追加の記述やコマンドが存在しており、それらを ~/.xinitrc に追加して、その後のシステムのカスタマイズも行えます。

ほとんどの DM は xinit の前に同じようなファイルである xprofile も読み込みます。

インストール

xorg-xinitインストールしてください。

設定

xinit and startx take an optional client program argument, see #Override xinitrc. If you do not provide one they will look for ~/.xinitrc to run as a shell script to start up client programs.

xinitrc

.xinitrc がユーザーのホームディレクトリに配置されている場合、startxxinit で実行されます。存在しない場合、startx/etc/X11/xinit/xinitrc を実行します。このファイルではデフォルトで TwmXtermxorg-xclock を起動するようになっています (xinit にはファイルの実行以外のデフォルトの挙動があります、詳しくは man 1 xinit を見て下さい)。したがって、他のウィンドウマネージャやデスクトップ環境を使う場合、まずデフォルトの xinitrc のコピーを作成してください:

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

スクラッチでファイルを作成するのではなく、コピーを作成することで、/etc/X11/xinit/xinitrc.d のシェルスクリプトの読み込みなど、オリジナルファイルに書かれているデフォルトの挙動を維持することができます。ただしこのディレクトリに含まれていても .sh 拡張子が付いていないスクリプトは読み込まれません: FS#41471。そのため、/etc/X11/xinit/xinitrc.d/?*.sh/etc/X11/xinit/xinitrc.d/?* で置き換えて下さい [1]

必要なコマンドを追加して、そのコマンドと衝突するような行を削除/コメントアウトしてください。exec 以降の行は無視されるので注意しましょう。例:

~/.xinitrc
...

if [ -d /etc/X11/xinit/xinitrc.d ] ; then
    for f in /etc/X11/xinit/xinitrc.d/?* ; do
        [ -x "$f" ] && . "$f"
    done
    unset f
fi

# twm &
# xclock -geometry 50x50-1+1 &
# xterm -geometry 80x50+494+51 &
# xterm -geometry 80x20+494-0 &
# exec xterm -geometry 80x66+0+0 -name login

xscreensaver &
xsetroot -cursor_name left_ptr &
exec openbox-session
ノート: 最低でも .xinitrc ファイルには上記の例にある if ブロックを含めるようにしましょう。/etc/X11/xinit/xinitrc.d/30-dbus.sh スクリプトが読み込まれます。これがないと D-Bus のセッションインスタンスが起動しません。

スクリーンセーバーや壁紙アプリケーションといった、実行時間が長いプログラムをウィンドウマネージャよりも前に起動する場合、& 記号を付けてバックグラウンドで実行するべきです。ウィンドウマネージャが起動するまで、それぞれのプログラムが終了するまでスクリプトが停止してしまいます。xrdb など、競合状態が発生するためにフォークしてはならないプログラムもあるので注意しましょう。コマンドの前に exec をつけているとスクリプトのプロセスがウィンドウマネージャのプロセスで置き換わり、プロセスがバックグラウンドにフォークされても X が終了しなくなります。

Xorg を通常ユーザーで実行するには、次を実行:

$ startx

または:

$ xinit -- :1 -nolisten tcp vt$XDG_VTNR

これで選択したウィンドウマネージャが起動します。

X を終了するには、ウィンドウマネージャの終了機能を実行してください。ウィンドウマネージャに終了機能がない場合、以下を実行:

$ pkill -15 Xorg
ノート: pkill は全ての X インスタンスを終了します。現在の VT のウィンドウマネージャを指定して終了させるには、以下を使用:
WM_PID=$(xprop -id $(xprop -root _NET_SUPPORTING_WM_CHECK \
| awk -F'#' '{ print $2 }') _NET_WM_PID \
| awk -F' = ' '{ print $2 }')

kill -15 $WM_PID

xprop プログラムは公式リポジトリxorg-xprop パッケージに入っています。

ノート:
  • 上記のコマンドはユーザーがログインしたのと同一の仮想端末上で Xorg を実行します [2]。これによって logind によってセッションが認証されるので、ターミナルを切り替えることによって画面ロッカーを迂回されることを防ぎます。
  • セッションのパーミッションを維持するには xinit のコマンドラインオプションとして vt$XDG_VTNR を指定する必要があります。
  • 既に別の仮想アイテムにログインしている場合、xinit は複数のセッションを扱えません。-- :session_no を付け加えてセッションを指定するようにしてください。X が既に動作している場合、:1 以上を指定します。
  • デフォルトでは、コンソールデバイスのパーミッションのため、X ディスプレイはログインした tty と同一である必要があります。これはデフォルトの /etc/X11/xinit/xserverrc で管理されています。詳細は一般的なトラブルシューティング#セッションのパーミッションを参照してください。
  • サーバーを実行している場所から別のコンソールの X ディスプレイを使いたい場合、/usr/lib/systemd/systemd-multi-seat-x によって提供されている X サーバーラッパーを使うことができます。~/.xserverrc を編集してラッパーを使うように startx を設定することが可能です。
  • startx の代わりに xinit を使う場合は、-nolisten tcp を渡して、異なる tty で X を起動することでセッションが破壊されることがないようにしてください。
  • "SocketCreateListener() failed" というエラーメッセージで X が終了してしまう場合、/tmp/.X11-unix 内のソケットファイルを削除する必要があります。root で Xorg を起動してしまった場合に発生します。

xserverrc

The xserverrc file is a shell script responsible for starting up the X server. Both startx and xinit execute ~/.xserverrc if it exists, startx will use /etc/X11/xinit/xserverrc otherwise.

In order to maintain an authenticated session with logind and to prevent bypassing the screen locker by switching terminals, Xorg has to be started on the same virtual terminal where the login occurred [3]. Therefore it is recommended to specify vt$XDG_VTNR in the ~/.xserverrc file:

~/.xserverrc
#!/bin/sh

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

See Xserver(1) for a list of all command line options.

ヒント: -nolisten local can be added after -nolisten tcp to disable abstract sockets of X11 to help with isolation. There is a quick background on how this potentially affects X11 security.

Alternatively, if you wish to have the X display on a separate console from the one where the server is invoked, you can do so by using the X server wrapper provided by /usr/lib/systemd/systemd-multi-seat-x. For convenience, xinit and startx can be set up to use this wrapper by modifying your ~/.xserverrc.

ノート: To re-enable redirection of the output from X session into the Xorg log file, add the -keeptty option. See Xorg#Session log redirection for details.

使用方法

Xorg を通常のユーザーとして実行するには、次のように実行します。

$ startx

または、#xserverrc が設定されている場合は:

$ xinit -- :1
ノート: xinit は他の X サーバーがすでに起動している場合は、複数の表示を処理しません。その場合は、-- :display_number (display_number1 以上) を付けてディスプレイを指定してください。

これでお好みのウィンドウマネージャー(またはデスクトップ環境)が正しく起動するはずです。

X を終了するには、ウィンドウマネージャーの exit 関数を実行してください(exit 関数があれば)。そのような機能がない場合は次のように実行します。

$ pkill -15 Xorg
ノート: pkill は実行中の X インスタンスを全て kill します。現在の仮想端末上のウィンドウマネージャーを kill するには、次のように実行します:
$ pkill -15 -t tty"$XDG_VTNR" Xorg

signal(7) も参照してください。

ヒントとテクニック

コマンドラインから xinitrc を上書きする

~/.xinitrc は既に記述しているが、他の WM/DE を試してみたい場合、ウィンドウマネージャのパスを加えて startx を実行することができます:

$ startx /full/path/to/window-manager

フルパスが必要なので注意してください。

ウィンドウマネージャに引数を指定する場合、startx のパラメータとしてクォートで囲う必要があります:

$ startx "/full/path/to/window-manager --key value"

また、-- の後にカスタムオプションを指定して (デフォルトの X サーバーオプションが入っている) /etc/X11/xinit/xserverrc を上書きすることもできます。例:

$ startx /usr/bin/enlightenment -- -nolisten tcp -br +bs -dpi 96 vt$XDG_VTNR

または:

$ xinit /usr/bin/enlightenment -- -nolisten tcp -br +bs -dpi 96 vt$XDG_VTNR

man startx を参照してください。

ヒント: 通常の GUI プログラムを起動するのに使うこともできます。#ウィンドウマネージャを使わずにアプリケーションを起動ゲーム#別の X サーバーでゲームを起動する を参照。

ログイン時に X を自動起動

ノート: ログインセッションを維持するために、X はログインしたのと同じ tty で実行させる必要があります。

Bash の場合、~/.bash_profile の最後に以下を追加してください。ファイルが存在しない場合、/etc/skel/.bash_profile からスケルトンをコピーしてください。Zsh の場合、~/.zlogin (または ~/.zprofile) に追加してください。

[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx
ノート:
  • 複数の VT でグラフィカルログインを使いたい場合、-eq 1-le 3 (vt1 から vt3) などで置き換えられます。
  • logind セッションを維持するために、X はログインしたのと同じ tty で実行させる必要があります。これはデフォルトの /etc/X11/xinit/xserverrc で管理されています。
  • xinitstartx よりも高速ですが、-nolisten tcp などの追加のパラメータを指定する必要があります。
  • X セッションが終了してもログインしたままにしたい場合、exec を削除してください。

Fish#ログイン時に X を起動Systemd/ユーザー#ディスプレイマネージャを使わずに Xorg に自動ログインも参照。

仮想端末に自動ログイン

上記の方法は仮想端末に自動ログインと組み合わせることができます。その場合、自動ログインする systemd サービスに適切な依存関係を設定して、~/.xinitrc が読み込まれて pulseaudio が起動する前に dbus が起動するようにさせる必要があります (参照: BBS#155416)。

DE/WM の選択

様々な DE/WM を頻繁に切り替えて使っている場合、ディスプレイマネージャを使うか、以下のコードを .xinitrc に追加することを推奨します。引数を使って起動したいデスクトップ環境やウィンドウマネージャをロードします:

~/.xinitrc
...

# Here Xfce is kept as default
session=${1:-xfce}

case $session in
    awesome           ) exec awesome;;
    bspwm             ) exec bspwm;;
    catwm             ) exec catwm;;
    cinnamon          ) exec cinnamon-session;;
    dwm               ) exec dwm;;
    enlightenment     ) exec enlightenment_start;;
    ede               ) exec startede;;
    fluxbox           ) exec startfluxbox;;
    gnome             ) exec gnome-session;;
    gnome-classic     ) exec gnome-session --session=gnome-classic;;
    i3|i3wm           ) exec i3;;
    icewm             ) exec icewm-session;;
    jwm               ) exec jwm;;
    kde               ) exec startkde;;
    mate              ) exec mate-session;;
    monster|monsterwm ) exec monsterwm;;
    notion            ) exec notion;;
    openbox           ) exec openbox-session;;
    unity             ) exec unity;;
    xfce|xfce4        ) exec startxfce4;;
    xmonad            ) exec xmonad;;
    # No known session, try to run it as command
    *) exec $1;;
esac

/etc/X11/xinit/xserverrc ファイルをホームディレクトリにコピーしてください:

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

その後、引数を指定して特定の DE/WM を起動することができます:

$ xinit
$ xinit gnome
$ xinit kde
$ xinit wmaker

または:

$ startx
$ startx ~/.xinitrc gnome
$ startx ~/.xinitrc kde
$ startx ~/.xinitrc wmaker

ウィンドウマネージャを使わずにアプリケーションを起動

ウィンドウマネージャを使わずに特定のアプリケーションだけを起動することも可能です。フルスクリーンモードで何か一つのアプリケーションを表示したいときに有用です。例:

~/.xinitrc
...

exec chromium

この方法を使うときはアプリケーションのウィンドウの配置を、アプリケーションの設定ファイルで設定しておく必要があります。

ヒント: この方法を使ってグラフィカルなゲームを起動することも可能です。特に、ウィンドウマネージャやデスクトップ環境、またはデスクトップアクセサリといったアプリケーションによるメモリと CPU の消費を抑えて、ゲームの実行パフォーマンスを底上げすることができます。

ディスプレイマネージャ#ウィンドウマネージャを使わずにアプリケーションを起動も見て下さい。