Linux에서 dmesg 명령을 사용하는 방법

dmesg 명령어를 통해 리눅스 시스템의 부팅 과정을 깊숙이 들여다볼 수 있습니다. ‘오류 찾기의 친구’라고도 불리는 이 명령어는 커널의 자체 순환 버퍼에서 하드웨어 장치와 드라이버 메시지를 확인하고 추적하는 데 유용합니다.

리눅스 순환 버퍼의 작동 원리

리눅스와 유닉스 계열 컴퓨터에서 부팅과 시작은 전원 공급 시 발생하는 일련의 사건 중 서로 다른 두 단계로 구분됩니다.

부팅 과정은 BIOS 또는 UEFI, MBRGRUB을 거쳐 커널이 메모리에 로드되고 초기 램디스크(initrd 또는 initramfs)와 연결되는 지점까지 시스템 초기화를 수행합니다. 그 후 시스템이 시작됩니다.

시작 프로세스는 운영 체제 초기화를 마무리하는 역할을 합니다. 초기화 초기 단계에서는 시스템 로그 또는 rsyslogd와 같은 로깅 데몬이 아직 작동하지 않습니다. 이 초기화 단계에서 발생하는 중요한 오류 메시지나 경고를 놓치지 않기 위해 커널에는 메시지 저장소로 사용되는 순환 버퍼가 포함되어 있습니다.

순환 버퍼는 메시지 저장을 위해 할당된 고정된 크기의 메모리 영역입니다. 단순한 구조로 되어 있으며, 버퍼가 가득 차면 가장 오래된 메시지를 최신 메시지가 덮어쓰는 방식으로 작동합니다. 흔히 ‘원형 버퍼’라고도 불립니다.

커널 순환 버퍼는 장치 드라이버의 초기화 메시지, 하드웨어 메시지, 커널 모듈 메시지 등 다양한 정보를 저장합니다. 여기에는 낮은 수준의 부팅 메시지도 포함되어 있으므로 하드웨어 오류나 부팅 관련 문제 발생 시 조사하기에 매우 유용한 장소입니다. dmesg 명령어를 사용하면 이러한 정보를 쉽게 확인할 수 있습니다.

dmesg 명령어

dmesg 명령어를 사용하면 순환 버퍼에 저장된 메시지들을 검토할 수 있습니다. 기본적으로 dmesg 명령어는 sudo 권한을 필요로 합니다.

sudo dmesg

순환 버퍼에 저장된 모든 메시지는 터미널 창에 출력됩니다.

메시지가 너무 많으므로 ‘less’ 명령어를 사용하여 출력을 정리하는 것이 좋습니다.

sudo dmesg | less

이제 ‘less’에서 스크롤하여 필요한 정보를 찾을 수 있습니다.

‘less’ 내의 검색 기능을 사용하면 특정 용어나 항목을 찾아서 강조 표시할 수 있습니다. ‘less’에서 ‘/’ 키를 누르면 검색 기능이 활성화됩니다.

sudo 권한 제거

dmesg 명령어를 사용할 때마다 sudo를 사용하지 않으려면 다음 명령어를 사용할 수 있습니다. 다만 이 경우, 사용자 계정을 가진 누구든지 sudo 없이 dmesg를 사용할 수 있게 된다는 점에 유의해야 합니다.

sudo sysctl -w kernel.dmesg_restrict=0

색상 출력

기본적으로 dmesg 명령어는 색상 출력을 생성하도록 구성되어 있습니다. 만약 색상 출력이 되지 않는 경우 ‘-L’ (색상) 옵션을 사용하여 출력을 색상으로 표시하도록 할 수 있습니다.

sudo dmesg -L

dmesg 명령어가 항상 기본 색상으로 표시되도록 설정하려면 다음 명령어를 사용하세요.

sudo dmesg --color=always

가독성 있는 타임스탬프

기본적으로 dmesg 명령어는 커널 시작 이후 초 단위로 타임스탬프를 표시하고 나노초 단위까지 표시합니다. 이를 사람이 더 읽기 쉬운 형식으로 바꾸려면 ‘-H’ (인간) 옵션을 사용하십시오.

sudo dmesg -H

이 옵션을 사용하면 다음 두 가지 변화가 있습니다.

출력 양이 줄어들고, 타임스탬프는 날짜와 시간을 분 단위로 표시합니다. 각 분 내에 발생한 메시지는 해당 분 시작 이후의 초 및 나노초로 표시됩니다.

더욱 가독성 높은 타임스탬프

나노초 단위의 정확도가 필요하지 않으면서 기본값보다 더 읽기 쉬운 타임스탬프를 원한다면 ‘-T’ (가독성) 옵션을 사용하십시오. ‘-H’ 옵션도 “사람이 읽을 수 있는” 옵션인데 반해 ‘-T’ 옵션은 “더욱 사람이 읽기 쉬운” 옵션인 점이 다소 혼란스러울 수 있습니다.

sudo dmesg -T

타임스탬프는 표준 날짜 및 시간 형식으로 표시되지만 분 단위 해상도로 낮아집니다.

1분 이내에 발생한 모든 이벤트는 동일한 타임스탬프를 갖습니다. 만약 일련의 사건을 확인하는 것이 목적이라면 이 옵션으로 충분할 수 있습니다. 또한, 이 옵션은 출력을 줄여주지 않는다는 점도 유의해야 합니다.

실시간 이벤트 보기

커널 순환 버퍼에 새로 추가되는 메시지를 실시간으로 확인하려면 ‘–follow’ (메시지 추적) 옵션을 사용하십시오. 순환 버퍼가 부팅 시퀀스 동안 발생하는 이벤트를 기록하는 데 사용된다면, 컴퓨터가 작동 중일 때 실시간 메시지가 순환 버퍼에 어떻게 추가될 수 있을까요?

