Qubes OS 4.0の再起動/終了中にタイムアウトによる遅延/遅延なしで実行中の各仮想マシンを安全にシャットダウンする方法は? (システムの問題)

Qubes OS 4.0の再起動/終了中にタイムアウトによる遅延/遅延なしで実行中の各仮想マシンを安全にシャットダウンする方法は? (システムの問題)

どんなことで質問これはQubes 4.0にも影響します。 dom0でマシンを再起動またはシャットダウンしたときに実行中のすべての仮想マシンを最初にシャットダウンしない限り、ジョブが完了する前にわずかな遅延(一時停止)が発生します。

xfceのログアウトメニューから再起動/終了を実行する前に、すべてのVMをシャットダウンするスクリプトを手動で実行する必要があります。そうしないと、停止が発生する可能性があります。少なくとも30秒間持続することができます(DefaultTimeoutStopSecデフォルトを90sに下げると30s)。

以下は、実行のスクリプトとサンプル出力です。

[ctor@dom0 ~]$ cat preshutdown 
#!/bin/bash

xl list
time qvm-shutdown --verbose --all --wait; ec="$?"
echo "exitcode: '$ec'"
time while xl list|grep -q -F '(null)'; do xl list;sleep 1; done
exit $ec

$ ./preshutdown 
Name                                        ID   Mem VCPUs  State   Time(s)
Domain-0                                     0  4080     6     r-----     108.6
sys-net                                      1   384     2     -b----       7.0
sys-net-dm                                   2   144     1     -b----      16.5
sys-firewall                                 3  2917     2     -b----       9.7
gmail-basedon-w-s-f-fdr28                    4  3247     2     -b----      28.6
stackexchangelogins-w-s-f-fdr28              5  3241     2     -b----      24.3
dev01-w-s-f-fdr28                            7  8481     6     -b----      32.6
2018-09-06 09:37:08,187 [MainProcess selector_events.__init__:65] asyncio: Using selector: EpollSelector

real    0m14.959s
user    0m0.065s
sys 0m0.017s
exitcode: '0'
Name                                        ID   Mem VCPUs  State   Time(s)
Domain-0                                     0  4095     6     r-----     123.0
(null)                                       1     0     1     --ps-d       7.8
(null)                                       3     0     0     --ps-d      11.0
Name                                        ID   Mem VCPUs  State   Time(s)
Domain-0                                     0  4095     6     r-----     123.1
(null)                                       1     0     1     --ps-d       7.8
(null)                                       3     0     0     --ps-d      11.0
Name                                        ID   Mem VCPUs  State   Time(s)
Domain-0                                     0  4095     6     r-----     123.4
(null)                                       1     0     1     --ps-d       7.8
(null)                                       3     0     0     --ps-d      11.0
Name                                        ID   Mem VCPUs  State   Time(s)
Domain-0                                     0  4095     6     r-----     123.7
(null)                                       1     0     1     --ps-d       7.8
Name                                        ID   Mem VCPUs  State   Time(s)
Domain-0                                     0  4095     6     r-----     123.8
(null)                                       1     0     1     --ps-d       7.8
Name                                        ID   Mem VCPUs  State   Time(s)
Domain-0                                     0  4095     6     r-----     123.9
(null)                                       1     0     1     --ps-d       7.8
Name                                        ID   Mem VCPUs  State   Time(s)
Domain-0                                     0  4095     6     r-----     124.0
(null)                                       1     0     1     --ps-d       7.8

real    0m7.093s
user    0m0.024s
sys 0m0.085s

ただし、Dom0はFedora 25(Fedora 28は仮想マシンのみ)に停止しているため、systemd簡単に更新できません(またはまだわかりません) - 現在のバージョンです。第231話240はgithubの最新バージョンですが、これがシステムの問題であるかどうか、正しく修正する方法がわからないかどうかはわかりません。qubes-core.servicesystemdが一部のDMデバイスをシャットダウンしようとする前に停止するようにします。
使ってみました。これそしてこれ答えますが結果変更なし。

systemd停止時の出力例は次のとおりです。

[ 443.660340] systemd[1]: qubes-core.service: Installed new job qubes-core.service/stop as 797
[ 443.660426] systemd[1]: dev-block-253:0.device: Installed new job dev-block-253:0.device/stop as 867
[ 533.755109] systemd[1]: dev-block-253:0.device: Job dev-block-253:0.device/stop timed out.
[ 534.047847] systemd[1]: qubes-core.service: About to execute: /usr/bin/pkill qubes-guid
[ 534.048939] systemd[1]: Stopping Qubes Dom0 startup setup...
[ 542.648718] systemd[1]: Stopped Qubes Dom0 startup setup.
[ 547.940019] systemd[1]: dev-block-253:0.device: Failed to send unit remove signal for dev-block-253:0.device: Transport endpoint is not connected

