성공 사례:

성공 사례:

요약: Crashkernel은 RAM의 주소 512MB에서 시작 kexec -e/-l하지만 그렇지 않습니다 kexec -p. 이유는 무엇입니까?

Marvell Armada XP(MV78460)(4코어 ARMv7) 및 1GB RAM을 사용하는 임베디드 플랫폼입니다.

  • 프로덕션 커널: 맞춤형 Linux 3.4.91
  • 구조 커널: clean kernel.org-Linux(4.2.3)(장치 트리를 사용한다는 것을 알고 있지만 zImage에 DTB를 추가하면 제대로 작동합니다)
  • 사용자 공간에서는 최신 kexec-tools(2.0.10)을 사용하고 있습니다.

    내역: kexec -l3.4.91 커널과 --atags) 및 의 램디스크 및 명령줄 인수를 사용하면 복구 커널이 제대로 부팅되고 및 를 통해 설정된 내용 kexec -e에 관계없이 ( 에 따라) RAM의 시작 부분에 배치되는 것처럼 보입니다 . /proc/iomemRAM 공간을 예약하기 위해 부팅 옵션을 사용할 때 높은 메모리 주소를 사용해야 합니다. 그렇지 않으면 요청한 영역이 이미 사용 중이라는 메시지가 나타납니다. 그래서 우리는 설정했습니다. 커널에서는 사용되지 않습니다.--mem-min--mem-maxcrashkernelcrashkernel=128M@512Mkexec -p

    CONFIG_AUTO_ZRELADDR=y현재 상태: 재배치 가능한 커널( )은 상위 128MB 내에 있어야 하는 것으로 알고 있는데 이는 우리에게는 불가능합니다. 그래서 저는 표준 커널 구성을 중심으로 작업 CONFIG_ARM_PATCH_PHYS_VIRT하고 no. 내가 설정한 머신에 하나를 추가해야 합니다. 이제 커널을 정상적으로 사용하고 부팅할 수 있습니다. 크기가 512MB인 것을 알 수 있습니다. 그러나 이를 구성하고 패닉을 일으키면 콘솔은 말을 하고 영원히 침묵을 유지할 것입니다.CONFIG_PHYS_OFFSET0x20000000Makefile.bootzreladdr-y := 0x20008000, params_phys-y := 0x20000100, initrd_phys-y := 0x20800000kexec -lkexec -e--mem-min-pLoading crashdump kernel... Bye!

    모든 파일과 모든 것은 RAM에만 있습니다.

    내가 무엇을 잘못할 수 있었나요? (좋은 상황에서도) 압축 해제 오류를 걱정해야 합니까?

    From dmesg:
    Reserving 128MB of memory at 512MB for crashkernel (System RAM: 760MB)
    
    root@host:~# cat /proc/iomem
    00000000-3bff9fff : System RAM
      00008000-00724f43 : Kernel code
      0076e000-0087553f : Kernel data
      20000000-27ffffff : Crash kernel
    (some RAM at the end is reserved for persistent storage, that's why it doesn't add up to 1GB)
    

    성공 사례:

    root@host:~# kexec -l -t zImage --command-line="console=ttyS0,38400 earlyprintk=ttyS0 root=/dev/ram rdinit=/sbin/init rw irqpoll maxcpus=1 reset_devices" --atags --initrd=./initramfs.cpio.gz -d --mem-min=0x20000000 --mem-max=0x28000000 ./zImage_fixed_addr
    Try gzip decompression.
    Try LZMA decompression.
    lzma_decompress_file: read on ./zImage_fixed_addr of 65536 bytes failed
    kernel: 0xb6c06008 kernel_size: 0x3db659
    kexec_load: entry = 0x20008000 flags = 0x280000
    nr_segments = 3
    segment[0].buf   = 0x40e98
    segment[0].bufsz = 0x3f0
    segment[0].mem   = 0x20001000
    segment[0].memsz = 0x1000
    segment[1].buf   = 0xb6c06008
    segment[1].bufsz = 0x3db659
    segment[1].mem   = 0x20008000
    segment[1].memsz = 0x3dc000
    segment[2].buf   = 0xb5ade008
    segment[2].bufsz = 0x1127516
    segment[2].mem   = 0x20f6e000
    segment[2].memsz = 0x1128000
    root@host:~# kexec -e
    Starting new kernel
    Booting Linux on physical CPU 0x0
    ...
    

    부팅 후:

    root@vanilla:~# cat /proc/iomem
    20000000-3fffffff : System RAM
      20008000-206dd237 : Kernel code
      20720000-2078f54f : Kernel data
    

    실패한 사례:

    root@host:~# kexec -p -t zImage --command-line="console=ttyS0,38400 earlyprintk=ttyS0 root=/dev/ram rdinit=/sbin/init rw irqpoll maxcpus=1 reset_devices" --atags --initrd=./initramfs.cpio.gz -d ./zImage_fixed_addr
    Try gzip decompression
    Try LZMA decompression.
    lzma_decompress_file: read on ./zImage_fixed_addr of 65536 bytes failed
    kernel: 0xb6b69008 kernel_size: 0x3db659
    phys_offset: 0
    kernel symbol _stext vaddr =         c0008240
    page_offset is set to c0000000
    get_crash_notes_per_cpu: crash_notes addr = 10f525c, size = 1024
    Elf header: p_type = 4, p_offset = 0x10f525c p_paddr = 0x10f525c p_vaddr = 0x0 p_filesz = 0x400 p_memsz = 0x400
    get_crash_notes_per_cpu: crash_notes addr = 10ff25c, size = 1024
    Elf header: p_type = 4, p_offset = 0x10ff25c p_paddr = 0x10ff25c p_vaddr = 0x0 p_filesz = 0x400 p_memsz = 0x400
    get_crash_notes_per_cpu: crash_notes addr = 110925c, size = 1024
    Elf header: p_type = 4, p_offset = 0x110925c p_paddr = 0x110925c p_vaddr = 0x0 p_filesz = 0x400 p_memsz = 0x400
    get_crash_notes_per_cpu: crash_notes addr = 111325c, size = 1024
    Elf header: p_type = 4, p_offset = 0x111325c p_paddr = 0x111325c p_vaddr = 0x0 p_filesz = 0x400 p_memsz = 0x400
    vmcoreinfo header: p_type = 4, p_offset = 0x7f1330 p_paddr = 0x7f1330 p_vaddr = 0x0 p_filesz = 0x1000 p_memsz = 0x1000
    Elf header: p_type = 1, p_offset = 0x0 p_paddr = 0x0 p_vaddr = 0xc0000000 p_filesz = 0x20000000 p_memsz = 0x20000000
    Elf header: p_type = 1, p_offset = 0x28000000 p_paddr = 0x28000000 p_vaddr = 0xe8000000 p_filesz = 0x13ffa000 p_memsz = 0x13ffa000
    elfcorehdr: 0x27f00000
    crashkernel: [0x20000000 - 0x27ffffff] (128M)
    memory range: [0 - 0x1fffffff] (512M)
    memory range: [0x28000000 - 0x3bff9fff] (319M)
    kernel command line: "console=ttyS0,38400 earlyprintk=ttyS0 root=/dev/ram rdinit=/sbin/init rw irqpoll maxcpus=1 reset_devices elfcorehdr=0x27f00000 mem=130048K"
    kexec_load: entry = 0x20008000 flags = 0x280001
    nr_segments = 4
    segment[0].buf   = 0x416e0
    segment[0].bufsz = 0x410
    segment[0].mem   = 0x20001000
    segment[0].memsz = 0x1000
    segment[1].buf   = 0xb6b69008
    segment[1].bufsz = 0x3db659
    segment[1].mem   = 0x20008000
    segment[1].memsz = 0x3dc000
    segment[2].buf   = 0xb5a41008
    segment[2].bufsz = 0x1127516
    segment[2].mem   = 0x20f6e000
    segment[2].memsz = 0x1128000
    segment[3].buf   = 0x412a0
    segment[3].bufsz = 0x400
    segment[3].mem   = 0x27f00000
    segment[3].memsz = 0x1000
    
    <cause crash via SysRq>
    
    Loading crashdump kernel...
    Bye!
    
  • 관련 정보