Ubuntu 20.04でシリアルコンソールを使う

<!--
0file: ubuntu_console_ja.md
0title: Ubuntu 20.04でシリアルコンソールを使う
0url: https://qiita.com/wataash/items/b291cc0643d952d986d8
tags: linux ubuntu
-->

![serial console](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167409/cdbe6fcf-e83b-23c9-8f5c-d4428e10ce3a.png "serial console")

[English](https://blog.wataash.com/entry/2020/04/26/122942)

```sh
sudo cp -nv /etc/default/grub   /etc/default/grub.orig
sudo cp -nv /boot/grub/grub.cfg /boot/grub/grub.cfg.orig
sudo vim /etc/default/grub
```

`/etc/default/grub`:

```sh
## remove (optional):
# GRUB_TIMEOUT_STYLE=hidden

## change:
# (optional)
# GRUB_TIMEOUT=0
GRUB_TIMEOUT=2

## add:
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200"

## change:
# GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200"
```

---

<!--
<table><tbody><tr><td>
can't parse markdown in qiita...
-->

<details><summary>説明</summary><div>
`GRUB_TIMEOUT_STYLE=hidden` を消して `GRUB_TIMEOUT=2` にするとブート時にGRUBメニューが表示されるようになります。

![GRUB menu](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167409/c9797c5e-d7d7-5f94-be98-5acd38cf5348.png "GRUB menu")

`GRUB_TIMEOUT` が1以上（あるいは-1）であれば、`GRUB_TIMEOUT_STYLE=hidden` であっても <kbd>Escape</kbd> キーを押すことでメニューは出せます ([ref.](https://www.gnu.org/software/grub/manual/grub/html_node/Simple-configuration.html))。

`GRUB_TERMINAL="console serial"` をつけることで、VGAコンソールとserialターミナルの両方にGRUBメニューが表示されます。

![GRUB menu in both VGA console and serial terminal](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167409/1fb272f1-b22c-0615-370d-659f946d0f17.png "GRUB menu in both VGA console and serial terminal")

シリアルコンソールの出力が表示されない場合、[マニュアル](https://www.gnu.org/software/grub/manual/grub/html_node/serial.html)を参照して、ハードウェアに合わせて `GRUB_SERIAL_COMMAND="serial --speed=115200"` を変えてみて下さい。

`GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200"` は[Linux kernelのcommand-line parameter](https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html)です。`GRUB_TERMINAL="console serial"` と同様、このオプションによりVGAコンソール (tty1) とシリアルコンソール (ttyS0) の両方でtty入力/出力が可能になります。

![tty output on both tty1 and ttyS0](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167409/8f1ecc84-7db8-4bc2-f20e-61f6158dbc96.png "tty output on both tty1 and ttyS0")

これはboot時にGRUB menuで変更することも可能です。

![Modify command-line parameter in GRUB menu](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167409/2eadea74-df98-3838-7bdd-5020f70f4793.png "Modify command-line parameter in GRUB menu")

<!-- https://help.ubuntu.com/community/SerialConsoleHowto -->
</div></details>

---

`/etc/default/grub` を編集したら `sudo update-grub` を実行して、boot時に実際に読み込まれる `/boot/grub/grub.cfg` を生成します。これは内部的に `grub-mkconfig -o /boot/grub/grub.cfg` を実行しています。

---

<details><summary>/etc/default/grub のオリジナル、修正後、diff</summary><div>

<!-- TODO: QEMU link -->

オリジナル（環境によって変わります。これはQEMUのもの）：

```sh
# 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_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
```

修正後：

```sh
# 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=2
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200"

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
#GRUB_TERMINAL="console serial"
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200"

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
```

diff:

```sh
sudo apt install python3-pip
pip3 install icdiff
~/.local/bin/icdiff /etc/default/grub.orig   /etc/default/grub
~/.local/bin/icdiff /boot/grub/grub.cfg.orig /boot/grub/grub.cfg
```

![diff /etc/default/grub](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167409/5f4ac23c-3be2-5d9e-fa5c-37f8953ddbad.png "diff /etc/default/grub")

`/boot/grub/grub.cfg` のdiffは大きいので自分の目で確かめてみて下さい。
</div></details>

---

再起動するとシリアルコンソールにdmesgが流れ、ログインプロンプトが表示されるようになります。

<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />この 作品 は <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズ 表示 4.0 国際 ライセンス</a>の下に提供されています。