Linux 6.18 계열 문서 기준

printk, 콘솔, 사용자 로그를 구분합니다

로그가 저장되는 곳과 화면에 출력되는 조건, 디버깅 이력을 확인합니다.

printk는 사용자 공간 libc의 printf가 아닙니다

커널 로그의 두 가지 처리
  1. 커널 코드의 printk/pr_*커널 로그 버퍼에 메시지를 기록합니다.
  2. 로그 조회dmesg나 로그 수집기가 메시지를 읽습니다.
  3. 콘솔 출력레벨·콘솔 구현·설정에 따라 화면이나 직렬 포트로 출력됩니다.

로그 기록 뒤의 조회와 콘솔 출력은 구분되는 경로입니다. 콘솔에 안 보인다고 로그 버퍼에도 없다는 뜻은 아닙니다.

사용자 프로그램의 printf는 libc와 파일 디스크립터를 사용합니다. libc에서 사용자 fault가 났다는 로그를 printk가 libc를 사용한다는 근거로 삼으면 안 됩니다. getty의 로그인 프롬프트, 셸 출력, 커널 콘솔도 서로 다른 출력 주체입니다.

레벨을 바꾸기 전에 현재 상태를 읽습니다

cat /proc/sys/kernel/printk
dmesg --level=err,warn
cat /proc/sys/kernel/tainted

printk 파일의 네 값은 현재 콘솔 레벨, 기본 메시지 레벨, 최소 콘솔 레벨, 기본 콘솔 레벨입니다. 낮은 숫자가 더 높은 우선순위입니다. 콘솔 레벨을 낮추는 것은 표시 범위를 줄이는 것이며 IRQ 오류나 I2C 통신 문제를 고치는 동작이 아닙니다. 권한 때문에 dmesg를 읽지 못할 수도 있습니다.

로그를 많이 찍으면 포맷 처리와 버퍼 기록, 느린 콘솔 출력 때문에 측정 자체가 달라질 수 있습니다. 출력 비용과 실행 문맥은 커널 버전·콘솔 구현·PREEMPT_RT 등에 따라 달라집니다. 모든 printk가 같은 방식으로 즉시 직렬 포트를 기다린다고 단정하지 않습니다.

필요한 위치를 골라 관찰합니다

지원되는 빌드에서는 dynamic debug로 특정 파일·함수의 디버그 메시지를 선택할 수 있습니다. pr_debug가 보이지 않는다고 모든 파일에 DEBUG를 정의해야 하는 것은 아닙니다. 반복 오류에는 ratelimit 계열을, 시간 순서 조사에는 적절한 tracepoint를 검토합니다.

__func__는 표준 C의 현재 함수명입니다. GNU __FUNCTION__도 존재하므로 printk에서 사용 불가능하다고 설명하면 틀립니다. 커널의 %pS는 주소를 심벌로 출력하는 형식이며 디버그 정보와 설정에 따라 보이는 내용이 달라집니다. 주소를 일반 문자열 포인터로 %s에 넘기지 않습니다.

taint는 문제 조사에 필요한 이력입니다

taint는 외부 모듈, 독점 라이선스 모듈, 경고, 강제 로드 등 여러 상태를 비트로 기록합니다. 0이 아니라고 모두 같은 문제를 뜻하지 않습니다. 원인이 된 모듈을 제거해도 이미 생긴 taint가 자동으로 사라지는 것은 아닙니다.

장애를 조사할 때는 해당 커널 버전, taint 해석, 문제 직전 로그, 재현 조건을 함께 남깁니다. 부팅 시간도 전체 시간 하나보다 어느 구간이 길어졌는지 나누어 측정해야 합니다. 콘솔을 끄거나 CPU 클록을 높여 결과만 바꾸기 전에 지연 위치를 확인합니다.

확인한 문서

Linux 6.18 계열 문서 기준