Red Hat Enterprise Linux でシリアルターミナルまたはコンソールをセットアップする方法
はじめに
デバッグプロセスのシリアルコンソールと、ヘッドレス操作のシリアルターミナルがあると便利な場合があります。シリアルコンソールは、すべてのコンソール出力をシリアルポートに送信します。シリアルターミナルが適切に設定されていれば、リモートターミナルとしてシリアルポート経由でシステムにログオンすることもできます。シリアルコンソールとシリアルターミナルの両方、またはどちらかだけをセットアップすることができます。このアーティクルでは、RHEL でのシリアルターミナルの設定について説明します。
コンテンツ
- シリアルコンソール用のカーネルオプション設定
- Red Hat Enterprise Linux 4 および 5
- Red Hat Enterprise Linux 6
- Red Hat Enterprise Linux 7
- Red Hat Enterprise Linux 8
- Red Hat Enterprise Linux 9 および 10
- シリアルコンソールからの 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 over a Serial Console を参照してください。
RHEL 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
RHEL 9 および RHEL 10 でのシリアルターミナルの設定
-
grubbyコマンドを使用してカーネルパラメーターを変更します。 -
現在のパラメーターを取得します。
# 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 rhgb quiet"
- パラメーターを "console=tty0 console=ttyS0,115200" に更新し、サーバーを再起動して変更を有効にします。
# grubby --update-kernel=ALL --args="console=tty0 console=ttyS0,115200"
# reboot
- 再起動後にコンソールパラメーターが適用されます。
# 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 rhgb quiet console=tty0 console=ttyS0,115200"
# cat /proc/cmdline
BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-570.18.1.el9_6.x86_64 root=/dev/mapper/rhel-root 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 rhgb quiet console=tty0 console=ttyS0,115200
シリアルコンソールからの 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