컴퓨터를 부팅하는 데 시간이 오래 걸립니다. 나는 이것이 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.cfg
GRUB의 디버깅 중복성을 줄이고 이러한 기능에 대해서만 디버그 메시지를 표시하려면 으로 이동하세요.
답변2
상상할 수 있듯이 GRUB와 Linux 간 전환에는 매우 복잡한 하위 수준 단계가 포함되므로 고급 추적이나 로깅을 위한 여지가 없습니다. 다행히도 이 코드에는 확장 일시 중지를 위한 공간이 없기 때문에 문제가 되지 않습니다. GRUB에서 모든 준비 단계를 설정하면 매우 상세한 추적을 얻을 수 있습니다.debug
환경 변수.
그러나 제어권이 Linux 커널로 이전된 후에 발생하는 지연이 발생할 가능성이 더 높습니다. 일반적으로 콘솔이 초기화될 때까지 로그 메시지가 표시되지 않습니다. 또한 지적하신 대로 타이밍 하위 시스템이 초기화될 때까지 모든 타임스탬프가 0이므로 나중에 타이밍을 계산할 수 없습니다.
다행스럽게도 부팅 옵션을 사용하면 earlyprintk
커널이 실제로 로그 메시지를 어딘가에 인쇄하도록 할 수 있으므로 이를 실시간으로 추적하고 지연이 발생하는 위치를 확인할 수 있습니다. earlyprintk
다양한 대상을 지정할 수 있지만 일반적인(물리적) 시스템과 가장 관련성이 높은 대상은 serial
, vga
(이전 콘솔) 또는 입니다 efi
. 커널이 적절한 구성 옵션으로 빌드되었는지 확인하십시오( CONFIG_EARLY_PRINTK*
).