如何构建用户态 Linux
创始人
2024-03-02 10:21:03
0

“用户态 Linux” 是什么?它是一种可以在用户态运行的 Linux 内核。(用户态是什么,这里就不解释了)

它有什么用?它用于内核隔离、替代 QEMU/Bochs 来调试 Linux 内核,也可以在低性能设备上代替 KVM 进行虚拟化。

但它也存在一些缺陷,比如不支持 ARM 架构以及多核系统。

编译 Linux 内核

首先通过 git 下载 Linux 内核源代码:

git clone --depth 1 https://mirrors.tuna.tsinghua.edu.cn/git/linux.git

(这里使用了清华大学的镜像站,kernel.org 也是可以的。)

然后采用如下步骤编译它:

$ 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 软件包:

sudo apt install debootstrap

以下命令皆需要 root 权限,先切换到 root 用户:

$ sudo su

然后构建根文件系统,存放在 rootfs 文件中:

# dd if=/dev/zero of=rootfs seek=2G # 创建一个 2GB 大小的空 rootfs 文件
 2000000000字节(2 GB,2 GB)已复制,0.137825 s,570 MB/s`

# mkfs.ext4 rootfs # 将其格式化为 ext4 格式
 mke2fs 1.46.5 (30-Dec-2021)
 Discarding device blocks: done                            
 Creating filesystem with 76748 1k blocks and 19200 inodes
 Filesystem UUID: 9dc7f1f6-8b16-4c64-9e22-94ede327c532
 Superblock backups stored on blocks: 
  	8193, 24577, 40961, 57345, 73729

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 

然后挂载 rootfs/mnt 下:

# mount rootfs /mnt

在其中创建 Debian Linux 的根文件系统(/):

# cd /mnt
# debootstrap sid ./ https://mirrors.tuna.tsinghua.edu.cn/debian
 I: Configuring python-central... 
 I: Configuring ubuntu-minimal... 
 I: Configuring libc-bin... 
 I: Configuring initramfs-tools... 
 I: Base system installed successfully.

通过 chroot 将其改变为根目录:

# chroot ./

设置 root 密码:

# passwd 
 New password: 
 Retype new password: 

然后退出 chroot 环境,并卸载:

# exit # 退出 chroot 环境
# cd ..
# umount /mnt
# exit # 退出 sudo 环境

设置 rootfs 的所有权为普通用户:

$ sudo chown `whoami` rootfs

这样,这个用户态 Linux 的根文件系统就准备好了。

测试用户态 Linux

然后就可以用这个内核启动了,只需要一行命令:

$ 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,这个容器的内核和宿主的内核是隔离的,可以使用这个容器作为一个调试内核的工具,如:

echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger

即可手动触发一个“ 内核恐慌 Kernel Panic ”错误。

延伸阅读:

作者简介:

calvinlin:一个普通的深圳初中生。


via: https://www.bilibili.com/read/cv15626523

作者:calvinlin 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出

相关内容

多家Linux厂商拥抱Ub...
在最近举办的Ubuntu峰会上,多家Linux相关厂商展示了他们的...
2025-11-08 06:16:18
微信Linux 4.1.0...
IT之家 10 月 27 日消息,深度操作系统官方今天在公众号发文...
2025-10-27 21:45:09
Fedora 43定档10...
来源:IT之家 【Fedora 43 正式版定档 10 月 28 ...
2025-10-27 06:15:15
Ubuntu认证新平台上线...
在如今的数字时代,掌握Linux系统的技能已成为许多求职者和专业人...
2025-10-26 08:16:30
英伟达发布 Nova 开源...
IT之家 10 月 25 日消息,phoronix 发现,英伟达周...
2025-10-26 06:17:38
英特尔 Nova Lake...
IT之家 10 月 22 日消息,继早前英特尔为 Nova Lak...
2025-10-22 18:45:16

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
如何检查你的 Linux 系统... 不知道在使用哪个初始化系统?以下是方法。每个主流 Linux 发行版(包括 Ubuntu、Fedor...
如何理解Apache 2.0许... 提要:Apache 2.0许可证中的专利许可条款使得开源代码可以安全使用,但它经常被误解。Apach...