
网上关于qemu运行openwrt的教程很多,但是在安卓手机上qemu运行openwrt一直找不到,为此我进行了长时间的探索学习,终于有了一些成果。
拿出我的吃灰手机
红米note4x 3+32 安卓11
查询得知
高通骁龙625 8x ARM Cortex A53, Octa-core CPU,单核频率最高可达2.0GHz,14nm FinFET制程,GPU Adreno 506 支持Cat.7 LTE网络 arm64位 也就是aarch64架构
授人与鱼,不如授人与渔,所以下面命令我都会有解释。很多时候大家可以玩出不一样的玩法
我弄懂这些都花了好几周,零零碎碎资料整合起来了
本次用到的工具是termux 安卓7 (API 24) 及以上版本,旧版本系统使用本镜像可能导致程序错误。
替换国内清华源参考 https://mirrors.tuna.tsinghua.edu.cn/help/termux/
全程在手机上复制粘贴也可以的,全程只有手机复制粘贴的可以跳过看下面的正戏开始。
但是为了方便,我们可以给手机安装ssh然后在电脑上操作
更改密码(或者说设定初始密码)termux输入
passwd
会显示这样(设置密码的时候,输入不显示的):
New password:
Retype new password:
New password was successfully set.
安装openssh
pkg upgrade
pkg install openssh
sshd 当然,喜欢在手机上慢慢敲命令的可以不装
执行sshd就是打开ssh服务,就可以连接ssh了
可以再输入一条
echo "sshd" >> ~/.bashrc 这样每打开终端会自动运行一次sshd
需要注意的是,我们平常开启的ssh服务端口是22,但是Termux开启的ssh服务端口是在8022
接着我们执行 ifconfig 查看自己的ip地址(若是需要连接电脑和手机需要在同一个的WiFi下)
这个每个人可能不同的,需要自己看上面显示换ip,比如我是192.168.42.129,你要把它换成你显示的手机ip
而我是拿它供网的,usb共享给路由器,也可以热点,然后电脑连上。最好是手机连路由器wifi,然后电脑连路由器,在同局域网就行,搞好以后甚至可以做给电脑做旁路由
这个时候换到电脑的终端输入了,我的电脑系统win10,自带ssh。在cmd或者powershell窗口上执行
ssh root@192.168.42.129 -p 8022 手动输入yes回车,输入密码回车连上了
当然,后面方便用xshell了,保存一次以后双击连接。
带“#”开头的整行都是注释用的话,可以不复制到终端运行
#更新源
apt-get update
#你可以查看qemu有什么包,可以根据自己的需求安装模拟其他架构
apt search qemu
#安装qemu工具包
apt install qemu-utils
#当然,我的是arm64位架构的,模拟arm的性能损耗会更低
#安装模拟aarch64架构的
apt install qemu-system-aarch64-headless
#安装x86_64架构的
apt install qemu-system-x86-64-headless
#首先进行arm架构的教程
#这里先采用官方releases版固件,你们成功后可以换其他充满插件的固件、或者手动构建armvirt镜像,替换执行命令里固件名字就行了
#下载arm固件
wget https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/19.07.8/targets/armvirt/64/openwrt-19.07.8-armvirt-64-root.ext4.gz
#(额,可能提示The program wget is not installed.那就执行pkg install wget安装wget后,再下载)
#解压
gzip -d openwrt-19.07.8-armvirt-64-root.ext4.gz
#arm与X86不同的是,X86会有ext4-combined一个映像就行,arm需要指定kernel,所以还要内核镜像。你们使用自己编译的固件时,记得也把内核文件复制到手机
wget https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/19.07.8/targets/armvirt/64/openwrt-19.07.8-armvirt-64-Image
#这个时候执行查看命令ls执行可以看到文件openwrt-19.07.8-armvirt-64-root.ext4 和 openwrt-19.07.8-armvirt-64-Image
#开始运行openwrt
qemu-system-aarch64 -M virt -m 1024m -kernel openwrt-19.07.8-armvirt-64-Image -append "root=fe00" -hda openwrt-19.07.8-armvirt-64-root.ext4 -no-reboot -nographic -cpu cortex-a53 -smp 4 -net nic -net user,id=wan,hostfwd=tcp::7080-:80,hostfwd=tcp::7022-:22
命令可选参数说明:
-M 是模拟的机器,可以执行qemu-system-aarch64 -M help查看列表,可以看到有树莓派的,所以也可以直接用树莓派的固件
-m 是分配内存大小 我这里分配1024mb
-kernel是指定内核
-append cmdline 设置Linux内核命令行和启动参数
我这里”root=fe00“指定根的块设备是fe00,如果你没有指定这个,内核将列出可用的块设备并重新启动,之后你们自己的固件可以取消这个”root=fe00“看可用块设备列表,再修改填上。我之前在这徘徊了很久啊。
-hda是指定硬盘镜像
--no-reboot 就是字面意思,里面客户系统如果重启就会直接退出qemu,重启相当于关机退出qemu。可以不要这条,这样客户系统可以进行重启的操作
-nographic 关闭qemu的图形化界面输出。也可以去掉,然后加上--vnc :1 以vnc为图像模式输出到”显示器”,并占用vnc 1端口,vnc访问手机ip:5901显示进入图像界面。-nographic与--vnc不同的是执行运行后不会立即有回显。
-cpu cortex-a53 模拟cortex-a53类型的处理器,因为前面查询我的骁龙625是cortex-a53类型处理器,模拟这个性能损失较小。可以输入qemu-system-aarch64 -cpu help查看可模拟列表
-smp 核数,给cpu分配核数
-net nic 就是快速配置网卡。后面net user,id=wan,hostfwd=tcp::7080-:80,hostfwd=tcp::7022-:22配置网卡网络模式为用户模式(nat模式,使用主机网络nat联网),分配id标识为wan,hostfwd是端口重定向参数,可以加逗号多个使用,很清晰可以自己根据需要增加和删改,这里我把主机7080端口重定向到客户系统的80端口,把主机7022端口重定向到客户系统的22端口。这两个端口分别是web网页管理地址端口、ssh端口。还有具体设置网卡可以百度搜索qemu网络模式。
执行后耐心等待跑码,看下面图
出现第一个框就可以按回车输命令了,但是不急,等第二个
出现br-lan: port 1(eth0) entered forwarding state就是启动好了(改过下面以后,第二次运行是出现8021q: adding VLAN 0 to HW filter on device eth0)

