天天学习,好好向上!

分类 技术 下的文章

前提条件:

1. 备用安卓机已 root。
2. 家中路由拥有公网 IP,并支持端口转发。或自行配置内网穿透,如 zerotier。

具体需要软件:

1. 备用安卓机:tasker。
2. 控制用安卓机:termux,chrome 浏览器。

操作步骤:

1. 备用安卓机设置开机开启无线调试:

安装 tasker,授予所需的所有权限。配置文件选项卡,点加号新建,输入任意名字,选择事件,系统,设备启动,返回,新建任务,输入任意名字,点加号新建,代码,运行 shell 命令,命令框内输入

stop adbd

都勾选使用 root,遇到错误后继续运行任务。点返回,然后同样步骤依次新建以下两句命令

setprop service.adb.tcp.port 5555
start adbd

返回,点击上方对号即可。
重启手机,测试能否顺利打开无线调试,并将端口设置为 5555。

2. 控制机安装 ws-scrcpy

安装 termux,进入 termux 使用以下命令安装以下所需包

pkg install android-tools nodejs git python build-essential
npm install -g node-gyp

使用以下命令安装 ws-scrcpy

git clone https://github.com/NetrisTV/ws-scrcpy.git
cd ws-scrcpy
#不使用下面这条命令,会报 no member named 'AccessorSignature' in namespace 'v8' 错误
npm install [email protected] --save
npm install

即可。

3. 完成备用机与控制机的配对

在备用机上打开开发者选项,无线调试,打开开关,使用配对码进行配对,会出现地址端口和配对码。在控制机上的 termux 里输入

adb pair 地址: 端口 配对码

即可完成配对。

4. 控制机通过 adb 链接备用机

在控制机的 termux 上输入

adb connect 备用机 IP

即可连接备用机,可以输入 adb devices 查看连接情况。如果为 device 说明连接成功。

5. 通过 ws-scrcpy 控制备用机

在控制机的 termux 上进入 ws-scrcpy 目录
输入 npm start 稍等片刻,出现

Listening on: http://localhost:8000……

后说明启动成功,把 termux 置入后台。打开 chrome 浏览器,输入 http://localhost:8000 即可打开,浏览器页面上点击 Broadway.js、H264 Converter、Tiny H264、WebCodecs 任意一项进入远程控制。
后期可根据需要将备用机在路由器上分配的 ip 固定,并转发 5555 端口到 WAN 上,或自行配置内网穿透如 zerotier,实现远程访问家中备用机。
Screenshot_2023-02-05-23-34-18-002_com.android.chrome.jpg
本人备用机机型为红米 note5,刷入第三方安卓 13 系统。控制机为小米 10,MIUI13 开发版 安卓 12 系统。测试通过!

导出 MIUI13 智能助理我的支出账单数据

前言

本人最近倒腾手机时,发现了钱迹这款记账软件,还有自动记账插件。看到可以导入其他软件的账单数据,就回想起来 2018 年还是 MIUI9 的时候,小米智能助理 app 推出的我的支出自动记账功能,很有意思,看看每个月的钱都花哪去了,从 2020 年 5 月份开始,小米下线了我的支出记账功能,时间长了也慢慢把这个功能忘记了。但是今天想起来了!那么我之前的账单数据还在吗?可以导出吗?带着这个问题,本人搜索了下网上,官方回帖称,数据不会删除,还可以在智能助理 app 设置里查看 (5.4.3 版的里没找到),但是记账功能已经没了。那么我怎么把账单数据导出来呢?

研究一下

研究了下智能助理的数据目录,发现有个 payment.db 文件比较像是记账的数据,但是用手机上的 sqlite 查看软件打不开,用 16 进制编辑软件打开,发现是乱码。估计是加密了,怎么解密呢?上网搜了下,并没有啥文章介绍这个。没办法,只有自己研究了,废了点力气,在我刚装好的 Debain sid 上,尝试反编译了智能助理 app 的 apk 文件,用到了 dex2jarjadx-gui两个项目工具,简单来说就是直接把 apk 文件 dex2jar 成了 jar 文件,然后用 jadx-gui 打开就能看见源码了,通过搜索关键字,找到了数据库加密的部分代码,和用于加密的密钥字符串名称 "payment_keychain",可以看出来这个字符串是根据机器 id 运算生成的,并不是写死的。然后在 app 的数据目录里,找到 "payment_preferences.xml" 文件,里面居然明文记载了这个密钥字符串。有了密码,加密方法呢?通过代码中提到的 sqlcipher 字样,我找到了相关的解密程序 sqlitebrowser,在 linux 平台上,要启用 sqlcipher 支持,必须自己编译,在 windows 和 macos 上有现成的下载。最后解密成功导出了数据。废话不多说,干货步骤在下面:

操作步骤

