ubuntu22.04 server 安装 xfce4 和 xrdp
最近需要在服务器上安装桌面。于是总结一下。
1 | apt update && apt-get upgrade -y && \ |
在用户家目录输出 xfce4 的 session
1 | echo "xfce4-session" | tee .xsession |
重启 xrdp
1 | systemctl restart xrdp |
最近需要在服务器上安装桌面。于是总结一下。
1 | apt update && apt-get upgrade -y && \ |
在用户家目录输出 xfce4 的 session
1 | echo "xfce4-session" | tee .xsession |
重启 xrdp
1 | systemctl restart xrdp |
Android 12及以上用户在使用Termux时,有时会显示 [Process completed (signal 9) - press Enter],这是因为Android 12的 PhantomProcesskiller 限制了应用的子进程,最大允许应用有32个子进程。
解决方案就是通过 adb 命令来修改底层的配置,命令如下:
1 | adb shell device_config set_sync_disabled_for_tests persistent |
这两条命令执行完,即修改最大子进程数为 65536。
补充:
可以直接在 termux 中安装 adb 工具,使用开发者工具里的无线调试来连接,并执行上面的两条指令。
1 | pkg install android-tools |
补充:
鸿蒙系统的话,执行下面的命令
1 | adb shell /system/bin/device_config set_sync_disabled_for_tests persistent |
去 https://github.com/termux/termux-app 下载并安装
1 | $ pkg update |
上面的命令是更新 termux 的包管理,安装 x11 相关工具,安装 proot,安装声音相关内容,安装 3D 相关内容,安装 archlinux。
1 | $ proot-distro login archlinux --user root --shared-tmp |
以 root 用户身份进入 archlinux,并且跟 termux 共享 /tmp
1 | Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/$arch/$repo |
1 | # pacman -Syu |
1 | # passwd |
1 | # vim /etc/sudoers |
1 | # su ety001 |
1 | # ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
修改 /etc/locale.gen 中 zh_CN.开头的注释符,并执行 locale-gen
配置默认语言
1 | # echo "LANG=zh_CN.UTF-8" >> /etc/locale.conf |
1 | $ vncserver -localhost |
如果是第一次启动 vncserver,会提示配置 vnc 的密码。
1 | $ vncserver -kill :1 |
停止服务,然后访问 ~/.vnc/xstartup,注释掉所有内容后,添加下面的内容
1 | startxfce4 & |
这样启动 vncserver 后,会执行启动 xfce4 桌面的命令。
这里需要注意的是,在启动 vncserver 前,还需要设置下面的环境变量
1 | export DISPLAY=:1 |
回到 termux,创建 start.sh 脚本
1 | pulseaudio --start --load="module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1" --exit-idle-time=-1 |
以后,只需要打开 termux 后,执行 start.sh 脚本即可启动 archlinux 容器和桌面。
只需要用 vnc 软件连接 127.0.0.1:5901 即可。
另外,还需要在 xfce4 的配置面板中,关闭屏保和锁屏功能。
网格机器人,就是在一定的价格范围内,划定指定数量的价格网格,作为买卖价格的基础。
比如币安的 STEEM / USDT 交易对,开通一个价格范围 0.175 – 0.275 ,网格数100的机器人。那就意味着每个小网格的价格跨度是 0.001 = (0.275-0.175)/100,那么机器人建单就会按照 0.175, 0.176, 0.177, 0.178 这样的规律操作,这就是所谓的网格。
而具体的买单和卖单数量则是根据当前的市场价决定初始状态。
假设你目前开机器人订单的时候,当前市场价是 0.178,那么 0.178 之前的网格是买单,0.178之后的网格是卖单,空下 0.178 这个价格。(这里卖单需要的STEEM币,是机器人计算出需要多少初始数量的STEEM,然后以市场价一次性吃入)。
之后随着市场价格波动,机器人动态增加买卖单。比如按照上面的假设初始化以后,
| Buy | Sell |
|---|---|
| 0.177 | 0.179 |
| 0.176 | 0.180 |
| 0.175 | 0.181 |
| 0.182 | |
| 0.183 | |
| ……… |
价格跌到 0.176 – 0.177 之间的时候, 0.177 的买单成交,机器人自动用 0.177 成交的 STEEM 下 0.178 的卖单,等 0.178 的卖单成交,这一个网格的低买高卖就完成了。
现货网格机器人并不是无脑就能赚钱的机器人,无论是价格低点的判断,还是各种参数的设置,都需要长时间的观察和尝试。
网格机器人只是一个辅助工具,关键还是自我对于市场价格的判断。我们可能做不到像专业的技术流的分析师那样,但是只要能判断出一个大致范围,那么就是网格机器人一展身手的时候。
真文韵输入法 是 fydeOS 团队开发的,基于 RIME 引擎,针对 ChromeOS 的输入法集成。
给中文用户第三方输入法选择方案。
但是目前还处于早期阶段,因此 UI 配置界面很简陋,可以自己通过 RIME的配置文件,按照自己的需求更改。
比如我习惯的翻页方法是逗号和句号,而这个默认不支持的。
需要我们自己修改一下配置。
在编辑 RIME 配置文件里,找到 /root/build 目录下面 yaml 配置文件,命名则是根据你安装的输入法来确定的。
打开 yaml 格式配置文件,找到 key_binder: bindings 选项,删除掉原来的 Page_Down 和 Page_Up 配置,增加下面两行配置:
1 | - {accept: "comma", send: Page_Down, when: has_menu} |
保存后,等待输入法重载即可。
之前两个局域网是靠 zerotier 连接的,但是 zerotier 在国内的网络环境实在是太糟糕了,即使我用了黑科技在国内服务器上搭建两 planet ,依旧是不稳定。
于是放弃 zerotier ,转而使用 wireguard 组建我的工作 VPN。
网络信息如下:
公私钥信息如下:
公私钥生成命令:
1 | wg genkey | tee privatekey | wg pubkey > publickey |
1.三台机器都开启转发
1 | # 添加下面的配置到 /etc/sysctl.conf 后执行 sysctl -p 生效 |
2.三台机器都安装 wireguard
3.机器A配置 /etc/wireguard/wg0.conf
1 | [Interface] |
4.机器B配置 /etc/wireguard/wg0.conf
1 | [Interface] |
5.服务器配置 /etc/wireguard/wg0.conf
1 | [Interface] |
6.局域网A的openwrt路由器上添加静态路由
7.局域网A的openwrt路由器上添加静态路由
主要难点就是各个节点的 AllowedIPs 和防火墙规则配置。
Here is the demo code which displays how to create a new account with Steem JS SDK in two different ways ( by taking fee or by taking interests of claimed account).
1 | const steem = require('steem') |
前段时间刷机,因为官方文档的问题,我把路由刷成砖了。
然后尝试了 ttl 救砖,一开始能进 uboot ,后来因为刷错了,导致 uboot 也挂了。

