OpenVZ VPS 安装 User-mode Linux 以实现 BBR 拥塞控制

 

安装 UML

先装工具链:

apt-get install build-essential libncurses5-dev 

因为需要 BBR 先弄到超前版内核树 net-next,还有对应 UML 的内核配置

cd ~ 

git clone git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git  

cd net-next 

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 

make defconfig ARCH=um 

也可以 export ARCH=um,方便一些。

配置内核使用 BBR

make menuconfig ARCH=um 

进入配置菜单,进入 Networking support → Networking options → TCP: advanced congestion control 页面,移到 BBR TCP,按两下空格直到变成 <*> BBR TCP。下方 Default TCP congestion control 回车选 BBR。一路 Exit,保存。

make ARCH=um vmlinux -j2 编译。

UML 中安装 Arch Linux

基本与在 Ubuntu 下安装新 Arch 一样。

先装一个只读的 rootfs

因为 UML hostfs 的限制,hostfs 一定是只读的,而 OpenVZ 也没有 loop 设备,无法直接挂载磁盘镜像,故我们要先装个只读的 rootfs 来启动 UML UML 中挂镜像。(RefPeterCxy Blog

# 先下载 Arch 最新的 Bootstrap 包:

cd ~ 

wget http://mirror.rackspace.com/archlinux/iso/latest/archlinux-bootstrap-2017.02.01-x86_64.tar.gz 

tar xzf archlinux-bootstrap-2017.02.01-x86_64.tar.gz 

mv root.x86_64 root 

vi root/etc/resolv.conf 

# 加上一行 nameserver 8.8.8.8,保存

mount –rbind /proc root/proc 

mount –rbind /sys root/sys 

mount –rbind /dev root/dev 

mount -t tmpfs tmpfs root/tmp 

mount –rbind /root root/root 

nano root/etc/pacman.d/mirrorlist 

# 搜索离你最近的国家镜像,去掉对应的注释

# 进入 chroot

root/bin/arch-chroot root /bin/bash 

# 此时已经进入 chroot 环境

pacman-key –init 

pacman-key –populate archlinux 

# 安装基础系统

pacman -Sy base 

# 改控制台,也可以不改,通过 screen 连接 pts

systemctl enable getty@tty0 

systemctl disable getty@tty1 

# 退出 chroot

exit 

# 解除 rbind

umount root/{dev,proc,sys,tmp} 

此时在 root 文件夹下就有了完整的 rootfs,可以启动 UML 了。

设置网络

首先在主机商的面板(SolusVM)打开 TUN/TAP 功能。一般能做 VPNPPTPL2TP等) VPS 都有这个选项。

之后配置 TAP 设备:

ip tuntap add tap0 mode tap 

ip addr add10.0.0.1/24 dev tap0 

ip route add default via 10.0.0.1 dev venet0:0 

ip link set tap0 up 

iptables -P FORWARD ACCEPT 

iptables -t nat -A POSTROUTING -o venet0:0 -j MASQUERADE 

安装 Arch 到镜像

cd ~/net-next 

dd if=/dev/zero of=rootfs.img bs=1MB count=6000 # 创建一个 6GB 的镜像 

mount -o remount,size=2G/dev/shm # 改一下 tmpfs 大小,防止爆内存

# 启动到 UML

./vmlinux root=/dev/root rootfstype=hostfs hostfs=./root ubd0=rootfs.img eth0=tuntap,tap0 mem=128M 

mem 是内存大小,此处取 128M(可以根据你的内存情况修改)。 
此时已经有 UML shell,可以开始安装系统了。用户名 root,没有密码。

ip link set eth0 up 

ip addr add10.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 # entropy 生成器

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 

vi /etc/pacman.d/mirrorlist # mirrorlist 

编辑网络配置:

vi /etc/systemd/network/50-static.network 

加入

[Match]

Name=eth0

[Network]

Address=10.0.0.2/24 

Gateway=10.0.0.1 

同上,enable 各项服务,配置 时区、locale 等:

vi root/etc/resolv.conf 

# 加上一行 nameserver8.8.8.8,保存

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 # 配置主机名 

vi /etc/hosts # 加入 127.0.1.1 umlarch.localdomain umlarch 

mkinitcpio -p linux # 应该不需要,以防万一 

genfstab -U /mnt >> /mnt/etc/fstab # fstab 

shutdown -h 0 # 关闭 UML 

现在配置已经基本完成,改变一下命令行,从新建的镜像启动:

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

pacman-key –init 

pacman-key –populate archlinux 

搞定。

配置端口转发

先给自己留下 SSH 端口~

iptables -t nat -A PREROUTING -p tcp –dport 22 -j RETURN 

然后其他的端口全转发走啦:

iptables -t nat -A PREROUTING -i venet0 -j DNAT –to-destination10.0.0.2 

发表评论

邮箱地址不会被公开。 必填项已用*标注