安卓手机用qemu运行openwrt
机械硬盘
编辑于 2023年08月18日 06:09

网上关于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

代码块
JavaScript
自动换行
复制代码
pkg upgrade
pkg install openssh
sshd
复制成功

当然,喜欢在手机上慢慢敲命令的可以不装

执行sshd就是打开ssh服务,就可以连接ssh了

可以再输入一条

代码块
JavaScript
自动换行
复制代码
echo "sshd" >> ~/.bashrc
复制成功

  这样每打开终端会自动运行一次sshd

需要注意的是,我们平常开启的ssh服务端口是22,但是Termux开启的ssh服务端口是在8022

接着我们执行 ifconfig 查看自己的ip地址(若是需要连接电脑和手机需要在同一个的WiFi下)

这个每个人可能不同的,需要自己看上面显示换ip,比如我是192.168.42.129,你要把它换成你显示的手机ip

而我是拿它供网的,usb共享给路由器,也可以热点,然后电脑连上。最好是手机连路由器wifi,然后电脑连路由器,在同局域网就行,搞好以后甚至可以做给电脑做旁路由

这个时候换到电脑的终端输入了,我的电脑系统win10,自带ssh。在cmd或者powershell窗口上执行

代码块
JavaScript
自动换行
复制代码
ssh root@192.168.42.129 -p 8022
复制成功

手动输入yes回车,输入密码回车连上了

当然,后面方便用xshell了,保存一次以后双击连接。

正戏开始

带“#”开头的整行都是注释用的话,可以不复制到终端运行

代码块
JavaScript
自动换行
复制代码
#更新源

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(这个镜像改过一次,下次再启动就不用改了)

输入

代码块
JavaScript
自动换行
复制代码
vi /etc/config/network 
复制成功

按键盘i就可以编辑进行增删了,把config interface 'wan&#​39; 那整部分改成以下这样

代码块
JavaScript
自动换行
复制代码
config interface 'wan'

        option ifname 'eth0'

        option proto 'dhcp'
复制成功

编辑好了,按键盘ESC,然后按住shift再按一下键盘上的;就可以输入wq回车后保存退出(就是按esc退出后,按出冒号,wq命令保存退出)

重启网络服务

代码块
JavaScript
自动换行
复制代码
/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一下外网

代码块
JavaScript
自动换行
复制代码
ping www.baidu.com
复制成功

只要手机能联网,它就能联网!

因为我手机用的是4g数据,地方信号不好,延迟有点大哈别介意

开放wan的80端口

代码块
JavaScript
自动换行
复制代码
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
复制成功

前面执行命令的时候,我们已经弄好手机7080端口重定向客户机的80端口了,所以我们在浏览器访问手机ip加7080端口,就可以进入openwrt的管理页面啦!

连上openwrt的ssh,前面执行命令的时候,我们已经弄好手机7022端口重定向客户机的22端口了,只要在openwrt开放22端口,就可以手机ip加7022连上了

代码块
JavaScript
自动换行
复制代码
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
复制成功

你可以根据需要设置好重定向端口和开放端口,例子很明白了

现在,进行模拟x86架构的教程

X86方便一些,不需要指定内核,使用带combined字样的镜像就行了,内核打包在里面的

代码块
JavaScript
自动换行
复制代码
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
复制成功

解压

代码块
JavaScript
自动换行
复制代码
gzip -d openwrt-19.07.8-x86-64-combined-ext4.img.gz
复制成功

运行

代码块
JavaScript
自动换行
复制代码
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

输入

代码块
JavaScript
自动换行
复制代码
vi /etc/config/network 
复制成功

按键盘i就可以编辑进行增删了,把config interface 'wan&#​39; 那整部分改成以下这样

代码块
JavaScript
自动换行
复制代码
config interface 'wan'

        option ifname 'eth0'

        option proto 'dhcp'
复制成功

编辑好了,按键盘ESC,然后按住shift再按一下键盘上的;就可以输入wq回车后保存退出(就是按esc退出后,按出冒号,wq命令保存退出)

重启网络服务

代码块
JavaScript
自动换行
复制代码
/etc/init.d/network restart
复制成功

就可以联网了。然后开放端口

代码块
JavaScript
自动换行
复制代码
iptables -I INPUT -p tcp --dport 80 -j ACCEPT

iptables -I INPUT -p tcp --dport 22-j ACCEPT
复制成功

浏览器访问手机ip:7080进行设置

跑分

两个都修改成2核1G内存

替换软件源为清华源,更快下载

代码块
JavaScript
自动换行
复制代码
sed -i 's_downloads.openwrt.org_mirrors.tuna.tsinghua.edu.cn/openwrt_' /etc/opkg/distfeeds.conf
复制成功

opkg update opkg install openssl-util

开始测试

代码块
JavaScript
自动换行
复制代码
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文件。

代码块
JavaScript
自动换行
复制代码
cat /tmp/sslspeed
复制成功

aarch64  2核1G内存

  

代码块
JavaScript
自动换行
复制代码
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内存

代码块
JavaScript
自动换行
复制代码
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
复制成功