web-dev-qa-db-ja.com

/ dev / console動的リダイレクト

_/dev/console_に送信されたすべてのデータを他の何かに動的にリダイレクトすることは可能ですか(たとえば、-_/dev/null_、_/dev/tty9_、さらには_/dev/null_)?

もちろん、それは_console=XXX_カーネルブートパラメータ(または単一プログラムの場合は標準のパイプリダイレクト)を介して静的実行できます。問題は、外部デバイスからのデータに基づいて、動的に(および出力を行うすべてのプログラムに対して)実行する必要があることです。

助言がありますか?

5
qehgt

私が考えることができるいくつかのオプションがあります、それらの有効性は物事が「コンソール」にどのように進むかに依存します。

カーネルソースメッセージの場合、最も簡単なのは_dmesg -n 1_を使用して(実質的にすべての)コンソールメッセージを無効にし、syslogd/klogdを使用してそれらを抽出してログに記録するか転送することです。すべてのカーネルメッセージは引き続きログに記録され、コンソールのログレベルに関係なく、_/proc/kmsg_(またはsys_syslog())を介してアクセスできます。これのバリエーションは、printk()出力を抑制するquietでカーネルを起動し、カーネルメッセージの処理をsyslogd/klogdのみに依存することです。

より冒険的で包括的なオプションは、コンソールモジュールを使用することです。これらは、一般的にVMゲストで使用されるため、 VMホストはゲストコンソールに直接アクセスできます。 2つのタイプシステムドライバー(例:x86 PCの「VGA」、カーネルの「console =」オプション)、およびモジュラードライバー必要に応じてロードおよびアンロードできます。 、およびシステムドライバーを引き継ぐ可能性があります。1つの可能性のあるドライバーは netconsole ですが、簡単にロードおよびアンロードできます(システムドライバーとモジュール式ドライバーの両方として使用できます)。

  • take_over_console()ではないので、すべてが元のコンソールに移動します
  • イーサネット経由でのみログに記録されます(ループバックはサポートされていません)

「ダミー」コンソールと上記のオプションの1つを使用すると、何か便利なことができる場合があります。 netcatまたはsocatをネットコンソールの「クライアント」にしてください:

_modprobe netconsole "[email protected]/eth0,[email protected]/ff:ff:ff:ff:ff:ff"
socat UDP4-LISTEN:55514 -
_

個々のシステムサービスからコンソール出力をキャプチャすることに興味がある場合は、スクリプトを変更しない簡単な方法はないと思います。

これを行うための単純ではない(そしておそらくニースではない)方法には、LD_PRELOADを使用して ハイジャック 出力を生成する関数をリダイレクトするか、__init_コードを追加してデフォルトのファイル記述子を修正します。さらに悪いことに、デバッガーを使用して接続し、 開いているファイル記述子を操作する 。 _/etc/ld.so.preload_は、最初のオプションを実装する簡単な方法(ハックでやや厄介な場合)です。

デーモンのコンソール出力を監視したい場合は、おそらくスタートアップスクリプトを修正して、screenセッションで実行するようにします(おそらく like like )。

4
mr.spuratic