`apt-get`、`dpkg`はBluetoothシリアルポートでは失敗しますが、物理的に接続されたコンソールでは成功します。

`apt-get`、`dpkg`はBluetoothシリアルポートでは失敗しますが、物理的に接続されたコンソールでは成功します。

Linuxでは、一部のコマンドがシステムに接続されているコンソールでは実行できますが、シリアルコンソールでは実行できない理由を説明できる構成設定や機能はありますか?


リモートシステムはRaspberryPiなので、ここに公開しますが、そうではありません。考えるこの質問はこれに関連しています。私はこの問題が他のDebian(そしておそらく他のLinux)システムでも起こり得ると思います。

Bluetoothシリアルポートを介してリモートシステムにログインすると、apt-get update一部のパッケージ管理関連コマンドでエラーが発生します。

Raspbian GNU/Linux 9 raspberry pi rfcomm0
raspberrypi login: pi
Password:
Last login: Mon Dec  3 12:31:11 UTC 2018 on rfcomm0
Linux raspberrypi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~$ sudo bash
root@raspberrypi:/home/pi# apt-get update
Hit:1 http://archive.raspbian.org/raspbian stretch InRelease
Err:1 http://archive.raspbian.org/raspbian stretch InRelease
  Waited for apt-key but it wasn't there
Reading package lists... Done
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://archive.raspbian.org/raspbian stretch InRelease: Waited for apt-key but it wasn't there
W: Failed to fetch http://archive.raspbian.org/raspbian/dists/stretch/InRelease  Waited for apt-key but it wasn't there
W: Some index files failed to download. They have been ignored, or old ones used instead.
root@raspberrypi:/home/pi# 
root@raspberrypi:/home/pi# dpkg -i /var/cache/apt/archives/apt-utils_1.4.8_armhf.deb 
dpkg: unrecoverable fatal error, aborting:
 wait for subprocess dpkg-split failed: No child processes

リモートシステムコンソールで同じコマンドを直接実行すると、次のようになります。いいえエラーが発生し、スムーズに動作しません。このボードには、Bluetooth設定以外の設定を変更せずにデフォルトのRaspbianシステムがインストールされています。

pi@raspberrypi:~$ who -a
           system boot  1970-01-01 00:00
           run-level 5  2018-12-03 12:29
pi       - tty1         2018-12-03 12:29 00:53         674
pi       - rfcomm0      2018-12-03 13:27   .          1906
pi@raspberrypi:~$ pstree
systemd─┬─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─cron
        ├─dbus-daemon
        ├─dhcpcd
        ├─hciattach
        ├─login───bash───sudo───bash   < XXX apt-* works from here
        ├─rfcomm───login───bash        <     but not from here
        ├─rsyslogd─┬─{in:imklog}
        │          ├─{in:imuxsock}
        │          └─{rs:main Q:Reg}
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-timesyn───{sd-resolve}
        ├─systemd-udevd
        ├─thd
        └─wpa_supplicant

これは再現可能ですか、それとも別のRPiですか?しかし、私は本当のDebianシステムをテストする余分なx86システムを持っていませんでした。


編集する:これははるかに話すべきことではありません。 straceを使用して問題を追跡しようとしましたが、

# apt-get install -y openssh-server
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  libva-wayland1
Use 'apt autoremove' to remove it.
Suggested packages:
  molly-guard monkeysphere rssh ssh-askpass ufw
The following NEW packages will be installed:
  openssh-server
0 upgraded, 1 newly installed, 0 to remove and 114 not upgraded.
Need to get 0 B/301 kB of archives.
After this operation, 833 kB of additional disk space will be used.
E: Waited for /usr/bin/apt-listchanges --apt || test $? -lt 10 but it wasn't there
E: Failure running script /usr/bin/apt-listchanges --apt || test $? -lt 10
# strace apt-get install -y openssh-server
[...]
[long list of system calls]
[...]
munmap(0x74c0d000, 2269184)             = 0
munmap(0x74a56000, 1798144)             = 0
close(3)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

ご覧のとおり、実行がステータス0(成功)で終了し、パッケージが正しくインストールされましたapt-getstrace「外部的に」実行すると動作straceしませんか? ! ?


この質問は私のすべての調査を失望させました。 /var/log/syslog、/var/log/auth、またはJournalctlには何の手がかりも表示されません。私は私がAPTキャッシュをクリアしましたが、エラーメッセージが偽であると感じ、いくつかのサブプロセスを生成できないと思いました。 PAMと関係があると疑われますが、確信できません。

答え1

私はRaspbian Stretchと一緒にRaspberry Pi Zero Wを使用しています。 Bluetoothシリアルコンソールを介してログインすると、sudo apt-get update同じWaited for apt-key but it wasn't thereエラーメッセージが表示されます。上記の投稿が見つかるまで、これは私を狂わせました。

straceで実行すると、あなたと同じように私にもうまくいきます。しかし、straceでapt-getを実行することは非常に不満足です。なぜなら、straceは非常に騒々しく、apt-getが何を言っているのかを読むことができないからです。