컴퓨터에 연결된 하드웨어를 변경하면 메시지가 커널 순환 버퍼로 전송됩니다. 커널 모듈을 업데이트하거나 추가하면 해당 변경 사항에 대한 메시지가 순환 버퍼에 나타납니다. USB 드라이브를 연결하거나 Bluetooth 장치를 연결/해제하면 dmesg 출력에 해당 메시지가 표시됩니다. 가상 하드웨어도 순환 버퍼에 새로운 메시지를 생성합니다. 가상 머신을 실행하면 순환 버퍼에 새로운 정보가 도착하는 것을 확인할 수 있습니다.

sudo dmesg --follow

명령 프롬프트로 다시 돌아가지 않고 새로운 메시지가 나타나면 터미널 창 하단에 dmesg에 의해 표시됩니다.

CD-ROM 디스크의 내용을 디렉터리 트리에 마운트하는 것과 같은 동작도 커널에게는 변경으로 인식되어 dmesg 출력이 생성됩니다.

실시간 피드를 종료하려면 Ctrl+C를 누르세요.

최근 메시지 확인

tail 명령어를 사용하여 커널 순환 버퍼 메시지의 마지막 10개를 확인할 수 있습니다. 물론, 원하는 메시지 수를 설정할 수 있습니다. 10은 단지 예시일 뿐입니다.

sudo dmesg | tail -10

최근 10개의 메시지가 검색되어 터미널 창에 표시됩니다.

특정 용어 검색

dmesg의 출력 결과를 grep 명령어를 통해 특정 문자열이나 패턴을 검색할 수 있습니다. 여기서 ‘-i’ (대소문자 무시) 옵션을 사용하면 검색 시 대소문자를 구분하지 않습니다. 예를 들어, “usb”를 검색할 때 “USB”와 같은 대소문자 조합도 모두 검색 결과에 포함됩니다.

sudo dmesg | grep -i usb

검색된 결과는 대문자와 소문자를 모두 포함합니다.

첫 번째 메시지는 시스템의 하드 디스크인 SCSI 장치 sda에 대한 내용을 포함하고 있습니다. 참고로, sda는 오늘날 최초의 SATA 하드 드라이브 또는 USB 드라이브를 의미합니다.

sudo dmesg | grep -i sda

sda를 언급하는 모든 메시지가 검색되어 터미널 창에 출력됩니다.

grep이 한 번에 여러 용어를 검색하도록 하려면 ‘-E’ (정규 표현식 확장) 옵션을 사용하고, 검색어를 인용 부호 안에 넣고 검색어 사이를 “|” 파이프로 구분해야 합니다.

sudo dmesg | grep -E "memory|tty|dma"

검색어를 언급하는 모든 메시지가 터미널 창에 출력됩니다.

로그 수준 활용

커널 순환 버퍼에 기록되는 모든 메시지에는 레벨이 첨부됩니다. 이 레벨은 메시지가 나타내는 정보의 중요도를 나타냅니다. 레벨은 다음과 같습니다.

비상: 시스템을 사용할 수 없는 상태.
경고: 즉시 조치가 필요한 상태.
치명: 심각한 문제.
오류: 오류 발생.
경고: 경고 발생.
주의: 정상적인 상태이나 중요함.
정보: 정보 제공.
디버그: 디버깅 메시지.

‘-l’ (레벨) 옵션을 사용하고 원하는 레벨 이름을 명령행 인수로 전달하여 dmesg가 특정 레벨과 일치하는 메시지를 추출하도록 할 수 있습니다. 예를 들어 ‘정보’ 레벨의 메시지만 확인하고 싶다면 다음 명령어를 사용하십시오.

sudo dmesg -l info

표시된 모든 메시지는 ‘정보’ 레벨 메시지입니다. 여기에는 오류나 경고가 포함되지 않고 유용한 알림만 포함됩니다.

여러 로그 레벨의 메시지를 함께 검색하려면, 다음 명령어와 같이 여러 로그 레벨을 쉼표로 구분하여 지정하면 됩니다.

sudo dmesg -l debug,notice

dmesg의 출력 결과는 각각의 로그 레벨에 따른 메시지가 혼합된 형태로 표시됩니다.

시설 카테고리

dmesg 메시지는 ‘시설’이라는 범주로 그룹화되어 있습니다. 시설 목록은 다음과 같습니다.

kern: 커널 메시지.
user: 사용자 레벨 메시지.
mail: 메일 시스템.
daemon: 시스템 데몬.
auth: 보안/인증 메시지.
syslog: 내부 syslogd 메시지.
lpr: 라인 프린터 하위 시스템.
news: 네트워크 뉴스 하위 시스템.

dmesg에 특정 시설의 메시지만 표시하도록 요청할 수 있습니다. 이를 위해서는 ‘-f’ (시설) 옵션을 사용해야 합니다.

sudo dmesg -f daemon

dmesg 명령어는 터미널 창에 데몬과 관련된 모든 메시지를 출력합니다.

로그 레벨에서 했던 것처럼 dmesg에 여러 시설의 메시지를 동시에 표시하도록 요청할 수 있습니다.

sudo dmesg -f syslog, daemon

출력 결과는 syslog와 데몬 로그 메시지가 혼합된 형태입니다.

시설과 레벨 결합

‘-x’ (디코드) 옵션을 사용하면 dmesg가 각 줄의 접두사로 시설과 레벨을 사람이 읽기 쉬운 형식으로 표시합니다.

sudo dmesg -x

각 줄의 시작 부분에서 시설과 레벨을 확인할 수 있습니다.

첫 번째 강조 표시된 부분은