什么是“UserlandLinux”?它是一个可以在用户态运行的Linux内核。(什么是用户态,这里不解释)是干什么用的?它用于内核隔离,代替QEMU/Bochs调试Linux内核,也可以代替KVM在低性能设备上进行虚拟化。但它也有一些缺点,比如不支持ARM架构和多核系统。编译Linux内核,首先通过git下载Linux内核源码:gitclone--depth1https://mirrors.tuna.tsinghua.edu.cn/git/linux.git(清华大学镜像站这里用的是kernel.org也是可以的。)然后用下面的步骤编译它:$cdlinux$exportARCH=um#很重要设置架构为用户模式??$makedefcongig$make-j8LD.tmp_vmlinux.kallsyms1KSYMS.tmp_vmlinux.kallsyms1.SAS.tmp_vmlinux.kallsyms1.SLD.tmp_vmlinux.kallsyms2KSYMS.tmp_vmlinux.kallsyms2.SAS.tmp_vmlinux.kallsyms2.SLDvmlinuxSYSMAPSystem.mapLINKModulelinuxMODPOSTENGmodules-only.sym.symvers经过长时间的编译,你得到一个vmlinux文件。它和普通Linux内核的区别在于这个vmlinux可以运行在用户态。准备根文件系统不要着急,先准备好内核使用的根文件系统。以下内容以DebianLinux为例。首先安装debootstrap软件包:sudoaptinstalldebootstrap以下命令都需要root权限,先切换到root用户:$sudosu然后构建root文件系统,存放到rootfs文件中:#ddif=/dev/zeroof=rootfsseek=2G#创建一个空的rootfs文件,大小为2GB2000000000字节(2GB,2GB)复制,0.137825s,570MB/s`#mkfs.ext4rootfs#将其格式化为ext4格式mke2fs1.46.5(2021年12月30日)丢弃设备块:完成创建具有76748个1k块和19200个inode的文件系统文件系统UUID:9dc7f1f6-8b16-4c64-9e22-94ede327c532存储在块上的超级块备份:8193、24577、40961、57345、分配组73729tables:done写入inodetables:done创建journal(4096blocks):done写入superblocks和filesystemaccountinginformation:done然后挂载rootfs到/mnt:#mountrootfs/mnt在其中创建DebianLinux的根文件系统(/):#cd/mnt#debootstrapsid./https://mirrors.tuna.tsinghua.edu.cn/debian一:Configuringpython-central...I:配置ubuntu-minimal...I:配置libc-bin...I:配置initramfs-tools...I:基本系统安装成功。通过chroot更改到根目录:#chroot./Setrootpassword:#passwdNewpassword:Retypenewpassword:然后退出chroot环境并卸载:#exit#退出chroot环境#cd..#umount/mnt#exit#退出sudo环境,将rootfs的归属设置为普通用户:$sudochown`whoami`rootfs这样,这个用户态Linux的根文件系统就准备好了。测试用户模式Linux,然后启动这个内核,只需要一行命令:$screen./vmlinuxmem=1Groot=/dev/rootrootfstype=hostfshostfs=./rootfscon=nullcon0=null,fd:2con1=fd:0,fd:1启动后,使用之前设置的root用户/密码登录,即可进入userlandLinux容器。与Docker不同的是,这个容器的内核与宿主机的内核是隔离的。您可以使用此容器作为调试内核的工具,例如:echo1>/proc/sys/kernel/sysrqechoc>/proc/sysrq-trigger您可以手动触发“kernelpanicKernelPanic”错误。作者简介:calvinlin:深圳一名普通的初中生。
