1 介绍
1.1 linux-toy由来
已经多年没有开发过内核态代码了。最近,由于项目需要,需要开发和调试Linux kernel模块。
翻箱倒柜,找到了以前开发内核的的一个自用脚本fjrti/linux-toy(gitee上自取)。感觉对于了解内核或连接Linux系统运行原理,还是有点价值的。写几篇文章记录一下:
Linux系统的构建和调试1-使用指南:就是本文,介绍。
Linux系统的构建和调试2-原理介绍:介绍工作原理,待填坑。
Linux系统的构建和调试2-Rootfs的制作:介绍rootfs,待填坑。
1.2 特点
Linux-toy的几个特点:
- 最简设计
- 使用一个makefile文件来总控
- 提供了一个小型化的Linux config文件。
- 支持两种rootfs
- 基于busybox的rootfs:完全从源代码构建袖珍型Linux。
- 基于Alpine的rootfs:可以通过apk安装需要的软件。
- 两种rootfs都已经内置了网络设置,默认网络就是通的。
- 支持两种网络模式
- user模式:有点是不修改host网络配置,可以直接访问外网。
- bridge模式:创建的多个VM接入同一个bridge。设置了iptable访问外网。
- 支持内核调试
- 默认的config已经开启了调试能力。
- 支持gdb直接调试内核代码。
- 支持目录
- 默认使用9P实现,host当前目录挂载到guest的/mnt/share下。
说明:
本人只处理Linux网络相关的代码,所以在内核配置文件中打开了大部分网络相关的功能,自行配置。
本脚本之适配了个人常用的centos7和archlinux。其他发行版,自行适配,非常简单。
1.3 运行依赖
Linux-toy的初衷是尽可能简单,基本上只使用下面的基本工具:
1、编译Linux kernel需要的工具。
2、qemu
3、bridge-utils iptables Dnsmasq telnet配置网络
2 使用说明
make help
Support targets:
build - Build linux kernel and rootfs
create - Create a qemu VM (root/123456)
debug - Debug linux kernel
show - List qemu VM
stop - Stop all qemu VM
clean - Delete kernel image and rootfs image
distclean - Delete all image and source code
* help - Show this message, default target
Support parameters:
make id=0|1|..|9 [targets] - Specify VM id (default 0)
make fs=busybox|alpine [targets] - Specify rootfs (default busybox)
make net=user|bridge [targets] - Specify network mode (default user)
make kvm=on|off [targets] - Specify kvm mode (default off)
make cpu=size [targets] - Specify vcpu (default 1)
make mem=size [targets] - Specify memory size (default 512m)
帮助信息已经比较完整,简单说明一下:
- 创建多个vm的时候,可以指定id作为区分。
- user网络默认下,guest的tcp 23端口映射到host的23端口上,使用telnet 127.0.0.1登录guest
- bridge网络模式下,/var/run/dnsmasq-fjrti.leases查看dhcp分配的地址,telnet登录guest,。
- 也通过通过VNC登录guest,端口号为5900 + id。
- host当前目录挂载到guest的/mnt/share下。
使用举例:
make create kvm=on fs=alpine net=bridge
make debug id=1 kvm=on fs=alpine net=bridge cpu=2
3 结束
留两个思考题,有兴趣的同学可以分析一下:
1、qemu的-kernel和-initrd是原理,如何沟通guest?
2、user-mode的网络模式,工作原理是什么?