最后买了热风枪和编程器,拆焊后,用编程器刷固件。

固件倒是刷成功了,但是焊回去后,路由无法开机,看上去焊接的没有问题,估计是热风枪把路由器主板搞的太热,把某个元器件搞坏了吧,毕竟是我第一次用热风枪。

于是从闲鱼二手买了一个同款路由器,重新刷机。之所以买同款,是因为这台路由器整体的硬件配置和价格真的是超高性价比啊。
这次吸取了之前刷机时对于官方文档中不确定的命令参数不懂硬上的教训,所以记录一下整个刷机过程。
大概过程是:
所有涉及到的固件都在这里: https://pan.baidu.com/s/1341uqxZab8om_YL9UEJpAA?pwd=2333
小米在旧的固件上不知道是故意留的后门,还是真有漏洞。第一步就是通过路由器管理界面的升级功能,降级固件到 1.0.16。
之后需要准备一台 OpenWRT,我这里正好有个闲置的刚好拿来用。

把这台 OpenWRT 的 LAN 口 IP 设置为 169.254.31.1,然后关闭 DHCP。
之后把 PC 端修改为 169.254.31.22/24(这里官方文档是错误的)。
完成生效后,登陆这台路由器的 SSH,创建文件 /usr/lib/lua/luci/controller/admin/xqsystem.lua,内容为:
1 | module("luci.controller.admin.xqsystem", package.seeall) |
保存后,这时你用电脑访问 http://169.254.31.1/cgi-bin/luci/api/xqsystem/token 就能看到上面脚本文件中 result 变量的输出内容了,这个就是一会需要注入到 Redmi AX6 路由的代码。
可以看到我们注入的代码做了这么两个工作:
准备工作完毕,下面正式开始破解。
PC 清空之前的 IP 设置,改为自动获取,使用网线连接 Redmi AX6(之所以用网线,是因为破解使用的是路由无线中继中的漏洞,如果用 wifi 连接,在破解过程中会脱离与路由器的连接)。
登陆 Redmi AX6 网页界面后,可以看到 URL 中有一个 stok 的值,我们复制出来备用(这里假设是 aaabbb)。
假设我们之前准备的 OpenWRT 路由的 WiFi 名是 ety001op,密码是 12345678。
构造下面两条URL,然后浏览器依次访问
1 | http://192.168.31.1/cgi-bin/luci/;stok=aaabbb/api/misystem/extendwifi_connect?ssid=ety001op&password=12345678 |
第一个 URL 是让 Redmi 去连接我们准备的路由器,第二个 URL 就是让 Redmi 获取要注入的代码。
下面我们 ssh root@192.168.31.1 就能连接到 Redmi 的终端界面了,密码是 admin。
至此破解结束。
进入 Redmi 的终端后,如果你想备份下,可以执行下面的命令备份相关的分区
1 | dd if=/dev/mtd1 of=/tmp/mtd1.bin |
具体的分区情况,可以通过这条命令查看
1 | cat /proc/mtd |
一般备份下 ART 分区,uboot 分区。
因为 Redmi AX6 是双系统,mtd12 一个系统,mtd13 一个系统。
我们要合并的是 mtd12, mtd13, mtd14(overlay分区),因此我们需要先确认下我们目前是启动的哪个分区的系统(一般情况下出厂都是 mtd13 分区的系统)。
1 | nvram get flag_boot_rootfs |
这是对照表
1 | mtd12 "rootfs" 0 |
如果你看到你输出结果是 0,那么你现在用的是 mtd12 的系统,你需要先切换到 mtd13 系统去
1 | nvram set flag_last_success=1 |
我们必须确保自己是在 mtd13 分区的系统中
下面刷入临时系统(固件xiaomimtd12.bin)到 mtd12 分区,同时设置下次启动 mtd12 分区
1 | mtd write /tmp/xiaomimtd12.bin rootfs |
如果一切顺利,重启后,你 PC 的 IP 地址会获取到 192.168.1.0/24 段的,访问 192.168.1.1 可以顺利打开 OpenWRT 登陆界面。
我们重新登陆 SSH,ssh root@192.168.1.1,这个临时 OpenWRT 密码为空。
通过工具把 ax6-uboot.bin 和 ax6-uboot-mibib.bin 两个文件传入到路由器 /tmp 目录里。
扩容前打印下分区表,确认 mtd1 和 mtd7 存在
1 | cat /proc/mtd |
确认后,顺次执行下面的命令,擦除分区并写入
1 | mtd erase /dev/mtd1 |
等待执行成功。
分区修改后,记得一点要 断电。
分区修改后,记得一点要 断电。
分区修改后,记得一点要 断电。
剩下的操作就简单了,只要能顺利进入 Uboot,以后刷机就简单了,也不用担心变砖了(理论上 factory 的固件都可以刷)。
进入 Uboot 的方法基本上都一样,就是在断电的情况下,按住 reset ,上电。
Redmi AX6 指示灯会先蓝灯闪烁,然后变黄灯,这时松开 reset ,电脑上手动配置 IP 为 192.168.1.2/24。
进入 Uboot 的 Web 界面 192.168.1.1,选择最终固件 openwrt-ipq807x-generic-redmi_ax6-squashfs-nand-factory.ubi ,刷入,重启,成功!
我的服务器宿主机安装的是 PVE,上面跑着一台 Archlinux 的虚拟机作为工作机(显卡、键盘、鼠标、USB声卡直通),一台 Windows 的虚拟机作为辅助(在 Archlinux 下使用 KRDC 连接后一直开着一个窗口,用来运行没法在 Linux 下原生运行的程序,比如微信)。
最近看到 Atlas OS 不错,于是想要用 Atlas OS 重做 Windows 虚拟机。
但是问题是 Atlas OS 不支持 RDP,于是我只能选择 VNC 方式连接(tightvnc)。
但是众所周知,VNC 不支持声音传输。
搜索了一晚上,终于找到了一个牛逼的库,可以在 Windows 下实现虚拟声卡,然后通过 multicast 或者 unicast 的方式,把声音转到同局域网下的其他设备播放。
地址:https://github.com/duncanthrax/scream
我们的目的就是在 Windows 虚拟机安装虚拟声卡,在 Archlinux 下安装 Receiver。
Archlinux 下安装 Receiver 非常简单,直接用 Aur 库安装即可,
1 | yay -S scream-git |
安装后,启动
1 | scream -u -o pulse |
这样就指定 Receiver 用 unicast 方式接收数据,然后转给 pulseaudio 进行播放。
然后去 duncanthrax/scream 库的 Release 页面下载最新版本。
解压后,找到安装 bat 脚本,选择 x64 架构的,右键,用管理员权限执行。
这里在 Atlas 下有个问题,就是 Atlas 把 netlogon 服务给干掉了,导致 bat 脚本的 net session 执行失败,进而检查用户权限失败,进而无法安装。解决方法就是用记事本编辑 bat 脚本,把里面的 if 部分去掉,然后再用管理员权限执行,即可完成安装。
之后,需要配置 Windows 端也使用 unicast 。

按照图片在注册表中新建指定内容即可,一个配置指向 IP,一个配置指向端口,截图里的端口是 4011,Receiver 的默认端口是 4010。
修改完注册表,需要重启计算机,之后就能在 Windows 里播放声音测试了。
测试没有问题,我们需要在 Receiver 端配置开启启动,
新建 ~/.config/systemd/user/scream.service 文件,内容如下:
1 | [Unit] |
然后执行下面的命令,设置为开机自启动
1 | $ systemctl --user enable scream |
最后重启下 Archlinux 试试。
最近服务器加装了带供电的 PCIe 转 USB 的板卡,然后发现接在上面的 USB 声卡,挂载到 Linux 的虚拟机里有噪音,但是挂载到 Windows 的虚拟机里没有噪音。
搜索了很多内容,最终找到了解决方案,修改了一下采样率,让人难受了两个月的问题终于解决。
1 | $ vim ~/.config/pulse/daemon.conf |