• 用户态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,保存退出。
    不过为了能编译出体积最小又能满足 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

  • 相关阅读:
    关于Android线程间通信
    关于代码重构
    Android读书笔记01
    回忆 2012年写的
    我的笑 -- 2007年写的?
    伊人笑 2010年
    血色青春 2012年
    隔夜听雨
    错乱的爱 2010年
    【前端JS、后台C#】编码解码。
  • 原文地址:https://www.cnblogs.com/makefile/p/umlinux.html
Copyright © 2020-2023  润新知