web-dev-qa-db-ja.com

コンソールからxinitを実行中に新しいlogindセッションを作成する方法は?

現在のシステムはコンソールから起動しますが、ディスプレイマネージャーを使用したくありません。

Ubuntu 13.10に更新した後、ConsoleKitはユーザーログインの管理に使用されなくなり、代わりにsystemd-logindサービスが使用されることに気付きました。

Ubuntu 13.04の.xinitrc設定は次のようになりました。

exec ck-launch-session startxfce4

ck-launch-sessionにより、ディスクをマウントしたり、PCをシャットダウン/リブート/サスペンドできました。

これらの機能を有効にする方法に関するドキュメントを見つけることができる唯一の場所は、 Arch Linuxのドキュメント でした。

ユーザーは最初にsystemd-logindを設定して、セッションを管理する必要があります。 systemdがシステム初期化デーモンとして実行されている場合、これはすでに発生しています。

次に、ユーザーは~/.xinitrcに次を入力してsystemdを起動する必要があります:/usr/lib/systemd/systemd --user

これらのコマンドは不要であるため、ユーザーはck-launch-sessionまたはdbus-launchのインスタンスを~/.xinitrcから削除する必要があります。

ただし、Ubuntuはupstartではなくsystemdを使用しているため、構成ではできません。

同様のことをしようとしたので、これを.xinitrcに入れました:

export DESKTOP_SESSION=xfce
init --user

そして、xfceセッションは開始しますが、ハードディスクをマウントしたり、PCを再起動、シャットダウン、およびサスペンドすることはできません。 startxfce4を直接呼び出すのと同じです。

Xサーバーをvt01引数(01は現在のttyのID)で起動すると、すべて正常に動作しますが、CTRL+Cのようなものは使用できません何かがハングした場合にサーバーを終了します。はい、killall xinitを呼び出すなどの回避策がありますが、これで問題は解決しません。

新しいttyでXサーバーを起動した場合、新しいlogindセッションが生成されないため、シャットダウンを実行できないと思います。 logind documentation を読んだ後、Xサーバーの起動時に新しいセッションを作成する必要があり、Xサーバーにいるときにそのセッションをアクティブとしてマークする必要があることに気付きました。これは、次のコマンドで確認できます。

loginctl show-session $XDG_SESSION_ID | grep Active

Logindドキュメントの次の行は、私を混乱させます。

CreateSession()およびReleaseSession()を使用して開閉することができますログインセッション。これらの呼び出しは、クライアントによって直接呼び出されることはありません。セッションの作成/終了は、PAMとそのpam_systemdモジュールの仕事のみです。

私の質問は、Xサーバーの起動時にPAMに新しいログインセッションを作成させるにはどうすればよいですか?

4
jeremija

UbuntuコンソールブートとOpenboxのセットアップでこれを一晩中見てきましたが、あなたと同じ船に乗っていました。 systemdはUbuntu 13.10では完全には使用されていませんが、あなたが言ったようにConsoleKitに取って代わります。私はloginctlまで持っていて髪を引き裂きたいと思っていましたが、それから http://blog.falconindy.com/articles/back-to-basics-with-x-and-systemd.htmlを見つけました これはおやつです。

私の.xinitrcは次のとおりです-

exec dbus-launch --sh-syntax --exit-with-session openbox-session

上記のリンクでヘルパースクリプトを使用し、startxを「exec path/to/the/helper/script」としてエイリアスしました。おやつに動作し、nmアプレットもボールをプレーしています。

追伸上記のリンクが消えた場合、startxを置き換えるヘルパースクリプトを以下に示します。

#!/bin/bash
TTY=${TTY:-$(tty)}
TTY=${TTY#/dev/}

if [[ $TTY != tty* ]]; then
  printf '==> ERROR: invalid TTY\n' >&2
  exit 1
fi

printf -v vt 'vt%02d' "${TTY#tty}"

xinit -- "$vt" "$@"
1
Nathan Pardoe