小内存OpenVZ VPS使用UML开启BBR
前言
Bottleneck Bandwidth and RTT(BBR)是 Google 最近提交到 Linux 4.9 版本内核的新 TCP 拥塞控制算法,BBR 相对于 Linux 中已经用了好多年的默认 CUBIC 算法的主要改进是在有一定丢包率的网络链路上充分利用带宽,另外也能有效降低延迟。这对于很多使用美帝 VPS + Shadowsocks 爬墙方案的人来说应该还是比较有用的,目前从一些更新了内核开启 BBR 的 KVM VPS 用户的反馈来看效果也还是不错的。
我目前使用的爬墙服务器是 AlphaRacks 的低配 OpenVZ VPS,内存只有 96 MB,到国内的线路质量倒还凑合,OpenVZ 虽然没办法直接升级 kernel ,但看到 AlphaRacks 控制面板里能开启 TUN/TAP,那可以考虑捣鼓使用 User-mode Linux(UML)来开启 BBR 了。
User-mode Linux 和 QEMU 这种虚拟机稍微有点类似,但 UML 是直接将 Linux 内核编译成可执行的 ELF 应用层程序,这样可以直接在普通 Linux 环境中运行及调试其它版本 Linux 内核的功能,有关 UML 的详细信息请参考其官方网站。
提示
不想自己编译 UML 内核和构建 UML rootfs 的朋友可以直接拉到「使用 UML Shadowsocks 系统」这部分哦。
编译 User-mode Linux 内核
准备编译环境
我是直接在 Windows 10 RS2 64 位系统上编译 UML 内核的,使用 Win10 自带的 Bash on Ubuntu 14.04 环境编译还是非常方便的,而且编译速度相比使用虚拟机也是快了很多。
首先安装编译需要的软件包:
备注
由于我使用的 OpenVZ VPS 系统是 32 位的,所以这里安装
libc-dev
和libvdeplug-dev
开发包时都指定了使用 32 位版本;如果你需要编译 64 位版本的 UML 内核,那把下面的-i386
去掉即可。
zzm@ZZM-P238:~$ sudo apt-get install build-essential libncurses5-dev libc6-dev-i386 libvdeplug-dev-i386
这里安装 libvdeplug-dev
开发包是为了支持 UML 的 Virtual Distributed Ethernet(VDE)模式网卡设备,VDE 主要是为了让 UML 的网络功能在类似 Docker 这种连 TUN/TAP 都不支持的系统上也能工作起来。
接着可以下载最新 Linux 4.10.1 版本内核源代码,并解压缩准备配置内核选项,4.10.1 版本源代码解压之后不到 800 MB。
提示
如果像我一样直接在 Win10 Bash 环境中编译,那么最好将内核源代码解压到 Win10 Bash 的 VolFs 文件系统中(也就是 Ubuntu rootfs 目录,一般直接 cd 到
HOME
主目录即可)。
UML 内核配置
如果使用默认的 UML 内核配置是比较简单的,直接下面两步即可,第二步内核配置界面里可以手工开启 BBR 功能:
zzm@ZZM-P238:~/linux-4.10.1$ cp arch/um/configs/i386_defconfig .config zzm@ZZM-P238:~/linux-4.10.1$ make menuconfig ARCH=um
不过为了能编译出体积最小又能满足 BBR 爬墙需要的 kernel,我还是使用自己修改的最小配置,首先将下面的内容保存为 mini.config
文件(如果需要编译 64 位 kernel,那直接把开头的 CONFIG_64BIT=n
这一行去掉即可):
zzm@ZZM-P238:~/linux-4.10.1$ cat 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 支持,去掉了所有的网卡设备驱动;
- 去掉了几乎所有的内核调试信息。
然后使用 mini.config
生成新的内核配置文件:
zzm@ZZM-P238:~/linux-4.10.1$ make ARCH=um allnoconfig KCONFIG_ALLCONFIG=mini.config
编译内核
内核选项配置完毕之后,编译就非常简单了:
zzm@ZZM-P238:~/linux-4.10.1$ make ARCH=um vmlinux -j4
这里我开启了 4 个并发编译(make 的 -j4
参数)支持,UML 的 vmlinux 可执行程序在我的笔记本上不到 4 分钟就编译完成了,最终编译出来的 vmlinux 文件大小大概为 3 - 4 MB。
你可以试着运行编译出来的 vmlinux 可执行程序查看编译时使用的内核配置:
[root@localhost ~]# ./vmlinux --showconfig
准备 UML rootfs
准备 rootfs 和 shadowsocks-libev
既然 UML 内核我都是按最小化编译的,那运行的 rootfs 自然不能用像 Ubuntu、CentOS 那种「庞大」的系统了,这里我直接使用最小化的 busybox rootfs + Shadowsocks 服务端程序和运行库的方式,除了 busybox 基础环境和 Shadowsocks 服务端程序基本没有添加任何其它东西。
最终我将 UML vmlinux 内核文件和 rootfs 目录一起压缩打包起来大小也不过才 3 MB,这样能非常方便地上传到 VPS 上和分享给其他人。当然缺点就是如果需要安装其它的软件那只能手工拷贝到 rootfs 目录中了。
具体 busybox rootfs 的制作方法这里我就不做详细说明了,感兴趣的朋友可以参考相关的文档了解一下,我分别制作了 32 位和 64 位的 busybox rootfs 目录。
另外为了减少 UML 系统的程序依赖和内存占用,Shadowsocks 服务端我选择的是 shadowsocks-libev,这里我也分别编译了最新 3.0.3 版本 32 位和 64 位的服务端程序。
32 位 shadowsocks-libev 我是在 32 位 Ubuntu 14.04 系统下编译的,依赖的动态库也是使用的 Ubuntu 14.04 自带的库文件;64 位 shadowsocks-libev 则是在 64 位 CentOS 6 系统下编译的,所以 64 位运行库版本和 32 位的不同。你问我为什么不用同一个系统?因为我刚好有这两个系统的 VPS 能用来编译,实在是懒的换了 ^_^。
测试 UML rootfs
由于 OpenVZ 系统内核不支持 loop 设备,不能挂载文件系统映像进行修改,这里我直接使用 UML 的 hostfs 将 OpenVZ 主机系统的一个目录设为 UML 系统的 rootfs。
现在 UML hostfs 并没有某些网友说的存在只读的限制,而且相比使用 loop 设备或者 ubd 文件系统这种方式,hostfs 并不需要预先产生一个很大的文件,主机也能直接修改 UML rootfs 目录内容,UML 内核也根本不需要支持 ext3、ext4 这种真实的文件系统,综合比较下来实在是没有什么理由不用 hostfs。
首先安装 UML 工具 uml-utilities
软件包,后面的 tunctl
和 uml_mconsole
等命令会用到:
root@zohead:~# apt-get install uml-utilities
接着可以配置 OpenVZ 系统上的 TUN/TAP 虚拟网卡和开启端口转发:
root@zohead:~# tunctl -u root Set 'tap0' persistent and owned by uid 0 root@zohead:~# ifconfig tap0 192.168.0.3 up root@zohead:~# echo 1 > /proc/sys/net/ipv4/ip_forward root@zohead:~# iptables -t nat -I POSTROUTING -o venet0 -j MASQUERADE root@zohead:~# iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 9443 -j DNAT --to-destination 192.168.0.4 root@zohead:~# iptables -t nat -A PREROUTING -i venet0 -p udp --dport 9443 -j DNAT --to-destination 192.168.0.4
备注
上面的命令中假设 TUN/TAP 虚拟网卡 IP 地址为
192.168.0.3
(可以自行修改),UML 系统网卡 IP 地址为192.168.0.4
(需要和 TUN/TAP 虚拟网卡地址在同一网段),只将 OpenVZ 主机系统上9443
端口的 TCP 和 UDP 数据转发到 UML 系统网卡上。
最后是启动 UML 系统的例子:
root@zohead:~# ./vmlinux-i686 umid=shadowsocks root=/dev/root rootfstype=hostfs rootflags=/root/umlfs-i686 rw mem=48M init=/sbin/init eth0=tuntap,tap0
简单说明一下 UML vmlinux 程序的参数:
umid
参数指定 UML 系统 ID,建议每个 UML 系统都使用的固定的 ID,不然每次运行都会在~/.uml
目录下产生新的临时目录;rootflags
参数指定 UML rootfs 路径,这里 必须 使用绝对路径;mem
参数指定 UML 系统的内存大小,经过我的测试,只运行 shadowsocks-libev 服务端的话就算分配 32 MB 内存看起来也没什么压力;init
参数指定 UML 系统的 init 进程,不建议修改;eth0=tuntap,tap0
则是指定 UML 的 tuntap 模式网卡,使用 OpenVZ 主机系统的tap0
虚拟网卡设备。
使用 UML Shadowsocks 系统
uml-linux.sh 脚本
为了使用起来方便,我把启动 UML 系统和设置端口转发的操作写成了一个 uml-linux.sh
脚本,这样 OpenVZ 系统启动之后可以根据配置自动运行并配置端口转发:
#!/bin/sh UML_ID="shadowsocks" TAP_DEV="tap0" ROUTER_DEV="venet0" TAP_ADDR="192.168.0.3" UML_ADDR="192.168.0.4" REV_TCP_PORTS="" REV_UDP_PORTS="" FWD_TCP_PORTS="9443" FWD_UDP_PORTS="9443" DIR="$( cd "$( dirname "$0" )" && pwd )" [ ! -d /sys/class/net/$TAP_DEV ] && tunctl -t $TAP_DEV ifconfig $TAP_DEV $TAP_ADDR up echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -I POSTROUTING -o $ROUTER_DEV -j MASQUERADE for i in $REV_TCP_PORTS; do if [ "x$i" = "x*" ]; then P_TMP="" else P_TMP="--dport $i " fi iptables -t nat -A PREROUTING -p tcp $P_TMP-j RETURN done for i in $REV_UDP_PORTS; do if [ "x$i" = "x*" ]; then P_TMP="" else P_TMP="--dport $i " fi iptables -t nat -A PREROUTING -p udp $P_TMP-j RETURN done for i in $FWD_TCP_PORTS; do if [ "x$i" = "x*" ]; then P_TMP="" else P_TMP="--dport $i " fi iptables -t nat -A PREROUTING -i $ROUTER_DEV -p tcp $P_TMP-j DNAT --to-destination $UML_ADDR done for i in $FWD_UDP_PORTS; do if [ "x$i" = "x*" ]; then P_TMP="" else P_TMP="--dport $i " fi iptables -t nat -A PREROUTING -i $ROUTER_DEV -p udp $P_TMP-j DNAT --to-destination $UML_ADDR done nohup $DIR/vmlinux-i686 umid=$UML_ID root=/dev/root rootfstype=hostfs rootflags=$DIR/umlfs-i686 rw mem=48M init=/sbin/init con=pts eth0=tuntap,$TAP_DEV,,$UML_ADDR &
一般只要修改脚本最开始的几行配置即可(最后一行 vmlinux 程序和 UML rootfs 路径默认使用脚本所在路径,如果不同请自行修改):
TAP_ADDR
为 TUN/TAP 虚拟网卡地址,UML_ADDR
为 UML 系统内网卡地址;REV_TCP_PORTS
和REV_UDP_PORTS
分别指定 OpenVZ 主机系统需要保留哪些 TCP 和 UDP 端口不转发到 UML 系统(多个以空格隔开),一般如果 UML 系统使用固定的一些端口,那么默认留空即可;FWD_TCP_PORTS
和FWD_UDP_PORTS
分别指定哪些 TCP 和 UDP 端口需要转发到 UML 系统(默认只写了一个9443
,实际如果需要多个则以空格隔开),如果需要指定端口范围也可以写成15000:20000
,如果需要所有端口都转发到 UML 系统那可以直接写成*
(此时REV_TCP_PORTS
一般最少要留一个端口用于 SSH 远程登录);- 需要分配给 UML 系统的内存大小请自行修改 vmlinux 的
mem
参数。
UML Shadowsocks 系统配置
另外 UML 系统内部的网卡地址配置及启动 shadowsocks-libev 服务端的操作都在 /etc/rc.local
脚本中:
#!/bin/sh if [ -d /sys/class/net/eth0 ]; then ifconfig eth0 192.168.0.4 up route add default gw 192.168.0.3 dev eth0 sleep 2 fi SS_DNS="" [ -f /etc/default/pdnsd ] && . /etc/default/pdnsd # start local DNS server if needed if [ "x$START_DAEMON" = "xyes" -o "x$START_DAEMON" = "xYES" ]; then pdnsd -d [ $? -eq 0 ] && SS_DNS="-d 127.0.0.1 " fi for i in `ls /etc/shadowsocks-libev/*.json 2>/dev/null`; do SS_NAME=`basename $i .json 2>/dev/null` start-stop-daemon -n shadowsocks-$SS_NAME -x ss-server -b -S -- -c $i -u $SS_DNS--fast-open done exit 0
简单说明一下:
- 这里的
192.168.0.4
网卡 IP 地址就对应上面的UML_ADDR
,192.168.0.3
网关地址就是TAP_ADDR
,因此如果上面脚本中的地址修改了,那么 UML rootfs 的/etc/rc.local
中的地址也需要修改; - 你可以将 shadowsocks-libev 配置文件放到
/etc/shadowsocks-libev
目录中,此脚本会自动遍历并一一启动ss-server
服务器,同时默认也开启了 TCP Fast Open 和 UDP 转发; - 另外 rootfs 里集成了
pdnsd
DNS 服务器,如果需要实现 DNS 缓存加速或者 UML 系统的 UDP DNS 解析存在问题,都可以启用pdnsd
本地 DNS 服务器。
配置修改完成之后,运行 uml-linux.sh
脚本就会在后台启动 UML 系统,并根据需要自动启动 shadowsocks-libev 服务器。
控制 UML 系统
如果你需要登录到 UML 系统,可以先用 uml_mconsole
命令得到 UML 系统分配到的虚拟终端(第二个参数就是 UML 系统 ID):
root@zohead:~# uml_mconsole shadowsocks config con0 OK pts:/dev/pts/2
然后使用 screen
命令就可以连接到该虚拟终端上(默认什么都不显示,需要按回车键终端才会出来):
root@zohead:~# screen /dev/pts/2
如果想在 OpenVZ 主机系统里直接关闭整个 UML 系统,那也非常简单:
root@zohead:~# uml_mconsole shadowsocks halt
UML Shadowsocks 系统下载
为了方便大家使用,我把 32 位和 64 位的 UML 4.10.1 版本 vmlinux 内核程序及配置和 Shadowsocks 服务端 rootfs 目录、uml-linux.sh
脚本一起打包分享给大家。
32 位的 UML Shadowsocks 系统(百度网盘备用):
https://zohead.com/downloads/uml-shadowsocks-i686.tar.xz
https://pan.baidu.com/s/1kVdoWcB
64 位的 UML Shadowsocks 系统:
https://zohead.com/downloads/uml-shadowsocks-x64.tar.xz
https://pan.baidu.com/s/1dFDta9N
将上面的文件下载到 VPS 某个目录并解压缩,修改 uml-linux.sh
文件中的转发端口,将 Shadowsocks 服务端配置文件放到 rootfs 的 /etc/shadowsocks-libev
目录,之后以 root 身份运行 uml-linux.sh
脚本即可。
提示
如果需要让 ShadowsocksR 服务器使用 TCP 等方式进行域名解析,可以修改
/etc/default/pdnsd
文件将其中的START_DAEMON
改为yes
来启用pdnsd
本地 DNS 服务器。
UML ShadowsocksR 系统
考虑到某些网友的需要,我还生成了 32 和 64 位的 UML ShadowsocksR 系统,都是使用的最新支持混淆的 Python 版本 ShadowsocksR 服务器,有需要的朋友可以下载测试(百度网盘为备用下载地址)。
32 位的 UML ShadowsocksR 系统:
https://zohead.com/downloads/uml-shadowsocksr-i686.tar.xz
https://pan.baidu.com/s/1eSDrWye
64 位的 UML ShadowsocksR 系统:
https://zohead.com/downloads/uml-shadowsocksr-x64.tar.xz
https://pan.baidu.com/s/1o7F3qpc
ShadowsocksR 系统的 rootfs 只包含了基础 Python 环境和 ShadowsocksR 服务器程序,同样下载并解压缩,由于包含了 Python 环境,该 rootfs 解压缩之后接近 30 MB。
使用前可根据需要修改 uml-linux.sh
文件中的转发端口,将 ShadowsocksR 服务器 JSON 格式配置文件放到 rootfs 的 /etc/shadowsocks
目录,之后以 root 身份运行 uml-linux.sh
脚本即可(启用 pdnsd
本地 DNS 服务器的方法和上面的相同)。
UML 系统 BBR 效果
最后对比一下我的 AlphaRacks OpenVZ VPS 上启用 BBR 前后的对比速度,这里我就直接观看同一个 1080p 的 YouTube 视频来对比统计信息了。
在我的江苏移动宽带环境下,启用 BBR 之前 YouTube 视频连接速度一般只能跑到 1Mbps 左右:
而在使用 UML Shadowsocks 系统开启 BBR 之后能跑到 2Mbps,不过有的时候速度还是不太稳定:
UML 目前也是主要用于调试验证 Linux 内核功能的,总之 OpenVZ 使用 UML 开启 BBR 的实际使用效果还是需要长期观察测试的,本文也主要关注 UML 系统下使用 Shadowsocks 的问题,并没有考虑通用的情况,如果文章中有任何问题还请提出指正,祝大家玩的开心。
feifei:
2017年03月10日 星期五 08:35下午
http://www.feifeiss.com/code 注册即可享受60G 60天的免费试用
Das:
2017年03月13日 星期一 11:38上午
libvdeplug2-dev-i386 跟你一样用的windows10 bash 但提示
Unable to locate package libvdeplug2-dev-i386
Uranus Zhou:
2017年03月13日 星期一 11:45上午
不好意思,应该是 libvdeplug-dev-i386(安装命令里贴错了,下面提示信息里是正确的),我修改一下,库文件包是 libvdeplug2 或者 libvdeplug2-i386;
如果你是直接编译 64 位的 UML vmlinux,那就不用加 i386 后缀了。
孤狼吠月:
2017年03月15日 星期三 04:00下午
楼主可以详细的写一下 rootfs 怎么构建的吗? 我打算用 Debian 8 x64 构建一个,但是目前不知道应该怎么动手? 谢谢
Uranus Zhou:
2017年03月15日 星期三 05:47下午
我这里用的都是基于 busybox 构建的 rootfs,为了能最小的体积实现特定的功能;
如果你要用 Debian 8 x64,可以 Docker 部署一个基础的 Debian 系统,或者到网上下载做好的基础 Debian 8 rootfs 映像,
有别人分享的做好的 UML rootfs 映像:Linux Filesystems: Distribution Disk Images;
或者也可以自己手动制作:User Mode Linux on Debian Jessie。
孤狼吠月:
2017年03月15日 星期三 06:38下午
楼主要么写一下这个 busybox 的 rootfs 制作过程?很喜欢这个小巧的 rootfs,干净简单够用, 包括编译 shadowsocks-libev 之后怎么知道哪些动态链接库应该要放到 rootfs 里面呢? 没有这些动态链接库,ss 应该在 uml 里面跑不起来吧
Uranus Zhou:
2017年03月15日 星期三 07:13下午
额,这个相关的东西就比较多了,要对 Linux 启动和文件系统之类的有些了解,可以参考 Linux Journal 上的几篇文章学习一下:
Building Tiny Linux Systems with Busybox--Part I
Building Tiny Linux Systems with Busybox, Part 2: Building the Kernel
Building Tiny Linux Systems with BusyBox, Part 3
编译完成之后用
ldd
命令可以看到程序依赖的动态库;如果
shadowsocks-libev
是静态编译的话,就不需要专门增加这些动态链接库了;这里我的 rootfs 用动态库也是为了加别的程序方便,不需要都用静态编译的程序。
Das:
2017年03月16日 星期四 03:16下午
怎么才能设置成开机启动啊?我在/etc/rc.local 里添加了 /root/uml-linux.sh 开机没反应。但直接执行是没有问题的
Uranus Zhou:
2017年03月16日 星期四 03:25下午
我的VPS上就是改 /etc/rc.local 文件开机启动的,你的VPS是什么系统?可能 uml-linux.sh 没有加执行权限?可以 ifconfig -a 看看 tap0 网卡有没有起来
Das:
2017年03月16日 星期四 04:09下午
我用的 ubuntu-14.04-x86-minimal系统,查看tap0网卡是有的。
Uranus Zhou:
2017年03月16日 星期四 04:44下午
不太确定哪里不对了,可以先停止 UML Linux 系统,删除
/nohup.out
文件,把
/etc/rc.local
里改成类似/root/uml-linux.sh >/root/uml.out 2>&1
这样输出到文件的形式然后重启系统,运行
ifconfig -a
看看 tap0 网卡 IP 地址对不对,运行iptables -t nat -L
确认转发规则是否正确设置了,然后看看
/nohup.out
和/root/uml.out
文件有没有什么错误了。Das:
2017年03月17日 星期五 10:16上午
按照你说的方法试了下,tap0 网卡 IP 地址是对的,转发规则也真确。不知道是不是这里错了
make_uml_dir : no value in environment for $HOME
Uranus Zhou:
2017年03月17日 星期五 10:27上午
UML vmlinux 运行时需要在
$HOME/.uml
目录下创建临时目录和产生一些文件,应该是$HOME
环境变量没正确设置导致的;你可以在
/root/uml-linux.sh
前面加上一句:export HOME="/root"
再重启试试效果。
Das:
2017年03月17日 星期五 10:39上午
OK,解决,谢谢了!
Uranus Zhou:
2017年03月17日 星期五 10:47上午
不客气,也可以把
uml-linux.sh
脚本最后一行改一下,直接指定 uml_dir:nohup $DIR/vmlinux-i686 umid=$UML_ID uml_dir=$DIR/.uml root=/dev/root rootfstype=hostfs rootflags=$DIR/umlfs-i686 rw mem=48M init=/sbin/init con=pts eth0=tuntap,$TAP_DEV,,$UML_ADDR &
这样不指定
$HOME
环境变量也没关系了。Eric:
2017年03月18日 星期六 07:21上午
64 位的 UML ShadowsocksR 系统 解压还是SS程序啊? 怎么‘回事?
Uranus Zhou:
2017年03月18日 星期六 09:57上午
可执行程序名字是一样的,是用 shadowsocksr-libev 编译的
jleewin95:
2017年03月20日 星期一 12:10下午
博主你好,我编译 UML 内核时出错,请教怎么解决
linux-4.9.16# make menuconfig ARCH=um
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/mconf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTLD scripts/kconfig/mconf
scripts/kconfig/mconf arch/x86/um/Kconfig
kernel/time/Kconfig:155:warning: range is invalid
configuration written to .config
*** End of the configuration.
*** Execute ‘make’ to start the build or try ‘make help’.
----------------------------
我尝试了4.10 和4.9 的内核,都报错
kernel/time/Kconfig:155:warning: range is invalid
就算用了make defconfig ARCH=um
也是同样错误
恳请博主帮助
Uranus Zhou:
2017年03月20日 星期一 12:18下午
range is invalid 只是警告,make menuconfig 和 defconfig 都只是配置内核选项,真正编译是运行 make ARCH=um;
make menuconfig 有没有出现配置界面?
jleewin95:
2017年03月20日 星期一 05:59下午
多谢博主解疑!
这个warning困扰了我两天,google了一堆也没发现答案…
原来是可以忽略的啊~
menuconfig正常,我选择了tcp中的bbr,然后编译OK
然后又用了博主的mini.config,同样OK
------
接下来准备按照博主的教程搞定shadowsocks
thanks a lot!
zavier:
2017年03月22日 星期三 02:14下午
编译内核时出错了,求助大佬:
ld -r -dp -o arch/um/drivers/vde.o arch/um/drivers/vde_kern.o arch/um/drivers/vde_us
er.o -m elf_i386 -r /usr/lib/gcc/x86_64-linux-gnu/6/../../../../lib/libvdeplug.a
ld: Relocatable linking with relocations from format elf64-x86-64 (/usr/lib/gcc/x86_ 64-linux-gnu/6/../../../../lib/libvdeplug.a(libvdeplug.o)) to format elf32-i386 (arch/um/drivers/vde.o) is not supported
arch/um/drivers/Makefile:30: recipe for target ‘arch/um/drivers/vde.o’ failed
make[1]: *** [arch/um/drivers/vde.o] Error 1
Makefile:988: recipe for target ‘arch/um/drivers’ failed
make: *** [arch/um/drivers] Error 2
Uranus Zhou:
2017年03月22日 星期三 02:34下午
编译32位UML Linux内核要安装 libvdeplug-dev-i386 包(假设编译所用的系统是64位的),64位系统下编译64位UML内核用 libvdeplug-dev 包。
zavier:
2017年03月22日 星期三 05:39下午
编译又出现了一个错误,能在帮我看一下吗,十分感谢!
/usr/bin/ld: arch/um/drivers/built-in.o: relocation R_X86_64_32 against `.rodata
.str1.1′ can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Makefile:969: recipe for target ‘vmlinux’ failed
Uranus Zhou:
2017年03月22日 星期三 10:40下午
这个的前面应该有别的报错吧?你的编译环境是什么样的?是编译64位的UML内核?
可以运行这个命令看看:
file arch/um/drivers/built-in.o
可以 make clean 之后再重新编译试试
zavier:
2017年03月23日 星期四 10:18上午
抱歉,提问时没有给足够的信息给你。昨天的问题查了好久没解决,今天编译又出了新的错误,我这方面太菜不想折腾了。。。还是十分感谢博主的热心帮助
Uranus Zhou:
2017年03月23日 星期四 11:52上午
简单点可以直接下载我编译好的那个内核文件和 rootfs。
wu先生:
2017年03月23日 星期四 02:35下午
技术文。收藏备用。
谢谢:
2017年03月24日 星期五 10:46上午
博主。ss应该怎么配置呢,我不管怎么换端口,都没法连接上uml里的ss。访问主机内的ss没问题。
从uml里可以访问外部网络,外部网络和主机能够ping通
用的是你的64位版本,ubuntu 16.04.
我的理解是,ss本地端口填9443,server地址填host的ip,服务端的ss配置文件里监听端口也是9443。
bhlis:
2017年03月24日 星期五 11:23上午
SSR-libev 的版本只是客户端支持SSR,服务端跟无混淆的一样,见https://github.com/breakwa11/shadowsocks-rss/wiki说明,服务端只有python版本。
能帮忙编译一个uml可用的python吗,自己尝试不成功,Python的动态链接库太多了。谢谢!
Uranus Zhou:
2017年03月24日 星期五 11:31上午
SS 配置里的本地端口(local_port)是无所谓的,server_port 需要和
uml-linux.sh
脚本里设置的端口一致(默认 9443);你可以在 host 端运行
iptables -t nat -L
命令确认端口映射是否正确。Uranus Zhou:
2017年03月24日 星期五 11:43上午
谢谢指出,一直也没用这个 SSR 的服务端;
Python 不用自己编译,可以把 32 位(Ubuntu 14.04)或 64 位(CentOS 6)系统里 Python 包的所有文件及依赖库拷到 UML rootfs 目录中;
只是稍微有些麻烦,我有空时可以再把 SSR 的 UML rootfs 更新一下。
Uranus Zhou:
2017年03月24日 星期五 11:44下午
我制作了 32 和 64 位 ShadowsocksR Python 服务器版本的 UML rootfs 包(包含 Python 环境),文章中的链接也已经更新;
可将 ShadowsocksR 服务器 JSON 配置文件(支持多个文件)放到
/etc/shadowsocks
目录启动 UML 系统即可。firebotao:
2017年03月25日 星期六 03:50上午
请问下,我按照教程做到最后一步运行uml-linux.sh时,出现下面的提示,怎么解决,此时ss连接不通,谢谢。
[root@256OVZ ~]# bash uml-linux.sh
uml-linux.sh: line 14: tunctl: command not found
SIOCSIFADDR: No such device
tap0: unknown interface: No such device
tap0: unknown interface: No such device
[root@256OVZ ~]# nohup: appending output to `nohup.out’
Uranus Zhou:
2017年03月25日 星期六 12:42下午
你的 VPS 系统缺少 tunctl 命令,需要安装 uml-utilities 软件包。
firebotao:
2017年03月25日 星期六 01:23下午
你好,我用的是centos 64位系统,需要安装 uml-utilities 这个软件包,我是否要换成ubuntu系统?centos上面提示没apt-get这个命令。
Uranus Zhou:
2017年03月25日 星期六 01:29下午
yum install 就行,用 VPS 这些基础命令要了解的。
firebotao:
2017年03月25日 星期六 01:37下午
yum install我试过很多次不行哦,提示没这个东东
root@256OVZ ~]# yum install uml-utilities
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
* base: http://ftp.cuhk.edu.hk
* extras: http://ftp.cuhk.edu.hk
* updates: http://ftp.cuhk.edu.hk
No package uml-utilities available.
Error: Nothing to do
Uranus Zhou:
2017年03月25日 星期六 05:40下午
额,CentOS 下的软件包名直接就是 tunctl。
stranger:
2017年05月13日 星期六 03:45下午
請問樓主,如果我想同時擁有IPV6,配置 OpenVZ 系统上的 TUN/TAP 虚拟网卡和开启端口转发該如何修改呢?
Uranus Zhou:
2017年05月13日 星期六 05:50下午
不好意思,这个 UML Linux 内核在编译的时候我没启用 IPv6,你需要先修改配置启用 IPv6 编译出新的 vmlinux 文件;
然后把 uml-linux.sh 还有 hostfs 里面的 /etc/rc.local 脚本中的 IP 地址换成 IPv6 的。