• User Mode Linux – 一个用户态的 Linux 内核


    User Mode Linux 可以在用户态启动一个 Linux。这使我们能在类似 OpenVZ 虚拟化技术的系统上,使用最新的 Linux 内核;甚至可以在非 root 用户下启动。

    但有些 OpenVZ VPS 的 TOS 可能不允许你这么做;另外,这样可能会有一定的性能损失。

    准备 rootfs 镜像

    我们找一台 Ubuntu Server 来准备 rootfs。这个时候需要有 root 权限,因为你需要 mount 一个 loop 文件系统,chroot 改点东西之类的。

    # 下载镜像
    wget http://uk.images.linuxcontainers.org/images/alpine/3.1/amd64/default/20170305_17:50/rootfs.tar.xz
    # 安装解压软件
    apt install xz-utils
    # 创建镜像,32 M 对于 alpine 是够用的
    dd if=/dev/zero of=rootfs.img bs=1M count=32
    mkfs.ext4 rootfs.img
    # 把镜像挂到 loop 上
    mkdir rootfs
    sudo mount -o loop rootfs.img rootfs
    sudo tar xvf rootfs.tar.xz -C rootfs
    # 给 root 设个密码
    sudo chroot rootfs /bin/sh
      passwd
      exit
    # 清理
    sudo umount rootfs
    rmdir rootfs
    

    此时 rootfs.img 已经做好了。

    编译内核

    我们继续用 ubuntu server 来编译 UML 内核。

    sudo apt install build-essential kernel-package fakeroot libncurses5-dev libssl-dev ccache
    # 抓内核源码
    wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.10.1.tar.xz
    tar xvf linux-4.10.1.tar.xz
    cd linux-4.10.1
    make defconfig ARCH=um
    make menuconfig ARCH=um
    # 这里会出来一个界面让你配置内核,有茫茫多的参数可以选
    # 大概找一些 linux 内核编译的文章可以参考吧
    # 主要是 User Mode Linux 有一些特殊选项可以注意下,比如强制静态编译什么的
    # 然后就开始正式编译啦
    make ARCH=um
    strip linux # 移除调试符号
    

    编译过程可能比较慢。有时候会有一些库找不到啥的,apt 装一下就好。

    获取 slirp

    slirp 是用来在没有 root 的情况下联网的。

    apt source slirp
    

    这里获取到的 slirp 放到目标机器上编译,不需要在 ubuntu server 上搞了。

    cd slirp-1.0.17/src
    ./configure
    make CFLAGS="-I. -DUSE_PPP -DUSE_MS_DNS -DFULL_BOLT -fno-strict-aliasing -Wno-unused -std=gnu89" clean all
    

    启动 UML

    现在万事俱备,只欠东风了。

    # 在 UML Host 上
    # 把一些二进制文件放好
    slirp=/home/oott123/uml/slirp/slirp-1.0.17/bin/slirp
    uml=/home/oott123/uml/kernel/linux-4.10.1/linux
    rootfs=/home/oott123/uml/alpine/rootfs.img
    cow=/home/oott123/uml/machine/demo/data.cow # 放 copy-on-write 数据的地方
    export TMPDIR=/tmp
    $uml rw ubda=$cow,$rootfs mem=128M eth0=slirp,,$slirp
    

    配置网络

    启动之后你可能会发现没有网络。不用担心,改改网络配置:

    # 在 UML 里
    vi /etc/network/interfaces
    #####
    auto eth0
    iface eth0 inet static
    address 10.0.2.15
    gateway 10.0.2.2
    netmask 255.255.255.0
    dns-nameservers 10.0.2.3
    hostname $(hostname)
    #####
    /etc/init.d/networking restart
    echo 'nameserver 114.114.114.114' > /etc/resolv.conf
    # 测试网络
    wget -O- myip.ipip.net
    # 安装软件
    apk update
    apk add curl
    curl myip.ipip.net
    # 关闭 UML
    halt
    

    与主机交互

    或许你需要将 UML 内的端口转发到主机上。

    # 在主机上
    vi ~/.slirprc
    redir 2222 22
    

    或许你需要访问主机的文件系统。

    # 在 UML 上,把 UML 内的 /mnt/home 映射到 /home
    # 注意权限问题、注意两边不要同时读写
    mkdir /mnt/home
    mount none /mnt/home -t hostfs -o /home
  • 相关阅读:
    2019-2020-1 20175317 《信息安全系统设计基础》第二周学习总结
    2019-2020-1 20175317 《信息安全系统设计基础》第一周学习总结
    2018-2019-2 20175317 实验五《网络编程与安全》实验报告
    20175317 《Java程序设计》个人项目
    回文数
    勾股数
    四方定理
    尼科彻斯定理
    实现mypwd
    2019-2020-1 20175301 20175305 20175318 实验五 通讯协议设计
  • 原文地址:https://www.cnblogs.com/dream397/p/14251536.html
Copyright © 2020-2023  润新知