커널 로깅이 시작되기 전에 grub에서 부팅 성능 문제 디버깅

커널 로깅이 시작되기 전에 grub에서 부팅 성능 문제 디버깅

컴퓨터를 부팅하는 데 시간이 오래 걸립니다. 나는 이것이 grub 이후 커널 로깅이 시작되기 전의 지연으로 인해 발생했다고 믿을 만한 이유가 있습니다(부팅하는 데 30초가 걸리지만 dmesg메시지의 타임스탬프는 0.00000- 사이 입니다 9.34223. 자세한 내용은 참조).이 게시물).

무슨 일이 일어나고 있는지 디버깅할 수 있는 방법이 있나요? 특히:

  • grub 자체를 더 장황하게 만들거나 로그를 유지하는 방법이 있습니까?
  • grub과 커널 로깅 사이에 시간이 걸릴 수 있는 다른 프로세스가 있습니까? 이를 어떻게 디버깅합니까?

이 문제는 내 설정에만 국한된 문제가 아닌 것 같습니다. 하지만 만약을 대비해 저는 Ubuntu 16.10과 grub(2)을 실행하고 있습니다.

편집하다:

@TooTea의 제안에 따라 환경 변수를 설정했는데 문제가 되지 않는 debug=all많은 메시지가 생성되었습니다 . script/script.c:50 malloc 0x7a9a2ca0그런 다음 8초 지연 지연과 일치하는 메시지 세트가 있습니다.

kern/dl.c:56 Detecting ext2... 
lib/relocator.c:1397 chunks = 0x7a7e0ae0
lib/relocator.c:434 trying to allocate in ...-... aligned ... size ...
lib/relocator.c:1198 allocated: ...+...
lib/relocator.c:1409 allocated .../...
lib/relocator.c:1410  chunks = 0x7a7e0ae0

답변1

이것은 확실히 내 질문에 대한 완전한 대답은 아니지만 유사한 문제를 조사하는 동안 여기에 온 다른 사람들에게 유용할 수 있습니다.

GRUB 매뉴얼에서는 debug환경 변수 또는 debug=all시설 이름과 함께 쉼표/공백 목록을 사용할 것을 권장합니다. 그런 다음 다음과 같이 말합니다.

자세한 내용은 소스를 참조하세요.

온라인에서 잠재적인 목록을 찾을 수 없습니다. 따라서 나중에 참조할 수 있도록 현재 github 저장소 coreos/grub에서 이러한 이름 목록을 가져왔습니다. 이 이름이 앞으로 나와 다른 사람들에게 유용할 수 있기를 바랍니다. 물론 소스에 대한 추가 조사 없이는 제한적으로 사용되지만 여전히 좋은 출발점이 될 수 있습니다.

name                frequency in source
acpi                |||||
affs                |
ahci                ||
appleload           |
arcdisk             ||
archelp             ||
ata                 ||
atkeyb              ||
biosdisk            ||
bsd                 ||||
btrfs               ||
cache               ||
cbfs                |
chain               |||
crypt               ||
cryptodisk          ||
datetime            |
devalias            ||
disk                |||||
diskfilter          ||
dl                  ||||||||
dns                 ||
drivemap            ||
efi                 ||
efidisk             ||
efiemu              ||||||||||||||
ehci                ||
elf                 ||
exfat               |
expand              ||
fat                 |
fb                  ||
fdt                 |
fixvideo            ||
font                ||
fs                  ||
geli                ||
gpt                 ||||
hostdisk            |||||
init                |||||
jpeg                |
keystatus           ||
lexer               |
linux               |||||||||||||
loader              |||||||
luks                ||
memdisk             ||
mm                  ||
mmap                |||||
modules             ||
multiboot_loader    |||||
nativedisk          ||
net                 ||||||||||
ohci                ||
partition           ||||||
pata                ||
play                ||
reiserfs_tree       ||
relocator           |||
scripting           ||
scsi                ||
serial              ||
smbios              ||
syslinux            ||
tftp                ||
tga                 ||
ubootdisk           ||
uhci                ||
usb                 ||||||
usb_keyboard        ||
usbms               ||
video               |||||||
xen                 |||||||||
xen_loader          ||
xfs                 ||
xnu                 ||||||
zfs                 |||||

예를 들어 다음과 같이 쓸 수 있습니다.

set debug=linux,video,fs

/boot/grub/grub.cfgGRUB의 디버깅 중복성을 줄이고 이러한 기능에 대해서만 디버그 메시지를 표시하려면 으로 이동하세요.

답변2

상상할 수 있듯이 GRUB와 Linux 간 전환에는 매우 복잡한 하위 수준 단계가 포함되므로 고급 추적이나 로깅을 위한 여지가 없습니다. 다행히도 이 코드에는 확장 일시 중지를 위한 공간이 없기 때문에 문제가 되지 않습니다. GRUB에서 모든 준비 단계를 설정하면 매우 상세한 추적을 얻을 수 있습니다.debug환경 변수.

그러나 제어권이 Linux 커널로 이전된 후에 발생하는 지연이 발생할 가능성이 더 높습니다. 일반적으로 콘솔이 초기화될 때까지 로그 메시지가 표시되지 않습니다. 또한 지적하신 대로 타이밍 하위 시스템이 초기화될 때까지 모든 타임스탬프가 0이므로 나중에 타이밍을 계산할 수 없습니다.

다행스럽게도 부팅 옵션을 사용하면 earlyprintk커널이 실제로 로그 메시지를 어딘가에 인쇄하도록 할 수 있으므로 이를 실시간으로 추적하고 지연이 발생하는 위치를 확인할 수 있습니다. earlyprintk다양한 대상을 지정할 수 있지만 일반적인(물리적) 시스템과 가장 관련성이 높은 대상은 serial, vga(이전 콘솔) 또는 입니다 efi. 커널이 적절한 구성 옵션으로 빌드되었는지 확인하십시오( CONFIG_EARLY_PRINTK*).

관련 정보