止まらなかった時と比較:

[ 67.643774] systemd[1]: dev-block-253:0.device: Installed new job dev-block-253:0.device/stop as 777
[ 67.643982] systemd[1]: qubes-core.service: Installed new job qubes-core.service/stop as 860
[   68.032308] systemd[1]: qubes-core.service: About to execute: /usr/bin/pkill qubes-guid
[ 68.033396] systemd[1]: Stopping Qubes Dom0 startup setup...
[ 76.932065] systemd[1]: Stopped Qubes Dom0 startup setup.
[ 76.985423] systemd[1]: dev-block-253:0.device: Redirecting stop request from dev-block-253:0.device to sys-devices-virtual-block-dm\x2d0.device.
[ 82.205556] systemd[1]: dev-block-253:0.device: Failed to send unit remove signal for dev-block-253:0.device: Transport endpoint is not connected

奇妙なことに、上記の一時停止と一時停止は何も変更せずに発生しましたsystemd。最初の2回の再開はすべて一時停止されず、3回目は一時停止でした。 (詳しくはこちら)

実行中のすべての仮想マシンを安全にシャットダウンする方法再起動/終了中Qubes OS 4.0では?つまり、xfceメニューで再起動/終了を実行する前にスクリプトを手動で実行する必要はありません。

考えられる考え:
ユーザーがログオフ(?)したsession-2.scopeときにタイムアウトしたすべてのデバイスが停止した場合、つまりそのデバイスはリストどのような方法でsystemctl --user status *.device 優先順位を設定できますか?だから彼らはいつも停止する前に停止します。qubes-core.serviceなぜなら、後者が--system一つであるからです。どう思いますか?ランタイム時の様子は次のとおりですsystemctl --user(仮想マシンの実行中にログイン)。https://gist.github.com/constantoverride/a7dbad2146645387209b25e4c07de8ad#gistcomment-2701867
編集する:私は前に試しました--user提供するしかし、すべてがすぐに(つまり同時に)停止するように見えるので、私のスクリプトと上記のスクリプトは同時にタイムアウトします。
編集する--system:私はそれを行う方法を知らなかったか、またはsystemdがいくつかのサービスを停止しようとする前に、systemdにサービスを停止(および停止を完了)するように指示する方法がなかったので、.device私のサービスとそのサービスが.device失敗してタイムアウトしました。同時に(90秒)出力されます。ログの表示ここ

ベストアンサー1

トラブルシューティング済みqubes-gui-dom0-4.0.8-1.29.fc25渡すこれコードの変更(これ犯罪)。
だから赤スズメこれ以上回避策は必要ありません。

産む犯罪ここで:

From 612cfe5925d32d8af0269163ee3ad627de4a8226 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?=
 <[email protected]>
Date: Thu, 13 Sep 2018 12:22:19 +0200
Subject: [PATCH] xside: avoid making X11 calls in signal handler

This is very simlar fix to QubesOS/qubes-issues#1406
2148a00 "Do not make X11 requests in X11 error handler"

Since signals can be sent asynchronously at any time, it could also hit
processing another X11 message. For this reason, avoid making X11 calls
if exit() is called from signal handler.

Fixes QubesOS/qubes-issues#1581
---
 gui-daemon/xside.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/gui-daemon/xside.c b/gui-daemon/xside.c
index cca28da..3e12012 100644
--- a/gui-daemon/xside.c
+++ b/gui-daemon/xside.c
@@ -2455,6 +2455,13 @@ static void handle_message(Ghandles * g)
 /* signal handler - connected to SIGTERM */
 static void dummy_signal_handler(int UNUSED(x))
 {
+    /* The exit(0) below will call release_all_mapped_mfns (registerd with
+     * atexit(3)), which would try to release window images with XShmDetach. We
+     * can't send X11 requests if one is currently being handled. Since signals
+     * are asynchronous, we don't know that. Clean window images
+     * without calling to X11. And hope that X server will call XShmDetach
+     * internally when cleaning windows of disconnected client */
+    release_all_shm_no_x11_calls();
     exit(0);
 }

これの目的は、qubes-guid安全なシャットダウン(SIGTERMなど)を許可して、redsparrowがSIGKILLを実行する必要がないようにすることです。その他の情報については、redsparrowをご覧ください。回答

おすすめ記事