유용한 중요한 정보를 제외하고 커널이 부팅되면 다음과 같은 많은 디버깅 정보가 인쇄됩니다.
....
kernel: [0.00000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
kernel: [0.00000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
kernel: [0.00000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
...
kernel: [0.00000] MTRR variable ranges enabled:
kernel: [0.00000] 0 base 0000000000 mask 7E00000000 write-back
...
kernel: [0.00000] init_memory_mapping: [mem 0x00100000-0xcf414fff]
kernel: [0.00000] [mem 0x00100000-0x001fffff] page 4k
kernel: [0.00000] [mem 0x00200000-0xcf3fffff] page 2M
kernel: [0.00000] [mem 0xcf400000-0xcf414fff] page 4k
....
kernel: [0.00000] ACPI: XSDT 0xD8FEB088 0008C (v01 DELL CBX3 01072009 AMI 10013)
kernel: [0.00000] ACPI: FACP 0xD8FFC9F8 0010C (v05 DELL CBX3 01072009 AMI 10013)
....
kernel: [0.00000] Early memory node ranges
kernel: [0.00000] node 0: [mem 0x00001000-0x0009cfff]
kernel: [0.00000] node 0: [mem 0x00100000-0xcf414fff]
kernel: [0.00000] node 0: [mem 0xcf41c000-0xcfdfcfff]
....
kernel: [0.00000] ACPI: Local APIC address 0xfee00000
kernel: [0.00000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
kernel: [0.00000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)
그리고 훨씬 더.
커널 개발자 / 디버거 이외의 다른 사람에게 이것이 어떻게 유용한 지 알 수 없습니다.
loglevel=5
부팅 매개 변수 로 사용하여 이들을 제거 할 수 있음을 발견했습니다 . 디버깅 로그는 더 이상 터미널에 인쇄되지 않지만 여전히 dmesg
에 syslog
있습니다.
그것은 너무, 전 세계적으로 부팅 로그 상세를 감소하는 것이 가능 dmesg
하고 syslog
,이 쓸모없는 정보에 의해 침수되지 않습니까?
자체 컴파일 커널을 사용하고 있습니다 3.18
수용 솔루션
/etc/rsyslog.conf
나에게 문제 를 해결하기 위해 다음 줄을 넣는 것으로 나타났습니다 .
kern.debug /dev/null
& ~
답변
syslog의 경우 다음 행을 추가 할 수 있습니다 /etc/syslog.conf
.
kern.info; kern.debug /dev/null
커널 .info 및 .debug 메시지를 버립니다 (loglevel = 5로 버림)
또한 특정 로그 수준의 메시지를 표시 dmesg
하는 옵션과 함께 사용할 수 있습니다 -n
.
답변
일부 로그는 printk () 로 인쇄되어 해제 할 수 없습니다. 그리고 일부는 pr_debug ()에 의해 인쇄되며 커널 구성에 따라 꺼질 수 있습니다. pr_debug () 의 동작은 동적 디버그 기능에 의해 제어됩니다. 경우 CONFIG_DYNAMIC_DEBUG이 설정되어, 모든 pr_debug () 호출을 동적으로 할 수 있습니다 활성화 / 당 callsite 사용할 수 없습니다. 동적 디버그의 세부 사항은 여기에 있습니다 . 경우 CONFIG_DYNAMIC_DEBUG가 설정되지 않으며 DEBUG가 소스 파일에 정의되어, pr_debug ()가 같은 작품 의 printk () . 둘 다 정의되지 않은 경우 pr_debug 는 아무 작업도 수행하지 않습니다.
커널의 정의는 다음과 같습니다.
#include <linux/dynamic_debug.h>
/* If you are writing a driver, please use dev_dbg instead */
#if defined(CONFIG_DYNAMIC_DEBUG)
/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */
#define pr_debug(fmt, ...) \
dynamic_pr_debug(fmt, ##__VA_ARGS__)
#elif defined(DEBUG)
#define pr_debug(fmt, ...) \
printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
#define pr_debug(fmt, ...) \
no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#endif
따라서 커널 구성을 확인하고 이러한 로그의 출처를 찾으십시오. 그런 다음 비활성화하는 방법을 알게됩니다.
답변
loglevel
KCL에서 설정하는 것 외에도 kernel.printk
sysctl을 조정 하여 최대 수준이 원하는 것을 반영하고 부팅 전체에 지속되도록 할 수 있습니다 .
의견 에서이 추가 설명에 관해서 :
문제는 syslog와 dmesg에 쓸모없는 디버깅 로그가 넘쳐서 실제 경고와 오류를 간과하기 쉽다는 것입니다.
재부팅logrotate
후 파일을 방해하지 않기 위해 cron 작업을 사용 합니다 .
root ~ $ crontab -l
@reboot /usr/sbin/logrotate --force /root/rotate-boot-messages
@reboot /bin/dmesg -c
root ~ $ cat /root/rotate-boot-messages
"/var/log/dmesg" {
copytruncate
notifempty
missingok
dateext
}
"/var/log/syslog" {
copytruncate
notifempty
missingok
dateext
}
그런 다음 로그에 대한 디버그 데이터 덤프가 제한되어 새로 시작됩니다.