Bluetoothシリアルコンソールを使用してRaspberry PiのWiFi IPアドレスを見つけ、SSH経由でRaspberry Piにログインできました。sudo apt-get updateSSHを介して正常に実行できました。これは問題に対する考えられる解決策です。ssh localhostWiFiを使いたくない場合でも動作します。

2番目の解決策は、Bluetoothシリアルコンソールを介してRaspberry Piにログインし、screenRaspberry Piで実行することです。一度入ったら、Bluetooth経由でシリアルコンソールを起動screenできます。sudo apt-get update

端末エミュレーションに問題があるようですが、わかりません。 Bluetoothシリアルポートを介してRaspberry Piに初めて接続したとき、screenまたは以下の緑色のコマンドプロンプトは表示されませんssh。次の行でbluetooth rfcommシリアルコンソールを設定する方法に問題がある可能性がありますExecStart=

/etc/systemd/system/rfcomm.service

[Unit]
Description=RFCOMM service
After=bluetooth.service
Requires=bluetooth.service

[Service]
ExecStart=/usr/bin/rfcomm watch hci0 1 setsid /sbin/agetty -8 --noreset -s -w -L rfcomm0 115200 vt100 -a pi

[Install]
WantedBy=multi-user.target

ExecStart=行を次に変更すると、素晴らしい緑色のコマンドプロンプトが表示されます。

ExecStart=/usr/bin/rfcomm watch hci0 1 setsid /sbin/agetty -8 --noclear -s -w -L rfcomm0 115200 linux -a pi

このファイルを変更した後は、再起動が必要になることに注意してください。十分ではないようですsudo systemctl reload rfcomm.service

残念ながら、今すぐクールな緑のコマンドプロンプトがあるにもかかわらず、sudo apt-get update/で実行しないと、まだひどいエラーが発生します!Waited for apt-key but it wasn't therestracescreenssh

答え2

waitpidこれは、SIGCHLD シグナルと rfcomm setid getty がコンテキストでどのように機能するかに関するものです。私はPOSIXセマンティクス、制御端末、シグナルハンドラについてより具体的にはわかりませんが、問題はおそらくどのように追跡できると思います。無線周波数通信または設定値fork()/waitpid() が呼び出されているか、SIGCHLD は処理されません。

私はSOの質問でこの小さなプログラムを試してこの結論に達しました。waitpid()プロセスグループを待っている間、子プロセスエラーはありません。Bluetoothシリアル端末([rfcomm setid getty]の下)内で実行すると、他の動作が表示されます。 [rfcomm setid getty screen]では「中断」し、[rfcomm setid getty screen]では「動作」します。

// cc -o wp wp.c
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    pid_t pid, wpid;
    int stat;

    if ((pid = fork()))
    {
        printf("PARENT: %d | CHILD: %d\n", getpid(), pid);
        wpid = waitpid(-getpid(), &stat, 0);
        printf("DONE: wpid %d errno %d %m\n", wpid, errno);
    }
    else
    {
        printf("CHILD pid: %d\n", getpid());
        sleep(1);
    }
    return 0;
}

さまざまなコマンドの失敗の結果:

  • wp(上記のwaitpidテストプログラム)
    • "完了: wpid -1 errno 10 サブプロセスなし"
  • crontab -e
    • シャットダウン印刷中にループを停止する "crontab:waitpid()が "/usr/bin/sensible-editor"でPID 20864を待機できませんでした:サブプロセスなし"
  • apt-get update
    • 「apt-keyを待っていますが、存在しません」
  • git clone https://git.savannah.gnu.org/git/screen.git
    • 「エラー:インデックスパッケージのwaitpidに失敗しました:サブプロセスはありません」
    • 興味深いことに、非常にgit clone git://git.savannah.gnu.org/screenうまく動作します。
    • 「GNU/screenで実行すると動作します」と言うと、screenのソースコードで理由を見つけようとしましたが、何も思いませんでした。

ノート

  • ログインした後に/bin/dashを呼び出すと、/bin/bashまたは/bin/bash --loginを実行しても役に立ちませんが、すべてのコマンドが画面外でどのように機能するかと同様にうまく機能します。
  • waitpidテストは、ダッシュの「ジョブ制御を有効にする」パラメータ-mを使用して実行したときに機能します。/bin/dash -m -c "~/src/wp/wp"

信号に影響を与える可能性があるので、「Control TTY」が関連しているかどうかを除外したいと思います。 /dev/rfcomm0 を open() すると O_NOCTTY フラグを使用する rfcomm が表示されます。実験の結果、setsid --cttyより悪い動作が現れ、まだこれを変更したことがありません。rfcomm.c ソースコード。 (もう一度)読んでいます。TTY公開著者:Linus Akkeson、もっと学びようとしています。

私はこれが答えではなく、SEがフォーラムではないことを知っていますが、これが誰かに役立つことを願っており、コメントするのに十分な評判がないことを願っています。

関連情報