# Linux Kernel Module Cheat

###### 17.1.3.1.1. Linux kernel defconfig

To boot defconfig from disk on Linux and see a shell, all we need is these missing virtio options:

    ./build-linux \
      --linux-build-id defconfig \
      --custom-config-target defconfig \
      --config CONFIG_VIRTIO_PCI=y \
      --config CONFIG_VIRTIO_BLK=y \
    ;
    ./run --linux-build-id defconfig

Oh, and check this out:

    du -h \
      "$(./getvar vmlinux)" \
      "$(./getvar --linux-build-id defconfig vmlinux)" \
    ;

Output:

    360M    /path/to/linux-kernel-module-cheat/out/linux/default/x86_64/vmlinux
    47M     /path/to/linux-kernel-module-cheat/out/linux/defconfig/x86_64/vmlinux

Brutal. Where did we go wrong?

The extra virtio options are not needed if we use initrd:

    ./build-linux \
      --linux-build-id defconfig \
      --custom-config-target defconfig \
    ;
    ./run --initrd --linux-build-id defconfig

On aarch64, we can boot from initrd with:

    ./build-linux \
      --arch aarch64 \
      --linux-build-id defconfig \
      --custom-config-target defconfig \
    ;
    ./run \
      --arch aarch64 \
      --initrd \
      --linux-build-id defconfig \
      --memory 2G \
    ;

We need the 2G of memory because the CPIO is 600MiB due to a humongous amount of loadable kernel modules!

In aarch64, the size situation is inverted from x86_64, and this can be seen on the vmlinux size as well:

    118M    /path/to/linux-kernel-module-cheat/out/linux/default/aarch64/vmlinux
    240M    /path/to/linux-kernel-module-cheat/out/linux/defconfig/aarch64/vmlinux

So it seems that the ARM devs decided rather than creating a minimal config that boots QEMU, to try and make a single config that boots every board in existence. Terrible!

Bibliography: https://unix.stackexchange.com/questions/29439/compiling-the-kernel-with-default-configurations/204512#204512

Tested on 1e2b7f1e5e9e3073863dc17e25b2455c8ebdeadd + 1.