Skip to content

ROCKPro64 - Der Bootvorgang

Verschoben Hardware
  • Basis für diesen Beitrag

    rock64@rockpro64:/boot$ uname -a
    Linux rockpro64 4.4.132-1075-rockchip-ayufan-ga83beded8524 #1 SMP Thu Jul 26 08:22:22 UTC 2018 aarch64 aarch64 aarch64 GNU/Linux
    

    So sieht die Partitionstabelle des Images aus (SD-Karte)

     rock64@rockpro64:/boot$ sudo fdisk /dev/mmcblk0
     [sudo] password for rock64: 
     
     Welcome to fdisk (util-linux 2.31.1).
     Changes will remain in memory only, until you decide to write them.
     Be careful before using the write command.
     
     
     Command (m for help): p
     Disk /dev/mmcblk0: 29.7 GiB, 31914983424 bytes, 62333952 sectors
     Units: sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes
     Disklabel type: gpt
     Disk identifier: 2C9A4A22-7AA8-4A1B-815E-0C3E2E7065E6
     
     Device          Start      End  Sectors  Size Type
     /dev/mmcblk0p1     64     8063     8000  3.9M Linux filesystem
     /dev/mmcblk0p2   8064     8191      128   64K Linux filesystem
     /dev/mmcblk0p3   8192    16383     8192    4M Linux filesystem
     /dev/mmcblk0p4  16384    24575     8192    4M Linux filesystem
     /dev/mmcblk0p5  24576    32767     8192    4M Linux filesystem
     /dev/mmcblk0p6  32768   262143   229376  112M Microsoft basic data
     /dev/mmcblk0p7 262144 62333918 62071775 29.6G Linux filesystem
     
     Command (m for help): 
    
    Partition Start Sector Number of Sectors Partition Size PartNum in GPT Requirements
    MBR 0 1 512
    Primary GPT 1 63 32256
    loader1 64 7104 4096000 1 preloader (miniloader or U-Boot SPL)
    Vendor Storage 7168 512 262144 SN, MAC and etc.
    Reserved Space 7680 384 196608 Not used
    reserved1 8064 128 65536 legacy DRM key
    U-Boot ENV 8128 64 32768
    reserved2 8192 8192 4194304 legacy parameter
    loader2 16384 8192 4194304 2 U-Boot or UEFI
    trust 24576 8192 4194304 3 trusted-os like ATF, OP-TEE
    boot(bootable must be set) 32768 229376 117440512 4 kernel, dtb, extlinux.conf, ramdisk
    rootfs 262144 - - 5 Linux system
    Secondary GPT 16777183 33 16896

    Quelle der Info's (bearbeitet) Rockchip.

    Hier sieht man das zwei Partitionen gemountet werden.

    rock64@rockpro64:~$ df -h
    Filesystem      Size  Used Avail Use% Mounted on
    udev            992M     0  992M   0% /dev
    tmpfs           200M  484K  199M   1% /run
    /dev/mmcblk0p7   30G  1.3G   27G   5% /
    tmpfs           996M     0  996M   0% /dev/shm
    tmpfs           5.0M  4.0K  5.0M   1% /run/lock
    tmpfs           996M     0  996M   0% /sys/fs/cgroup
    /dev/mmcblk0p6  112M  4.0K  112M   1% /boot/efi
    /dev/sda1       1.9T   43G  1.8T   3% /mnt
    tmpfs           200M     0  200M   0% /run/user/1000
    
    • /dev/mmcblk0p6 = /boot/efi
    • /dev/mmcblk0p7 = Linux System /

    Inhalt /boot/efi (/dev/mmcblk0p6)

    rock64@rockpro64:/boot/efi$ ls -la
    total 22
    drwxr-xr-x 3 root root 16384 Jan  1  1970 .
    drwxr-xr-x 5 root root  4096 Aug 27 17:23 ..
    drwxr-xr-x 2 root root  2048 Jul 26 09:15 extlinux
    

    Inhalt extlinux

    rock64@rockpro64:/boot/efi$ ls -la extlinux/
    total 20
    drwxr-xr-x 2 root root  2048 Jul 26 09:15 .
    drwxr-xr-x 3 root root 16384 Jan  1  1970 ..
    -rwxr-xr-x 1 root root   688 Jul 21 22:50 extlinux.conf
    

    Datei extlinux.conf

     timeout 10
     default kernel-latest
     menu title select kernel
     
     label kernel-latest
         kernel /Image
         initrd /initrd.img
         fdt /dtb
         append rw root=LABEL=linux-root rootwait rootfstype=ext4 panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1
     
     label kernel-previous
         kernel /Image.bak
         initrd /initrd.img.bak
         fdt /dtb.bak
         append rw root=LABEL=linux-root rootwait rootfstype=ext4 panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1
    

    Inhalt /boot (/dev/mmcblk0p7)

    rock64@rockpro64:/boot$ ls
    System.map-4.4.132-1075-rockchip-ayufan-ga83beded8524  filesystem.packages
    config-4.4.132-1075-rockchip-ayufan-ga83beded8524      filesystem.packages-remove
    dtbs                                                   initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
    efi                                                    vmlinuz-4.4.132-1075-rockchip-ayufan-ga83beded8524
    extlinux
    

    In extlinux liegt auch hier eine extlinux.conf mit folgendem Inhalt.

    timeout 10
    menu title select kernel
    
    label kernel-4.4.132-1075-rockchip-ayufan-ga83beded8524
        kernel /boot/vmlinuz-4.4.132-1075-rockchip-ayufan-ga83beded8524
        initrd /boot/initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
        devicetreedir /boot/dtbs/4.4.132-1075-rockchip-ayufan-ga83beded8524
        append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=linux-root rootwait rootfstype=ext4
    
    label kernel-4.4.132-1075-rockchip-ayufan-ga83beded8524-memtest
        kernel /boot/vmlinuz-4.4.132-1075-rockchip-ayufan-ga83beded8524
        initrd /boot/initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
        devicetreedir /boot/dtbs/4.4.132-1075-rockchip-ayufan-ga83beded8524
        append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=linux-root rootwait rootfstype=ext4 memtest
    

    Ok, das kenne ich. Hier stellt man ein von wo er bootet usw. Was ich nicht verstehe, wofür braucht es dann /boot/efi (/dev/mmcblk0p6) ?? Es gibt immer einen Eintrag für die aktuelle Kernelversion und die alte Kernelversion. Wenn was schief geht, kann man die alte Version booten. Die aktuelle Version steht immer oben. Im Beispiel handelt es sich um das Original Image, kein anderer Kernel ist installiert.

    • Ordner /boot/efi ???
    • Ordner /boot/dtbs - hier liegt das .dts File!!
    • Ordner /boot/efi ???
    • Ordner /boot/extlinux ???????

    System.map-4.4.132-1075-rockchip-ayufan-ga83beded8524

    A symbol table is a look-up between symbol names and their addresses in memory. A symbol name may be the name of a variable or the name of a function.

    Quelle: https://en.wikipedia.org/wiki/System.map

    Beispiel (gekürzt)

    0000000000000000 A __rela_size
    0000000000000000 A _kernel_flags_le_hi32
    0000000000000000 A _kernel_offset_le_hi32
    0000000000000000 A _kernel_size_le_hi32
    000000000000000a A _kernel_flags_le_lo32
    0000000000000200 A PECOFF_FILE_ALIGNMENT
    0000000000080000 A _kernel_offset_le_lo32
    000000000119f908 A __rela_offset
    0000000001392000 A _kernel_size_le_lo32
    ffffff8008080000 t _head
    ffffff8008080000 T _text
    ffffff8008080800 T __exception_text_start
    ffffff8008080800 T _stext
    ffffff8008080800 T do_undefinstr
    ffffff8008080a1c T do_sysinstr
    ffffff8008080ab4 T do_mem_abort
    ffffff8008080b60 T do_sp_pc_abort
    ffffff8008080c34 T do_debug_exception
    ffffff8008080ce8 T __exception_text_end
    ffffff8008080ce8 T __irqentry_text_start
    ffffff8008080ce8 t gic_handle_irq
    ffffff8008080da8 t gic_handle_irq
    ffffff8008080f28 T __do_softirq
    ffffff8008080f28 T __irqentry_text_end
    ffffff8008080f28 T __softirqentry_text_start
    ffffff8008081228 T __entry_text_start
    ffffff8008081228 T __softirqentry_text_end
    ffffff8008081800 T vectors
    

    config-4.4.132-1075-rockchip-ayufan-ga83beded8524

    Linux Kernel Konfiguration

    Beispiel (gekürzt)

    #
    # Automatically generated file; DO NOT EDIT.
    # Linux/arm64 4.4.132 Kernel Configuration
    #
    CONFIG_ARM64=y
    CONFIG_64BIT=y
    CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
    CONFIG_MMU=y
    CONFIG_ARCH_MMAP_RND_BITS_MIN=18
    CONFIG_ARCH_MMAP_RND_BITS_MAX=24
    CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
    CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
    CONFIG_ARM64_PAGE_SHIFT=12
    CONFIG_ARM64_CONT_SHIFT=4
    CONFIG_STACKTRACE_SUPPORT=y
    CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
    CONFIG_LOCKDEP_SUPPORT=y
    CONFIG_TRACE_IRQFLAGS_SUPPORT=y
    CONFIG_RWSEM_XCHGADD_ALGORITHM=y
    CONFIG_GENERIC_BUG=y
    CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
    CONFIG_GENERIC_HWEIGHT=y
    CONFIG_GENERIC_CSUM=y
    CONFIG_GENERIC_CALIBRATE_DELAY=y
    CONFIG_ZONE_DMA=y
    CONFIG_HAVE_GENERIC_RCU_GUP=y
    CONFIG_ARCH_DMA_ADDR_T_64BIT=y
    CONFIG_NEED_DMA_MAP_STATE=y
    CONFIG_NEED_SG_DMA_LENGTH=y
    CONFIG_SMP=y
    CONFIG_SWIOTLB=y
    CONFIG_IOMMU_HELPER=y
    CONFIG_KERNEL_MODE_NEON=y
    CONFIG_FIX_EARLYCON_MEM=y
    CONFIG_PGTABLE_LEVELS=3
    

    filesystem.packages

    Beispiel (gekürzt)

    adduser 3.116ubuntu1
    alsa-utils      1.1.3-1ubuntu1
    apt     1.6.1
    apt-utils       1.6.1
    base-files      10.1ubuntu2
    base-passwd     3.5.44
    bash    4.4.18-2ubuntu1
    binutils        2.30-15ubuntu1
    binutils-aarch64-linux-gnu      2.30-15ubuntu1
    binutils-common:arm64   2.30-15ubuntu1
    bsdutils        1:2.31.1-0.4ubuntu3
    build-essential 12.4ubuntu1
    busybox-initramfs       1:1.27.2-2ubuntu3
    bzip2   1.0.6-8.1
    ca-certificates 20180409
    console-setup   1.178ubuntu2
    console-setup-linux     1.178ubuntu2
    coreutils       8.28-1ubuntu1
    

    filesystem.packages-remove

    Datei ist leer

    initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524

    initrd ist ein temporäres Dateisystem, das vom Linux-Kernel während des Bootvorgangs verwendet wird.

    Quelle: https://de.wikipedia.org/wiki/Initrd

    Jedes mal, wenn man einen Kernel installiert, wird dieses File angelegt. Ein Beispiel von meinem ROCKPro64 mit NVMe SSD.

    rock64@rockpro64v2_0:/boot$ ls
    config-4.18.0-rc8-1060-ayufan-g45828c4db727
    config-4.4.132-1075-rockchip-ayufan-ga83beded8524
    dtbs
    efi
    extlinux
    filesystem.packages
    filesystem.packages-remove
    initrd.img-4.18.0-rc8-1056-ayufan-gad339353011e
    initrd.img-4.18.0-rc8-1060-ayufan-g45828c4db727
    initrd.img-4.18.0-rc8-1060-ayufan-g45828c4db727.bak
    initrd.img-4.4.132-1075-rockchip-ayufan-ga83beded8524
    System.map-4.18.0-rc8-1060-ayufan-g45828c4db727
    System.map-4.4.132-1075-rockchip-ayufan-ga83beded8524
    vmlinuz-4.18.0-rc8-1060-ayufan-g45828c4db727
    vmlinuz-4.4.132-1075-rockchip-ayufan-ga83beded8524
    

    Hier kann man auch ganz gut erkennen, das es immer ein initrd.img gibt, eine entsprechende System.map und eine vmlinux.

    vmlinuz-4.4.132-1075-rockchip-ayufan-ga83beded8524

    On Linux systems, vmlinux is a statically linked executable file that contains the Linux kernel in one of the object file formats supported by Linux, which includes ELF, COFF and a.out. The vmlinux file might be required for kernel debugging, symbol table generation or other operations, but must be made bootable before being used as an operating system kernel by adding a multiboot header, bootsector and setup routines.

    Ich denke, das man das normalerweise nicht braucht. Aber ich mach hier zur Sicherheit mal ein paar ???? dran!

    wird fortgesetzt..

  • Ich versuche hier mal den Bootvorgang des ROCKPro64 zu verstehen 🙂

  • Um einen neuen Kernel booten zu können, brauche ich diese 4 Dateien unter /boot

    • config-4.19.0-rc4-1065-ayufan-g72e04c7b3e06
    • initrd.img-4.19.0-rc4-1065-ayufan-g72e04c7b3e06
    • System.map-4.19.0-rc4-1065-ayufan-g72e04c7b3e06
    • vmlinuz-4.19.0-rc4-1065-ayufan-g72e04c7b3e06

    Und den Ordner /boot/dtbs/4.19.0-rc4-1065-ayufan-g72e04c7b3e06 mit folgendem Inhalt

    rock64@rockpro64v2_0:/boot/dtbs/4.19.0-rc4-1065-ayufan-g72e04c7b3e06$ ls -la
    total 104
    drwxr-xr-x 26 root root 4096 Sep 30 09:54 .
    drwxr-xr-x  6 root root 4096 Sep 30 09:55 ..
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 al
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 allwinner
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 altera
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 amd
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 amlogic
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 apm
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 arm
    drwxr-xr-x  4 root root 4096 Sep 30 09:54 broadcom
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 cavium
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 exynos
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 freescale
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 hisilicon
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 lg
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 marvell
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 mediatek
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 nvidia
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 qcom
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 renesas
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 rockchip
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 socionext
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 sprd
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 synaptics
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 xilinx
    drwxr-xr-x  2 root root 4096 Sep 30 09:54 zte
    

    Unter /boot/extlinux liegt dann die Datei extlinux.conf

    Die sieht bei mir dann so aus

    timeout 10
    menu title select kernel
    
    label kernel-4.19.0-rc4-1065-ayufan-g72e04c7b3e06
        kernel /boot/vmlinuz-4.19.0-rc4-1065-ayufan-g72e04c7b3e06
        initrd /boot/initrd.img-4.19.0-rc4-1065-ayufan-g72e04c7b3e06
        devicetreedir /boot/dtbs/4.19.0-rc4-1065-ayufan-g72e04c7b3e06
        append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=TEST rootwait rootfstype=ext4
    
    label kernel-4.19.0-rc4-1065-ayufan-g72e04c7b3e06-memtest
        kernel /boot/vmlinuz-4.19.0-rc4-1065-ayufan-g72e04c7b3e06
        initrd /boot/initrd.img-4.19.0-rc4-1065-ayufan-g72e04c7b3e06
        devicetreedir /boot/dtbs/4.19.0-rc4-1065-ayufan-g72e04c7b3e06
        append rw panic=10 init=/sbin/init coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 root=LABEL=TEST rootwait rootfstype=ext4 memtest
    

    Darunter kommen dann evt. die alten Kernel die installiert waren, das habe ich hier im Beispiel weg gelassen.