windows下删除本地adb的emulator device

tcpip的很简单,disconnect就可以。

本地的比较麻烦。

  1. 查询pid

    netstat -ano|findstr 5555
    TCP    127.0.0.1:5555         0.0.0.0:0              LISTENING       3496
    TCP    127.0.0.1:5555         127.0.0.1:58569        ESTABLISHED     3496
    TCP    127.0.0.1:58569        127.0.0.1:5555         ESTABLISHED     2356

    我们看到adb server的进程ID 3496

  2. 删除进程
    taskkill /pid 3496 -f
    成功: 已终止 PID 为 3496 的进程。

如何将安卓手机变成linux服务器,实现远程控制

github: https://github.com/hiproz/aosp-server-toolkit

背景

之前是用orange pi做家庭远程伺服跳板机的,平时开vnc或者ssh之类。发现老是死机,于是萌生了用二手手机做服务器的想法。
网上小黄鱼有很多二手手机,价格比开发板还便宜,而且配置更高,硬件的一致性也更好。

pixel3 手机 & aosp

因为google的pixel手机对应的代码基线都是开源的,所以选择便宜的pixel手机。代码直接从aosp的官网获取。
目前pixel3的价格在100-200 比开发板是很高性价比了,所以我们选择pixel3手机作为入门。
aosp系统固件构建,一般主要是做跟服务器相关的特性修改,比如充电自动开机,集成各种工具,比如vnc,busybox等等。具体的编译和集成方法根据不同版本各有差异,需要自己从网上获取验证。

简介

为了将pixel手机变成一台通用linux服务器,用来实现远程控制监控家庭和公司网络的目的。我们基于aosp源码,添加必要的工具集,并给出相关的软件配置操作流程等。

这里的固件和工具,当前通过pixel3验证,但理论上只要适合aosp对应版本的手机,就都能使用,只是我们不一定都一一验证,需要用户自行验证,有问题欢迎反馈。

系统架构

我们方案的一些基本核心功能:

  1. 上电自动开机
  2. 实现vnc远程效果,采用frp+scrcpy
  3. 远程shell操作,我们使用的基于tcpip的 adb shell

file

使用步骤

  1. 下载对应编译好的aosp固件
  2. 烧录固件到手机,并手动配置手机wifi网络,确保手机能联网
  3. 首次配置:通过adb进行必要的frpc配置
  4. 远程登录手机,进行操作
  5. 恭喜你,你已经拥有了一台 arm64的带有屏幕的低功耗linux服务器了

烧录

使用安卓adb,fastboot工具链来进行烧录。

windows

windows adb tools

adb version:Version 31.0.3-7562133
fastboot verison:fastboot version 31.0.3-7562133

烧录步骤

  1. 解锁你的安卓手机,保证你能正常使用fastboot,解锁方法请根据你的手机型号和版本自行google
  2. 下载合适的固件压缩包,解压
  3. 启动cmd,cd到解压的目录内
  4. 设置环境变量 set ANDROID_PRODUCT_OUT=your 解压目录
  5. adb reboot bootloader
  6. fastboot flashall -w
  7. 烧录完成提示如下

file

mac

mac adb tools

【待补充】

烧录步骤

和windows的基本一致,不一致的是设置环境变量的命令不同。

*不同之处待更新**【待补充】*

首次使用

我们的系统是debug版本,所以支持root和remount。首次使用时,我们需要配置frpc相关的服务,保证我们以后可以远程操作手机。

1. 首次remount

为了对手机进行各种文件操作,我们建议默认remount。

adb root
adb remount
# 这里可能提示重启,请进行必要的重启 
adb reboot

2. frpc 配置

我们主要是通过frpc 来实现远程scrcpy和adb shell,所以你需要部署一台frp服务器。可以从网上买一个最小配置的vps。

frps 服务器

你需要一台有公网ip的服务器,部署frp服务器,具体可以去frpc官网下载,因为我们手机端集成的是v0.58.0。所以我们建议服务器端和电脑客户端,也下载对应的版本。我们假设服务器开启token安全机制,参考配置如下:

bindPort = 7000
auth.method = "token"
auth.token = "123"

usb adb连接手机,修改frpc配置

adb root
adb remount
adb shell
busybox vi /data/frpc.toml

frpc.toml 参考内容如下:

serverAddr = "1.1.1.1" # only support ip, do not use domain
serverPort = 7000
auth.method = "token"
auth.token = "000000"

[[proxies]]
name = "secret_proxy"
type = "stcp"
secretKey = "key"
localIP = "127.0.0.1"
localPort = 5555

请根据你自己服务器的实际参数,修改以上参数,修改后adb reboot手机,重新进去adb shell 确认frpc是否正确取运行,如果能正确看到frpc进程信息,就初步确认frp运行起来了:

blueline:/ # ps -ef|grep frpc
root     4185  2739 1 19:31:01 ?     00:00:00 frpc -c /data/frpc.toml
root     4194  3639 22 19:31:04 pts/0 00:00:00 grep frpc

远程连接手机

参看我们前面技术架构,在我们通过自己的电脑远程访问时,我们先要在本地把电脑上的frpc跑起来。

1. 配置本地frpc

serverAddr = "1.1.1.1"
serverPort = 7000
auth.method = "token"
auth.token = "123"

