“用户态 Linux” 是什么?它是一种可以在用户态运行的 Linux 内核。(用户态是什么,这里就不解释了)
它有什么用?它用于内核隔离、替代 QEMU/Bochs 来调试 Linux 内核,也可以在低性能设备上代替 KVM 进行虚拟化。
但它也存在一些缺陷,比如不支持 ARM 架构以及多核系统。
编译 Linux 内核
首先通过 git
下载 Linux 内核源代码:
1 | git clone --depth 1 https://mirrors.tuna.tsinghua.edu.cn/git/linux.git |
(这里使用了清华大学的镜像站,kernel.org 也是可以的。)
然后采用如下步骤编译它:
1 | $ cd linux |
经过漫长的编译之后,你获得了一个 vmlinux
文件。它和正常的 Linux 内核的区别是,这个 vmlinux
可以在用户态运行。
准备根文件系统
先别着急启动,先来准备内核所使用的根文件系统。
以下内容以 Debian Linux 为例。
首先安装 debootstrap
软件包:
1 | sudo apt install debootstrap |
以下命令皆需要 root 权限,先切换到 root 用户:
1 | $ sudo su |
然后构建根文件系统,存放在 rootfs
文件中:
1 | # dd if=/dev/zero of=rootfs seek=2G # 创建一个 2GB 大小的空 rootfs 文件 |
然后挂载 rootfs
到 /mnt
下:
1 | # mount rootfs /mnt |
在其中创建 Debian Linux 的根文件系统(/
):
1 | # cd /mnt |
通过 chroot
将其改变为根目录:
1 | # chroot ./ |
设置 root 密码:
1 | # passwd |
然后退出 chroot 环境,并卸载:
1 | # exit # 退出 chroot 环境 |
设置 rootfs 的所有权为普通用户:
1 | $ sudo chown `whoami` rootfs |
这样,这个用户态 Linux 的根文件系统就准备好了。
测试用户态 Linux
然后就可以用这个内核启动了,只需要一行命令:
1 | $ screen ./vmlinux mem=1G root=/dev/root rootfstype=hostfs hostfs=./rootfs con=null con0=null,fd:2 con1=fd:0,fd:1 |
启动后,使用你前面设置的 root 用户/密码登录,便可以进入到用户态 Linux 容器中了。
有别于 Docker,这个容器的内核和宿主的内核是隔离的,可以使用这个容器作为一个调试内核的工具,如:
1 | echo 1 > /proc/sys/kernel/sysrq |
即可手动触发一个“ 内核恐慌 ”错误。
延伸阅读:
- https://www.kernel.org/doc/html/latest/virt/uml/user_mode_linux_howto_v2.html
- https://wiki.archlinux.org/title/User-mode_Linux
作者简介:
calvinlin:一个普通的深圳初中生。
via: https://www.bilibili.com/read/cv15626523
本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出