私は、シリアルコンソールを使用する独自のinitシステムを備えた独自のLinuxシステムを持っています。私は最近、このシリアルコンソールでxon / xoffフロー制御が有効になっており、xon文字(0x13)がラインノイズのために受信されると起動プロセスが停止する危険があることがわかりました。シリアルコンソール(systemdベース)を持つ他のシステムを見ると、シリアルコンソールのフロー制御が無効になっていることがわかります。これは通常のようです。
問題は、コンソールttyのフロー制御を無効にするシステムの部分ですか?これはinitプロセスによって行われますか、それともカーネル自体によって行われますか?つまり、これはカーネル設定のバグですか、それともフロー制御を無効にするにはinitシステムを変更する必要がありますか?
tcsetattr()
関数を使用または実行してフロー制御を無効にできることを認識していますが、安定したシステムでは、プロセスはstty -ixon -F /dev/console
コンソールに出力を書き込む前に無効にする必要があります。システムソースコードを見ましたが、フロー制御を無効にするコードが見つかりませんでした。
答え1
私はあなたの排他的なLinuxシステムや排他的なinitシステムについて何も知らないことを認めています。
最近、このシリアルコンソールでxon / xoffフロー制御が有効になり、ラインノイズが原因でxon文字(0x13)を受信したときに起動プロセスが中断される危険性があることが確認されました。
起動ステップ(init前)に関する限り、これはどの基本Linuxでも可能ではありません。その理由は簡単です。カーネルは、構成に関係なく起動時にソフトウェアフロー制御を処理しません。
起動時にカーネルはハードウェアフロー制御(RTS / CTS)を処理できますが、次のコマンドで特別に指示された場合にのみ可能です。console
コマンドラインパラメータの開始なぜなら、デフォルトにならないからです。
起動ログには、起動コマンドラインにコンソールの特別な設定が含まれているかどうかが表示されます。設定に最終項目が含まれている場合アル字型(上記のリンクを参照)あなたの回線は偽のRTS / CTSを生成するのに十分なノイズがあります。その後、削除します。アル字型設定で。
getty
initが何であれ、ポートを開いて必要な回線規則を設定する一部(またはagetty、mgetty ...)プロセスの責任を残すまで、これらの設定を幸せにし続けます。
すべての標準Linuxディストリビューションでは、このプロセスは次のとおりです。アジティこれは、基本的にハードウェアフロー制御を無視し、他の同様のプロセスとは異なり、ソフトウェアフロー制御(XON / XOFF)を有効にして不適切であると判断した場合、それを無効にする責任を後続のプロセスに任せます。
したがって、まずログインしていないttyを処理するプロセスを理解する必要があります。いくつかのコマンドを実行しps -ax
、次の行を見つけます(現在のシステムと同じです)。
1515 tty2 Ss+ 0:00 /sbin/agetty 38400 tty2 linux
上記のように実行している場合は、上記のように使い慣れたコマンドを使用する必要がありますagetty
(後で開始された/usr/bin/loginプロセスは行ルールを変更できないため)。プロセスが報告するものと異なる場合は、ソフトウェア制御フローを無効にするオプションがあります。stty
agetty
もちろん、騒々しい環境でシリアルラインを使用するのは悪夢の一部であり、偽のXOFFは非常に小さい部分です。
回線にノイズがある場合は、ボーレートを下げてください。
RS232/RS485コンバータを設置して命を救った... ;-)