概述
这篇文章主要记录如何在MacOS上搭建Linux内核调试环境,以及在搭建过程中可能会遇到哪些问题。
过程
大体的搭建教程可以参考这篇文章,按照这个过程,基本上能搭建比较顺利地搭建出来。
文中提到要安装一个虚拟机,这比较简单,下载vmware和linux ubuntu镜像之后,用vmware快捷安装就可以得到一个linux镜像。但这其中也会遇到一些问题,下面来说说我遇到的问题以及我是如何解决的。
编译linux内核时分配的虚拟机磁盘空间不足
文章中说到在编译时需要分配一个比较大的磁盘空间,但是通过vmware快捷安装之后,得到的磁盘空间只有默认的20G,在编译的过程就会遇到 No Space Left 的错误。
这时候就需要用到 gparted 这个工具来扩充虚拟磁盘空间。
- 扩充虚拟机磁盘空间
先在虚拟机设置中对虚拟机的磁盘空间的进行扩充,这里扩充到100G
- 安装gparted
进入linux虚拟机,使用命令行安装gparted
sudo apt install gparted
- 打开gparted
在命令行中输入gparted命令,就会显示这个界面
gparted
- 调整分区虚拟磁盘空间 选中/dev/sda1 分区,然后点击上面的箭头,就会弹出一个调整磁盘空间的界面
调整磁盘空间到你想要的大小,这里可以调大一点。我编译完linux之后,实际占用的磁盘空间在17GB左右,所以调整大小到30G+应该也够用了。这里我按上述的文档调整到了100G。
这样在编译linux内核的时候就不用担心磁盘空间不够用而导致编译失败了。
通过ssh连接到root用户
我安装的ubuntu版本是 18.04.1 ,按照上述链接的这个内容
# 注释掉禁止 root 远程登录项。 #PermitRootLogin without-password
是没法做到让ssh连接到root用户的。因为在这个版本的ubuntu中,在/etc/ssh/sshd_config 配置文件中的 PermitRootLogin 本身就是被注释掉的。这个时候如果通过ssh root@ip 的方式连接,是不会成功的。
因此,需要将sshd_config这个配置文件中的 PermitRootLogin 配置打开,并配置成:
PermitRootLogin yes
这个时候再重新启动ssh,就可以通过 ssh root@ip 的方式连接上去了
注意使用qemu启动内核的位置
注意使用 qemu 启动内核的时候,所在的目录都要是
/home/linux-5.0.1/kernel_test/test_epoll_thundering_herd
因为链接中的启动命令是
qemu-system-x86_64 -kernel ../../arch/x86/boot/bzImage -initrd ../rootfs.img -append nokaslr -S -s
这里的启动目录都是有要求的,注意 -kernel ../../arch/x86/boot/bzImage -initrd ../rootfs.img ,如果所在的目录不是上述的 /home/linux-5.0.1/kernel_test/test_epoll_thundering_herd 目录的话,启动命令要找到对应的kernel文件和img文件所在的位置,才能正确启动。
配置网卡时要注意ubuntu版本中所拥有的网卡是哪个
配置网桥的时候,注意上述链接里的脚本,bridge_ports 配置的是 eth0 的网卡
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
auto tap0
iface tap0 inet manual
pre-up tunctl -t tap0 -u root
pre-up ifconfig tap0 0.0.0.0 promisc up
post-up brctl addif br0 tap0
但实际上,虚拟机中所拥有的网卡不尽相同,这里要看你所安装的虚拟机的网卡是哪个,可通过ifconfig去查看。我所安装的ubuntu版本,网卡名是ens33,那么就应该把eth0改成ens33,对应的配置文件应该是
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports ens33
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
auto tap0
iface tap0 inet manual
pre-up tunctl -t tap0 -u root
pre-up ifconfig tap0 0.0.0.0 promisc up
post-up brctl addif br0 tap0
配置完之后,重启网络
sudo /etc/init.d/networking restart
或重启虚拟机,即可看到br0网卡的ip地址变成了虚拟机的ip地址
其他
- GDB调试的时候,需要打开一个新的终端,通过gdb连接到qemu启动的内核进程来进行调试
- vscode配置的launch.json调试,是在 .vscode 目录下的统一调试配置,可以配置多种调试方式。是可选的,只要打开配置文件添加配置就可以了,在启动调试时可以选择gdb调试还是其他方式的调试
总结
整个过程下来,其实搭建一个linux内核的调试环境并没有那么难。之前一直各种踩坑,都没有成功,所以就认为这个弄起来很难。后来找到了这份大佬的教程之后,跟着做下来之后,真的能跑通,这才豁然开朗。由此可见,好的教程/思路+亲自动手 才能让自己搞定之前一直搞不定的事情。