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-get
。strace
「外部的に」実行すると動作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 update
SSHを介して正常に実行できました。これは問題に対する考えられる解決策です。ssh localhost
WiFiを使いたくない場合でも動作します。
2番目の解決策は、Bluetoothシリアルコンソールを介してRaspberry Piにログインし、screen
Raspberry 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 there
strace
screen
ssh
答え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がフォーラムではないことを知っていますが、これが誰かに役立つことを願っており、コメントするのに十分な評判がないことを願っています。