代码改变世界

linux kernel complie + QEMU

2026-08-29 22:06  蜡笔小旧  阅读(9)  评论(0)    收藏  举报

今天尝试了下编译linux kernel比想象中的简单很多。

  第一个花时间的在了下载源码,后面果断放弃git clone用浏览器走dl下载。

      第二个花时间的点是路径问题 `bin/busybox --install -s .` 始终都是绝对路径,最后改成了简单的ln方式。

sudo apt update
sudo apt install \
    build-essential \
    bc \
    bison \
    flex \
    libssl-dev \
    libelf-dev \
    libncurses-dev \
    qemu-system-x86 \
    cpio \
    busybox-static

#############################################################

# i use web browser instead of git 
git clone --depth=1 --branch v6.12 https://github.com/torvalds/linux.git
cd linux
mv linux kernel


#############################################################

# generate .config file
make defconfig

# start complie then generated a file `bzImage`
make -j$(nproc)

# Kernel: arch/x86/boot/bzImage is ready  (#1)

#############################################################

 

mkdir rootfs
cd ./rootfs

mkdir -p \
    bin \
    sbin \
    etc \
    proc \
    sys \
    dev \
    tmp

cp /usr/bin/busybox bin/

cd ..
cat > rootfs/init <<'EOF'
#!/bin/sh

# option 2
#mount -t devtmpfs none /dev
#mount -t proc none /proc
#mount -t sysfs none /sys

echo
echo "================================"
echo " Hello from my Linux kernel!"
echo "================================"
echo

exec /bin/sh

# option 2
# exec setsid cttyhack /bin/sh

EOF

chmod +x rootfs/init

 

ln -s busybox sh
ln -s busybox ls
ln -s busybox cat
ln -s busybox echo
ln -s busybox mount
ln -s busybox ps
# Create initramfs
cd rootfs
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz
cd ..

# directory
# kernel/
#    arch/x86/boot/bzImage
#
# rootfs/
#    init
#    bin/
#    proc/
#    sys/
#    ...

# rootfs.cpio.gz
qemu-system-x86_64 
   -kernel ./kernel/arch/x86/boot/bzImage
   -initrd ./rootfs.cpio.gz 
   -append "console=ttyS0" 
   -nographic