WinホストとLennyゲストのシリアルコンソール接続

■Windows版のシリアルコンソールでうだうだしてしまった。

 ※名前付きパイプの変更可能な名前部分は「ホスト名=イメージ名」とする

 結果から言うと、何をしても不安定。一応使えるというレベル。

 同じセッションに再接続すれば続きは出来るが、
 ハングしてgettyを再起動する場合を想定し、「screen」等で回避する。
 よって、vmxのシリアルコンソールの設定は、
 単純にサーバとアプリケーションを名前付きパイプ経由で接続する。

■割り込みモードの場合

> find "serial" vmlenny86.vmx

---------- VMLENNY86.VMX
serial0.present = "TRUE"
serial0.fileType = "pipe"
serial0.fileName = "\\.\pipe\vmlenny86"
serial0.pipe.endPoint = "server"
serial0.tryNoRxLoss = "TRUE"

■ポーリングモードの場合

$ grep ^T0 /etc/inittab
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100

serial0.present = "TRUE"
serial0.fileType = "pipe"
serial0.fileName = "\\.\pipe\vmlenny86"
serial0.pipe.endPoint = "server"
serial0.tryNoRxLoss = "TRUE"
serial0.yieldOnMsrRead = "TRUE"

■ゲスト(vmlenny86)側の設定

$ sudo grep ^T0 /etc/inittab
T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100

$ sudo grep ^T0 /etc/inittab
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100

$ sudo init q
$ ps -ef | grep ttyS0 | cut -c 48- | grep -v grep
 /sbin/getty -L ttyS0 115200 vt100

$ sudo init q
$ ps -ef | grep ttyS0 | cut -c 48- | grep -v grep
 /sbin/getty -L ttyS0 9600 vt100

■puttyからのログイン

 接続の種類は「シリアル」、シリアル接続は「\\.\pipe\vmlenny86」

■ログイン中にゲスト(vmlenny86)側を見ると以下のように表示される

$ ps -ef | grep ttyS0 | cut -c 48- | grep -v grep
 /bin/login --
 -bash

■名前付きパイプはドライバとして動作する

> dir /s /b c:\WINDOWS\system32 | find /i "NPFS.SYS"
c:\WINDOWS\system32\dllcache\npfs.sys
c:\WINDOWS\system32\drivers\npfs.sys

■名前付きパイプは以下のように「File System」として登録されている
 ※「taskmgr」からは「lsass」を確認すれば良い事が分かる。

> reg query HKLM\SYSTEM\CurrentControlSet\Services\Npfs /s

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Npfs
    ErrorControl        REG_DWORD       0x1
    Group       REG_SZ  File system
    Start       REG_DWORD       0x1
    Type        REG_DWORD       0x2

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Npfs\Aliases
    lsass       REG_MULTI_SZ    protected_storage\0netlogon\0lsarpc\0samr\0\0
    ntsvcs      REG_MULTI_SZ    eventlog\0svcctl\0\0

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Npfs\Enum
    0   REG_SZ  Root\LEGACY_NPFS\0000
    Count       REG_DWORD       0x1
    NextInstance        REG_DWORD       0x1

■サービスからも確かに「FILE_SYSTEM_DRIVER」として登録されている

> sc qc "Npfs"
[SC] GetServiceConfig SUCCESS

SERVICE_NAME: Npfs
        TYPE               : 2   FILE_SYSTEM_DRIVER
        START_TYPE         : 1   SYSTEM_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   :
        LOAD_ORDER_GROUP   : File system
        TAG                : 0
        DISPLAY_NAME       : Npfs
        DEPENDENCIES       :
        SERVICE_START_NAME :

■アイドルプロセス「PID=0」として認識している

> sc queryex Npfs | find "PID"
        PID                : 0

■サービスが落ちたら「Restart	DELAY: 60000 seconds」等で
 再起動すればよさそうだが、そういう問題ではなさそうだ。

> sc qfailure Npfs
[SC] GetServiceConfig SUCCESS

SERVICE_NAME: Npfs
        RESET_PERIOD             : 0 seconds
        REBOOT_MESSAGE           :
        COMMAND_LINE             :
        FAILURE_ACTIONS          :

■イベントログに「ntdll」のエラーでputtyが強制終了した時のログが出る

PS> get-eventlog application | \
       Where-Object { $_.EntryType -eq "Error" } | \
       Where-Object { $_.Source -eq "Application Error" } | \
       Where-Object {$_.Message -match "putty.exe" } | format-list | more

Index              : 3557
EntryType          : Error
InstanceId         : 1000
Message            : エラー発生アプリケーション putty.exe、バージョン 0.59.0.0、
エラー発生モジュール ntdll.dll、バージョン 5.1.2600.6055、エラー発生アドレス 0x00010a19
Category           : (0)
CategoryNumber     : 0
ReplacementStrings : {putty.exe, 0.59.0.0, ntdll.dll, 5.1.2600.6055...}
Source             : Application Error
TimeGenerated      : 2012/02/19 23:23:13
TimeWritten        : 2012/02/19 23:23:13
UserName           :

■「ntdll.dll」の存在箇所を確認
 ※エクスプローラの拡張機能を呼び出した時に使うDLLらしい。
  名前付きパイプがFileSystemだからかな。

> dir /s /b c:\ | find "ntdll"
C:\WINDOWS\system32\ntdll.dll
C:\WINDOWS\system32\dllcache\ntdll.dll