All Articles

改めて整理する、コンソール・ターミナル・仮想コンソール・端末エミュレータ・擬似端末

Linux を扱う中で

  • コンソール
  • ターミナル
  • 仮想コンソール
  • 端末エミュレータ
  • 擬似端末

といった用語の違いを明確にしたかったので、改めて整理しました。

まとめた結果

これらの用語について 1 つの図にまとめると、以下のようになりました。

what-is-console-terminal-etc.png

ここから、各用語について説明していきます。

コンソール (制御卓)

まず、古典的な「コンソール」について抜粋して説明していきます。

コンソールとは何かを一言で言うと、「ディスプレイとキーボードのような入出力装置がくっついた物理機器」です。

単にディスプレイとキーボードと組みを「コンソール」と呼ぶ場合もあるようです。

参考

コンソールの接続方式

コンソール機器をコンピュータに繋ぐには、

  • VGA 端子
  • シリアル端子 (シリアルポート)

のどちらかにケーブルを刺すことになります。

※ ディスプレイを HDMI、キーボードを USB でそれぞれ接続する場合もあります。

VGA コンソール

VGA 端子を経由してコンソール接続する場合、「VGA コンソール」と言います。

Linux のデバイスファイルとしては、/dev/console が対応します。

/dev/console は、「マスター・コンソール」とも言われます。

通常は「VGA コンソール」が「マスター・コンソール」ですが、組み込み Linux では後述する「シリアル・コンソール」が「マスター・コンソール」となる場合もあるそうです。

参考

シリアル・コンソール

シリアル端子に接続したコンソールを「シリアル・コンソール」と言います。

Linux のデバイスファイルとしては、/dev/ttySX が対応します。 (X には 0、1 などの数字が入ります)

シリアルコンソールは、VGA コンソールよりも遠隔地から利用可能です。

参考

ターミナル (端末)

ターミナルは、日本語で言うと「端末」です。

コンピュータに接続し、手元で操作する機器のことを言います。

なぜなにUNIX「コンソールとターミナルの違いは?」:新刊ピックアップ|技術評論社」という記事によれば、

コンピュータと多数のコンソールをシリアルケーブルで繋ぐことで,同時利用を実現しました。このとき,TSSを1つの通信ネットワークと捉え,各コンソールを“⁠ターミナル⁠”と呼ぶようになりました。

特に UNIX においては、

UNIXの起動時に表示される操作画面は「コンソール⁠」⁠,シリアルケーブルで直結する装置は「シリアルコンソール」と呼び,ネットワーク越しで接続する装置や,Xウィンドウシステム上で動く仮想端末は「ターミナル」と呼びます。

とのことです。

「コンソール」と「ターミナル」の違いについて、自分の理解としては、

  • 同じコンピュータに複数の人がシリアル・コンソールを接続して使うので、「コンソール」を「ターミナル (端末)」と呼ぶようになった
  • それとは別の観点で、UNIX では、VGA 端子やシリアル端子に接続するのは「コンソール」と呼び、SSH や X Window System で動く「擬似端末」を単に「端末 (ターミナル)」と呼ぶ場合もある

というのが結論です。

参考

X Window System の X サーバへの接続

現在、デスクトップ PC で Linux を利用する際は、HDMI などのポートにディスプレイを接続し、USB などのポートにキーボードを接続することになります。

デスクトップ PC であれば GUI を使うケースも多いと思いますが、その際は X Window System の X サーバにディスプレイとキーボードが接続されます

※ X サーバとしては、専用の「X 端末」を使い、コンピュータと通信させる方法もありますが、現在はあまり使われていません。

X Window System を使った GUI の利用中に CUI を使うには、

  • 仮想コンソール
  • 端末エミュレータ

のどちらかを使うことになります。

仮想コンソール

X Window System を利用した GUI にディスプレイ、キーボードを接続しているとき、Ctrl + Alt + F1 (~ F6) を押すことで、CUI を開くことができます。

X サーバへの接続と並列して、CUI の「仮想コンソール」に接続できるということです。

