zoukankan      html  css  js  c++  java
  • 用户态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

  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/makefile/p/umlinux.html
Copyright © 2011-2022 走看看