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内核的更多相关文章

  1. Linux用户态和内核态

    究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...

  2. Linux探秘之用户态与内核态

    一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...

  3. Linux 用户态和内核态

    1.特权级特权级用来管理和控制程序执行.如Intel x86架构的CPU,有0~3四个特权级,0级最高,3级最低.硬件在执行每条指令时都会检查指令具有的特权级.硬件提供了特权级使用机制,对操作系统来说 ...

  4. 【转载】 Linux用户态和内核态

    [说明]转载自 http://my.oschina.net/liubin/blog/27795 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分 ...

  5. Linux操作系统学习_用户态与内核态之切换过程

    因为操作系统的很多操作会消耗系统的物理资源,例如创建一个新进程时,要做很多底层的细致工作,如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录.页表等,这些操作显然不能随便让任何程序都可以做,于是就产 ...

  6. 【Linux 系统】Linux探秘之用户态与内核态

    一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...

  7. (转)linux用户态和内核态理解

    原文:https://blog.csdn.net/buptapple/article/details/21454167 Linux探秘之用户态与内核态-----------https://www.cn ...

  8. Linux 用户态与内核态的交互【转载】

    Linux 用户态与内核态的交互  在 Linux 2.4 版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的,例如iprote2网络管理工具,它与内核的交 ...

  9. linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解

    1.特权级         Intel x86架构的cpu一共有0-4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查.硬件已经提 ...

随机推荐

  1. 数据流(任务并行库 TPL)

    TPL 数据流库向具有高吞吐量和低滞后时间的占用大量 CPU 和 I/O 操作的应用程序的并行化和消息传递提供了基础. 它还能显式控制缓存数据的方式以及在系统中移动的方式. 为了更好地了解数据流编程模 ...

  2. Myeclipse 10安装与破解

    首先下载Myeclipse 10的压缩包,我这里以10.7版本为例.下载路径分享 链接:https://pan.baidu.com/s/1nxf19S9 密码:rqw4 下载好后解压,解压后进行安装. ...

  3. Linux下passwd和shadow文件内容详解

    一./etc/passwd /etc/passwd 文件是一个纯文本文件,每行采用了相同的格式: name:password:uid:gid:comment:home:shell name 用户登录名 ...

  4. js事件绑定函数

    js中事件绑定方法大致有三种: 1.在DOM元素中绑定 <input onclick="alert('在DOM中绑定')" type="button" v ...

  5. tomcat调优(三)

    标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 1.安全优化 降权启动 telnet管理端口保护 ajp连接端口保护 禁用管理端 关闭本地默认 ...

  6. python --- mulitprocessing(多进程)模块使用

    1. 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执 ...

  7. web移动端常见问题解决方案 (转)

    总结:本文总结了web移动端的常见问题并附上解决方案,包括:Meta标签.获取滚动条的值.禁止选择文本.屏蔽阴影.css之border-box.css3多文本换行.Retina屏幕高清图片.html5 ...

  8. mysql安装(CentOS 7.1 (64-bit system) MySQL 5.6.24)

    环境:CentOS 7.1 (64-bit system) MySQL 5.6.24yum install libaio //安装依赖的包wget http://dev.mysql.com/get/m ...

  9. 分析AJAX抓取今日头条的街拍美图并把信息存入mongodb中

    今天学习分析ajax 请求,现把学得记录, 把我们在今日头条搜索街拍美图的时候,今日头条会发起ajax请求去请求图片,所以我们在网页源码中不能找到图片的url,但是今日头条网页中有一个json 文件, ...

  10. HDU 5608 function [杜教筛]

    HDU 5608 function 题意:数论函数满足\(N^2-3N+2=\sum_{d|N} f(d)\),求前缀和 裸题-连卷上\(1\)都告诉你了 预处理\(S(n)\)的话反演一下用枚举倍数 ...