추가 읽기

추가 읽기

Alt+를 사용하면 Fn대부분의 Linux 배포판에서 가상 콘솔 간에 전환할 수 있습니다. 콘솔 전환을 처리하는 애플리케이션은 무엇이며 어떻게 처리합니까? 다른 모든 프로세스보다 먼저 키보드 입력을 읽어야 한다고 생각합니다. 아니면 장치 드라이버나 다른 커널 모듈에 의해 처리됩니까?

답변1

Linux 커널에는 터미널 에뮬레이터 프로그램이 내장되어 있습니다. 열린 파일 핸들이 있는 실행 중인 프로세스로 표시되지 않습니다. 이는 내부 커널 인터페이스를 사용하여 액세스하는 프레임 버퍼 및 입력 이벤트 하위 시스템 위에 위치합니다. 이는 일련의 애플리케이션 모드 시스템에 제공됩니다.커널 가상 터미널Devices /dev/tty1등 아래에는 /sys활성 KVT 번호와 일련의 CGA 스타일 비디오 버퍼링 장치 /dev/vcsa1등을 보여주는 더미 파일이 있습니다.

⎇ Alt일반적으로 +키 코드를 인식하는 것은 커널 터미널 에뮬레이터입니다 . 이 모든 작업은 전적으로 커널 모드 코드 내에서 수행됩니다. (커널 빌드 옵션을 사용하면 이 코드 없이 커널을 빌드할 수 있습니다.)FNCONFIG_VT

그러나 응용프로그램 소프트웨어는 이 기능을 비활성화할 수 있습니다. 예를 들어 Xorg 서버가 이를 수행합니다. 화면에서 활성화되어 있는 동안 대부분의 커널 터미널 에뮬레이터를 일시적으로 닫거나 연결을 끊습니다.그것은키 코드( ⎈ Control+ ⎇ Alt+ )를 사용하고 시스템 호출을 사용하여 프로그램 제어 하에서 활성 KVT를 전환합니다. 실제로 Xorg 서버는 커널에 내장된 터미널 에뮬레이터와 공유되는 프레임 버퍼 및 HID에 대한 독점 액세스를 협상하는 수단으로 KVT 스위칭을 사용합니다.FNioctl()

추가 읽기

답변2

systemd 기반 배포판(예: Enterprise Linux 7 및 8)에는 systemd-getty-generator가 있습니다. Lennart Poettering 블로그에서 이 솔루션에 대한 자세한 내용을 읽을 수 있습니다.http://0pointer.de/blog/projects/serial-console.html그리고 무료 데스크탑에서https://www.freedesktop.org/software/systemd/man/systemd-getty-generator.html.

간단한 테스트. 콘솔은 ctrl++ alt에서 시작됩니다 F2.

[root@SpaceStation ~]# systemctl list-units  | grep getty
  [email protected]                                                                       loaded active running   Getty on tty2
  system-getty.slice                                                                       loaded active active    system-getty.slice
  getty.target                                                                             loaded active active    Login Prompts

세 번째 콘솔( ctrl++ alt) 에 들어간 후 F3:

[root@SpaceStation ~]# systemctl list-units  | grep getty
  [email protected]                                                                       loaded active running   Getty on tty2
  [email protected]                                                                       loaded active running   Getty on tty3
  system-getty.slice                                                                       loaded active active    system-getty.slice
  getty.target    

생성된 서비스 파일은 다음과 같습니다.

cat /usr/lib/systemd/system/[email protected]
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target
After=rc-local.service

# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes

# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by [email protected], not this
# unit.
ConditionPathExists=/dev/tty0

[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

[Install]
WantedBy=getty.target
DefaultInstance=tty

가장 중요한 라인은 ExecStart=-/sbin/agetty --noclear %I $TERM터미널 시작을 담당합니다.

관련 정보