
리눅스 Device Tree status 기준 정리
Device Tree에서 status 속성은 노드가 현재 사용 가능한지, 비활성 상태인지, 다른 소프트웨어가 점유 중인지 같은 운영 상태를 나타낸다. 2026년 5월 24일 기준 Devicetree Specification과 Linux 커널 문서를 보면, 이 속성은 단순 메모가 아니라 커널이 노드를 건너뛸지 판단하는 기준으로 직접 연결된다.
실무에서 가장 자주 헷갈리는 부분은 세 가지다. status를 생략하면 어떻게 되는지, "disabled"와 "reserved"는 무엇이 다른지, 그리고 커널이 실제로 어떤 값을 특별하게 해석하는지다. 이 글은 공식 명세와 커널 문서만 기준으로 그 차이를 정리한다.
status 속성은 정확히 무엇을 뜻할까?
Devicetree Specification은 status를 디바이스의 operational status를 나타내는 문자열 속성으로 정의한다. 명세에 나오는 대표 값은 "okay", "disabled", "reserved", "fail", "fail-sss"다. 각 값은 단순 on/off가 아니라 왜 현재 사용할 수 없는지까지 구분하는 의미를 가진다.
"okay": 장치가 동작 가능한 상태다."disabled": 현재는 동작하지 않지만 나중에 동작 가능해질 수 있는 상태다."reserved": 장치는 동작 중이지만 다른 소프트웨어가 제어하므로 사용하면 안 되는 상태다."fail","fail-sss": 장치가 비정상 상태이며 수리 없이는 복구되기 어렵다는 뜻이다.
status를 아예 안 쓰면 어떻게 될까?
Linux 커널의 DTS coding style 문서는 status의 기본값이 "okay"라고 설명한다. 그래서 별도 제약을 표시할 필요가 없는 노드라면 이 속성을 생략할 수 있다. 같은 문서가 속성 정렬 순서에서 status를 마지막 쪽에 두라고 안내하는 이유도, 이 값이 추가적인 상태 주석에 가깝기 때문이다.
즉 보드 DTS에서 장치를 기본 활성 상태로 둘 생각이라면 굳이 status = "okay";를 반복해서 적지 않아도 된다. 반대로 SoC dtsi에서 공통 블록을 기본 비활성으로 두고, 보드 DTS에서 필요한 장치만 켜는 패턴에서는 "disabled"와 오버라이드가 자주 등장한다.
커널은 status를 실제로 어떻게 해석할까?
Linux 커널의 DeviceTree Kernel API 문서는 of_device_is_available()가 status가 없거나 값이 "okay" 또는 "ok"면 참을 반환한다고 설명한다. 이 말은 커널 코드가 노드 활성 여부를 볼 때 명세의 모든 상태 문자열을 동일하게 다루는 것이 아니라, 실제 사용 가능 여부를 좁게 판정한다는 뜻이다.
같은 문서에는 disabled 노드를 자동으로 건너뛰는 순회 함수와, CPU 노드에서 "fail"이나 "fail-..." 상태를 건너뛰는 함수 설명도 있다. 따라서 status는 문서상 의미 정의와 커널 내부의 사용 경로를 함께 봐야 오해가 줄어든다.
disabled와 reserved는 무엇이 다를까?
명세 기준으로 "disabled"는 현재는 동작하지 않지만 미래에는 활성화될 수 있는 상태다. 예를 들어 보드에서 부품이 실장되지 않았거나, 스위치나 설정에 따라 나중에 활성화될 수 있는 장치가 여기에 가깝다.
반면 "reserved"는 장치가 동작 중이지만 현재 소프트웨어가 사용하면 안 되는 상태다. 명세는 플랫폼 펌웨어 같은 다른 소프트웨어 컴포넌트가 제어하는 경우를 예로 든다. 따라서 둘 다 커널 입장에서는 "지금 내 것이 아님"처럼 보일 수 있어도, 이유는 전혀 다르다.
실무에서는 언제 disabled를 많이 쓸까?
공통 SoC 설명 파일인 dtsi에서 주변장치를 기본 "disabled"로 두고, 실제 배선된 보드 DTS에서만 "okay"로 바꾸는 패턴이 흔하다. 이 방식은 같은 SoC를 여러 보드가 공유할 때 보드별 실장 차이를 표현하기 쉽다.
uart0: serial@12340000 {
compatible = "vendor,soc-uart";
reg = <0x12340000 0x1000>;
status = "disabled";
};
이후 특정 보드 DTS에서 해당 노드를 참조해 status = "okay";로 덮어쓰면, 공통 정의와 보드별 활성화 기준이 분리된다. 이 예시는 일반적인 DTS 구성 패턴 설명용이며, 장치별 필수 속성은 각 바인딩 문서를 따로 확인해야 한다.
reserved나 fail은 아무 노드에나 써도 될까?
명세는 값을 정의하지만, 실제 운영 의미는 디바이스 바인딩과 커널 사용 경로를 같이 봐야 한다. 특히 "reserved"는 단순히 "아직 안 쓴다"의 뜻으로 남용하기보다, 정말 다른 소프트웨어가 제어 중인 리소스인지가 분명할 때 쓰는 편이 문서 의미와 맞다.
"fail" 계열도 마찬가지다. 명세는 심각한 오류가 감지된 상태라고 정의하지만, 모든 일반 장치 노드에서 이 상태가 동일한 운영 효과를 내는 것은 아니다. 커널 문서상 CPU 순회에서는 "fail"과 "fail-..."를 특별히 건너뛰는 설명이 확인된다.
status를 쓸 때 바로 확인할 기준은 무엇일까?
- 기본 활성 장치라면 속성을 생략해도 되는지 먼저 본다.
- 보드 미실장이나 선택적 사용 장치라면
"disabled"가 더 맞는지 본다. - 펌웨어나 다른 실행 환경이 점유 중인 장치라면
"reserved"의미가 맞는지 본다. - 커널 코드가 해당 노드를
of_device_is_available()같은 경로로 검사하는지 확인한다. - 장치별 세부 의미가 바인딩 문서에 추가로 정의돼 있는지 같이 본다.
FAQ
Q. status에 "ok"를 써도 되나?
Linux 커널 API 문서는 of_device_is_available()가 "okay"와 "ok"를 모두 사용 가능으로 본다고 설명한다. 다만 Devicetree Specification의 표준 값 표기는 "okay"이므로, 명세 기준 문서화와 가독성을 생각하면 "okay"를 쓰는 편이 더 일관적이다.
Q. status가 없으면 disabled로 해석되나?
그렇지 않다. Linux 커널 문서 기준으로 status가 없으면 사용 가능으로 본다. DTS coding style 문서도 기본값이 "okay"라고 설명한다.
Q. reserved는 disabled의 다른 표현인가?
같지 않다. "disabled"는 현재 비활성이지만 미래에는 사용할 수 있는 상태이고, "reserved"는 장치가 동작 중이지만 다른 소프트웨어 제어 아래 있으므로 사용하지 말아야 하는 상태다.
정리
Device Tree status를 볼 때 핵심은 "기본값은 활성", "비활성 이유는 값마다 다름", "커널은 사용 가능 여부를 별도 규칙으로 판정" 이 세 가지다. 그래서 단순히 켜고 끄는 플래그처럼 보지 말고, 명세 의미와 커널 소비 방식을 함께 봐야 한다.
보드 포팅이나 드라이버 디버깅에서는 특히 "disabled"를 기본값으로 둔 공통 dtsi와, 보드 DTS에서의 활성화 오버라이드를 먼저 확인하는 편이 빠르다. 반대로 "reserved"나 "fail"은 문서상 의미가 더 강하므로, 이유가 분명할 때만 쓰는 편이 안전하다.
참고 자료
'프로그래밍 > 리눅스 커널' 카테고리의 다른 글
| 리눅스 Device Tree aliases 기준 정리 (0) | 2026.07.06 |
|---|---|
| 리눅스 Device Tree label과 overlay 기준 정리 (0) | 2026.05.25 |
| 리눅스 Device Tree compatible는 어떻게 써야 할까? 순서와 작성 기준 정리 (0) | 2026.05.18 |
| cron과 systemd timer는 무엇이 다를까? 리눅스 작업 스케줄링 선택 기준 정리 (0) | 2026.05.09 |
| I2S의 bclk, lrclk 출력 시점 (0) | 2024.12.22 |





