准备内核

前往kernel 官网下载合适版本的内核源码

1
2
3
# 使用清华加速站
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.11.14.tar.xz
tar xJf linux-5.11.14.tar.xz

修改、编译

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
make menuconfig
设置"Kernel hacking" ->"Memory Debugging" -> "KASan: runtime memory debugger"

解决启动后没有网卡,网络配置
```bash
 Device Drivers  ---> -*- Network device support  --->
                <*>     Virtual ethernet pair devic

                 -*-   Ethernet driver support  --->
                <*>     Intel(R) PRO/1000 Gigabit Ethernet support

如果直接编辑.config: CONFIG_VIRTIO_NET=y CONFIG_E1000=y CONFIG_E1000E=y

解决启动后,挂载文件系统报错:

1
2
root@mark01:~# mount -t 9p -o trans=virtio,version=9p2000.L tag001 /mnt
mount: /mnt: unknown filesystem type '9p'.

内核支持9p 文件系统:

1
2
3
4
5
6
7
make menuconfig:
Networking support  --->  Plan 9 Resource Sharing Support (9P2000)
<*>   9P Virtio Transport
<*>   9P Xen Transport

File systems  ---> [*] Network File Systems  --->  
<*>   Plan 9 Resource Sharing Support (9P2000)

如果直接编辑.config:

1
2
3
4
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_9P_FS=y
CONFIG_9P_FS_POSIX_ACL=y 

修改完成后重新编译内核。make -j$(nproc) bzImage

启动后挂载. 保存退出

编译

make -j$(nproc) bzImage

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

编译指令小结:
* make config:内核配置,调用 ./scripts/Configure 按照 arch/i386/config.in 来进行配置。
* make dep:寻找依赖关系。
* make clean:清除以前构建内核所产生的所有目标文件、模块文件、以及一些临时文件等。
* make rmproper:删除所有因构建内核过程中产生的所有文件,把内核恢复到最原始的状态。
* make:构核,通过各目录的Makefile 文件将会在各个目录下产生许多目标文件。如果内核没有错误,将产生文件vmlinux,这就是构建的内核。
* make zImage:在make 的基础上产生压缩的内核映象文件./arch/$(ARCH)/boot/zImage 以及在 ./arch/$(ARCH)/boot/compresed/目录下产生临时文件。
* make bzImage:在make 的基础上产生压缩比例更大的内核映象文件./arch/$(ARCH)/boot/bzImage 以及在 ./arch/$(ARCH)/boot/compresed/目录下产生临时文件。
* make modules:编译模块文件,在make config 时所配置的所有模块将在这时编译,形成模块目标文件,并把这些目标文件存放在modules 目录中。
* make modules_install:把上面编译好的模块目标文件放置在目录 ./lib/modules/$KERNEL_VERSION/ 中


报错解决:
openssl/opensslv.h: No such file or directory
`sudo apt-get install libssl-dev`


### 运行
#### 准备
一个系统需要运行,需要硬件环境+内核+文件系统。  
硬件这里选择qemu模拟;
文件系统准备:
```bash
$ git clone https://github.com/fridayhub/ubuntu-rootfs-build.git
$ cd ubuntu-rootfs-build
$ sudo ./build_ubuntu_rootfs.sh

文件系统build过程中,要求选择时区,输入密码等。
生成文件系统: Writing superblocks and filesystem accounting information: done rootfs.img: 25636/194304 files (0.0% non-contiguous), 225723/776192 blocks

运行脚本
run.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
export IMAGE=/work/ubuntu-rootfs-build
export KERNEL=/work/linux-5.11.14
qemu-system-x86_64 -cpu host \
    -m 2G -smp 2 \
    -kernel $KERNEL/arch/x86/boot/bzImage \
    -append "console=ttyS0 root=/dev/sda rw earlyprintk=serial net.ifnames=0" \
    -drive file=$IMAGE/rootfs.img,format=raw \
    -net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \
    -net nic,model=e1000 \
    # 挂载本地目录到系统中
    -virtfs local,path=/mywork,mount_tag=tag001,security_model=mapped-xattr \
    -enable-kvm \
    -nographic \
    -pidfile vm.pid 2>&1 | tee vm.log

# 远程ssh到系统
#ssh -i $IMAGE/rootfs.img.id_rsa -p 10021 -o "StrictHostKeyChecking no" root@localhost

报错: qemu-system-x86_64: Initialization of device ide-hd failed: Could not reopen file: Permission denied 修改文件系统所属为普通用户: sudo chown user1:user1 rootfs.*

启动后输入制作文件系统时设置的用户名密码,即可登录:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[  OK  ] Started Network Manager Script Dispatcher Service.
[  OK  ] Started Dispatcher daemon for systemd-networkd.
[  OK  ] Found device /dev/ttyS0.
[  OK  ] Started Serial Getty on ttyS0.
[  OK  ] Reached target Login Prompts.
[  OK  ] Reached target Multi-User System.
[  OK  ] Reached target Graphical Interface.
         Starting Update UTMP about System Runlevel Changes...
[  OK  ] Finished Update UTMP about System Runlevel Changes.

Ubuntu 20.04.6 LTS mark01 ttyS0

mark01 login: friday
Password: 
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.11.14 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

friday@mark01:~$ uname -a
Linux mark01 5.11.14 #2 SMP Fri May 10 11:31:03 CST 2024 x86_64 x86_64 x86_64 GNU/Linux