요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. _serial_console:
Linux Serial Console
====================
To use a serial port as console you need to compile the support into your
kernel - by default it is not compiled in. For PC style serial ports
it's the config option next to menu option:
:menuselection:`Character devices --> Serial drivers --> 8250/16550 and compatible serial support --> Console on 8250/16550 and compatible serial port`
You must compile serial support into the kernel and not as a module.
It is possible to specify multiple devices for console output. You can
define a new kernel command line option to select which device(s) to
use for console output.
The format of this option is::
console=device,options
device: tty0 for the foreground virtual console
ttyX for any other virtual console
ttySx for a serial port
lp0 for the first parallel port
ttyUSB0 for the first USB serial device
options: depend on the driver. For the serial port this
defines the baudrate/parity/bits/flow control of
the port, in the format BBBBPNF, where BBBB is the
speed, P is parity (n/o/e), N is number of bits,
and F is flow control ('r' for RTS). Default is
9600n8. The maximum baudrate is 115200.
You can specify multiple console= options on the kernel command line.
The behavior is well defined when each device type is mentioned only once.
In this case, the output will appear on all requested consoles. And
the last device will be used when you open ``/dev/console``.
So, for example::
console=ttyS1,9600 console=tty0
defines that opening ``/dev/console`` will get you the current foreground
virtual console, and kernel messages will appear on both the VGA
console and the 2nd serial port (ttyS1 or COM2) at 9600 baud.
The behavior is more complicated when the same device type is defined more
times. In this case, there are the following two rules:
1. The output will appear only on the first device of each defined type.
2. ``/dev/console`` will be associated with the first registered device.
Where the registration order depends on how kernel initializes various
subsystems.
This rule is used also when the last console= parameter is not used
for other reasons. For example, because of a typo or because
the hardware is not available.
The result might be surprising. For example, the following two command
lines have the same result::
console=ttyS1,9600 console=tty0 console=tty1
console=tty0 console=ttyS1,9600 console=tty1
The kernel messages are printed only on ``tty0`` and ``ttyS1``. And
``/dev/console`` gets associated with ``tty0``. It is because kernel
tries to register graphical consoles before serial ones. It does it
because of the default behavior when no console device is specified,
see below.
Note that the last ``console=tty1`` parameter still makes a difference.
The kernel command line is used also by systemd. It would use the last
defined ``tty1`` as the login console.
If no console device is specified, the first device found capable of
acting as a system console will be used. At this time, the system
first looks for a VGA card and then for a serial port. So if you don't
have a VGA card in your system the first serial port will automatically
become the console, unless the kernel is configured with the
CONFIG_NULL_TTY_DEFAULT_CONSOLE option, then it will default to using the
ttynull device.
You will need to create a new device to use ``/dev/console``. The official
``/dev/console`` is now character device 5,1.
(You can also use a network device as a console. See
``Documentation/networking/netconsole.rst`` for information on that.)
Here's an example that will use ``/dev/ttyS1`` (COM2) as the console.
Replace the sample values as needed.
1. Create ``/dev/console`` (real console) and ``/dev/tty0`` (master virtual
console)::
cd /dev
rm -f console tty0
mknod -m 622 console c 5 1
mknod -m 622 tty0 c 4 0
2. LILO can also take input from a serial device. This is a very
useful option. To tell LILO to use the serial port:
In lilo.conf (global section)::
serial = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
3. Adjust to kernel flags for the new kernel,
again in lilo.conf (kernel section)::
append = "console=ttyS1,9600"
4. Make sure a getty runs on the serial port so that you can login to
it once the system is done booting. This is done by adding a line
like this to ``/etc/inittab`` (exact syntax depends on your getty)::
S1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
5. Init and ``/etc/ioctl.save``
Sysvinit remembers its stty settings in a file in ``/etc``, called
``/etc/ioctl.save``. REMOVE THIS FILE before using the serial
console for the first time, because otherwise init will probably
set the baudrate to 38400 (baudrate of the virtual console).
6. ``/dev/console`` and X
Programs that want to do something with the virtual console usually
open ``/dev/console``. If you have created the new ``/dev/console`` device,
and your console is NOT the virtual console some programs will fail.
Those are programs that want to access the VT interface, and use
``/dev/console instead of /dev/tty0``. Some of those programs are::
Xfree86, svgalib, gpm, SVGATextMode
It should be fixed in modern versions of these programs though.
Note that if you boot without a ``console=`` option (or with
``console=/dev/tty0``), ``/dev/console`` is the same as ``/dev/tty0``.
In that case everything will still work.
7. Thanks
Thanks to Geert Uytterhoeven <geert@linux-m68k.org>
for porting the patches from 2.1.4x to 2.1.6x for taking care of
the integration of these patches into m68k, ppc and alpha.
Miquel van Smoorenburg <miquels@cistron.nl>, 11-Jun-2000
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
Serial console build 설정과 `console=` 문법
1-34Serial port를 console로 쓰려면 kernel에 support를 built-in으로 compile해야 합니다. 기본으로는 포함되지 않습니다. PC-style port는 `Character devices --> Serial drivers --> 8250/16550 and compatible serial support --> Console on 8250/16550 and compatible serial port` menu option에서 설정하며 module로 build하면 안 됩니다.
Console output에 여러 device를 지정할 수 있으며 kernel command line의 `console=` option으로 사용할 device를 고릅니다. 기본 형식은 다음과 같습니다.
console=device,options
| device | 의미 |
|---|---|
| `tty0` | 현재 foreground virtual console |
| `ttyX` | 그 밖의 virtual console |
| `ttySx` | Serial port |
| `lp0` | 첫 parallel port |
| `ttyUSB0` | 첫 USB serial device |
`options`는 driver에 따라 달라집니다. Serial port는 `BBBBPNF` 형식으로 baudrate, parity, data bits, flow control을 지정합니다. `BBBB`는 speed, `P`는 parity(`n`, `o`, `e`), `N`은 bit 수, `F`는 flow control이며 RTS는 `r`입니다. 기본값은 `9600n8`, 최대 baudrate는 115200입니다.
여러 console의 output과 `/dev/console` 선택
35-90Kernel command line에는 `console=`을 여러 번 지정할 수 있습니다. 각 device type이 한 번만 나오면 output은 요청한 모든 console에 나타나고 마지막 device가 `/dev/console`을 열 때 사용됩니다.
console=ttyS1,9600 console=tty0
이 예에서 `/dev/console`은 현재 foreground virtual console이고 kernel message는 VGA console과 두 번째 serial port `ttyS1` 또는 COM2에 9600 baud로 출력됩니다.
같은 device type을 여러 번 지정하면 두 규칙이 적용됩니다. Output은 각 type의 첫 device에만 나타나고 `/dev/console`은 처음 등록된 device에 연결됩니다. 등록 순서는 kernel subsystem 초기화 순서에 따라 달라집니다.
마지막 `console=` parameter가 typo나 없는 hardware 때문에 사용되지 못할 때도 첫 등록 device 규칙이 적용됩니다. 다음 두 command line은 같은 결과를 만듭니다.
console=ttyS1,9600 console=tty0 console=tty1
console=tty0 console=ttyS1,9600 console=tty1
Kernel message는 `tty0`과 `ttyS1`에만 출력되고 `/dev/console`은 `tty0`에 연결됩니다. Kernel이 기본 동작 때문에 graphical console을 serial보다 먼저 등록하기 때문입니다.
마지막 `console=tty1`도 systemd에는 영향을 줍니다. Systemd는 kernel command line의 마지막 `tty1`을 login console로 사용합니다.
Console device를 지정하지 않으면 system console 역할이 가능한 첫 device를 씁니다. 현재는 VGA card를 먼저 찾고 다음으로 serial port를 찾습니다. VGA가 없으면 첫 serial port가 자동 console이 되지만 `CONFIG_NULL_TTY_DEFAULT_CONSOLE`이 설정되면 기본으로 `ttynull`을 사용합니다.
공식 `/dev/console`은 character device 5,1입니다. Network device를 console로 쓰려면 `Documentation/networking/netconsole.rst`를 참조하십시오.
여러 `console=` parameter가 있을 때 output과 controlling device가 결정되는 방식입니다.
`/dev/ttyS1`을 console로 쓰는 예제와 주의 사항
91-147다음은 `/dev/ttyS1`(COM2)을 console로 쓰는 예제이며 sample 값은 환경에 맞게 바꿉니다. 먼저 real console `/dev/console`과 master virtual console `/dev/tty0`을 만듭니다.
cd /dev
rm -f console tty0
mknod -m 622 console c 5 1
mknod -m 622 tty0 c 4 0
LILO도 serial device에서 input을 받을 수 있습니다. `lilo.conf` global section에 다음 설정을 둡니다.
serial = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
새 kernel flag는 `lilo.conf` kernel section에서 다음과 같이 조정합니다.
append = "console=ttyS1,9600"
Boot가 끝난 뒤 serial port로 login할 수 있도록 getty를 실행해야 합니다. 정확한 문법은 getty에 따라 다르며 `/etc/inittab`에 다음과 같은 줄을 추가합니다.
S1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
Sysvinit은 stty 설정을 `/etc/ioctl.save`에 기억합니다. Serial console을 처음 사용하기 전에 이 파일을 제거해야 합니다. 그렇지 않으면 init이 virtual console의 baudrate인 38400으로 설정할 수 있습니다.
Virtual console을 다루는 program은 흔히 `/dev/console`을 엽니다. 새 `/dev/console`을 만들었고 console이 virtual console이 아니면 VT interface를 원하면서 `/dev/tty0` 대신 `/dev/console`을 쓰는 program이 실패할 수 있습니다.
Xfree86, svgalib, gpm, SVGATextMode
Modern version에서는 이 문제가 수정됐어야 합니다. `console=` option 없이 또는 `console=/dev/tty0`으로 boot하면 `/dev/console`과 `/dev/tty0`이 같으므로 계속 동작합니다.
Geert Uytterhoeven `<geert@linux-m68k.org>`는 2.1.4x patch를 2.1.6x로 port하고 m68k, ppc, alpha 통합을 맡았습니다. 문서는 Miquel van Smoorenburg `<miquels@cistron.nl>`가 11-Jun-2000에 작성했습니다.
요약과 해설
serial-console.rst:1-147Serial console support는 module이 아니라 kernel built-in이어야 합니다. 여러 `console=` option을 쓸 때 각 type의 첫 device가 output을 받고, `/dev/console`은 kernel이 처음 등록한 console에 연결된다는 차이를 기억해야 합니다.
Bootloader output, kernel message, login getty는 서로 별도 설정입니다. LILO와 kernel command line, `/etc/inittab`을 모두 맞추고 기존 `/etc/ioctl.save`가 잘못된 baudrate를 복원하지 않게 제거합니다.