仮想マシンがもっている仮想的なシリアル回線とコンソールは、コマンドラインなどで指定すれば、ホストOSのいろいろなデバイスにくっつけることができます。
たとえば、仮想マシンのシリアル回線をホストOSの仮想端末にくっつけたり、それ以外にも、コンソール、ファイルディスクプリタにくっつけることができます。TCP/IPのポートにListenさせることすら可能です。だから、こんなことができます。
これらをするときのコマンドライン書式はこれです。→ device=channel.
デバイスは、"con" or "ssl" (それぞれコンソール、シリアル)で指定できる。さらに、コンソールの何番、とか指定したいなら、それも入れてください。
数字なしで "con" or "ssl" とかやると、コンソール、シリアルのすべてを指定してしまいます。コンソールの3番やシリアルの10番を指定したいなら、それぞれこのような指定になる → "con3" and "ssl10" 。
単にcon とか sslとか指定しても、それは、ほかに指定がない場合のいわゆる「デフォルト」を指定しただけです。con1 とか ssl3みたいな、より狭い指定はそれを上書きます。たとえば、シリアル回線を擬似端末に割り当てるけど、最初の二つだけはホストOSのコンソールに割り当てたいのなら、こんな風。
ssl=pty ssl0=tty:/dev/tty0 ssl1=tty:/dev/tty1
なお、上の指定は、「順不同」です。デフォルトを先にするのか、個別指定を先にするのかは問題ではないです。
仮想マシンにつなげられるホストOS上のデバイスはいろいろあります。それぞれの指定の仕方は微妙に異なっていますので、ひとつひとつ解説していきます。
これは、ホストOSのあいている擬似端末を仮想マシンにつなげる。 どの擬似端末をつなげたのかはブートログに出ているはずだ。 それに対応する端末に ホストOS上から端末ソフトをつなげれば、仮想マシンにアクセスできる。
これは、ホストOSの端末(/dev/ttyなんとか、ってことね)を仮想マシンにつなげる。 たとえば・・・
con1=tty:/dev/tty3
これは、仮想マシンのコンソールの1番を、ホストOSの/dev/tty3につなげる。
もし、このtty3がptyとの「対」になっていれば、どこかにすでにオープンされたpty があるはずだ。
UMLは、ホストOS上でxterm を走らせて、仮想マシンの指定されたデバイスとつなぐ。
ホストOSの指定されたTCPポートに仮想マシンのデバイスを割り当てる。たとえば、 仮想マシンのコンソール1をホストOSのTCPポート9000番に割り当てたいなら、このようにします。
con1=port:9000
仮想マシンのすべてのシリアル回線をTCPの9000番のポートに割り当てるならこれ。
ssl=port:9000
このポートにTELNETすると、仮想マシン内部の/etc/inittab とかで指定した
コンソールの数だけはTELNETのセッションが成立し、ログインできるはずだ。
それ以上TELNETを飛ばしても、既存のセッションを切らない限りはブロックされる。
この方法は、仮想マシンの複数のデバイスをひとつのホストOSのTCPポートに割り当てられるし、 ブートログを読まなくても、どうやってホストOSから仮想マシンへアクセスすべきかわかる。 さらに、仮想マシンのTCP/IPの設定をしなくても、TCP/IP経由で外部から仮想マシンを制御できる。 これが便利なのは、(たとえば教育用とかで) 仮想マシンへの不特定多数のネットからのログインを許す場合だ。 普通、これをやるときは、仮想マシン内部で inetd /telnetd を設定するのが普通だけど、 その場合、仮想マシンは外部から 直接に ip reachable になってしまうので、 iptables や tcpwrapper を真剣に設定しないとセキュリティ上まずい。 しかし、この方法だと、外部からのTCP/IPによる仮想マシンへのアクセスはコンソール経由に 限定されてるので、仮想マシン側はTCP/IPによる 直接のアクセスをすべて拒否するように設定でき、結構安全かも。
もし、仮想マシン内部の/etc/inittab で設定したコンソールが、ホストOS上の 有効なコンソールに結び付けられてないと、一見、仮想マシンはハングしたように見えます。 たとえば、仮想マシンのコンソールをxterm に結びつけるように設定しているのに、 ホストOS側に X window の設定がないとか。 しかし、実際には、仮想マシンがハングしているわけではないので、たとえば、telnetでのログインが 可能なようになっていれば、仮想マシンにTELNETすればログインできます。
ホストOSのファイルディスクプリタを仮想マシンのデバイスに結び付けます。 これは、通常、仮想マシンのメインコンソールをホストOSの標準入出力に、 それ以外のコンソールをホストOSのそれ以外のデバイスに、、、といった用途に用います。
con0=fd:0,fd:1 con=pts
これは、仮想マシンの指定のデバイスを「ヌル」にします。「ノン」とちがい、 読み出しはブロックされ、書き込みは成功したように見えます。ただ、書き込まれたデータは その場で破棄されます。
これは、仮想マシンの指定のデバイスを「ノン」にします。 もし、仮想マシン内部でdevfs を使っているのなら、/dev にデバイスが現れません。 使っていないのなら、仮想マシン内部でデバイスをオープンしようとしても、 -ENODEV で失敗します。
コンマで区切って二つのデバイスを指定することにより、それぞれを入力、出力に割り当てられる。
ssl3=tty:/dev/tty2,xterm
これは、仮想マシンのシリアル回線の3番に、
ホストOSのtty2 を入力に、ホストOSのxtermを画面出力に、という組み合わせを割り当てる。
ただし、これは、無意味な例です。
仮想マシンの con0をホストOSの標準入出力以外に割り当てると、 仮想マシンのブート時の出力はUMLを走らせたホストOSの端末上に現れる。 しかし、ブート過程においてコンソールドライバが初期化されると、 それ以降のブート時の出力は、con0をどこに割り当てたかで決定されます。
今まで説明してきた機能を使った例をいろいろ挙げます。
これにより、例の「respawning too fast」などのメッセージがなくなります。
con=pty con0=fd:0,fd:1
これは、仮想マシンのコンソールを、ホストOSの使われてない仮想コンソールに割り当てます。
これにより、その仮想コンソールには、ホストOSのログインプロンプトではなく、
仮想マシンのログインプロンプトが現れます。
con1=tty:/dev/tty6
二つの仮想マシンを(仮想的な)シリアル回線で結ぶことができます。
You can attach two virtual machines together with what amounts to a
serial line as follows:
ひとつの仮想マシンで、シリアル回線を擬似端末に結び付けます。
ssl1=pty
その仮想マシンのブート画面をみて、ホストOSのどの擬似端末を
取得したかを割り出します。なお、この例では/dev/ptyp1を取得したとします。
その擬似端末に対応するホストOSの端末に 仮想マシンのシリアル回線を割り当てた形で、 ほかの仮想マシンを立ち上げます。 tty -
ssl1=tty:/dev/ttyp1
そしてこの仮想マシンにログインします。まず、仮想マシンがシリアル回線をgetty で使ってないことを確認して下さい。
minicom などでシリアル回線に入ります。そうすると、もうひとつの仮想マシンへログインできます。