1. 前置安裝
1.1 編譯好的內核
參考:
https://blog.csdn.net/qq_51950769/article/details/148596916
1.2 編譯busybox
BusyBox 是一個非常輕量級的多合一工具箱,常被稱為“Linux 的瑞士軍刀”。
簡單來說:
它把很多常用的 Linux 命令(比如 ls、cp、mv、sh、mount 等)集成到一個單一的可執行文件里。適合用于資源有限的環境,比如嵌入式系統、initramfs、恢復系統等。
為什么用 BusyBox?
- 體積小:比安裝完整的 GNU 工具鏈省空間很多;
- 方便:一個文件搞定常用命令;
- 靈活:可以自定義編譯,裁剪只需要的命令。
# 下載源碼
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1# 配置(選擇你想要的功能)
make menuconfig# 編譯
make -j$nproc# 安裝到指定目錄(方便打包initramfs)
make CONFIG_PREFIX=../busybox-root install# 或者默認安裝, 后續制作根文件系統采用這種方式
make install
成功安裝后:
查看安裝目錄的文件,tree
:
1.3 根文件系統的制作
根文件系統提供操作系統運行所需的基本工具和環境。它包含啟動程序(如 init),負責啟動用戶空間進程。
沒有根文件系統,內核是“裸”的,無法完成完整的系統啟動和運行;根文件系統為系統提供了完整的用戶空間環境。
- 準備根文件系統目錄
進入到busybox的目錄
cd busybox-1.36.1/
root@ubantu64:~/busybox-1.36.1# ls
applets busybox_ldscript.README.txt configs editors INSTALL mailutils miscutils procps shell util-linux
applets_sh busybox.links console-tools examples klibc-utils Makefile modutils qemu_multiarch_testing size_single_applets.sh
arch busybox_unstripped coreutils findutils libbb Makefile.custom networking README sysklogd
archival busybox_unstripped.map debianutils include libpwdgrp Makefile.flags NOFORK_NOEXEC.lst runit testsuite
AUTHORS busybox_unstripped.out docs init LICENSE Makefile.help NOFORK_NOEXEC.sh scripts TODO
busybox Config.in e2fsprogs _install loginutils make_single_applets.sh printutils selinux TODO_unicode
root@ubantu64:~/busybox-1.36.1# cd _install/
root@ubantu64:~/busybox-1.36.1/_install##創建目錄
mkdir -p etc/init.d mnt tmp sys dev proc
結果:
- 創建文件系統表(fstab)
vim etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
如圖:
- 創建啟動腳本rcS
vim etc/init.d/rcSecho -e "Welcome to tinyLinux"
/bin/mount -a
mount -o remount,rw /
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
如圖:
給rcS可執行權限chmod 755 rcS。
- 創建初始化程序配置文件inittab
vim etc/inittab::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
如圖:
- 創建設備文件節點
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1
- 鏡像制作
(1) 創建一個空的鏡像,并把這個鏡像文件格式化為ext4
(2) 掛載到一個空的目錄,并把_install/*等啟動文件復制到這個鏡像中
(3) 卸載鏡像文件
(4) 使用gzip進行壓縮
# 先創建一個空的鏡像并格式化為ext4
mkdir ~/image
cd ~/image
dd if=/dev/zero of=./rootfs.ext4 bs=1M count=32
mkfs.ext4 rootfs.ext4
# 創建一個空目錄fs
mkdir fs
# 掛載到fs,并復制啟動文件
mount -o loop rootfs.ext4 ./fs
cp -rf busybox-1.36.1/_install/* ./fs
#卸載鏡像文件
umount ./fs
# 使用gzip壓縮
gzip --best -c rootfs.ext4 > rootfs.img.gz
最終結果:
1.4 安裝qemu-system-x86_64
qemu-system-x86_64
是什么?
qemu-system-x86
是 QEMU 提供的一個用于模擬 x86 架構(如 x86_64 或 i386)計算機系統的可執行程序。簡單來說:它可以在你的電腦上虛擬出一個完整的 x86 電腦,用來運行操作系統、測試內核、開發系統級軟件等。
apt install qemu-system-x86
2. 內核調試
進行內核調試,我們需要使用兩個命令:
2.1 qemu-system-x86_64
qemu-system-x86_64
主要用來啟動一個內核。
qemu-system-x86_64 \-kernel ~/linux-5.10.126/arch/x86/boot/bzImage \-initrd ~/kernal/rootfs.img.gz \-append "root=/dev/ram init=/linuxrc" \-serial file:output.txt
參數解釋:
-kernel
指定要加載的 Linux 內核鏡像(通常是 bzImage 格式)。-initrd
:指定 initrd(初始化內存盤)文件,系統啟動時會加載到內存中,通常用于提供根文件系統。-append
:傳遞給內核的啟動參數,這里是指定root=/dev/ram:告訴內核從 RAM 磁盤(initrd)掛載根文件系統。
init=/linuxrc:指定初始化進程為 /linuxrc。-S
:啟動時暫停 CPU-s
:在 TCP 端口 1234 上開啟 GDB 服務器
擴展參數:
-nographic
:禁用圖形輸出,所有輸出(包括串口輸出)將重定向到終端(即你運行命令的終端窗口),用于無頭(headless)運行。-smp
是 QEMU 中用于指定虛擬機的 CPU 配置的參數,全稱是 “Symmetric Multi-Processing”(對稱多處理)。-m
是 QEMU 中用于指定 虛擬機內存大小 的參數。-cpu
是 QEMU 中用于指定虛擬 CPU 類型和特性的參數。-enable-kvm
,用于啟用 KVM(Kernel-based Virtual Machine)硬件加速。-serial
: 串口(Serial Port):在 QEMU 虛擬機中,串口是一個虛擬的通信接口,通常用于內核調試、系統日志輸出或與外部工具交互。file:output.txt:將虛擬機的串口輸出寫入到當前目錄下的 output.txt 文件中(如果文件不存在會自動創建,已存在則會覆蓋)。
不使用圖像化啟動命令:
qemu-system-x86_64 \-kernel ~/linux-5.10.126/arch/x86/boot/bzImage \-initrd ~/kernal/rootfs.img.gz \-append "root=/dev/ram init=/linuxrc console=ttyS0" \-nographic \-serial mon:stdio \-monitor none
2.2 gdb
執行:
gdb vmlinux
在執行:
target remote :1234
此時qemu中跑的linux內核:
最后在提醒:想調試的話,最好把Makefile中的編譯選項全部從O2
改為O1
:
3 參考文章
https://zhuanlan.zhihu.com/p/17345710829
https://blog.csdn.net/weixin_37867857/article/details/88205130