“用户态 Linux” 是什么?它是一种可以在用户态运行的 Linux 内核。(用户态是什么,这里就不解释了)
它有什么用?它用于内核隔离、替代 QEMU/Bochs 来调试 Linux 内核,也可以在低性能设备上代替 KVM 进行虚拟化。
但它也存在一些缺陷,比如不支持 ARM 架构以及多核系统。
编译 Linux 内核 首先通过 git
下载 Linux 内核源代码:
1 2 git clone --depth 1 https://mirrors.tuna.tsinghua.edu.cn/git/linux.git
(这里使用了清华大学的镜像站,kernel.org 也是可以的。)
然后采用如下步骤编译它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ cd linux $ export ARCH=um $ make defconfig $ make -j8 LD .tmp_vmlinux.kallsyms1 KSYMS .tmp_vmlinux.kallsyms1.S AS .tmp_vmlinux.kallsyms1.S LD .tmp_vmlinux.kallsyms2 KSYMS .tmp_vmlinux.kallsyms2.S AS .tmp_vmlinux.kallsyms2.S LD vmlinux SYSMAP System.map LINK linux MODPOST modules-only.symvers GEN Module.symvers
经过漫长的编译之后,你获得了一个 vmlinux
文件。它和正常的 Linux 内核的区别是,这个 vmlinux
可以在用户态运行。
准备根文件系统 先别着急启动,先来准备内核所使用的根文件系统。
以下内容以 Debian Linux 为例。
首先安装 debootstrap
软件包:
1 2 sudo apt install debootstrap
以下命令皆需要 root 权限,先切换到 root 用户:
然后构建根文件系统,存放在 rootfs
文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2000000000 字节(2 GB,2 GB)已复制,0 .137825 s,570 MB/s` mke2fs 1 .46 .5 (30 -Dec-2021 ) Discarding device blocks: done Creating filesystem with 76748 1 k blocks and 19200 inodes Filesystem UUID: 9 dc7f1f6-8 b16-4 c64-9 e22-94 ede327c532 Superblock backups stored on blocks: 8193 , 24577 , 40961 , 57345 , 73729 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): doneWriting superblocks and filesystem accounting information: done
然后挂载 rootfs
到 /mnt
下:
在其中创建 Debian Linux 的根文件系统(/
):
1 2 3 4 5 6 7 8 # cd /mnt # debootstrap sid ./ https: I: Configuring python-central... I: Configuring ubuntu-minimal... I: Configuring libc-bin... I: Configuring initramfs-tools... I: Base system installed successfully.
通过 chroot
将其改变为根目录:
设置 root 密码:
1 2 3 4 # passwd New password: Retype new password:
然后退出 chroot 环境,并卸载:
1 2 3 4 5 # exit # cd ..# umount /mnt # exit
设置 rootfs 的所有权为普通用户:
1 2 $ sudo chown `whoami ` rootfs
这样,这个用户态 Linux 的根文件系统就准备好了。
测试用户态 Linux 然后就可以用这个内核启动了,只需要一行命令:
1 2 $ 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 2 3 echo 1 > /proc/sys/kernel/sysrqecho c > /proc/sysrq-trigger
即可手动触发一个“ 内核恐慌 Kernel Panic ”错误。
延伸阅读:
作者简介:
calvinlin:一个普通的深圳初中生。
via: https://www.bilibili.com/read/cv15626523
作者:calvinlin 编辑:wxy
本文由贡献者投稿至 Linux 中国公开投稿计划 ,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出