通常、Linux の場合の仮想コンソールには、デバイスファイルの /dev/tty1 ~ /dev/tty6 が割り当てられます

ちなみに、tty は teletypewriter の略です。

参考

端末 (ターミナル) エミュレータ

「端末エミュレータ」を使うことで、GUI の中で CUI を使うこともできます

端末エミュレータというのは、例えば

  • X Window System で利用できる xterm
  • Windows の Tera Term
  • macOS の “ターミナル” という名前のアプリケーションや iTerm2

などです。

「ターミナル」の説明でも書きましたが、端末エミュレータを単に「端末 (ターミナル)」と呼ぶ場合もあります。

端末エミュレータは、次に説明する「擬似端末」を使います

参考

擬似端末 (pseudo terminal)

さて、

  • GUI の中で CUI を使う場合
  • SSH などで他のコンピュータから接続される場合

については、CUI には直接物理機器が接続されているわけではありません。

この状態を仮想的な接続として扱うために「擬似端末」が使われます

擬似端末は、Linux のデバイスファイルとしては、/dev/pts/X が対応します。 (X には 0、1 などの数字が入ります)

プロセスが /dev/ptmx をオープンすることで、/dev/pts/X などが作られるという仕組みです。

Telnet や SSH での接続

Telnet や SSH を使い、ネットワーク経由で接続する場合は、GUI の中で CUI を使う場合とほぼ同じです。

クライアント側で端末エミュレータなどを使い、接続としては「擬似端末」が使われることになります。

tty と pts に直接書き込む標準入力で見てみる

/dev/ttyX や /dev/pts/X を使ったよくある実験として、相手方の画面に文字を表示するというものがあります。

例えば、「X Window System 上の擬似端末 (/dev/pts/0)」から「仮想コンソール (/dev/tty3)」に “hello” と送ってみます。

$ tty
/dev/pts/0
$ echo hello > /dev/tty3

このとき、仮想コンソール「/dev/tty3」を見てみると… (Ctrl + Alt + F3 で切り替えます)

~ $ hello

しっかり hello と表示されています。

ファイルディスクリプタを見てみる

もう少し理解を深めるために、ファイルディスクリプタを見てみようと思います。

ファイルディスクリプタというのは、各プロセスが扱っているファイルに割り当てる識別子のことです。

※ Linux では、デバイスや標準入出力なども全てファイルとして表現されます

X Window System 上の擬似端末で、まずはシェルのプロセスの PID を確認します。

$ ps
    PID TTY          TIME CMD
   2094 pts/0    00:00:00 bash
   2317 pts/0    00:00:00 ps

この PID のプロセスのファイルディスクリプタを見てみます。

$ ls -l /proc/{PID}/fd
合計 0
lrwx------ 1 hoge hoge 64. 7月 20 13:53 0 -> /dev/pts/0
lrwx------ 1 hoge hoge 64. 7月 20 13:53 1 -> /dev/pts/0
lrwx------ 1 hoge hoge 64. 7月 20 13:53 2 -> /dev/pts/0
lrwx------ 1 hoge hoge 64. 7月 20 13:53 255 -> /dev/pts/0

ファイルディスクリプタは、0 が標準入力、1 が標準出力、2 が標準エラー出力であり、それらが /dev/pts/0 を指していることが分かりました。

同様の手順で、仮想コンソールの標準入力・標準出力・標準エラー出力が /dev/tty3 などを指していることも確認できます。

Linux はデバイスファイルへの書き込みによってディスプレイへの表示などを実施しているので、$ echo hello > /dev/tty3 などとして /dev/pts/0 や /dev/tty3 に書き込めば、対応するディスプレイに文字が表示されるわけです。

おわりに

以上、改めて、

  • コンソール
  • ターミナル
  • 仮想コンソール
  • 端末エミュレータ
  • 擬似端末

という用語を整理しました。

追加で

  • /dev/console と /dev/tty0 の関係
  • tty と tty0
  • ターミナルサーバやコンソールサーバ

などについてもまとめたいところですが、一旦ここまでとします。

参考

この記事の内容に間違い・ご指摘などありましたら、Twitter の DM でご連絡お願いします。