Linux内核环境搭建

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


img_v3_0293_ffabf901-24e8-4a47-a110-57a35b10626g.jpg

你可以在这里进行可视化配置


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文件


img_v3_0293_eec399ba-2cfd-4bcd-b5aa-c1ba430dad1g.jpg

注意点

修改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

继续开启内核的基础配置


img_v3_0293_63905038-3532-4123-b37b-de3569bdf74g.jpg
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扩展包


img_v3_0293_59f3dad3-04fe-4778-96b6-506a2d2b392g.jpg

接下来配置(.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

img_v3_0293_3a15a843-2e58-4d7d-89b1-72c4c8f767eg.jpg

然后就可以通过vscode调试linux源码了

5 优质博主推荐

ubuntu20.04上linux内核开发环境搭建(qemu+gdb+vscode)_ubuntu 内核开发-CSDN博客

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容