1 安装相关依赖和软件
sudo apt-get install vim
sudo apt-get install vim-scripts
sudo apt-get install vim-gtk
sudo apt-get install fcitx (中文输入法需要)
sudo apt-get install fcitx-libs (中文输入法需要)
sudo apt-get install kolourpaint4(图片编辑软件)
sudo apt-get install rar (压缩、解压文件)
sudo apt-get install unrar
sudo apt-get install wine (模拟win系统环境)
sudo apt-get install hexedit (16进制编辑器)
sudo apt-get install net-tools(网络相关工具)
sudo apt-get install wireshark (可选,抓包软件)
sudo apt-get install libelf-dev
sudo apt-get install libssl-dev
sudo apt-get install bison
sudo apt-get install git
sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install build-essential
sudo apt-get install ninja-build
sudo apt-get install libpixman-1-dev
sudo apt-get install flex(编译用到的词法分析器)
sudo apt update
$ sudo apt install build-essential
$ sudo apt install gcc-multilib
$ sudo apt install git
2 下载linux源码和buildroot
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git
root@linux:~#wget https://buildroot.org/downloads/buildroot-2020.02.8.tar.gz
root@linux:~#tar zxvf buildroot-2020.02.8.tar.gz && cd buildroot-2020.02.8
root@linux:~#export ARCH=x86_64
root@linux:~#export FORCE_UNSAFE_CONFIGURE=1
root@linux:~#make menuconfig
这里下载buildroot压缩包解压,配置buildroot
它的作用就是生成制作rootfs,制作 rootfs 可以理解为创建 Linux 系统的根文件系统(Root File System)。在 Linux 中,根文件系统是整个文件系统的起点,包含了操作系统启动所需的所有文件和目录结构。它包括了操作系统内核、设备文件、配置文件、库文件、可执行文件等
除了上述方式buildroot还有busybox,这里主要讲buildroot
先看下在buildtools根目录下执行make menuconfig
你可以在这里进行可视化配置
Toolchain --->
# 编译一些package会用到,比如f2fstools
[*] Enable WCHAR support
System configuration --->
# 系统启动后,密码为空,回车登录shell
[*] Enable root login with password
( ) Root password
# 设置eth0接口为DHCP,如果不设置,qemu启动kernel镜像后,需要手动配置网络
(eth0) Network interface to configure through DHCP
Target packages --->
Filesystem and flash utilities --->
# 格式化f2fs用到
[*] f2fs-tools
Filesystem images --->
[ ] ext2/3/4 root filesystem
# 设置rootfs的文件系统类型
[*] f2fs root filesystem
配置完成后,buildtools 根目录执行
make
这个耗时长一些,结束后你可以在output/images下看到roottfs.f2fs文件
注意点
修改buildroot-2020.02.8/package目录下的package源码后,重新编译时,需要删除output/build/目录中对应的package,否则编译出来的rootfs.f2fs镜像不会包含改动。
当你生成了roottfs.f2fs后就完成了第一步
接下来将你的roottfs.f2fs文件拷贝到你的linux内核源码根目录
在linux内核源码根目录打开控制台
root@linux:/home/gsf/linux-5.10.3# export ARCH=“x86_64”
root@linux:/home/gsf/linux-5.10.3# make x86_64_defconfig
root@linux:/home/gsf/linux-5.10.3# make menuconfig
继续开启内核的基础配置
Processor type and features --->
[ ] Randomize the address of the kernel image (KASLR) 不要选
Drevice Drivers --->
NVME Support
<*> NVM Express block device
[*] NVMe multipath support
[*] NVMe hardware monitoring
<*> NVM Express over Fabrics FC host driver
<*> NVM Express over Fabrics TCP host driver
File systems --->
<*> F2FS filesystem support
[*] F2FS Status Information (NEW)
[*] F2FS extended attributes (NEW)
[*] F2FS Access Control Lists (NEW)
Network File Systems--->
<*> NFS client support
<*> NFS client support for NFS version 2
<*> NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
<*> NFS client support for NFS version 4
<*> SMB3 and CIFS support (advanced network filesystem)
Kernel hacking --->
Compile-time checks and compiler options --->
[*] Compile the kernel with debug info
[*] Provide GDB scripts for kernel debugging
注:高版本改成了
Kernel hacking --->
Compile-time checks and compiler options --->
Debug information (Disable debug information) --->
(X)Generate DWARF Version 5 debuginfo
[*] Provide GDB scripts for kernel debugging
按上述要求配置好linux内核
root@linux:/home/gsf/linux-5.10.3#make -j4 bzImag
编译引导镜像 bzImag用于拉起linux内核
当你有了bzimg和roottfs.f2fs后,就可以启动linux内核了
最简单的启动,资源很少,无disk,无网络
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -drive file=rootfs.f2fs,if=ide,format=raw -nographic -append "root=/dev/sda console=ttyS0"
启动完成后,用户名输入root,登录系统查看信息,f2fs已经挂载:
# cat /proc/mounts
/dev/root / f2fs rw,lazytime,relatime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,exte0
devtmpfs /dev devtmpfs rw,relatime,size=48612k,nr_inodes=12153,mode=755
接下来挂载 scsi disk(格式化成ext4)启动
- 1 制作ext4镜像
root@linux:/home/gsf/linux-5.10.3#dd if=/dev/zero of=ext4.img bs=1M count=256
root@linux:/home/gsf/linux-5.10.3# mkfs.ext4 ext4.img
- 2 执行qemu命令
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -drive file=rootfs.f2fs,if=ide,format=raw,id=myid0 --nographic -append "root=/dev/sda console=ttyS0" -hdb ext4.img
这里要注意你生成bzImage路径,机器不同可能是x86/x86_64
这里进入虚拟linux系统中
- 3 添加挂载配置
创建目录
# mkdir /mnt/scsimp
并在 vi /etc/fstab文件中增加一行:
/dev/sdb /mnt/scsimp ext4 defaults 0 0
- 4 reboot查看虚拟linux系统,是否挂载ext4镜像
# cat /proc/mounts
……
sysfs /sys sysfs rw,relatime 0 0
/dev/sdb /mnt/scsimp ext4 rw,relatime 0 0
完成ext4镜像挂载 接下来就是nvme disk
这里给出nvme disk的配置步骤,但是我配置失败了,如果你们配置成功可以给我个文档链接,这里nvme的配置不会影响你使用虚拟linux系统
3 配置NVME disk
- 1 制作虚拟磁盘
root@linux:/home/gsf/linux-5.10.3#qemu-img create -f raw disk.qcow 1G
- 2 执行qemu命令启动虚拟linux系统
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -drive file=rootfs.f2fs,if=ide,format=raw,id=myid0 --nographic -append “root=/dev/sda console=ttyS0” -device nvme,drive=nvme1,serial=deadbeaf,num_queues=8 -drive file=disk.qcow,if=none,id=nvme1 -smp 4
这个命令是用 QEMU 模拟器来启动一个 x86_64 架构的虚拟机,并加载 Linux 内核和根文件系统进行运行。让我解释一下各个参数的含义:
qemu-system-x86_64:启动 QEMU 模拟器,用于模拟 x86_64 架构的虚拟机。
-kernel arch/x86_64/boot/bzImage:指定 Linux 内核的镜像文件路径。
-drive file=rootfs.f2fs,if=ide,format=raw,id=myid0:挂载根文件系统,使用 F2FS 文件系统格式,通过 IDE 接口模拟硬盘,指定格式为 raw,设备 ID 为 myid0。
--nographic:以非图形化(无图形界面)模式运行 QEMU。
-append “root=/dev/sda console=ttyS0”:向内核传递的启动参数,指定根文件系统为 /dev/sda,并设置控制台为串口终端 ttyS0。
-device nvme,drive=nvme1,serial=deadbeaf,num_queues=8:添加一个 NVMe 设备,指定驱动名称为 nvme1,序列号为 deadbeaf,队列数为 8。
-drive file=disk.qcow,if=none,id=nvme1:将一个 QCOW 格式的磁盘映像文件作为 NVMe 设备的存储介质,设备 ID 为 nvme1。
-smp 4:指定虚拟机的 CPU 个数为 4。
这个命令的作用是启动一个使用指定 Linux 内核和 F2FS 格式根文件系统的 x86_64 虚拟机,并添加了一个 NVMe 设备作为存储介质。
- 3 创建目录 设置挂载配置
创建目录
# mkdir /mnt/nvmemp
并在/etc/fstab文件中增加:
/dev/nvme0n1p1 /mnt/nvmemp f2fs defaults 0 0 -------后面会将disk.qcow格式化成f2fs,所以这里按f2fs挂载
格式化nvme disk
#fdisk /dev/nvme0n1
Device contains neither a valid DOS partition table, nor Sun, SGI, OSF
or GPT disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that the previous content
won’t be recoverable.
Command (m for help): n
Partition type
p primary partition (1-4)
e extended
p
Partition number (1-4): 1
First sector (32-2097151, default 32): ------------回车,默认即可
Using default value 32
Last sector or +size{,K,M,G,T} (32-2097151, desfault 2097151):
------------回车,默认即可
Using default value 2097151
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table
[ 131.575409] nvme0n1: p1
格式化成功后,出现/dev/nvme0n1p1设备,这就是刚fdisk新建的分区
格式化新建的nvme分区
mkfs.f2fs -L nvmedisk /dev/nvme0n1p1
- 4 reboot重启虚拟linux系统,查看nvme是否挂载
# cat /proc/mounts
……
sysfs /sys sysfs rw,relatime 0 0
/dev/sdb /mnt/scsimp ext4 rw,relatime 0 0
/dev/nvme0n1p1 /mnt/nvmemp f2fs rw,relatime 0 0
另外,还可以看到系统中有5个nvme队列。nvme0q0是管理队列。nvme0q1~4是IO队列每个核一个(我们的qemu命令指定了num_queues=8、smp 4参数)。
# cat /proc/interrupts
# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
0: 183 0 0 0 IO-APIC 2-edge timer
1: 0 0 9 0 IO-APIC 1-edge i8042
……
24: 6 0 0 0 PCI-MSI 65536-edge nvme0q0
25: 0 0 0 11 PCI-MSI 65537-edge nvme0q1
26: 0 0 0 0 PCI-MSI 65538-edge nvme0q2
27: 0 0 0 0 PCI-MSI 65539-edge nvme0q3
28: 0 0 0 0 PCI-MSI 65540-edge nvme0q4
到这里基本就结束了
接下来就是配置vscode,可以debug linux源码执行流程,有助于你理解linux源码
4 vscode配置
首先下载vscode gdb扩展包
接下来配置(.vscode/launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "kernel debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/vmlinux",
"cwd": "${workspaceFolder}",
"MIMode": "gdb",
"miDebuggerPath":"/usr/bin/gdb-multiarch",
"miDebuggerServerAddress": "localhost:1234"
}
]
}
参数介绍
program: 调试的符号文件
miDebuggerPath:gdb的路径, 这里需要注意的是,由于我们是arm64内核,因此需要用gdb-multiarch来进行调试
miDebuggerServerAddress:对端地址,qemu会默认使用1234这个端口
如果没下载gdb-multiarch
sudo apt-get install gdb-multiarch
完成后,打开一个控制台执行
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -drive file=rootfs.f2fs,if=ide,format=raw,id=myid0 --nographic -append "root=/dev/sda console=ttyS0" -nographic -s -S
这个命令可以等待vscode终端通过gdb 连接
vscode 执行start debuging
然后就可以通过vscode调试linux源码了
5 优质博主推荐
ubuntu20.04上linux内核开发环境搭建(qemu+gdb+vscode)_ubuntu 内核开发-CSDN博客