前提条件:

  • 智能助理 app 没有被清除过数据,继承了老版本的数据;
  • 手机已 root,可以访问 /data 目录(虽然不 root 可以通过手机自带备份导出数据,但是_tmp_bak 文件怎么解密还没研究出来,只能先以 root 为主);
  1. 使用 MT 管理器之类的 app 访问 /data/data/com.miui.personalassistant 目录,从 databases 目录拷贝出来 "payment.db" 文件, 并从 shared_prefs 目录拷贝出 "payment_preferences.xml" 文件到 /sdcard 等可随意访问的目录下;
  2. 通过数据线或者 ftp 远程管理方式将 "payment.db" 和 "payment_preferences.xml" 文件拷贝到计算机上;
  3. 下载 安装 sqlitebrowser 到计算机上,然后通过开始菜单快捷方式打开 "DB Browser (SQLCipher)";
  4. 点击工具栏上的 "打开数据库(O)",选择 "payment.db" 文件。
  5. 在弹出的 "SQlCipher 加密" 窗口中,加密设置选择 "SQLCipher 3 默认",用记事本打开 "payment_preferences.xml", <string name="payment_keychain"></string> 中间的那个字符串就是数据库的加密密码,复制出来,粘贴到密码文本框中,最后点击 OK 即可解密打开。
    2022-08-10 22-56-13 创建的截图.png
  6. 进入浏览数据选项卡,表选择 "transactions" 即可列出所有的账单数据了。这里需要注意的是,所有的时间标签都是用 java 毫秒表示的,为了容易看懂,也为了后期方便导入数据到其他记账软件,这里我们鼠标邮件点击时间的标题栏,如 "tannsaction_time",选择 "编辑显示格式",然后选择 "Java 时间戳(毫秒)到日期",然后将下方的 strftime('%Y-%m-%d %H:%M:%S.', "transaction_time"/1000, 'unixepoch') || ("transaction_time"%1000) 修改为 strftime('%Y-%m-%d %H:%M:%S.', "transaction_time"/1000, 'unixepoch', 'localtime') || ("transaction_time"%1000) 点击确定即可显示正确的时间(不加 localtime 参数,时间会显示为 UTC 时间比北京时间早 8 个小时)。然后依次将所有的时间列都如此修改。
  7. 点击上方工具栏中的 "按当前显示的样子保存表" 按钮(在刚才选择表下拉菜单的右侧),选择 "导出到 CSV",换行符选择 "Windrows 回车 + 换行" 然后确定即可。至此,MIUI13 智能助理我的支出账单数据就全部导出成功了。后续我们可以根据不同的账单软件导入模板修改相关的样子进行导入。

后记

导出的 csv 文件采用了 UTF- 8 编码,直接用 excel 打开,中文会乱码,要避免这个问题,可以用记事本先打开这个 csv 文件,然后保存时选择编码为 "ANSI" 就可以了。

安装 Debian unstable 到清华同方 L860-T1

简介

清华同方 L860-T1 笔记本电脑采用了龙芯 3A4000 处理器,7A1000 桥片,没有独立显卡,因此在安装 Debian Unstable 时容易出现无法初始化图形界面的问题,本篇文章记录了本人从网络博客文章中学习如何自行安装 Debian 到龙芯处理器电脑的过程中积累的一些经验和做法。

准备工作

  • 拥有一台清华同方 L860-T1 笔记本电脑
  • 准备一个 u 盘
  • 拥有 wifi 网络或有线网络

    Debian 官方的安装包是不能在龙芯上直接使用的。所以,要使用一些其他的方法。

    方法四、DebootStrap
    该方法适用于 UEFI 启动,也适用于固件和 PMON 。文中以 UEFI 为范例。
    Debootstrap 是一个可以快速获得基本 Debian 系统的一个工具,可以将 Debootstrap 看作是一种特殊的安装工具。它不同于 Debian Installter , 不需要安装用的 CD/DVD ISO, 仅需连接到 Debian 软件仓库,软件仓库简介 (英文) . 无论你是否使用 Debian , 只要是任何的 Linux/GNU 发行版,例如 Fedora/Gentoo/Arch/OpenSUSE, 甚至是 Ubuntu , 均可运行 Debootstrap . 当然如果你正在使用 Ubuntu , 你一定到 Debian 的软件仓库下载一个 Debootstrap , 而不能使用 Ubuntu 自己的 debootstrap。

    准备启动优盘

    U 盘的大小建议不小于 32GB, 不过这年头小 U 盘其实很难找到了。
    在 windows 电脑上使用 Ventoy 启动神器 来制作启动 u 盘,在本人的建议下 Ventoy 支持了 mips64el 架构,按照软件说明制作即可。

    下载启动镜像

    本人使用 UOS 统信操作系统,下载地址 在此
    选择 统信 UOS 桌面专业版 MIPS64el下载
    下载完成后放入 u 盘根目录即可。

    开始安装

    引导进入 UOS 安装界面

    将 u 盘插入电脑 usb 口,开机进入 bios 选择 u 盘启动
    重启后进入 ventoy 启动菜单,选择 uos 镜像文件
    进入 uos 启动菜单,选择 install ... 选项,即可引导进入安装界面。

    需要说明的是 uos 是没有专门的 live 模式的,我们这里进入安装模式,随后通过命令行界面进行操作。本人之所以选择 uos 镜像是因为他自带的源里有许多方便的小工具,实测运行起来也很稳定。比如银河麒麟的 2107 版镜像就无法在 L860-T1 上引导成功。

    进入命令行界面

    进入图形化安装界面后,按键盘 Ctrl+Alt+F2(可能需要同时按住 Fn 键)切换到命令行界面。

    连接网络

    命令行界面会自动登陆 uos 用户,输入 sudo -i 进入 root 用户
    输入

