別の VT/TTY で Xorg サーバーを手動で実行/初期化/起動するにはどうすればいいですか?

別の VT/TTY で Xorg サーバーを手動で実行/初期化/起動するにはどうすればいいですか?

Xorg サーバーを起動したいのですが (これは、xterm新しく作成された「初期」 からの最小限のターミナル エミュレーターのみを備えている必要がありますtty)、これは または を発行するのと同じくらい簡単だと思っていましたが、xinitどちらstartxも失敗しました。そこで質問です。

別の VT/TTY で Xorg サーバーを手動で実行/初期化/起動するにはどうすればいいですか?

ここでは

現在の質問の背景をもう少し詳しく説明します。

これが背景であり、私がすでに試したことは次のとおりです。

を見ると、新しく作成された(または)man openvtでシェルを実行することができましたが、違いを正確にはわかりませんttyvtVT<>端末) このような:

 $> sudo openvt -s /bin/bash

-sは、その新しい tty/vt への直接切り替えを引き起こします。私は、Xorgに従ってman xinit最小限のxtermアプリケーションで起動するはずのサーバーを手動で起動したいと考えていました。 切り替えられた tty の新しいシェル ( 経由で作成openvt) で、私は次のコマンドを発行します。

 $> su -c 'xinit xterm -display :4 -- :4' - mahr &>/tmp/output

そしてこの出力を受け取ります

$> cat /tmp/output
X.Org X Server 1.19.6
Release Date: 2017-12-20
X Protocol Version 11, Revision 0
Build Operating System: Linux 4.4.0-148-generic x86_64 Ubuntu
Current Operating System: Linux scitech 4.15.0-70-generic #79-Ubuntu SMP Tue Nov 12 10:36:11 UTC 2019 x86_64
Kernel command line: BOOT_IMAGE=/vmlinuz-4.15.0-70-generic root=/dev/mapper/ubuntu--vg-root ro
Build Date: 03 June 2019  08:10:35AM
xorg-server 2:1.19.6-1ubuntu4.3 (For technical support please see http://www.ubuntu.com/support) 
Current version of pixman: 0.34.0
    Before reporting problems, check http://wiki.x.org
    to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
    (++) from command line, (!!) notice, (II) informational,
    (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/home/mahr/.local/share/xorg/Xorg.4.log", Time: Thu Nov 28 10:57:53 2019
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
(EE) 
Fatal server error:
(EE) parse_vt_settings: Cannot open /dev/tty0 (Permission denied)
(EE) 
(EE) 
Please consult the The X.Org Foundation support 
     at http://wiki.x.org
 for help. 
(EE) Please also check the log file at "/home/mahr/.local/share/xorg/Xorg.4.log" for additional information.
(EE) 
(EE) Server terminated with error (1). Closing log file.

Session terminated, terminating shell...xinit: giving up
xinit: unable to connect to X server: Connection refused
xinit: unexpected signal 2
 ...terminated.

答え1

xinitは脆弱なので使用しないでください. 使用startx. xinitは、警告やドキュメントなしで、任意のユーザー ID からの X 接続を受け入れるように記述されているようです。 startxこの問題を修正するようです。なぜこのような状況が許容されているのか、そもそもなぜこのようなことが起こったのかはわかりません。

動作方法はX「最近」変更されました。set X-uid root であることに依存し、新しい VT に切り替えていました。ただし、その場合でも、テキスト VT から起動した場合にのみ機能する可能性があります。たとえば、非 root ユーザーは別のセッション内からX起動できない可能性があります。言い換えると、とにかくこれが必要なことを実行するかどうかはわかりません。XX

Xは、現在代わりに VT を使用します。 などの一部のツールは、startx新しいデザインを使用するために動作が変更されました。

設計上、プログラムを root として起動する必要はありません (セキュリティを向上させるため)。logind代わりに、より小さなバックグラウンド サービス (root 権限で起動) を使用することで機能します。

ルートとして実行に戻った場合はX、 からの許可は必要ありません。おそらくこれで互換性が維持されるとlogind思います。X

Xフル として実行することを強制せずに実行しようとしていたようですroot。その場合は からの許可が必要ですlogind。 はlogind、何かを行う許可を与えますログインしたVTで私はトリックを思いつきましたログインを偽装する

user=mahr
sudo systemd-run \
    --property PAMName=login \
    --property User="$user" \
    --property StandardInput=tty \
    --property TTYPath=/dev/tty8 \
    sh -c 'chvt 8 && exec startx /usr/bin/xterm'

tty を動的に割り当てることも可能であるように思えます (openvt -sと コマンドを使用したスクリプトを使用tty)。ただし、それを実行しようとすると、画面が数回フリーズしてしまいました :-)。

logind 意図されましたこの X サーバーのような非ルート プログラムがシステムに与えるダメージを軽減します。私の理解では、この実装は非常に制限されています。回復キーは提供されません。 logindカーネルのシステム アテンション キーを使用すると、ひどく強制終了されます。

カーネル コマンド SysRQ + R を使用しても、画面を回復できませんでした。おそらく何かが壊れたのlogindだと思いますgdm:-)。

答え2

私のテストでは、この2行を/etc/X11/Xwrapper.config:

allowed_users=anybody
needs_root_rights=yes

X サーバーの起動は、デフォルトでは、対象の仮想端末の所有者であり、物理的に (キーボードで) 接続されているユーザーのみに許可されているようです。 (あなたの場合: root が仮想端末の所有者であり、x が 'mahr' として実行しようとしました)。

この 2 行は、その要求をオーバーライドし、すべてを 1 つのコマンド、1 つの端末から起動することさえ可能にします (init スクリプトや ssh で起動するリモート x に便利です)。

sudo openvt -c15 -- su user -c 'xinit /usr/bin/xterm -display :15 -- :15 vt15'

答え3

これは@sourcejediの私のバージョンです答え(申し訳ありませんが、コメントには入りません):

#!/bin/sh                     
# login-spoof

# Pretend that we're running a command after having logged into a
# given virtual terminal as us. Example:

# $ ./login-spoof 8 startx /usr/bin/xterm -- :1
# Running as unit: run-r3cc564bee3134c789c09c21faee9e710.service
# (opens xterm on /dev/tty8)

TTYNUM=$1; shift
sudo systemd-run \
    --property PAMName=login \
    --property User="$USER" \
    --property StandardInput=tty \
    --property TTYPath=/dev/tty$TTYNUM \
    sh -c 'export PATH="'$PATH'"; chvt '$TTYNUM' && exec "$@"' x "$@"

関連情報