如何構建用戶態 Linux
「用戶態 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
即可手動觸發一個「 內核恐慌 」錯誤。
延伸閱讀:
- 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中國 榮譽推出
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive