Linux中國

如何構建用戶態 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

即可手動觸發一個「 內核恐慌 Kernel Panic 」錯誤。

延伸閱讀:

作者簡介:

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

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

作者:calvinlin 編輯:wxy

本文由貢獻者投稿至 Linux 中國公開投稿計劃,採用 CC-BY-SA 協議 發布,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國