`/dev/console`은 어디에 사용되나요?

`/dev/console`은 어디에 사용되나요?

~에서이 답변도착하다Linux: /dev/console, /dev/tty 및 /dev/tty0의 차이점

~에서 문서:

/dev/tty      Current TTY device
/dev/console  System console
/dev/tty0     Current virtual console

옛날에는 /dev/consolesysadmin 콘솔이 있었습니다. TTY는 서버에 연결된 사용자의 직렬 장치입니다. Now /dev/console/dev/tty0현재 디스플레이를 나타내며 일반적으로 동일합니다. console=ttyS0grub.conf. 그 후 당신은 /dev/tty0모니터 /dev/console이고 /dev/ttyS0.

통과"시스템 콘솔"는 가상 콘솔의 장치 /dev/console파일과 마찬가지로 텍스트 물리적 터미널의 장치 파일처럼 보입니다 ./dev/tty{1..63}

" /dev/console/dev/tty0현재 디스플레이를 나타내며 일반적으로 동일합니다"라고 하면 /dev/console가상 콘솔의 장치 파일일 수도 있는 것 같습니다. ( 은 현재 활성화된 가상 콘솔이며 그 중 하나일 수 있음 )과 /dev/console/dev/tty0비슷해 보입니다 ./dev/tty{1..63}/dev/tty0/dev/tty{1..63}

무엇인가요 /dev/console? 그것은 무엇을 위해 사용됩니까?

Linux 커널과 프로세스는 /dev/console동일한 목적을 수행합니까? /dev/tty( /dev/tty프로세스 프로세스 세션의 제어 터미널은 pts일 수 있으며 1부터 63까지 또는 그 이상입니까? /dev/ttyn)n

또 다른 답장말하는:

커널 문서에는 /dev/console문자 장치 번호가 5:1로 지정되어 있습니다. 이 문자 장치를 열면 콘솔 목록의 마지막 tty인 "기본" 콘솔이 열립니다.

console="콘솔 목록"은 모든 것을 의미합니까?부팅 옵션?

" /dev/console5:1 번호의 문자 장치"는 /dev/console물리적 텍스트 터미널(예: 시스템 콘솔)용 장치 파일이라는 의미입니까? (그러나 위에서 인용한 첫 번째 답변은 /dev/console동일할 수 있다고 말했습니다. /dev/tty0이것은 실제 텍스트 터미널이 아니라 가상 콘솔입니다.)

감사해요.

답변1

/dev/console존재의 주요 목적은 커널의 콘솔을 사용자 공간에 노출시키는 것입니다.Linux 커널 장치 문서지금 말해

콘솔 장치는 /dev/console시스템 메시지가 전송되어야 하고 단일 사용자 모드에서의 로그인이 허용되어야 하는 장치입니다. Linux 2.1.71부터 이는 /dev/console커널에 의해 관리됩니다. 이전 버전의 경우 시스템 구성에 따라 /dev/tty0특정 가상 콘솔(예: 장치가 아님 /dev/tty1) 또는 직렬 포트 호스트 에 대한 심볼릭 링크여야 합니다.tty*cu*

/dev/console, 메이저 5와 마이너 1이 있는 장치 노드로, 커널이 시스템 관리자와 상호 작용하는 기본 방법으로 간주하는 모든 것에 대한 액세스를 제공합니다. 이는 시스템에 연결된 물리적 콘솔일 수 있습니다(가상 콘솔 추상화가 맨 위에 위치하므로, 그것은 사용할 수 있습니다 tty0또는 ttyN어디서나질소1에서 63 사이), 직렬 콘솔, 하이퍼바이저 콘솔, 점자 장치 등이 있습니다. 커널 자체는 /dev/console커널이 아닌 사용자 공간을 위해 :device 노드를 사용하지 않습니다. 그러나 노드가 /dev/console존재하고 사용 가능한지 확인하고 init표준 입력, 출력 및 오류 지점을 /dev/console.

여기에 설명된 대로 /dev/console문자 장치에는 고정된 메이저와 마이너가 있으며, 별도의 장치(물리적 장치가 아닌 커널에 액세스하는 방법)이기 때문에 다른 장치와 동일하거나 /dev/tty0다른 장치와 동일하지 않습니다. 이는 다음과 다소 유사합니다.상황/dev/tty이는 다른 가상 콘솔이나 터미널 장치와 약간 다른 기능을 제공하므로 자체 장치(5:0)입니다.

"콘솔 목록"은 실제로 console=시작 매개변수에 의해 정의된 콘솔 목록입니다(또는 없는 경우 기본 콘솔). 이렇게 정의된 콘솔을 보면 이를 수행할 수 있습니다 /proc/consoles. /dev/console액세스를 제공합니다마지막으로:

커널 명령줄에서 여러 console= 옵션을 지정할 수 있습니다. 출력은 모든 항목에 표시됩니다. 를 열 때 마지막 장치가 사용됩니다 /dev/console.

답변2

"무엇입니까 /dev/console?"이전 답변. 아마도 이 대답은 다른 두 질문에 대한 답을 알면 더 명확해질 것입니다.

