一. 简介
突然发现前文忘了写如何编译运行Linux内核并进行修改、调试,所以这里临时补上。主要使用QEMU搭建虚拟机,并在其基础上下载内核并编译从而实现内核调试。
二. QEMU虚拟机搭建
2.1 windows平台
windows使用QEMU建立虚拟机需要以下步骤:
- 官网下载QEMU的windows版安装程序并安装
- 下载想用的虚拟机镜像 文件
- 在windows的高级系统设置->环境变量中增加对应的QEMU位置
- 使用
qemu-img create -f qcow2 [name].qcow2 30G
创建镜像 - 使用
qemu-system-x86_64 -accel whpx -hda .\[name].qcow2 -m 512 -net nic,model=virtio -net user -cdrom .\[name].iso -vga std -boot strict=on
开启虚拟机。这里可以简化为qemu-system-x86_64 boot - d -cdrom .\[name].iso
。 - 一步一步完成安装即可。
2.2 Linux平台
这里以Ubuntu为例进行说明
- 创建网桥并设置P地址
1 | brctl addbr br0 |
- 配置iptables开启NAT访问外网功能
1 | iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
- 通过
apt-get install qemu
安装QEMU - 安装
libvirt
1 | apt-get install libvirt-bin |
- 创建虚拟机镜像,如
ubuntutest.img
。
1 | qemu-system-x86_64 -enable-kvm -name ubuntutest -m 2048 -hda ubuntutest.img -cdrom ubuntu-14.04-server-amd64.iso -boot d -vnc :19 |
- 创建xml管理虚拟机。
1 | <domain type='qemu'> |
- 保存xml为
domain.xml
,并交给libvirt
托管
1 | virsh define domain.xml |
- 启动虚拟机
1 | virsh start ubuntutest |
修改登录界面工具,配置
/boot/grub/
下的grub.cfg
和menu.lst
在
grub.cfg
中 submenu ‘Advanced options for Ubuntu’ 这一项,linux /boot/vmlinuz-4.15.0-55-generic root=UUID=470f3a42-7a97-4b9d-aaa0-26deb3d234f9 ro console=ttyS0 maybe-ubiquity
中,加上console=ttyS0
。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-470f3a42-7a97-4b9d-aaa0-26deb3d234f9' {
menuentry 'Ubuntu, with Linux 4.15.0-55-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-55-generic-advanced-470f3a42-7a97-4b9d-aaa0-26deb3d234f9' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 470f3a42-7a97-4b9d-aaa0-26deb3d234f9
else
search --no-floppy --fs-uuid --set=root 470f3a42-7a97-4b9d-aaa0-26deb3d234f9
fi
echo 'Loading Linux 4.15.0-55-generic ...'
linux /boot/vmlinuz-4.15.0-55-generic root=UUID=470f3a42-7a97-4b9d-aaa0-26deb3d234f9 ro console=ttyS0 maybe-ubiquity
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-4.15.0-55-generic
}在
menu.lst
文件中,在Ubuntu 18.04.2 LTS, kernel 4.15.0-55-generic
这一项,在kernel /boot/vmlinuz-4.15.0-55-generic root=/dev/hda1 ro console=hvc0 console=ttyS0
这一行加入console=ttyS0
。1
2
3
4title Ubuntu 18.04.2 LTS, kernel 4.15.0-55-generic
root (hd0)
kernel /boot/vmlinuz-4.15.0-55-generic root=/dev/hda1 ro console=hvc0 console=ttyS0
initrd /boot/initrd.img-4.15.0-55-generic
重启虚拟机,进入机器控制台
1 | virsh console ubuntutest |
三. 内核编译
内核编译主要包括源码的下载、解压缩、编译文件的添加、编译选项的修改等步骤。
下载和压缩很简单
1 | apt-get install linux-source-4.15.0 |
再安装以下依赖包
1 | apt-get install libncurses5-dev libssl-dev bison flex libelf-dev gcc make openssl libc6-dev |
接着定义编译选项
1 | make menuconfig |
编译内核可以通过nohup
在后台完成,缺点是不易确定啥时候编译完
1 | nohup make -j8 > make1.log 2>&1 & |
完成后,启动虚拟机时在GRUB界面选择即可进入新的内核。
总结
本文大致介绍了QEMU以及内核编译的知识,有兴趣的可以自己动手试一试。
参考文献
[1] Debugging kernel and modules via gdb
[2] 极客时间 趣谈Linux操作系统