1. 序章

このチュートリアルでは、最初に2つを調べます tty Linuxシステムに存在するドライバー。 / dev / tty / dev/console。 次に、のさまざまな役割を発見します / dev / console / dev / tty0 / dev / tty

2. / dev / console

/ dev /consoleはシステムコンソールと呼ばれます。 歴史的に、これはLinuxコンピュータに直接接続された端末でした。 今では、シリアル端末をLinuxコンピューターに接続するオプションが提供されています。

/ dev /consoleを見てみましょう。

$ ls -lah /dev/console
crw------- 1 root root 5, 1 Jun 15 15:25 /dev/console
$ file /dev/console
/dev/console: character special (5/1)

ご覧のとおり、これは /devフォルダーにあるファイルです。 これは、メジャー番号5とマイナー番号1で構成される識別子を持つ文字デバイスを表します。

kernel のドキュメントを見ると、 / dev /consoleは以前はシンボリックリンクであったと記載されています。 その結果、 / dev /consoleは別のデバイスを指しています。

/ dev /consoleが何を指しているか見てみましょう。

$ cat /sys/devices/virtual/tty/console/active
tty0

うーん、これはtty0/dev / console が同じものであることを意味しますか? さらに調べてみましょう。

Linuxシリアルコンソールのドキュメントを見ると、 / dev /consoleが指すものを変更できると記載されています。

それを試してみましょう:

注:この例では、GRUBブートローダーが必要です。

$ cat /etc/default/grub | head -n 10
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="ignore_loglevel"

/ etc / default / grub の行をGRUB_CMD_LINE_LINUX=” ignore_loglevel”で次のように変更する必要があります。

GRUB_CMD_LINE_LINUX =” console = / dev / tty2 ignore_loglevel”

grubの設定を更新して再起動しましょう。

$ sudo update-grub
$ sudo reboot

次に、 / dev /consoleが指している場所を見てみましょう。

$ cat /sys/devices/virtual/tty/console/active
tty2

/ dev /consoleが変更されたことがわかります。

これで、 / dev /consoleが指すものを変更できることがわかりました。 このデバイスの目的は何ですか?

/ dev / consoleは、特に起動時に、ログメッセージを出力するための保証された場所をカーネルに提供しているようです。 また、シングルユーザーモードに切り替えるときに使用するデバイスは / dev /consoleです。

シングルユーザーモードに入って、これを試してみましょう。

$ init 1

グラフィックが消えていることに気づきました。 シングルユーザーテキストモードです。

どのttyを使用しているかを見てみましょう。

$ tty
tty2

これは/dev /consoleと同じです。

私たちが発見したように。 / dev / console は、さまざまなデバイスを指すことができます。 カーネルメッセージは/dev/ consoleに記録され、そこでログインプロンプトを起動できます

3. / dev / tty0

/ dev / tty0 は、アクティブなtty端末を指します。 いくつかの例を使ってさらに詳しく見ていきましょう。

tty3 にアクセスするには、CTRL + ALT+F3を押します。 コマンドttyを入力すると、tty3を使用していることを確認できます。

$ tty
/dev/tty3

echoを使用してコンソールに書き込むことができるかどうかを見てみましょう。

$ echo "hello world" > /dev/tty3
hello world

さて、これまでのところ、CTRL + ALT+FNを押すことでtty Nに変更できることを確認しました。 ただし、キーボードにはF0キーはありませんが、tty0があることに注意してください。

tty0についてもう少し調べてみましょう。

$ cat /sys/devices/virtual/tty/tty0/active
tty3

tty0tty3を指しているようです。 では、別のttyに切り替えてみましょう。 tty4としましょう。 簡単なショートカットは、CTRL +ALT+右矢印を押すことです。 これにより、tty3からtty4に移動します。

$ tty
/dev/tty4
$ cat /sys/devices/virtual/tty/tty0/active
tty4

tty0が現在アクティブなコンソールであることがわかります。

4. / dev / tty

このセクションでは、 / dev/ttyと/dev/tty0の違い。 / dev / ttyは、端末のタイプに関係なく、アクティブなプロセスの端末のエイリアスです。 。 たとえば、これはbashまたはsshdに関連付けられた端末にすることができます。

POSIX standard によると、 / dev / tty はプロセスグループに関連付けられた端末と見なされますが、 / dev /tty0は仮想端末に関連付けられます。

それが実際に何を意味するのか見てみましょう。

まず、ローカルマシンにSSH接続して、ttyを確認しましょう。

$ ssh localhost
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-37-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 updates can be installed immediately.
0 of these updates are security updates.

Last login: Tue Jun 16 10:59:08 2020 from 127.0.0.1
$ tty
/dev/pts/0

これはptsで、別のタイプの端末です。 次に、「helloworld」を / dev /tty0に出力することがsshセッションに影響するかどうかを確認しましょう。

ルートのみが/dev / tty0、したがってに書き込むことができることに注意してください。ルートに切り替える必要があります。

$ sudo -i
$ echo "hello world" > /dev/tty0
$ # Nothing here was expecting hello world.
$ exit # let's leave root.

「helloworld」というメッセージは出力されません。 ただし、アクティブな tty を確認すると、そこに「helloworld」が出力されていることがわかります。

/ dev /ttyを使ってみましょう。

$ echo "hello world" > /dev/tty
hello world

「helloworld」というメッセージが印刷されます! これは、 / dev/ttyがsshセッションに関連付けられている端末を表すためです。 使用中の端末に関係なく、 / dev /ttyは現在の端末にすばやくアクセスする方法です。

5. 結論

このチュートリアルでは、 / dev /consoleとその役割について説明しました。 次に、ttytty0を調べて、2つの違いを確認しました。 / dev /ttyは現在アクティブなttyであり、 / dev /tty0は現在のプロセスに関連付けられている端末です。