[[visitors]]
name = "secret_visitor"
type = "stcp"
serverName = "secret_proxy"
secretKey = "key"
bindAddr = "127.0.0.1"
bindPort = 5555

在配置完frpc后,我们基本就可以拔掉usb,完全像远程服务器一样来访问手机了。这里我们假设你的frps 和frpc都配置正确。如果你有这方面的错误,请检查网络以及端口防火墙等基本网络参数。

2. 设置tcpip adb,建立远程adb链路

adb connect localhost:5555
connected to localhost:5555

3. 像在本地通过usb连接手机一样,启动scrcpy

file

4. 如果想使用shell, 你可以使用adb shell,感觉就跟usb 连接一样

adb shell

ssh

我们的固件集成了ssh客户端,当我们需要将手机作为跳板服务器或者堡垒机服务器通过ssh访问别的ssh服务器器时,我们就可以使用手机中的ssh来完成

vi

你可以使用 busybox vi

其他工具?

待补充

本地下载

  1. https://cdn.itranscloud.com/aosp/aosp_blueline-userdebug_12_SP1A.210812.016.A1.7z
  2. https://cdn.itranscloud.com/aosp/aosp_blueline-userdebug_12_SP1A.210812.016.A1_v101.7z

pixel3 aosp编译

以下内容主要参考网络内容,按照实际验证的顺序和细节补充而成,使流程更清晰,可以傻瓜式照抄。

  1. 根据自己手机刷机前的版本信息,在 https://source.android.com/docs/setup/about/build-numbers?hl=zh-cn#source-code-tags-and-builds 获取版本SP1A.210812.016.A1
    file
    后面repo init时,我们将要用这个版本号,获取准确的版本。

    repo init -u https://android.googlesource.com/platform/manifest -b android-12.0.0_r3
  2. 获取vendor驱动,从 https://developers.google.com/android/drivers?hl=zh-cn 中找到对应版本 https://link.zhihu.com/?target=https%3A//developers.google.com/android/drivers/%23crosshatchsp1a.210812.016.a1, 这个待会编译时,要解压到vendor下

  3. 安装git, repo:https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/

  4. 运行 repo init,这里考虑到网速的问题,我们使用清华的镜像地址。如果你没有网络困扰,也可以使用上面提到的google android官方地址:

    mkdir ~/work/aosp/
    cd ~/work/aosp/
    repo init -u
    https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r3
  5. repo sync -jxx , xx为你的虚拟软核数

  6. 更新vendor和驱动:

    cd ~/Downloads
    tar xvf qcom-crosshatch-*.tgz
    tar xvf google_devices-crosshatch-*.tgz
    cd ~/work/aosp/
    ~/Downloads/extract-qcom-crosshatch.sh
    ~/Downloads/extract-google_devices-crosshatch.sh
  7. 编译

    source build/envsetup.sh
    lunch 4(aosp_blueline-userdebug)
    m

    m 是构建代码的简单命令

  8. 安装adb kit,安装adb 和fastboot工具集,作者用的是Version 31.0.3-7562133 版本。

  9. 烧录下载

    adb reboot bootloader
    fastboot flashall -w

    flashall 会提示设置ANDROID_PRODUCT_OUT环境变量,设置成实际的out编译目录就好(如果是在windows烧录,就把整个目录下载到windows,然后设置成windows实际的out路径)。
    linux: export ANDROID_PRODUCT_OUT=/xxx/out/target/product/blueline
    windows: set ANDROID_PRODUCT_OUT=/xxx/out/target/product/blueline

  10. 构建内核(可选),可以参考https://zhuanlan.zhihu.com/p/448289040 的后半部分内容。

最后,如果你不想麻烦,也可以取用我们编译好的原生版本:
https://cdn.itranscloud.com/aosp/aosp_blueline-userdebug_12_SP1A.210812.016.A1.7z

ref:https://zhuanlan.zhihu.com/p/448289040

letsencrypt renew的认证路径

在某些重定向的配置场景中,所有请求都被proxy到了远端服务器,这时候certbot rewew的时候就因为无法远程操控well-known路径导致认证失败。
解决就是在proxy的本地创建认证目录:

# letsencrypt认证目录
location /.well-known/ {
    root  /data/wwwroot/xxx;
}

location /{
    # 其他目录的操作在这里
}

openwrt刷机固件基本知识

squashfs-factory.bin -- uboot 裸机第一次刷openwrt时用
squashfs-sysupgrade.bin -- 由openwrt升级到openwrt时用

官方固件的说明
xxx-preloader.bin -》 BL2
xxx-bl31-uboot.fip -》FIP
xxx-initramfs-recovery.itb -》包含rootfs image的运行在ram中的系统,用于flash还不完备时,加载在内存中做调试用,一般刷机不用
xxx-sysupgrade.bin -》 在系统升级页面中升级系统

docker启用ipv6

某些docker应用需要跟ipv6打交道时,就需要docker的网络能获得有效的ipv6地址。

  1. 我们首先要确认host主机自己有有效的ipv6地址
  2. docker 默认使用bridge网络,我们可以检查bridge的属性:docker network inspect bridge
    file
    正常的话应该是true,如果是false,就要先检查docker配置。

注意:如果host的ipv6发生过变化,docker服务(注意是服务,不是指某个容器)需要重启,才能重新获得正确的ipv6