因为第一个网卡默认是分配给lan的,所以我们要改一下,分给wan(这个镜像改过一次,下次再启动就不用改了)
输入
vi /etc/config/network
按键盘i就可以编辑进行增删了,把config interface 'wan' 那整部分改成以下这样
config interface 'wan'
option ifname 'eth0'
option proto 'dhcp'
编辑好了,按键盘ESC,然后按住shift再按一下键盘上的;就可以输入wq回车后保存退出(就是按esc退出后,按出冒号,wq命令保存退出)
重启网络服务
/etc/init.d/network restart 执行ifconfig看看
eth0 Link encap:Ethernet HWaddr 52:54:00:12:34:56
inet addr:10.0.2.15
获得了一个nat地址
现在ping一下外网
ping www.baidu.com 只要手机能联网,它就能联网!

因为我手机用的是4g数据,地方信号不好,延迟有点大哈别介意
开放wan的80端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT 前面执行命令的时候,我们已经弄好手机7080端口重定向客户机的80端口了,所以我们在浏览器访问手机ip加7080端口,就可以进入openwrt的管理页面啦!

连上openwrt的ssh,前面执行命令的时候,我们已经弄好手机7022端口重定向客户机的22端口了,只要在openwrt开放22端口,就可以手机ip加7022连上了
iptables -I INPUT -p tcp --dport 80 -j ACCEPT 你可以根据需要设置好重定向端口和开放端口,例子很明白了
现在,进行模拟x86架构的教程
X86方便一些,不需要指定内核,使用带combined字样的镜像就行了,内核打包在里面的
wget https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/19.07.8/targets/x86/64/openwrt-19.07.8-x86-64-combined-ext4.img.gz 解压
gzip -d openwrt-19.07.8-x86-64-combined-ext4.img.gz 运行
qemu-system-x86_64 -m 1024m -hda openwrt-19.07.8-x86-64-combined-ext4.img -no-reboot -nographic -smp 2 -net nic -net user,id=wan,hostfwd=tcp::7080-:80,hostfwd=tcp::7022-:22 同样,改一下eth0,分给wan
输入
vi /etc/config/network
按键盘i就可以编辑进行增删了,把config interface 'wan' 那整部分改成以下这样
config interface 'wan'
option ifname 'eth0'
option proto 'dhcp'
编辑好了,按键盘ESC,然后按住shift再按一下键盘上的;就可以输入wq回车后保存退出(就是按esc退出后,按出冒号,wq命令保存退出)
重启网络服务
/etc/init.d/network restart 就可以联网了。然后开放端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 22-j ACCEPT 浏览器访问手机ip:7080进行设置
跑分
两个都修改成2核1G内存
替换软件源为清华源,更快下载
sed -i 's_downloads.openwrt.org_mirrors.tuna.tsinghua.edu.cn/openwrt_' /etc/opkg/distfeeds.conf
opkg update opkg install openssl-util
开始测试
openssl speed md5 sha1 sha256 sha512 des des-ede3 aes-128-cbc aes-192-cbc aes-256-cbc rsa2048 dsa2048 | tee /tmp/sslspeed | awk -v ORS="" '$1 ~ /OpenSSL/ {print "| " $2 " |"} $1 ~ /(md5|sha)/ {print " " $5 " |"} $1 ~ /(des|aes)/ {b = b " " $6 " |"} $1 ~ /(rsa|dsa)/ {print b " " $6 " | " $7 " |";b=""} END { print "\n" }' | sed 's/\.\(..\)k/\10/g' 测试完成,测试结果保存在/tmp下的sslspeed文件。
cat /tmp/sslspeed
aarch64 2核1G内存
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
md5 2345.78k 9028.32k 27361.33k 55603.54k 78219.86k 74679.15k
sha1 2060.79k 5820.54k 12326.49k 17208.03k 19619.29k 19633.22k
des cbc 2966.17k 3461.81k 3582.62k 3658.22k 3629.86k 3525.88k
des ede3 1004.05k 1076.56k 1099.76k 1110.49k 1095.02k 1086.75k
aes-128 cbc 3859.83k 4408.20k 4571.63k 4650.21k 4572.02k 4306.34k
aes-192 cbc 3527.58k 3952.12k 4089.88k 3808.79k 4068.42k 3863.52k
aes-256 cbc 3223.38k 3582.85k 3681.47k 3719.15k 3647.91k 3525.88k
sha256 1916.95k 5264.55k 10780.11k 14924.20k 16907.07k 17001.85k
sha512 1348.55k 5433.92k 11909.28k 22806.93k 30542.09k 29950.62k
sign verify sign/s verify/s
rsa 2048 bits 0.040826s 0.001071s 24.5 933.6
sign verify sign/s verify/s
dsa 2048 bits 0.018837s 0.014805s 53.1 67.5 X86 2核1G内存
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
md5 3372.23k 10675.43k 26252.46k 41720.10k 49754.76k 50417.79k
sha1 1462.10k 3723.77k 7062.45k 9937.98k 10458.17k 10160.28k
des cbc 2281.98k 2569.14k 2646.28k 2641.44k 2672.74k 2655.53k
des ede3 734.11k 767.46k 654.58k 765.43k 772.78k 772.93k
aes-128 cbc 3142.41k 3478.23k 3584.09k 3599.02k 3609.94k 3593.56k
aes-192 cbc 2349.68k 3090.44k 3192.58k 3145.78k 3120.63k 3089.87k
aes-256 cbc 2418.03k 2628.49k 2678.10k 2711.37k 2766.57k 2692.44k
sha256 1540.33k 3855.26k 7400.12k 9692.61k 10619.26k 10727.09k
sha512 1418.24k 4975.96k 6822.40k 15752.47k 14248.53k 15937.16k
sign verify sign/s verify/s
rsa 2048 bits 0.045972s 0.001250s 21.8 800.3
sign verify sign/s verify/s
dsa 2048 bits 0.020689s 0.017391s 48.3 57.5