Q1. "물리적인 단말기 자체를 나타내는 장치파일은 무엇인가요?"

해당 장치 파일이 없습니다.

Q2. " /dev/console소용이 무엇입니까?"

Linux에서는 /dev/console시작(및 종료) 중에 메시지를 표시하는 데 사용됩니다. Stephen Kitt의 답변에서 알 수 있듯이 "단일 사용자 모드"에서도 사용됩니다. 그것을 사용하는 데 다른 의미는 없습니다.

Unix의 "좋은 옛날" /dev/console은 전용 물리적 장치였습니다. 하지만 리눅스에서는 그렇지 않습니다.

관련 증거

1. "물리적인 단말기 자체를 나타내는 장치파일은 무엇인가요?"

이렇게 이해해 보도록 하겠습니다. 장치 자체를 나타내는 장치 파일(에뮬레이션이지만)이며 프로세스나 커널과 관련이 없습니다 /dev/tty{1..63}. 그 중 하나가 현재 무언가(아마도 커널)에서 사용되고 있음 을 나타냅니다./dev/pts/n/dev/tty0/dev/tty{1..63}또는 쉘 프로세스? ). /dev/tty현재 프로세스 세션에서 사용되는 제어 터미널을 나타냅니다. /dev/console현재 커널이 사용하는 터미널을 나타냅니까?

커널이나 프로세스와는 별개로 물리적 터미널 자체를 나타내는 장치 파일은 무엇입니까?

기본 장치 /dev/tty{1..63}는 입니다 struct con_driver. 가능한 모든 드라이버를 보려면 다음을 확인하세요.https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console

이러한 기본 장치에 대한 장치 파일이 없습니다!


이를 관리할 수 있는 최소한의 사용자 공간 인터페이스만 있습니다.

$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device

==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device

정말 더 알고 싶다면,(M)모듈. 즉, 가상 콘솔 장치는 로드 가능한 커널 모듈에 의해 제공되지 않습니다. 이는 초기 커널 이미지(일명 "내장")의 일부입니다.

둘째, bind각 하위 디렉터리의 파일은 /sys/class/vtconsole어떤 vtconsole 장치가 활성화되어 있는지 알려주는 것 같습니다. 0활성 에 쓰면 가상으로 전환되는 것 같습니다. (GUI VT는 영향을 받지 않은 것으로 보이지만 텍스트 VT는 작동을 멈춥니다.) 더미에 글을 쓰면 1활성화되지 않습니다. 두 방법 모두 실제 방법으로 다시 전환할 수 있습니다. 코드를 올바르게 읽었다면 echo 1 > bind모듈(?!)로 구축된 콘솔 드라이버에서만 작동한다는 점입니다 .

~을 위한프레임버퍼특히, 다양한 프레임 버퍼 장치( ...) 바인딩에 대한 추가 정보 /dev/fb0와 특정 가상 콘솔 바인딩에 대한 추가 정보가 있습니다.https://kernel.org/doc/Documentation/fb/fbcon.txt. 여기에는 커널 옵션 fbcon:map=이나 이라는 명령이 포함됩니다 con2fbmap.

물론 세부 사항은 커널 버전, 아키텍처, 펌웨어, 장치, 드라이버 등에 따라 다를 수 있습니다. 저는 위의 인터페이스를 실제로 사용해 본 적이 없습니다. 커널은 i915// inteldrmfb호출하려는 모든 것을 허용하고 로드 시 이를 대신합니다 vgacon.

내 EFI 시스템은 그런 일을 한 적이 없는 것 같습니다 vgacon. 그래서 먼저 가상 콘솔을 사용하고 두 번째로 1.2초 후에 fbcon, in 으로 전환합니다 efifb. 하지만 지금까지는 작동하는 세부 사항이 무엇인지 신경 쓸 필요가 없습니다.

$ dmesg | grep -C2 [Cc]onsole
[    0.230822] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.233164] NR_IRQS: 65792, nr_irqs: 728, preallocated irqs: 16
[    0.233346] Console: colour dummy device 80x25
[    0.233571] console [tty0] enabled
[    0.233585] ACPI: Core revision 20180810
[    0.233838] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484882848 ns
--
[    1.228393] efifb: scrolling: redraw
[    1.228396] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
[    1.230393] Console: switching to colour frame buffer device 170x48
[    1.232090] fb0: EFI VGA frame buffer device
[    1.232110] intel_idle: MWAIT substates: 0x11142120
--
[    3.595838] checking generic (e0000000 408000) vs hw (e0000000 10000000)
[    3.595839] fb: switching to inteldrmfb from EFI VGA
[    3.596577] Console: switching to colour dummy device 80x25
[    3.596681] [drm] Replacing VGA console driver
[    3.597159] [drm] ACPI BIOS requests an excessive sleep of 20000 ms, using 1500 ms instead
[    3.599830] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
--
[    3.657050] e1000e 0000:00:19.0 eth0: MAC: 11, PHY: 12, PBA No: FFFFFF-0FF
[    3.657869] e1000e 0000:00:19.0 eno1: renamed from eth0
[    4.711453] Console: switching to colour frame buffer device 170x48
[    4.734356] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
[    4.778813] Loading iSCSI transport class v2.0-870.

