~에서이 답변도착하다Linux: /dev/console, /dev/tty 및 /dev/tty0의 차이점
~에서 문서:
/dev/tty Current TTY device /dev/console System console /dev/tty0 Current virtual console
옛날에는
/dev/console
sysadmin 콘솔이 있었습니다. TTY는 서버에 연결된 사용자의 직렬 장치입니다. Now/dev/console
및/dev/tty0
현재 디스플레이를 나타내며 일반적으로 동일합니다.console=ttyS0
에grub.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/console
5: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
?
console
기술적으로 / 에서 읽고 쓸 수 있습니다tty0
. 예를 들어getty
로그인을 허용하려면 a 를 실행하세요tty0
. 그러나 이것은 빠른 해킹으로만 유용합니다. 이는 Linux에서 여러 가상 콘솔을 활용할 수 없음을 의미하기 때문입니다.systemd
sysfs
기본 TTY 장치를 감지하려면 /dev/console 장치와 연관된 속성을 찾으십시오 . 이를 통해 사용자가 boot 를 통해 커널 콘솔을 설정할 때 직렬 콘솔이systemd
자동으로 생성되고getty
로그인이 허용됩니다console=ttyS0
. 이는 편리합니다. 이 콘솔을 두 개의 다른 위치에 구성할 필요가 없습니다. 다시 한 번 을 참조하십시오man systemd-getty-generator
. 그러나 실제로 는 이에 대한 여지가systemd
없습니다 ./dev/console
시스템 부팅 중에는 sysfs가 설치되어 있지 않을 수도 있습니다. 하지만 여러분은 가능한 한 빨리 오류 및 진행 메시지를 표시할 수 있기를 원합니다! 그래서 우리는 포인트 1)로 다시 돌아갑니다. 커널은 PID 1로 시작하여 stdin/stdout/stderr을
/dev/console
.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
.사용자의 현재 가상 콘솔에
console
긴급 메시지를 쓸 수 있습니다 .tty0
이는 콘솔에 인쇄된 긴급 커널 메시지와 유사한 긴급 사용자 공간 오류 메시지에 유용할 수 있습니다(참고자료 참조man dmesg
). 그러나 적어도 시스템 부팅이 완료될 때까지는 이 작업을 수행하는 것이 일반적이지 않습니다.rsyslog에는이 페이지의 예, 커널 메시지를 에 인쇄합니다
/dev/console
. 커널이 이미 기본적으로 이 작업을 수행하므로 Linux에서는 의미가 없습니다. 내가 다시 찾을 수 없는 한 가지 예는 커널이 아닌 메시지에 이것을 사용하는 것은 좋은 생각이 아니라는 것입니다. 왜냐하면 콘솔에 너무 많은 syslog 메시지가 넘쳐서 너무 많은 방해가 될 것이기 때문입니다.systemd-journald에는 모든 로그를 콘솔로 전달하는 옵션도 있습니다. 원칙적으로 이는 가상 환경에서 디버깅하는 데 유용할 수 있습니다. 그러나 디버깅 목적으로 우리는 일반적으로
/dev/kmsg
. 그러면 커널 로그 버퍼에 저장되어 사용할 수 있습니다dmesg
. 커널 자체에서 생성된 메시지와 마찬가지로 이 메시지는 현재 커널 구성에 따라 콘솔에 표시될 수 있습니다.