Update instructions

This commit is contained in:
Jean-Claude 2023-10-29 19:51:36 +01:00
parent 30351df034
commit 1fb8a54b4b
Signed by: jeanclaude
GPG Key ID: 8A300F57CBB9F63E
1 changed files with 129 additions and 10 deletions

139
kernel.md
View File

@ -1,17 +1,119 @@
# Kernel
## Get and compile
- Download kernel from kernel.org
- Uncompress the archive
- `cd <linux-kernel>`
- Configure Kernel: `make ARCH=x86_64 nconfig`
- Config is written to `.config`
- Compile the kernel: `make ARCH=x86_64 -j <numProcesses=numCores+1>`
- Compressed kernel is written to `arch/x86/boot/bzImage`
## Get and Prepare Source
- Download kernel from <https://kernel.org>: `wget https://cdn.kernel.org/pub/linux/kernel/<kernelVersion>.tar.{xz,sign}`
- Uncompress the archive: `unxz linux-<kernelVersion>.tar.xz`
- Verify Signature of tar: `gpg2 --verify linux-<kernelVersion>.tar.sign`
- If there is a key issue, import keys: `gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org`
- Untar the archive: `tar -xvf linux-<kernelVersion>.tar`
- Change ownership: `chown -R jeanclaude:jeanclaude <linuxKernel>`
- `cd <linuxKernel>`
- Clean source: `make mrproper`
## Run in qemu
## Configure
- Config is written to `.config`
### For Qemu
- Create config file `make defconfig`
- Configure for Qemu `make kvm_guest.config`
### Use Hosts Configuration
- Copy the current hosts config: `zcat /proc/config.gz > .config`
- Changing `CONFIG_LOCALVERSION` is required to prevent overwriting a current kernel
- Can by done by setting `LOCALVERSION=-<someSuffix>` for the compile command
- Some options may have changed, run `make olddefconfig` to accept defaults
### Create own configuration
- Configure Kernel: `make nconfig`
## Compilation
- Compile the kernel: `make -j $(nproc)`
- We can also choose $numCores + 1$
- Compressed kernel is written to `arch/x86/boot/bzImage`
- Prepare Modules: `make modules -j $(nproc)`
- Install Modules: `sudo make modules_install`
- Modules are installed to `/lib/modules/<kernelVersion>`
## Prepare initramfs
- Investigate what is in the initramfs using `lsinitcpio <initramfs>`
- Extract to PWD using `lsinitcpio -x <initramfs>`
### Using Busybox
- Simple but has limited utilities
```
#!/bin/bash
ARCH="x86_64"
BB_VER="1.31.0"
# Dirs
mkdir -p root
cd root
mkdir -p bin dev etc lib mnt proc sbin sys tmp var
cd -
# Utils
if [ ! -f "root/bin/busybox" ]; then
curl -L "https://www.busybox.net/downloads/binaries/${BB_VER}-defconfig-multiarch-musl/busybox-${ARCH}" >root/bin/busybox
fi
cd root/bin
chmod +x busybox
ln -s busybox mount
ln -s busybox sh
cd -
# Init process
cat >>root/init << EOF
#!/bin/busybox sh
/bin/busybox --install -s /bin
mount -t devtmpfs devtmpfs /dev
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs tmpfs /tmp
setsid cttyhack sh
exec /bin/sh
EOF
chmod +x root/init
# initramfs creation
cd root
find . | cpio -ov --format=newc | gzip -9 >../initramfs
cd -
```
### Using Arch
- Create `./mkinitcpio.conf` with following content:
```
MODULES=(ext4)
HOOKS=(base systemd modconf sd-vconsole filesystems block keyboard)
```
- Enter fakeroot: `fakeroot`
- Create initramfs: `mkinitcpio --generate initramfs.img --kernel <kernel> --config mkinitcpio.conf`
- `<kernel>` is must be located in `/lib/modules/`
- Leave fakeroot: `exit`
## Run in Qemu Step-by-Step
- Most basic `qemu-system-x86_64 -kernel ../Kernel/arch/x86_64/boot/bzImage`
- Window opens with dmesg output with a panic
- With terminal but not redirected: `qemu-system-x86_64 -kernel ../Kernel/arch/x86_64/boot/bzImage -nographic`
- Redirect output using kernel argument: `qemu-system-x86_64 -kernel ../Kernel/arch/x86_64/boot/bzImage -nographic -append "console=ttyS0"`
- Still get panic as there is no root filesystem => no init to run
- Run with initramfs: `qemu-system-x86_64 -kernel ../Kernel/arch/x86_64/boot/bzImage -nographic -append "console=ttyS0" -initrd initramfs.img`
- Get same panic as there is not enough RAM
- Allocate more memory: `qemu-system-x86_64 -kernel ../Kernel/arch/x86_64/boot/bzImage -nographic -append "console=ttyS0" -initrd initramfs.img -m 512`
- For busybox this is all which is required
- For arch we get `Failed to start Switch Root.`
- May have increase memory quite a bit more
- Create spares file: `dd if=/dev/zero of=kernel-hd bs=1M count=2048`
- Create FS on virtual HD: `mkfs.ext4 kernel-hd`
- Start using virtual HD: `qemu-system-x86_64 -kernel ../Kernel/arch/x86_64/boot/bzImage -nographic -append "console=ttyS0 root=/dev/sda rootfstype=ext4 rw" -initrd initramfs.img -m 512 -hda kernel-hd`
Copy
## Run in Qemu
- Create dedicated folder
- Copy the kernel `<linux-kernel>/arch/x86/boot/bzImage` here
- Copy the kernel `<linuxKernel>/arch/x86/boot/bzImage` here
- Copy some suitable disk image here
- Start qemu: `qemu-system-x86_64 -smp 1 -nographic -kernel bzImage -append "root=/dev/sda rootfstype=ext4 rw console=ttyS0" -hda <diskImg>`
- `-hda`: disk image
@ -20,3 +122,20 @@
- `-append`: command line parameters to the kernel
- `-nographic`: disable graphic window and use command line instead
- Quit qemu using `Ctrl-a x`
### SSH Into Kernel
- Add the following to start Qemu
```
-netdev user,id=unet,hostfwd=tcp::2222-:22 \
-net user \
```
- Ssh into kernel usign `ssh root@localhost:2222`
## Other
- Generate JSON Compilation Database: `scripts/clang-tools/gen_compile_commands.py`
# Debian/Ubuntu
- Build for: `make -j`nproc` deb-pkg LOCALVERSION=-choose-your-prefix KDEB_PKGVERSION=$(make kernelversion)-1`
- Install `sudo dpkg -i <out>.deb`
- Uninstall `sudo apt remove --purge <kernelName>`
- Taken from list installed kernels: `dpkg --list | grep linux-image`