用戶態Linux內核
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,保存退出。
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內核