How does one set up a serial terminal and/or console in Red Hat Enterprise Linux?
はじめに
デバッグプロセスのシリアルコンソールと、ヘッドレス操作のシリアルターミナルがあると便利な場合があります。シリアルコンソールは、すべてのコンソール出力をシリアルポートに送信します。シリアルターミナルが適切に設定されていれば、リモートターミナルとしてシリアルポート経由でシステムにログオンすることもできます。シリアルコンソールとシリアルターミナルの両方、またはどちらかだけをセットアップすることができます。このアーティクルでは、RHEL でのシリアルターミナルの設定について説明します。
コンテンツ
- シリアルコンソール用のカーネルオプション設定
- Red Hat Enterprise Linux 4 and 5
- Red Hat Enterprise Linux 6
- Red Hat Enterprise Linux 7
- Red Hat Enterprise Linux 8
- Red Hat Enterprise Linux 9
- シリアルコンソールからの GRUB のコントロール
シリアルコンソール用のカーネルオプション設定
最初に、カーネルがシリアルポートにすべてのコンソールメッセージを出力するようにするには、起動時に console=ttyS0
(ここの 0 は数字のゼロ) パラメーターをカーネルに渡す必要があります。この設定は、通常ブートローダーを使用して実施しますが、この例では GRUB を使用しています。以下に示す例の設定では、システムはコンソール出力を通常のコンソール (「モニター」) tty0
に送付するのに加えて、出力を 115200 のボーレートでシリアルポート ttyS0
に送付します。
-
ファイル
/boot/grub/grub.conf
を編集して、カーネル行に以下のカーネルオプションを追加します。console=ttyS0,115200 console=tty0
-
たとえば、grub.conf を以下のように編集します。
[root@localhost ~]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/hda2 # initrd /initrd-version.img #boot=/dev/hda default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz title Red Hat Enterprise Linux AS (2.4.21-27.0.2.ELsmp) root (hd0,0) kernel /vmlinuz-2.4.21-27.0.2.ELsmp ro root=LABEL=/ console=ttyS0,115200 console=tty0 initrd /initrd-2.4.21-27.0.2.ELsmp.img
-
注記:上記の例ではボーレートを 115200 としていますが、実際の構成でのボーレートは、ハードウェアの設定により異なります。それぞれのサーバーには独自のシリアルコンソール設定があり、一般的にはシステム BIOS に記載されています。これらの設定を適用する前に、サーバーのマニュアルも確認することを推奨します。ボーレートを誤って設定すると、ログイン時に意味のない文字が表示される場合があります。
-
注記:システム出力のプライマリーコンソールは、カーネルパラメーターのリスト中 最後の コンソールになります。上記の例では、VGA コンソール
tty0
がプライマリーディスプレーで、シリアルコンソールがセカンダリーディスプレーです。つまり、シリアルコンソールはセカンダリーコンソールなので、init スクリプトからのメッセージは送付されません。ただし、ブートメッセージおよび重大な警告はシリアルコンソールに送付されます。init スクリプトのメッセージをシリアルコンソールにも表示させる必要があれば、コンソールパラメーターの順番を入れ替えてシリアルコンソールをプライマリーにしなければなりません。console=tty0 console=ttyS0,115200
-
grub.conf に加えたすべての設定変更は、次回のシステム再起動時に有効になります。
-
シリアルポート経由の root ログインを許可するためには、Red Hat Enterprise Linux 4、5、および 6 では、
/etc/securetty
ファイルにシリアルポートを追加する必要もあります。リストの最後に新しい行としてttyS0
を追加します。tty9 tty10 tty11 ttyS0
-
Red Hat Enterprise Linux 7 の場合には、デフォルトで
/etc/securetty
にttyS0
のエントリーがあります。
RHEL 4 および RHEL 5 でのシリアルターミナルの設定
この設定では、シリアルコンソール経由でログインすることができるように、リモートターミナルとしてシリアルポートをセットアップします。そのためには、シリアルポート用に agetty プロセスを生成する必要があります。
-
具体的には、
/etc/inittab
ファイルに以下の行を追加します。co:2345:respawn:/sbin/agetty ttyS0 115200 vt100
-
このオプションを、
# Run gettys in standard runlevels
セクションに追加する必要があります。# Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 co:2345:respawn:/sbin/agetty ttyS0 115200 vt100
-
この編集を行った後に、以下のコマンドを実行します。
# init q
RHEL 6 でのシリアルターミナルの設定
RHEL6 では、プライマリーコンソールがシリアルポートの場合には、 upstart (init プロセス) により agetty
プロセスが自動的に開始されます (注記: 最後の console= パラメーターがプライマリーコンソールです)。
-
プライマリーコンソールではないシリアルポートで agetty を開始するには、以下の内容で新たな
/etc/init/serial-ttyS0.conf
ファイルを作成します。start on stopped rc RUNLEVEL=[2345] stop on runlevel [S016] respawn exec /sbin/agetty /dev/ttyS0 115200 vt100-nav
-
続いて、再起動または以下のコマンドの実行により、新たな
agetty
を開始します。[root@localhost ~]# initctl start serial-ttyS0
-
注記: 新たな agetty でキーボードが正常に機能しない場合には、カーネルパラメーターから
console=ttyS0
を削除しなければならない場合があります。-
背景となる情報:
-
システムを起動すると、ハードウェアデバイスを取り扱う udev が開始されます。
/lib/udev/rules.d/10-console.rules
ファイルに従い udev は /dev/console を含む多数のデバイスを確認し、それぞれのデバイスに対して /lib/udev/console_check helper ヘルパープログラムを実行します。# Console initialization - keyboard, font, etc. KERNEL=="tty0", RUN+="/lib/udev/console_init %k" # Check and set up serial and serial-like consoles if necessary KERNEL=="console", RUN+="/lib/udev/console_check %k" KERNEL=="ttySG*", RUN+="/lib/udev/console_check %k" KERNEL=="xvc*", RUN+="/lib/udev/console_check %k" KERNEL=="hvsi*", RUN+="/lib/udev/console_check %k" KERNEL=="hvc*", RUN+="/lib/udev/console_check %k"
-
console_check が
/dev/console
をシリアルコンソールと判断すると (ioctl() システムコールを実行して)、以下のコマンドを実行します。/sbin/initctl emit --no-wait fedora.serial-console-available DEV=ttyS0 SPEED=115200
-
このコマンドにより
fedora.serial-console-available
イベントが init デーモンに送付されます。このイベントに対する init デーモンの処理は、/etc/init/serial.conf
で設定されています。start on fedora.serial-console-available DEV=* and stopped rc RUNLEVEL=[2345] stop on runlevel [S016] instance $DEV respawn pre-start exec /sbin/securetty $DEV exec /sbin/agetty /dev/$DEV $SPEED vt100-nav
-
init デーモンは、
serial.conf
の exec 行からのコマンドを実行して agetty を起動します。/sbin/agetty /dev/ttyS0 115200 vt100-nav
-
これにより、シリアルコンソールにログインプロンプトが表示されます。
-
-
-
シリアルコンソールのステータスを確認するには、initctl コマンドを使用して init デーモンのジョブをクエリーします。
[root@localhost ~]# initctl list | grep serial serial (ttyS0) start/running, process 1254
-
あるいは、
[root@localhost ~]# initctl status serial DEV=ttyS0 serial (ttyS0) start/running, process 1254
-
上記の
DEV=ttyS0
パラメーターに注意してください。このパラメーターを指定しないと、initctl
はコマンドが不明確であることを示すエラーメッセージを返します。[root@localhost ~]# initctl status serial initctl: Unknown parameter: DEV
-
/etc/init/serial.conf
でのジョブ定義のために、DEV=ttyS0 パラメーターが必要です (上記を参照)。
RHEL 7 でのシリアルターミナルの設定
-
以下の行を
/etc/default/grub
に追加します (行がすでに存在する場合は更新します)。GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8" GRUB_TERMINAL=serial GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
GRUB_CMDLINE_LINUX_DEFAULT
は、この設定をデフォルトのメニューエントリーにのみ適用します。設定をすべてのメニューエントリーに適用するには、GRUB_CMDLINE_LINUX
を使用します。- 注記:
/etc/default/grub
ファイルでは、上記の各行のタイプは 1 回のみ指定してください。 行がすでに存在する場合には、同じ行をコピーして追加するのではなく、その行を変更します。 これは、GRUB_CMDLINE_LINUX_DEFAULT
行をファイル内で 1 回だけ指定するためです。
-
以下のように grub2-mkconfig -o コマンドを実行し、
/boot/grub2/grub.cfg
ファイルを再ビルドします。- BIOS ベースのマシン:
~]# grub2-mkconfig -o /boot/grub2/grub.cfg
- UEFI ベースのマシンの場合:
~]# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
- BIOS ベースのマシン:
-
追加情報は、『RHEL 7 システム管理者のガイド』26.9. を参照してください。シリアルコンソールでの GRUB 2
Red Hat Enterprise Linux 8
-
GRUB ブートパラメーターは、
grub2-editenv
コマンドを使用して編集されます。まず、現在のパラメーターを取得します。# grub2-editenv - list | grep kernelopts kernelopts=root=/dev/mapper/rhel_example-root ro crashkernel=auto resume=/dev/mapper/rhel_example-swap rd.lvm.lv=rhel_example/root rd.lvm.lv=rhel_example/swap
-
ここから、行全体をコピーし、シリアルコンソールパラメーターを追加して、上記のコマンドに渡します。
grub2-editenv - set "kernelopts=root=/dev/mapper/rhel_example-root ro crashkernel=auto resume=/dev/mapper/rhel_example-swap rd.lvm.lv=rhel_example/root rd.lvm.lv=rhel_example/swap console=tty0 console=ttyS0,115200"
-
これでコンソールパラメーターが設定されるはずです。パラメーターを有効にするには再起動が必要です。パラメーターをリスト表示して、パラメーターが設定されたことを確認できます。
# grub2-editenv - list | grep kernelopts kernelopts=root=/dev/mapper/rhel_example-root ro crashkernel=auto resume=/dev/mapper/rhel_example-swap rd.lvm.lv=rhel_example/root rd.lvm.lv=rhel_example/swap console=tty0 console=ttyS0,115200
Red Hat Enterprise Linux 9
-
grubby コマンドを使用してカーネルパラメーターを変更します。
-
現在のパラメーターを取得します。
# grubby --info=ALL|grep -i args # grubby --info=ALL|grep -i args args="ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap
-
パラメーター console=tty0 console=ttyS0,115200 を更新します。
# grubby --update-kernel=ALL --args="console=tty0 console=ttyS0,115200"
-
これでコンソールパラメーターが設定されるはずです。パラメーターを有効にするには再起動が必要です。パラメーターをリスト表示して、パラメーターが設定されたことを確認できます。
# grubby --info=ALL|grep -i args args="ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap console=tty0 console=ttyS0,115200" # reboot # cat /proc/cmdline
シリアルコンソールからの GRUB のコントロール
VGA コンソールではなくシリアルコンソールを使用するように grub を設定することもできます。これにより、起動プロセスを中断し、別のカーネルを選択したりカーネルパラメーターを追加したりできます (例: シングルユーザーモードでの起動)。
-
シリアルコンソールを使用するように GRUB を設定するには、
grub.conf
でスプラッシュイメージをコメントアウトし、serial
およびterminal
オプションを追加します。[root@localhost ~]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/hda2 # initrd /initrd-version.img #boot=/dev/hda default=0 timeout=10 #splashimage=(hd0,0)/grub/splash.xpm.gz serial --unit=0 --speed=115200 terminal --timeout=5 serial console title Red Hat Enterprise Linux AS (2.4.21-27.0.2.ELsmp) root (hd0,0) kernel /vmlinuz-2.4.21-27.0.2.ELsmp ro root=LABEL=/ console=ttyS0,115200 console=tty0 initrd /initrd-2.4.21-27.0.2.ELsmp.img
-
grub.conf で変更した設定内容は、次回のシステム再起動時に有効になります。
Comments