nmcli dev wifi connect WIFI 连接点名称 password WIFI 密码

即可连上 wifi。

如果连接上 wifi 后开始出现大量的调试信息,导致输入文字困难,可以使用 dmesg -n 1 命令来关闭带外日志输出

也可选择有线网络连接。

下载安装 debootstrap 包

wget http://ftp.cn.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.127_all.deb
apt install ./debootstrap_1.0.127_all.deb`

建立安装路径

mkdir /mnt/deb

磁盘分区

备份文件警告!
请务必在执行后续操作前,备份目标计算机上的所有重要文件!本人不会对您任何操作 / 误操作造成的损失负责!
parted /dev//dev/nvme0n1
(parted) mklabel gpt
(parted) mkpart ESP fat32 1MiB 300MiB
(parted) mkpart boot ext4 300MiB 1300MiB
(parted) mkpart root ext4 1300MiB 103700MiB
(parted) mkpart home ext4 103700MiB 236820MiB
(parted) mkpart swap 236820MiB 100%
(parted) set 1 boot on
(parted) quit

partprobe /dev/nvme0n1
mkfs.vfat -F 32 /dev/nvme0n1p1
mkfs.ext4 /dev/nvme0n1p2
mkfs.ext4 /dev/nvme0n1p3
mkfs.ext4 /dev/nvme0n1p4
mkswap /dev/nvme0n1p5

挂载必要位置

mount /dev/nvmen1p3 /mnt/deb

“/dev/nvmen1p3” 为新硬盘规划为根分区 “/” 的路径。

开始网络安装 Debian 根文件系统

debootstrap --arch mips64el unstable /mnt/deb http://ftp.cn.debian.org/debian

“/mnt/deb” 是刚才挂载的路径。“http://ftp.cn.debian.org/debian” 是镜像站的地址。

坐下来,等一等,喝杯咖啡,根文件系统就创建好了。

挂载更多必要位置

mount /dev/nvme0n1p4 /mnt/deb/home
mount /dev/nvme0n1p2 /mnt/deb/boot
mkdir -p /mnt/deb/boot/efi
mount /dev/nvme0n1p1 /mnt/deb/boot/efi
mount --bind /dev /mnt/deb/dev
mount -t devpts devpts /mnt/deb/dev/pts
mount -t proc proc /mnt/deb/proc
mount -t sysfs sysfs /mnt/deb/sys
mount -t tmpfs tmpfs /mnt/deb/tmp

使用 genfstab 生成 fstab 文件

输入 apt update 更新软件列表
下载如下包

apt install arch-install-scripts

/etc/fstab 文件指定了系统启动时挂载文件目录的规则,需要仔细配置。

编写该文件,可以自己亲历亲为,仔细编写即可。但懒人有懒人的方法,不喜欢自己写这种配置文件,怕出错的话,也完全可以用 ArchLinux 团队提供的 genfstab 脚本,自动生成配置文件。刚才联网下载的 arch-install-scripts 就包含这个脚本。

使用 genfstab,需要在 LiveCD 操作系统中运行,且需要在运行前将 所有分区挂载到位。如果有 swap 分区的话,也需要确认已经启用。

使用命令 swapon /dev/nvme0n1p5 开启 swap 分区后执行

genfstab -U /mnt/deb

查看输出结果是否符合预期,如果符合,则再次运行

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

将 fstab 文件写入正确路径。

但是本人在安装 unstale 时遇到一个问题,就是 genfstab 命令生成的文件中关于 fat32 分区挂载的参数中涉及 cp936 这个字符集,而 unstable 的 locales 配置里并没有 zh_CN GB2312、zh_CN.GB18030 GB18030 和 zh_CN.GBK GBK 这几个字符集,导致无法支持 cp936 这个字符集,从而会开机启动时挂载失败,要解决这个文件,需要手动修改 fstab 文件,将挂载参数的一大串直接改为 defaluts 即可。例如:

# /dev/nvme0n1p1
UUID=D7E1-BB08          /boot/efi     vfat          rw,relatime,fmask=0022,dmask=0022,codepage=936,iocharset=iso8859-1,shortname=mixed,errors=remount-ro    0 2

改为

# /dev/nvme0n1p1
UUID=D7E1-BB08          /boot/efi     vfat          defaults    0 2

拷贝必要启动文件

下载银河麒麟版的内核、模块和固件, 龙芯内核和模块、xorg 显示驱动到 debian 的 home 目录下

cd /mnt/deb/home

wget http://archive.kylinos.cn/kylin/KYLIN-ALL/pool/main/l/linux-firmware/linux-firmware_1.201kylin1_all.deb

wget http://archive.kylinos.cn/kylin/KYLIN-ALL/pool/main/l/linux/linux-headers-5.4.18-53_5.4.18-53.42_all.deb
wget http://archive.kylinos.cn/kylin/KYLIN-ALL/pool/main/l/linux/linux-headers-5.4.18-53-generic_5.4.18-53.42_mips64el.deb
wget http://archive.kylinos.cn/kylin/KYLIN-ALL/pool/main/l/linux/linux-image-5.4.18-53-generic_5.4.18-53.42_mips64el.deb
wget http://archive.kylinos.cn/kylin/KYLIN-ALL/pool/main/l/linux/linux-modules-5.4.18-53-generic_5.4.18-53.42_mips64el.deb
wget http://archive.kylinos.cn/kylin/KYLIN-ALL/pool/main/l/linux/linux-modules-extra-5.4.18-53-generic_5.4.18-53.42_mips64el.deb
wget http://archive.kylinos.cn/kylin/KYLIN-ALL/pool/main/c/crda/crda_3.18-1build1_mips64el.deb

wget http://ftp.loongnix.cn/os/loongnix/20/mips64el/pool/main/l/linux/linux-image-4.19.0-13-loongson-3_4.19.190-rc2.lnd.1_mips64el.deb

wget http://ftp.loongnix.cn/os/loongnix/20/mips64el/pool/main/l/linux/linux-headers-4.19.0-13-loongson-3_4.19.190-rc2.lnd.1_mips64el.deb

wget http://ftp.loongnix.cn/os/loongnix/20/mips64el/pool/main/l/linux/linux-kbuild-4.19_4.19.190-rc2.lnd.1_mips64el.deb

wget http://ftp.loongnix.cn/os/loongnix/20/mips64el/pool/main/x/xserver-xorg-video-loongson/xserver-xorg-video-loongson_0.2.0-2_mips64el.deb

其中,

  • linux-firmware_1.201kylin1_all.deb 是银河麒麟提供的固件
  • linux-headers-5.4.18-53_5.4.18-53.42_all.deb
    、linux-headers-5.4.18-53-generic_5.4.18-53.42_mips64el.deb、linux-modules-5.4.18-53-generic_5.4.18-53.42_mips64el.deb、linux-modules-extra-5.4.18-53-generic_5.4.18-53.42_mips64el.deb 是银河麒麟提供的内核模块文件
  • linux-image-5.4.18-53-generic_5.4.18-53.42_mips64el.deb 是银河麒麟提供的内核
  • crda_3.18-1build1_mips64el.deb 是 linux-modules-extra-5.4.18-53-generic_5.4.18-53.42_mips64el.deb 的依赖文件。
  • linux-image-4.19.0-13-loongson-3_4.19.190-rc2.lnd.1_mips64el.deb 是龙芯提供的内核
  • linux-headers-4.19.0-13-loongson-3_4.19.190-rc2.lnd.1_mips64el.deb 是龙芯提供的内核模块文件
  • linux-kbuild-4.19_4.19.190-rc2.lnd.1_mips64el.deb 是 linux-headers-4.19.0-13-loongson-3_4.19.190-rc2.lnd.1_mips64el.deb 的依赖文件
  • xserver-xorg-video-loongson/xserver-xorg-video-loongson_0.2.0-2_mips64el.deb 是龙芯提供的桌面显示驱动

复制启动文件至 Debian 的分区。

cp -r /boot/efi/* /mnt/deb/boot/efi

chroot 进入 Debian 系统

chroot /mnt/deb /bin/bash

安装必要的包

apt install grub-common locales tzdata initramfs-tools sudo

安装内核、模块和固件

apt install /home/*.deb

修复蓝牙无固件的 bug

这里需要特殊说明的是在 L860-T1 上,wifi 驱动可以正常识别,但蓝牙固件无法加载成功,后来发现是目录位置不同的问题,加上一句命令即可修复蓝牙缺少固件的问题。

ln -sf /lib/firmware/rtl_bt /lib/firmware/imc_bt

配置 initramfs.conf

我们需要将配置改成只包含需要的模块:
nano /etc/initramfs-tools/initramfs.conf
找到一行 MODULES=most 配置,将其改成下面的:
MODULES=dep

重新生成 initrd.img

update-initramfs -k all -c

检查其生成的大小,应该小了不少。

生成 grub 菜单

最后手动更新 grub 配置,安装内核的时候其实会自动更新一次:
grub-mkconfig -o /boot/EFI/BOOT/grub.cfg

修改语言环境

dpkg-reconfigure locales
按提示选择需要的 locale ,如果是 tui 图形界面,则用空格取消或选中。这里提供一个示例:

  • en_US.UTF-8 UTF-8
  • zh_CN.UTF-8 UTF-8

确定后根据提示选择默认 locale ,选择中文:

  • zh_CN.UTF-8

再次确定,将自动完成配置。

注意这里的配置按键

  • 空格键 是 选择
  • TAB 键 是 切换
  • enter 键 (回车键) 是 确认

这里,粗心的人如果没看清楚界面上的使用说明,就会被小坑一把,如果直接按了回车键,就跳到了默认语言设置页面,导致配置中文失败。

配置时区

dpkg-reconfigure tzdata
依次选择 AsiaShanghai

配置 hosts

查看你的 hostname :
cat /etc/hostname
在 UOS 安装盘下,会默认为 UOS, 这里为了方便,本人把他改为了localhost
echo localhost > /etc/hostname
如果改为其他, 还需要在 /etc/hosts 中添加一条配置:
127.0.0.1 你的主机名.localdomain 你的主机名

建立用户

adduser 你的用户名
请输入 2 遍设置的密码。

按提示输入用户的其他信息。

Changing the user information for lio
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n]

如果信息无误,输入 “Y”,结束。

如果需要再次设置密码,请执行以下命令。
passwd 你的用户名

设置 sudo 权限

usermod -a -G sudo 你的用户名

安装 mate 桌面环境

apt install task-mate-desktop
中间有可能暂停要求你同意某些事项,同意即可继续安装,这个安装东西较多,持续时间有点长,耐心等待一会儿就好了。

第一次重启

退出 chroot
exit

重启
reboot

拔出启动 u 盘
启动时选择 “Debian GNU/Linux”

如果需要选择内核版本,可以进入高级模式,选择对应内核启动,银河麒麟的 5.4 内核有 drm 驱动,文本界面比较流畅,龙芯的 4.19 内核有 entxviv 驱动,文本界面有点卡,蓝牙也有点 bug, 但是对即插即用网络打印机、扫描仪支持的特别好。视频播放性能上,4.19 也比 5.4 要好一些。

如果不出问题,应该就可以进入图形登陆界面了。输入上面设置的用户名和密码,就可以登陆了。

进入桌面后联网

使用 wifi 或者有线联网。

安装必要软件

这部分比较繁琐,后头填坑。
下面讲讲我遇到的一些显示问题的解决方法:

修改默认显示驱动为 softpipe

部分软件如微信,在系统 llvmpipe 图形驱动下工作不正常,软件界面会花屏到无法观看。需要手动将默认显示驱动更换为 softpipe 才行。具体方法如下:
终端中输入
sudo nano /etc/environment
增加以下系统变量

LIBGL_ALWAYS_SOFTWARE=true
GALLIUM_DRIVER=softpipe

ctrl+ o 并回车保存,ctrl+ x 关闭文件。重启计算机即可。

目前 softpipe 的性能很差,只能满足一般办公需要。对与没有独立显卡的 L860-T1 也是没有办法的事情,后期本人会再研究研究怎么更好的使用本本自带的 LS7A1000 桥片自带的 GC1000 显示芯片。后期填坑吧。

附录

配置 retroarch

softepipe 下,retroarch 的默认配置性能非常低下,平均不到 2 帧,简直就是 PPT。使用以下方法来提高性能。

  1. 进入 Settings - Video - Output 修改 Video 选项为 vulkan;
  2. 返回上一层菜单,在 Video 下,将 Threaded Video 选项打开;
  3. 进入 Synchronization,关闭Vertical Sync (VSync) 选项。
    如此设置后,通过菜单退出 retroarch 后,在启动,即可获得菜单 20 帧左右,游戏 60 帧左右的性能了,可以愉快的 Metal Slug 啦!

配置 SMplayer

  1. 选项 - 首选项 - 常规 - 多媒体引擎 选择 mpv
  2. 在视频选项卡下,选择输出驱动为 x11,确定保存即可。
    可以获得姣好的视频播放性能。其他选项可能导致视频播放前屏幕黑屏。

参考文献:

  1. https://my.oschina.net/chipo/blog/3077050
  2. https://www.cnblogs.com/weilinfox/p/15813976.html
  3. https://www.dhao2001.com/2022/03/19/loongson-first-run-install-debian/

最近,我的好基友配了一台配置相当好的游戏 PC,和他聊起来,我就讲了讲,我是如何把自己的游戏笔记本电脑利用联通给家里路由器分配的公网 IP,实现了自己的云游戏服务器,人在外地都可以使用 moonlight 软件直接串流玩自己家电脑上的游戏,而且延时超低,体验也超好。他很感兴趣,也想在自家的电脑上实现,我就介绍给他说需要公网 IP 让他去申请。
我给出的条件是:
1、要有单独光猫,不能带路由功能,要不就没法实现自定义的好多功能了;
2、自己家的路由器最好能刷固件,支持一些自定义功能。
对于条件 2,基友就和我买了一样的斐讯 K2P,刷了同样的 padavan 固件。但是对于条件 1,在安装移动宽带时,发现并没有不带路由功能的光猫可以提供,只能用带路由功能的。正当一筹莫展时,朋友发现可以把带路由的光猫工作模式设置为“桥接模式”,即可实现单光猫功能。
好了硬件方面准备好了,又遇到个麻烦,就是当地移动根本就不给分配公网 IP,打客服电话申请了也没有。
没办法,期间尝试 frp 内网穿透到甲骨文云主机上,问题也较多,速度也慢,无法满足云游戏的低延迟高带宽需要。
幸好,基友家的 K2P 开启 WAN 里的 IPv6 设置后,可以获取到公网 IPv6 WAN 地址。诡异的是,却无法获取 IPv6 LAN 地址,路由器下的设备都没有 IPv6 公网地址。所以只能试试直接用 IPv6 访问路由器,然后端口转发到他的游戏 PC 上就可以了。经过调试,最终成功实现,现在就把其中的操作步骤分享如下:

实现此功能需要的几个前提条件

硬件准备:

1. 游戏 PC 应配备支持 GameStream 的英伟达游戏显卡,并安装最新版本的 Geforce Experience,同时开启 GameStream 开关。
2. 游戏 PC 使用网线连接路由器,以便可以远程 Wake on LAN 来唤醒开机,同时传输数据更稳定。
3. 能刷 padavan 固件的路由器 1 台,光猫需要设置桥模式,本人是斐讯 K2P,供参考。

软件准备:

1. 一个免费的个人顶级域名(去 dot.tk 上申请)
2. 需要支持 IPv6 域名 AAAA 记录更新的 CloudFlare 账号。
3. 找到对应路由器版本的 socat 程序,用于实现公网 ipv6 地址向本地内网 ipv4 地址的端口转发。

实现步骤

第一步:完成路由器 IPv6 相关设置

1. 打开路由器 padavan 固件 WAN 设置中的 IPv6 选项。

设置如下图保存。
ipv6 设置.png
过个 5 到 10 分钟,去网络地图 - 外部网里状态里查看,IPv6 WAN 有 240 开头的 IP 后就说明成功获取了公网 IPv6 地址。
这里可以注意到,并未获取到 IPv6 LAN 地址,说明当地移动宽带对 IPv6 的支持可能还不太完备。
ipv6 地址.png

2. 设置公网 IPv6 地址的动态域名解析

因为 IPv6 地址会因为路由器重启,重新拨号等原因不断发生变动,所以有必要设置一个动态域名解析来实现一个网址和我们的路由器公网 IPv6 地址的对应关系,设置好后,需要访问路由只需要输入设置的域名即可,这里,我使用了 cloudflare 的域名解析服务和自己的免费.tk 域名。
进入 cloudflare 网站,登录自己的账号,在自己域名的 dns 记录中添加一条 AAAA 记录的域名解析,IPv6 地址可以随便输一个,比如 2400::0, 记得点掉 Proxied 按钮,使其变为 DNS Only。然后点击保存。
cloudflare 域名设置.png
然后回到路由器后台设置界面,进入扩展功能 -Cloudflare 域名解析中,输入自己的 cloudflare 账号和 API Key(可以点击上面的帮助链接获取),然后在顶级域名 3[IPv6]里输入你的域名。点击保存,这样路由器就会在每 600 秒检测更新一次你指定域名对应的 AAAA 记录了,下次访问该域名就看直接访问路由器了。
cloudflare 设置.png
至此,IPv6 的相关设置完成。可以在路由器日志里看到相关更新信息:
cloudflare 成功更新地址.png

第二步:设置游戏 PC 的固定 IP 分配

进入路由器内部网络 (LAN) - DHCP 服务器中,开启手动指定 IP 的 DHCP 列表的启用手动设置功能开关,然后在下方添加一条游戏 PC 的 MAC 地址与 IP 地址绑定的条目。来固定给游戏主题分配一个内网 IP 地址。下一步指定端口转发时需要。

指定 IP.png

第三步:设置公网 IPv6 到内网 IPv4 地址的端口转发

1. 首先需要准备找到适合自己路由器的 socat 程序,我找了一天才从一位 大佬制作 的 K2P 固件里提取出了可用的 socat 程序文件(用 7z 解压后固件后可在 /usr/bin 目录下找到)。
2. 使用 SCP 工具将 socat 文件上传到路由器 /etc/storage/bin/ 目录下。这里我在手机上使用 AndFTP 工具上传的,过程不在赘述。
3. 使用终端软件连接路由器的 ssh 命令行,我使用的是 connectbot 软件,输入以下命令使得 socat 可用

chmod 755 /etc/storage/bin/socat

4. 回到路由器后台设置页面,进入高级设置 - 自定义设置 - 脚本,展开“在路由器启动后执行:”
在尾部输入如下内容:

nohup /etc/storage/bin/socat UDP6-LISTEN:9,reuseaddr,fork UDP4:192.168.123.204:9 &
nohup /etc/storage/bin/socat UDP6-LISTEN:47998,reuseaddr,fork UDP4:192.168.123.204:47998 &
nohup /etc/storage/bin/socat UDP6-LISTEN:47999,reuseaddr,fork UDP4:192.168.123.204:47999 &
nohup /etc/storage/bin/socat UDP6-LISTEN:48000,reuseaddr,fork UDP4:192.168.123.204:48000 &
nohup /etc/storage/bin/socat UDP6-LISTEN:48002,reuseaddr,fork UDP4:192.168.123.204:48002 &
nohup /etc/storage/bin/socat UDP6-LISTEN:48010,reuseaddr,fork UDP4:192.168.123.204:48010 &
nohup /etc/storage/bin/socat TCP6-LISTEN:48010,reuseaddr,fork TCP4:192.168.123.204:48010 &
nohup /etc/storage/bin/socat TCP6-LISTEN:47984,reuseaddr,fork TCP4:192.168.123.204:47984 &
nohup /etc/storage/bin/socat TCP6-LISTEN:47989,reuseaddr,fork TCP4:192.168.123.204:47989 &

如图:
代码.png

然后点击保存。
注意,这里的 TCP4:192.168.123.204 地址是刚才我们绑定的内网地址,这里要根据大家电脑的实际 IP 修改。
9 号端口用于远程开机唤醒,剩下几个端口均为串流游戏使用。

5. 然后进入高级设置 - 系统管理 - 恢复 / 导出 / 上传设置,点击“保存 /etc/storage/ 内容”的提交按钮,将变动保存到闪存。随后点击页面上方电源按钮,将路由器重启。
批注 2019-11-23 160504.png
至此,公网 IPv6 到内网 IPv4 地址的端口转发就设置成功了,不过路由器重启后,会有几分钟才能获取到 IPv6 地址,所以需要耐心等待一下。

第四步:设置游戏 PC 的远程开机和 GameStream 选项

1. 进入电脑的 BIOS 中,找到 WAKE ON LAN 的相关选项,打开它,此步不再赘述。(我的笔记本电脑没有此选项,但是实际支持 LAN 唤醒)
2. 打开电脑,进入系统后,打开 Geforce Experience 软件,登录账号后,点击右上方齿轮图标,点击左侧 SHIELD,然后打开 GAMESTREAM 开关即可。
批注 2019-11-23 161625.png
这里建议添加远程桌面客户端到游戏和应用里,这样就可以以远程桌面的方式运行任意程序和游戏了。而且根据 moonlight 软件开发者说,添加了 mstsc 程序其实只是一个占位符,告诉 GFE 要运行远程桌面罢了,并不会实际运行它。
添加方式:点击下方添加按钮,选择 C:\windows\system32\mstsc.exe 程序即可,然后点击编辑按钮,修改名字和图标吧。
批注 2019-11-23 162402.png

至此就完成了自己的公网云游戏服务器搭建哦。要想连接自己服务器,只需要在支持 ipv6 网络里打开 moonlight 软件,添加主机地址就输入前面在 cloudflare 设置的域名就可以咯。

本人实际测试了下,离基友 400 公里,还跨了移动联通运营商。在强制 H265 编码下游戏传输延迟加解码延迟才仅有十毫秒左右,根本感觉不出来。游戏体验相当好。
微信图片_20191123165113.jpg

附相关项目地址:

本人使用的 K2P 固件:https://opt.cn2qq.com/padavan/
免费个人域名申请:https://www.freenom.com/zh/index.html?lang=zh
CloudFlare 注册:https://dash.cloudflare.com/sign-up
提取 socat 使用的固件发布地址:https://github.com/hanwckf/rt-n56u/releases
Moonlight:https://moonlight-stream.org/
Geforce Experience:https://www.geforce.cn/geforce-experience/download

最近,突发奇想,想着能不能在自己的远程主机上弄个图形界面再远程控制,上网搜了一圈,果然有不少教程,不过我比较担心我的主机 RAM 太小,导致图形界面运行不起来,在装了一大堆服务后,甲骨文的免费主机的 1G 内存占用率已经达到了近 80%,所以我的选择一个占用内存小的桌面。
根据网上查找教程的线索,提出 Xfce 这种图形界面即省内存,又不简单,所以就选择他了。根据网上的教程,先进入 root 账户,直接输入

yum grouplist

来查看都有哪些可以安装的组包,显示有 Xfce,所以就按照网上的教程,输入了

yum groupinstall "Server with GUI"
yum groupinstall Xfce

期间提示输入了两次 y,等了一小会就安装好了

因为我只能远程连接我的主机,所以我也就没有设置什么默认图形界面启动。然后,就开始研究远程连接了

查了查资料,显示好像 VNC 连接比较方便,然后就找了篇教程,输入

yum install vnc-server

就可以吧 VNC 服务安装到主机上了.

接下来是配置,参照网上的配置,把我弄得一头雾水,有的说需要改 /etc/sysconfig/ 下的配置文件,有的说拷贝配置文件到 systemd 目录下。最后实际去看了看 这些文件发现下面这种才正确。

cp /lib/systemd/system/[email protected] /etc/systemd/system/vncserver@:1.service

有博主说,直接把 [email protected] 文件拷贝到 /etc/systemd/system/ 目录下也行,不用加那个“:1”,后来经过我的测试,还是带了好,这样可以指定好 VNC 服务的端口(:1 对应的端口就 5901,:2 就是 5902,以此类推),而且可以配置出多个不同用户的实例,更加方便管理。这里我们只配置一个。输入如下命令来编辑配置文件,

vi /etc/systemd/system/vncserver@:1.service

前面按照网上的教程,修改配置文件使用 root 用户来连接 VNC,我照做了,开始没理解用户那里怎么配置,失败了,后来干脆完全照搬代码,终于也成功了,可是直接用 root 用户连接时,系统会提示不安全,所以我还是想使用默认账户 opc 来连接 VNC 服务。所以,经过反复试验,终于找到了既能使用普通账户,又不会出现 systemd 里的错误信息,配置文件改成了如下:

[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=opc
Group=opc
WorkingDirectory=/home/opc

PIDFile=/home/opc/.vnc/%H%i.pid
ExecStartPre=-/usr/bin/vncserver -kill %i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -localhost -nolisten tcp %i
ExecStop=/usr/bin/vncserver -kill %i > /dev/null 2>&1

[Install]
WantedBy=multi-user.target

特别需要注意的是,采用网上的教程,仅仅修改

ExecStart=/sbin/runuser -l -c "/usr/bin/vncserver %i"
PIDFile=/home//.vnc/%H%i.pid

两处 为普通用户,会导致服务在 systemd 里启动时报错

New main PID 2241 does not belong to service, and PID file is not owned by root. Refusing.

诡异的是仍然可以使用 VNCViewer 正常连接。。。。
为了不出现这个错误,在 [Service] 里需要把 User、Group 和 WorkingDirectory 均指定到 opc 用户。同时把几项命令字符串改写为 opc 用户直接运行的样子。

ExecStartPre=-/usr/bin/vncserver -kill %i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -localhost -nolisten tcp %i
ExecStop=/usr/bin/vncserver -kill %i > /dev/null 2>&1

这里特别需要注意的是 ExecStart 命令,因此 vnc 服务并未加密,直接从外网连接有一定危险性。于是我加上了 -localhost 和 -nolisten tcp 参数,这两个参数添加后,可以防止直接从外网访问主机 VNC,只能通过 SSH 通道端口转发方式才能连接,同时关闭 tcp 监听,实现更加安全的 VNC 服务。

随后,切换回 opc 用户

su opc
vncpasswd

设置 VNC 服务的密码
然后把 VNC 服务设置为自启动

sudo systemctl daemon-reload
sudo systemctl enable vncserver@:1.service
sudo systemctl start vncserver@:1.service

若开启了防火墙,还需要设置防火墙

sudo firewall-cmd --permanent --add-service vnc-server
sudo systemctl restart firewalld.service

然后编辑启动配置文件 xstartup

vi /home/opc/.vnc/xstartup

设置为如下内容

#!/bin/sh
unset SESSION_MANAGER
[-x /etc/vnc/xstartup] && exec /etc/vnc/xstartup
[-r $HOME/.Xresources] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
startxfce4 &

保存即可。如果 xstartup 是个空白文件,则还需要对它进行赋权

sudo chmod 755 /home/opc/.vnc/xstartup
sudo chown opc:opc /home/opc/.vnc/xstartup

然后输入

sudo systemctl restart vncserver@:1.service

重启 VNC 服务。
接下来就可以在自己电脑上安装 VNC 客户端,先使用 putty,选择之前建立的连接服务器的 Session,进入左侧 Connection-SSH-Tunnels 里,在 Source Port 输入 5900,Destination 里输入 localhost:5901, 选择 Local 单选框,最后点击 Add 按钮,即可添加本地 5900 端口到远程主机 5901 端口的转发映射。去 Session 里保存下,然后点击 Open 按钮使用 ssh 连接上远程主机。
批注 2019-10-15 224957.png
然后,就可以在 VNC 客户端里使用地址

127.0.0.1:5900

输入刚才用 vncpasswd 设置的密码来连接远程桌面啦!
效果如下图:
批注 2019-10-13 235609.png
PS:最后看了下,占用内存情况还是比较少的,现在内存占用率变化很小,依然不到 80%,几乎感觉不出来,Xfce 果然还是省内存呀!