1. 程式人生 > >用戶態Linux內核

用戶態Linux內核

ner inf 設置 x86 line 動態鏈接 dir examples tac

User Mode Linux 是可以在用戶態啟動的 Linux版本,最新版linux內核已提供了支持。這使我們能在類似 OpenVZ 虛擬化技術的系統上,使用最新的 Linux 內核;並且可以在非 root 用戶下啟動。

用途

調試內核模塊,網絡實驗,體驗最新功能。。。

工具代碼準備

安裝內核編譯工具
apt-get install build-essential libncurses5-dev
以及計算器小工具bc(編譯的時候用到):apt-get install bc
下載內核源碼,選擇較新版本:
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.2.tar.xz

解壓 xz -d linux-4.*.tar.xz && tar xf linux-4.*.tar
另可以下載對應的內核補丁,也可以不管.

編譯user mode內核

配置架構為user mode:
cd linux-4.*
make defconfig ARCH=um # 配置默認屬性
make menuconfig ARCH=um # 進入配置菜單
進入 UML-specific options→ 選擇Force a static link能夠靜態連接(包括glibc等)
進入 Networking support → Networking options → TCP: advanced congestion control 頁面,移到 BBR TCP,註意進入TCP子目錄時需要按Y將TCP: advanced congestion control選中.再將 BBR TCP選中。進入下方 Default TCP congestion control 選 BBR。一直ESC,保存退出。

不過為了能編譯出體積最小又能滿足 BBR 需要的 kernel,使用如下修改的最小配置,首先將下面的內容保存為 kernel-mini.config 文件(如果需要編譯 64 位 kernel,那直接把開頭的 CONFIG_64BIT=n 這一行去掉即可,如果動態編譯,去掉CONFIG_STATIC_LINK):
kernel-mini.config

CONFIG_64BIT=n
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_SCRIPT=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=n
CONFIG_HOSTFS=y
CONFIG_MCONSOLE=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_KERNEL_STACK_ORDER=1
CONFIG_SWAP=n
CONFIG_SYSVIPC=y
CONFIG_EXPERT=n
CONFIG_EMBEDDED=n
CONFIG_SLUB_DEBUG=n
CONFIG_BLOCK=y
CONFIG_LBDAF=y
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_BLK_DEV_BSG=n
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_UBD=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=n
CONFIG_DEFAULT_IOSCHED="deadline"
CONFIG_NETDEVICES=n
CONFIG_STDERR_CONSOLE=y
CONFIG_SSL=y
CONFIG_NULL_CHAN=y
CONFIG_PORT_CHAN=y
CONFIG_PTY_CHAN=y
CONFIG_TTY_CHAN=y
CONFIG_XTERM_CHAN=y
CONFIG_UNIX98_PTYS=y
CONFIG_EXT2_FS=y
CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_TMPFS=y
CONFIG_SYSFS=y
CONFIG_SCHED_DEBUG=n
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_CUBIC=y
CONFIG_TCP_CONG_BBR=y
CONFIG_DEFAULT_BBR=y
CONFIG_DEFAULT_TCP_CONG="bbr"
CONFIG_IPV6=n
CONFIG_SYN_COOKIES=y
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_QFQ=y
CONFIG_NET_SCH_CODEL=y
CONFIG_NET_SCH_FQ_CODEL=y
CONFIG_NET_SCH_FQ=y
CONFIG_NET_SCH_FIFO=y
CONFIG_UML_NET=y
CONFIG_UML_NET_TUNTAP=y
CONFIG_UML_NET_VDE=y
CONFIG_DEBUG_KERNEL=n
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
  • 啟用了 UML 的 hostfs 及 mconsole 等很實用的功能;
  • 支持 UML 的 ubd 塊設備,也開啟了 loop 設備支持,去掉了 ramdisk 等沒什麽用的其它設備支持;
  • 支持 proc、sysfs、tmpfs 等虛擬文件系統,真實的文件系統只保留了 ext2 支持,需要 ext3 或者 ext4 支持的朋友請自行修改;
  • 開啟 BBR 並設置為默認擁塞控制算法,另外需要為 BBR 啟用 Fair Queue 包調度器;
  • 去掉對 IPv6 支持;去掉了所有的網卡設備驅動;
  • 去掉了幾乎所有的內核調試信息。
  • 開啟TAP網絡連接方式,去掉了VDE網絡連接方式. VDE交換設備是由軟件模擬的一個網絡交換設備。如果要開啟需要apt-get install libvdeplug-dev,參考http://blog.sina.com.cn/s/blog_3e4774e30101qyde.html

使用 mini.config 生成新的內核配置文件:
make ARCH=um allnoconfig KCONFIG_ALLCONFIG=kernel-mini.config
新配置將寫到.config文件
使用上述的最小化配置,make ARCH=um vmlinux -j$(nproc) 編譯。
動態鏈接編譯出的vmlinux約4.7M;靜態鏈接5.3M,執行strip vmlinux去掉調試符號之後是4.4M.

$ ldd vmlinux
        not a dynamic executable
$ file vmlinux
vmlinux: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, stripped

在.config中設置CONFIG_STATIC_LINK=y將會靜態編譯

可以通過編譯出的vmlinux查看編譯時使用的內核配置:
./vmlinux --showconfig

rootfs

使用busybox 做rootfs: https://busybox.net/
配置編譯:
make defconfig
make menuconfig
在其中選擇Busybox Settings—>1、Build Options—>,選擇[*] Build Busybox as a static binary(no shared libs);
如果編譯時動態鏈接,編譯出的busybox不到1M,靜態編譯出來2.5M.

make -j 編譯
make CONFIG_PREFIX=~/root install 安裝到~/root文件夾
拷貝etc目錄:cp -r examples/bootfloppy/etc ~/root

rootfs文件系統

下載可以運行內核的rootfs文件系統,這裏采用Arch的文件系統鏡像(140M),當然也可以采用alpine等小型文件系統或者ubuntu的.
wget http://mirror.rackspace.com/archlinux/iso/latest/archlinux-bootstrap-2017.11.01-x86_64.tar.gz
tar xzf archlinux-bootstrap-*.tar.gz
mv root.x86_64 root

控制 UML 系統

如果你需要登錄到 UML 系統,可以先用 uml_mconsole 命令得到 UML 系統分配到的虛擬終端(第二個參數就是 UML 系統 ID):
uml_mconsole $uml_id config con0
OK pts:/dev/pts/2

然後使用 screen 命令就可以連接到該虛擬終端上(默認什麽都不顯示,需要按回車鍵終端才會出來):
screen /dev/pts/2

如果想在 OpenVZ 主機系統裏直接關閉整個 UML 系統,那也非常簡單:
uml_mconsole shadowsocks halt

後續工作

操作系統制作好之後記得打包備份.

不願意折騰的直接用alpine的rootfs好了,root壞境已經配置好了:
官方網站上的minirootfs裏邊缺openrc等程序,http://dl-cdn.alpinelinux.org/alpine/v3.7/releases/x86_64/alpine-minirootfs-3.7.0-x86_64.tar.gz
推薦使用這裏的版本: http://uk.images.linuxcontainers.org/images/alpine/

運行時報錯:
Checking PROT_EXEC mmap in /dev/shm…Operation not permitted
/dev/shm must be not mounted noexec

解決方法:

mkdir /tmp/uml
chown root.root /tmp/uml
chmod 777 /tmp/uml
export TMPDIR=/tmp/uml

用戶態Linux內核