Serial connection (2)
panicでcoreが収集出来た時、鑑識は色々な道具を使って解析するって事を以前書いた。 その時の例だと、道具の名前は、XXXstatってのが多かった。でも、中にはwなんてのも 解析に役立つ仕組みが組み込まれている。よって、XXXstatを洗い出すだけでは、 有用なものを見逃してしまう可能性がある。
オイラーは貧乏性なので、とことん使える道具を洗い出しておきたい。さて、どうする?
使えるコマンドのmanを引くと
-M core Extract values associated with the name list from the specified core instead of the running kernel. -N system Extract the name list from the specified system instead of the running kernel.
こういうのが、共通的に表れる。上記は、w(1)の例。だったら、manから一か八(いちかはち) か拾い出せばいいじゃん。(この洒落、分かるかなぁ)早速やってみる。
[ob: ~]$ cd /usr/share/man/man1 [ob: man1]$ fgrep -l -- '-M' * | xargs fgrep -l -- '-N' gcc.1 : vi.1
全くもって見当違いなものが検索された。こういう時は、テディベアに向かって、ぼそぼそと 語りかけると良いらしい。
manで出て来る、-Mが含まれるファイルを洗い出す。この時の検索文字にハイフンが入って いるので、fgrepのオプションと誤解される恐れがある。検索文字の前に、ハイフンを2つ並べて、 オプション解析を打ち切れって指示してる。
念のため、パイプ経由で、該当するファイルをxargに渡し、今度は -Nで再度検索。 論理は合ってるはずだよな。
こういう時は、検索対象のファイルを調べてみる。簡単そうな、w.1 がいいな。
.It Fl M Ar core Extract values associated with the name list from the specified .Ar core instead of the running kernel. .It Fl N Ar system Extract the name list from the specified .Ar system instead of the running kernel.
なんと、manで見える文字列と、manファイルは、似ても似つかないじゃん。そうか、 w.1ってのは原稿なんだな。manコマンドは、それを整形してるのか。ここまで、 分かれば、後は、
[ob: man1]$ fgrep -l 'Fl M Ar core' * | xargs fgrep -l 'Fl N Ar system' fstat.1 fuser.1 netstat.1 nfsstat.1 procmap.1 ps.1 w.1 [ob: man1]$ cd ../man8 [ob: man8]$ fgrep -l 'Fl M Ar core' * | xargs fgrep -l 'Fl N Ar system' crash.8 dmesg.8 iostat.8 kgmon.8 pstat.8 trpt.8 vmstat.8
鑑識に使う道具が列挙されたな。これで、榊マリコ法医研究員も安心だな。(いえ、特段、 科捜研の女なんてドラマは見てませんけど)
ああ、こんな面倒な事しなくても、catmanの下を探れってのは、今回は却下。 (調べたら、そんなの無かったぞ。あれは、FreeBSDだかの奴か?)そして、 manの書式は、mdoc(7)だから、良く見ておくようにってのも無しの方向で。。 上記は、あくまで軽いハックですから。
VMWARE serial connection
前回、qemuとvboxで、シリアル接続をやってみた。残るバーチャルマシンはVMWAREだな。 多分同様な事が出来るはず。勝手知ったるOpenBSDが動いているVMWARE Playerでやってみる。
VMWAREを立ち上げ、編集を選ぶ。左側にHDDとかUSB等のパソコンパーツが出てくる。 お目当てのシリアルは無いので、左下の追加を選ぶと、大事な事だから管理者の 権限必要って言われる。(この場合の管理者って、VMWAREが動いているWindowsの管理者ね)
ウィザードが起動するので、部品棚からシリアルポートを選ぶ。接続方法で名前付きパイプを選ぶ。そして、提案されたパイプ名を前回の神田明神お札に変更。 端末はサーバー、接続先はアプリケーション。起動時に接続を選んで、増設完了。一度選んでしまえば、 仮想PCに組み込まれるので、後からの変更は容易。
シリアルが増設されたらOpenBSDを起動。/etc/ttysでtty00が待ち受け受信というか接続 するように設定。そして、kill -HUP 1 して、initの再読み込み。これで、シリアル から接続出来るようになった。ちょろいもんだな。
PuTTYからの接続確認。
OpenBSD/amd64 (ob.localdomain) (tty00) login: sakae Password: Last login: Tue Nov 29 07:03:56 on ttyp0 from xxx.xxx.xxx.xxx OpenBSD 6.0 (GENERIC.MP) #0: Wed Oct 19 06:38:40 JST 2016 Welcome to OpenBSD: The proactively secure Unix-like operating system. Please use the sendbug(1) utility to report bugs in the system. Before reporting a bug, please try to reproduce it with the latest version of the code. With bug reports, please try to ensure that enough information to reproduce the problem is enclosed, and if a known fix for it exists, include that as well. [ob: ~]$ tty /dev/tty00
うん、大丈夫だな。端末ソフトはPuTTYのほか、MobaXtermも使っているので、 シリアル接続出来るかと思ったら、こちらは名前付きパイプはサポートしていなかった。 ちょっと残念。もしもの為に、teraTermを用意しておくかな。
実際にやってみたら、teratermだけじゃ接続出来なくて、 Named Pipe TCP Proxy Utilityと言う 変換器が必要だった。詳細は、 Serial portをつかってtera termで接続するを参照。非常用品を準備して安心しちゃいけないって教訓だね。
登山に行きます。そのためにテントやバーナーを買いました。それで安心しちゃだめ。 何処かの公園か河原にでも行って、テントを張る練習。バーナーでお湯ぐらいは沸かしてみる 事が必要だろう。生死に関わる事だぞ。
もしもディスプレイが壊れたら(ヒマラヤで) こういう話も有りますから、用意に越したことはない。
ついでなんで、FreeBSDでもシリアル接続出来るようにした。/etc/ttys で、ttyu0を 編集。これで、OK。3wireって、キャリアー検出線を見てるのかな。もしそうなら、 VMWAREが宜しくやってくれているんだろうね。
# Serial terminals # The 'dialup' keyword identifies dialin lines to login, fingerd etc. ttyu0 "/usr/libexec/getty 3wire" vt100 on secure ttyu1 "/usr/libexec/getty 3wire" vt100 onifconsole secure
そうそう、MobaXtermでも、間に上で使ったnptpを挟むと、ちゃんとシリアル接続出来た。 これで、Windows10に、TeraTermを入れなくてもいいな。
Fedora on VMWARE でもシリアル接続
(注 この項、次の項のDebianでシリアルの後に、書いたものなので、COM1がttyS0に なるって、当たり前に使ってます)
VMWAREでシリアル接続を制覇したオイラーは、Linux系にも手を出す事にした。 対象は、今となっては少々古くなった、サイエンス系のFedora 24.
この間、Fedora25が出たからね。そして、こいつがXを捨てて、Waylandとかに走った そうな。そう言えばウブもXを捨てて、Mirとか言うのに走るそうな。いよいよGUIに 関しては、基幹部分が分裂ですなあ。昔のUnixみたいに共倒れを期待。 相打ちして、Linux滅びろ。Displayサーバーのいがみ合いで共倒れになりそうな時、 BSDが復権すればいいな。歴史はきっと繰り返すのさ。
VMWAREとかVBOXが、Waylandを支持するか、Mirを支持するか、当分の間高みの見物 をしておこう。優劣が決まってから、勝ち馬に乗るのが常套手段。
アメちゃん所の大統領、トランプに決まれば経済が崩壊するとか言ってたくせに、 今は期待感で株価が暴騰してる。変化はチャンスなんですかねぇ。Display戦争も どんどんやっとくれ!
Systemd のHow do I change the number of gettys running by default? あたりを参考に。
[sakae@fedora ~]$ sudo systemctl enable getty@tty0 [sudo] password for sakae: Created symlink from /etc/systemd/system/getty.target.wants/getty@tty0.service to /usr/lib/systemd/system/getty@.service. [sakae@fedora ~]$ sudo systemctl start getty@tty0
[sakae@fedora ~]$ ps awx| grep getty 4088 tty1 Ss+ 0:00 /sbin/agetty --noclear tty0 linux 4149 pts/2 S+ 0:00 grep --color=auto getty
あれれ、待ち受け端末がtty0じゃ、明後日のやつじゃん。ログインを試みると、案の定、無しのつぶて。
本当は、ttyS0で待ち受けして欲しい。で、systemctlに与える引数を getty@ttyS0 に変更 して、再設定。そしたら、
[sakae@fedora ~]$ ps awx | grep getty 4232 ttyS0 Ss+ 0:00 /sbin/agetty --noclear ttyS0 vt220 4235 pts/2 S+ 0:00 grep --color=auto getty
端末らしい待ち受けになった。そして、
Fedora 24 (Twenty Four) Kernel 4.8.8-200.fc24.x86_64 on an x86_64 (ttyS0) fedora login: sakae Password: Last login: Wen Nov 30 05:59:51 from xxx.xxx.xxx.xxx [sakae@fedora ~]$
やったね。
Debian でもシリアル接続
こうなってくると、debianでもシリアル接続したくなる。いつもはssh接続なんだけど、 これだとOSを新しくしたりすると鍵が違うとか言われて面倒な事が有るんだ。
その点、シリアル接続なら、鍵の心配もいらないし、そもそも物理的接続だから、 ケーブルに針でも刺して、電圧をモニターしない限り盗聴も出来ない。超安全とか 言ってみる。
VBOXに入れてるDebianでもやってみる。OpenBSDみたいに、/etc/ttys なんてのが有るかな?
残念、無かったぞ。という事はLinuxってUNIXの紛い物です。COM1相当が、どのデバイスに 割り当てられているかヒントは無いかな? 考えられるmanを試してみるか。
TTYS(4) Linux Programmer's Manual TTYS(4) 名前 ttyS - シリアルターミナルライン(serial terminal lines) 説明 ttyS[0-3] はシリアルターミナルラインのためのキャラクターデバイス (character device)である。 これらは典型的には次のようにして作られる。 mknod -m 660 /dev/ttyS0 c 4 64 # base address 0x3f8 mknod -m 660 /dev/ttyS1 c 4 65 # base address 0x2f8 mknod -m 660 /dev/ttyS2 c 4 66 # base address 0x3e8 mknod -m 660 /dev/ttyS3 c 4 67 # base address 0x2e8 chown root:tty /dev/ttyS[0-3] ファイル /dev/ttyS[0-3] 関連項目 chown(1), mknod(1), tty(4), agetty(8), mingetty(8), setserial(8)
そんなデバイス有るのか? リナはデバイスもダイナミックに生成してるはずなんで、 今調べて有れば、多分使えるのだろう。
sakae@debian:~$ ls /dev/ttyS* /dev/ttyS0 /dev/ttyS1 /dev/ttyS2 /dev/ttyS3
念のため、dmesgも確認しておく。ここまで、すらすら書いてきたけど、大前提として、 VBOXの設定で、シリアルを選んで、パイプ接続、神田大明神のお札を貼っておく事。 詳細は、前回の記事を参照の事。
sakae@debian:~$ dmesg | grep ttyS [ 8.976912] 00:02: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 1650A
どうやら、ハード的にも認識してるみたい。じゃ、このポートを使ってloginの見張りを させればいいんだな。関連コマンドのagettyあたりだろうと当たりを付けて、manすると
sakae@debian:~$ sudo /sbin/agetty 9600 ttyS0
起動したら、ずっと動いたままになっちゃったけど、その対処は後で考えよう。
PuTTYのシリアル接続(これも前回やった)で、トライ。
Debian GNU/Linux 8 debian ttyS0 debian login: sakae パスワード: 最終ログイン: 2016/11/24 (木) 13:51:16 JST 10.0.2.2から開始日時 pts/0 Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 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. -bash: 端末プロセスグループを設定できません (1169): デバイスに対する不適切なioctlです -bash: このシェルではジョブ制御が無効になっています
何時もsshで入っているので、こういうバナーは新鮮だな。で、bashが小言を垂れているぞ。 端末プロセスグループって、端末屋の仲間にならないと、フル制御が出来ない。
現実にもこういうシチエーションよく有るね。金払うとフル機能が使えますってやつ。 まさか、今回は金を払う必要はあるまい。世界のデビアン教ですから。
で、攻略法を考える。端末デバイスはrootの持ち物、グループはdialoutってなってた。 だから、オイラーもdialoutのグループに入れてもらえばいいのかな。
リナだと、小難しいコマンドを叩くんだろうけど、BSDからの流れ者は、vi /etc/groupで 済ますのさ。
で、件のagettyの起動は、昔のLinuxで /etc/inittabでやってたような気がする。 inittab(5)に、
例 以下は、昔のLinuxで使われていたものに似たinittabの例である: # linux用のinittab id:1:initdefault: rc::bootwait:/etc/rc 1:1:respawn:/etc/getty 9600 tty1 2:1:respawn:/etc/getty 9600 tty2
わざわざ、昔って断ってるけど、これがシリアルのコントロールだったんだな。今は そんなファイルは無いぞ。どこかのGUI好きな連中が改悪して、systemdしちゃったから、 そんなにWindowsに喧嘩売りたいんか、所詮勝ち目はないぞ。うかうかしてたら、 Windowsも過去のものになって、タブレットって名前の板とか電話兼端末とか、腕時計に 変わられてしまうのにね。
sakae@debian:~$ systemctl -a | grep ttyS0 dev-ttyS0.device loaded active plugged /dev/ttyS0 sys-devices-pnp0-00:02-tty-ttyS0.device loaded active plugged /sys/devices/pnp0/00:02/tty/ttyS0
inittab (respawn) replacement in systemd
色々調べると、Debianの場合 systemdと言っても、世に出てるそれとは違った独自の 改造が施してあるようだ。Debian Loveとは程遠いオイラーなので、尻尾を巻いて 逃げ出しましょ。
Fedora での教訓を生かして
もう一度、debianに挑戦します。えいぃっとばかり
sakae@debian:~$ sudo systemctl enable getty@ttyS0 Created symlink from /etc/systemd/system/getty.target.wants/getty@ttyS0.service to /lib/systemd/system/getty@.service. sakae@debian:~$ sudo sudo systemctl start getty@ttyS0
これで、何の問題もなく、シリアル接続出来ましたよ。debianなら、それだけにしか興味を 持たないと解決は遅れただろうね。尻軽おじさんで、あっちこっちに頭を突っ込んでおくと、 いい事あるな。
ついでなんで、sysytemctl enableした時のメッセージから、探偵業をやってみるか。
sakae@debian:/etc/systemd/system/getty.target.wants$ ls -l total 0 lrwxrwxrwx 1 root root 34 Oct 2 06:52 getty@tty1.service -> /lib/systemd/system/getty@.service lrwxrwxrwx 1 root root 34 Nov 30 15:20 getty@ttyS0.service -> /lib/systemd/system/getty@.service
なる程、リンク元のファイルの一部に、引数を埋め込んだものが作成されるのね。リンク先は 共通になってるって事は、共通な処理が行われるんか。考えたものだな。でも、こういの 馴染みが無いな。
で、共通なlibの下にあるやつは、
[Service] # the VT is cleared by TTYVTDisallocate ExecStart=-/sbin/agetty --noclear %I $TERM Type=idle Restart=always RestartSec=0 UtmpIdentifier=%I TTYPath=/dev/%I TTYReset=yes TTYVHangup=yes TTYVTDisallocate=yes KillMode=process IgnoreSIGPIPE=no SendSIGHUP=yes
主要な部分は、これだな。起動コマンド自体が引数になってて、そのコマンドの引数が (リンク元)から取られたり、環境変数から持ってきたりしてる。 そして、そのコマンドの制御方式(再起動等)も、変数にまとめられている。
じゃ、これらを使う本体は? 勿論、systemdだな。大がかりなものを作ったものだ。 シンプルさが、失われていくな。そのうち、恐竜みたいに滅びるぞ、図体が大きくなり過ぎてね。
違いますって、恐竜が滅びたのは、巨大隕石が地球に衝突したからってのが、今や定番の説に なりつつあります。じゃ、こんなのどうだ。
世の中、右を向いても左を向いてもLinuxばかり。Linuxに取りつく強力なウィルスが 出現したら、大感染するぞ。で、WHOが慌てて、バンデミック宣言発令。 感染の拡大を押さえるため、インターネットの使用は10日間停止してください。
その間に、感染に強いOpenBSDに乗り換えてください。インストール用メディアは、 市町村の保健所から入手してください。
なお、多様性は善ですから、OpenBSD以外にも、BSD系のDNAを継承したOSも配布してます。 好みで、選んでいただいてかまいません。
なんて風にならないかね。それとも、凶悪なウィルスに対抗する、人工知能入り ワクチンソフトをWHOが公開するとか。。。。
今年もインフルエンザが流行り始めました。十分なご注意を。
そしてもう一つ、冬の風物詩と言えば、