저는 Linux 장치 드라이버를 통해 Linux 커널 개발을 독학하려고 노력 중이며 현재 디버깅에 관한 장을 읽고 있습니다. 내가 읽은 모든 것에서 printk() 메시지는 "콘솔"로 전송되어야 하며, 내가 아는 한 콘솔은 일반적으로 "/dev/console" 장치로 표시됩니다.
문제는 xconsole 유틸리티를 사용하여 /dev/console을 모니터링할 때 pritnk 문을 표시할 수 없다는 것입니다. 내 메시지는 syslog에 표시되며 dmesg를 사용하면 내 메시지를 볼 수 있습니다. 그래서 나는 실용적인 목적으로 이것을 묻는 것이 아니라 Linux 시스템에 대한 나의 이해의 격차를 메우기 위해 이것을 묻는 것입니다.
필터링되지 않도록 printk 메시지를 가장 높은 로그 수준(KERNEL_EMERG)으로 설정했습니다. "콘솔 로깅 활성화"라는 기능을 사용했지만 dmesg -E
효과가 없었습니다.
저는 사용자 정의 커널 5.4.55로 Kubuntu 20을 실행하고 있습니다. 커널 디버깅 구성 옵션을 활성화합니다. 이것은 내 /proc/cmdline 파일입니다.
BOOT_IMAGE=/boot/vmlinuz-5.4.55 root=UUID=3978ed71-51b0-4505-83b9-58401946ed0f ro console=tty0 vt.handoff=7
이것은 내 /proc/sys/kernel/printk입니다:
4 4 1 7
이것은 내 커널 구성입니다.
당신의 도움을 주셔서 감사합니다
편집하다
@ user433151의 답변 외에도 시작 중에 콘솔이 명시적으로 설정된 경우에도 printk() 메시지가 현재 활성 가상 터미널에만 나타나는 것으로 나타났습니다. 예를 들어, console=tty2
boot를 사용하는 것만으로도 /dev/console이 tty2를 "가리키는" 사실에 영향을 미치는 것처럼 보이지만 tty2를 커널 메시지의 "대상" 콘솔로 만들지는 않습니다. 커널 메시지의 기본 "대상" 콘솔은 항상 tty0인 것으로 나타나므로 printk 메시지가 tty2에 나타나도록 하려면 printk 메시지가 기록될 때 tty2가 현재 활성화된 가상 터미널이어야 합니다. 내 혼란의 일부는 내 모듈을 tty1에서 실행한 다음 tty2로 전환하여 내 printk 문이 나타나지 않는다는 사실에서 비롯됩니다. 내 해결책은 tty2에서 모듈을 시작하거나 ioctl(TIOCL_SETKMSGREDIRECT)을 사용하여 메시지를 리디렉션하는 것입니다.
답변1
xconsole
(1)유저모드 프로그램으로 작성한 내용만 얻을 수 있지만 /dev/console
,아니요터미널에 기록된 모든 커널 메시지 /dev/console
는 다음과 같습니다.유형별칭(2).
printk 커널 메시지는 다음으로만 보낼 수 있습니다.
리눅스가상 터미널좋아요
/dev/tty0
(그러나아니요임의의 의사 터미널 또는 터미널 에뮬레이터로)(삼). "가상 터미널"은 Linux를 실행하는 PC에서 Ctrl-Alt-Fx를 사용하여 전환할 수 있는 "검은색" 비 GUI 터미널입니다.예를 들어 직렬 콘솔
/dev/ttyS0
(그러나아니요직렬 USB 콘솔 또는 이와 유사한 장치에 연결).시스템 로거(rsyslog이든 일부 시스템이든) 또는 dmesg와 같은 프로그램에서 선택한 dmesg 버퍼.
(1) xconsole
의사 터미널을 생성하고 ioctl(TIOCCONS)
사용자 영역 쓰기를 해당 터미널로 리디렉션하는 방식 으로 작동합니다 /dev/console
.
(2)Linux에는 어떤 터미널이 어떤 터미널을 참조하는지 알아낼 수 있는 인터페이스가 없습니다 /dev/console
. 해당 정보를 얻을 수 있는 유일한 방법은 커널을 라이브 디버그하는 것입니다.
(삼) /dev/tty0
현재 "포커스된" 가상 터미널의 별칭입니다. 리디렉션 커널 메시지를 다른 가상 터미널로 사용할 수 있습니다 ioctl(TIOCL_SETKMSGREDIRECT)
.