2. “무슨 /dev/console소용이 있나요?”

/dev/console을 TTY 장치로 사용할 수 있습니다. 예를 들어, 여기에 쓰면 특정 기본 장치에 쓰게 되며 고유한 문자 장치 번호도 갖게 됩니다.

일반적으로 /dev/console은 /dev/tty0에 바인딩되어 있지만 때로는 다른 장치에 바인딩될 수도 있습니다.

따라서 이 경우 /dev/console에 쓰면 /dev/tty0에 쓰게 됩니다. 반대로 /dev/tty0에 쓰는 것은 현재 활성화된 /dev/ttyN 장치에 쓰는 것과 같습니다.

그러나 이것은 흥미로운 질문을 제기합니다. 액세스는 tty0현재 활성화된 가상 콘솔에 따라 다른 가상 콘솔에 액세스합니다. 사람들은 Linux tty0에서도 실제로 무엇을 사용 합니까 console?

  1. console기술적으로 / 에서 읽고 쓸 수 있습니다 tty0. 예를 들어 getty로그인을 허용하려면 a 를 실행하세요 tty0. 그러나 이것은 빠른 해킹으로만 유용합니다. 이는 Linux에서 여러 가상 콘솔을 활용할 수 없음을 의미하기 때문입니다.

  2. systemdsysfs기본 TTY 장치를 감지하려면 /dev/console 장치와 연관된 속성을 찾으십시오 . 이를 통해 사용자가 boot 를 통해 커널 콘솔을 설정할 때 직렬 콘솔이 systemd자동으로 생성되고 getty로그인이 허용됩니다 console=ttyS0. 이는 편리합니다. 이 콘솔을 두 개의 다른 위치에 구성할 필요가 없습니다. 다시 한 번 을 참조하십시오 man systemd-getty-generator. 그러나 실제로 는 이에 대한 여지가 systemd없습니다 ./dev/console

  3. 시스템 부팅 중에는 sysfs가 설치되어 있지 않을 수도 있습니다. 하지만 여러분은 가능한 한 빨리 오류 및 진행 메시지를 표시할 수 있기를 원합니다! 그래서 우리는 포인트 1)로 다시 돌아갑니다. 커널은 PID 1로 시작하여 stdin/stdout/stderr을 /dev/console.

  4. Linux 컨테이너 내에서 파일은 /dev/console문자 장치 번호 대신 다른 것으로 생성될 수 있습니다 5:1. 대신 PTS 장치 파일로 생성할 수 있습니다. 그러면 이 파일을 통해 /dev/console로그인하는 것이 합리적입니다 . systemd이러한 장치에 대한 로그인은 컨테이너 내에서 허용됩니다 man systemd-getty-generator.

    이 메커니즘은 이 명령을 사용하여 컨테이너를 실행할 때 사용됩니다 systemd-nspawn. ( systemd-nspawn맨 페이지를 검색해 보면 알 수 없지만 TTY에서 실행 중인 경우에만 해당된다고 생각합니다 .)

    systemd-nspawn/dev/console호스트에서 PTS 장치의 바인드 마운트로 컨테이너를 생성합니다 . 이는 PTS 장치가 /dev/pts/컨테이너 내에서 표시되지 않음을 의미합니다.

    PTS 장치는 devpts특정 설치에 대해 로컬입니다. PTS 장치는 장치 번호로 장치를 식별하는 일반 규칙의 예외입니다. PTS 장비는 장비 번호와 장착 방법의 조합으로 식별됩니다 devpts.

  5. 사용자의 현재 가상 콘솔에 console긴급 메시지를 쓸 수 있습니다 . tty0이는 콘솔에 인쇄된 긴급 커널 메시지와 유사한 긴급 사용자 공간 오류 메시지에 유용할 수 있습니다(참고자료 참조 man dmesg). 그러나 적어도 시스템 부팅이 완료될 때까지는 이 작업을 수행하는 것이 일반적이지 않습니다.

    rsyslog에는이 페이지의 예, 커널 메시지를 에 인쇄합니다 /dev/console. 커널이 이미 기본적으로 이 작업을 수행하므로 Linux에서는 의미가 없습니다. 내가 다시 찾을 수 없는 한 가지 예는 커널이 아닌 메시지에 이것을 사용하는 것은 좋은 생각이 아니라는 것입니다. 왜냐하면 콘솔에 너무 많은 syslog 메시지가 넘쳐서 너무 많은 방해가 될 것이기 때문입니다.

    systemd-journald에는 모든 로그를 콘솔로 전달하는 옵션도 있습니다. 원칙적으로 이는 가상 환경에서 디버깅하는 데 유용할 수 있습니다. 그러나 디버깅 목적으로 우리는 일반적으로 /dev/kmsg. 그러면 커널 로그 버퍼에 저장되어 사용할 수 있습니다 dmesg. 커널 자체에서 생성된 메시지와 마찬가지로 이 메시지는 현재 커널 구성에 따라 콘솔에 표시될 수 있습니다.

관련 정보