Canary Workshop

Whatever is worth doing at all is worth doing well

OpenVZ下的User Mode Linux运行实战

近来有人折腾出了OpenVZ下通过User Mode Linux运行高版本Linux内核的虚拟系统进而开启BBR给一些黑科技加速。我在这里也尝试了部署,并解决了网上教程的一些问题,现在记录在这里。

0、准备工作

我所采用的VPS是Bandwagon Host的老版服务器,512MB内存,并成功运行。注意User Mode Linux有可能导致违反VPS的TOS导致被封禁。宿主系统我采用Ubuntu 16.04.2,宿主机内核为2.6.32-042stab116.1。

1、配置环境
1
sudo apt-get install build-essential libncurses5-dev bc

这里主要安装了编译环境,为下面的内核编译做准备。

2、编译内核

这里我采用了(此时)最新的内核Linux 4.10.1。编译过程如下:

1
2
3
4
5
6
7
8
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.10.1.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/patch-4.10.1.xz
xz -d linux-4.10.1.tar.xz
tar xvf linux-4.10.1.tar
cd linux-4.10.1
xz -d ../patch-4.10.1.xz | patch -p1
make defconfig ARCH=um
make menuconfig ARCH=um

接下来就是熟悉的内核配置阶段了。这里按照正常开启BBR的方法操作即可,不再赘述。接下来

1
make ARCH=um vmlinux -j2

完成后将得到一个vmlinux文件,将其复制走备用,然后即可删除内核源码及编译目录,以节省空间(大部分OpenVZ的硬盘并不大)。

3、安装Arch Linux

这里的安装方式是采用一个只读的rootfs挂载Bootstrap镜像来安装。截止此时最新的镜像是2017.03,步骤:

1
2
3
4
5
cd
wget http://mirror.rackspace.com/archlinux/iso/latest/archlinux-bootstrap-2017.03-x86_64.tar.gz
tar xzf archlinux-bootstrap-2016.12.01-x86_64.tar.gz
mv root.x86_64 root
sudo vim root/etc/resolv.conf

在文件末尾加入nameserver 8.8.8.8存盘

1
2
3
4
5
6
sudo mount --rbind /proc root/proc
sudo mount --rbind /dev root/dev
sudo mount --rbind /sys root/sys
sudo mount -t tmpfs tmpfs root/tmp
sudo mount --rbind /root root/root
sudo vim root/etc/pacman.d/mirrorlist

将第一个源地址反注释

1
sudo root/bin/arch-chroot root /bin/bash

进入了Arch Linux的chroot环境,接下来使用pacman准备安装系统:

1
2
3
pacman-key --init
pacman-key --populate archlinux
pacman -Sy base

这里修改默认的tty设置,无需screen即可进入系统

1
2
3
4
systemctl enable getty@tty0
systemctl disable getty@tty1
exit
sudo umount root/{dev,proc,sys,tmp}

下面创立一个系统镜像供启动:

1
2
dd if=/dev/zero of=rootfs.img bs=1MB count=2000 #这里我创建了2GB的镜像
mount -o remount,size=2G /dev/shm

至此,Arch Linux安装完毕。

4、配置宿主机网络

确保宿主机支持TUN/TAP,执行:

1
2
3
4
5
6
7
ip tuntap add tap0 mode tap
ip addr add 10.0.0.1/24 dev tap0
ip link set tap0 up
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o venet0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
iptables -t nat -A PREROUTING -i venet0 -j DNAT --to-destination 10.0.0.2

这样做之后会保留22端口供登录宿主机,其余流量一律转发到虚拟系统。

5、配置虚拟系统
1
sudo ./vmlinux root=/dev/root rootfstype=hostfs hostfs=./root ubd0=rootfs.img eth0=tuntap,tap0 mem=256m

等到启动过程完毕后,输入root登录,无需密码,之后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ip link set eth0 up
ip addr add 10.0.0.2/24 dev eth0
ip route add default via 10.0.0.1 dev eth0
mkfs.ext4 /dev/ubda
mount /dev/ubda /mnt
mkdir -p /mnt/var/lib/pacman
pacman -Sy base -r /mnt
pacman -Sy havaged -r /mnt
mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --rbind /dev /mnt/dev
mount -t tmpfs tmpfs /mnt/tmp
mount --rbind /root /mnt/root
chroot /mnt /bin/bash
nano /etc/pacman.d/mirrorlist #修改源设置
nano /etc/systemd/network/50-static.network

加入

1
2
3
4
5
6
[Match]
Name=eth0
[Network]
Address=10.0.0.2/24
Gateway=10.0.0.1

1
sudo nano root/etc/resolv.conf

加入

1
nameserver 8.8.8.8

1
2
3
4
5
6
7
8
9
10
11
12
systemctl enable systemd-networkd
systemctl enable getty@tty0
systemctl disable getty@tty1
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sed -i 's/#en_US.UTF/en_US.UTF/' /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf
echo 'umlarch' > /etc/hostname
nano /etc/hosts
mkinitcpio -p linux
genfstab -U /mnt >> /mnt/etc/fstab
halt
6、收尾

这里我们就获得了一个运行4.10内核的Arch Linux系统,可以使用BBR,可以做什么就很清楚了。新的系统可以使用以下指令启动:

1
sudo ./vmlinux root=/dev/ubda ubd0=rootfs.img eth0=tuntap,tap0 mem=256m

第一次进入系统别忘了初始化pacman

1
2
pacman-key --init
pacman-key --populate archlinux

然后就可以正常安装各类黑科技了~