HP t240 与 Armbian

上一篇文章发了后,有人说太折腾,我这就来砍一步好吧,去 https://www.armbian.com/uefi-x86/ 下载 Armbian 25.2.3 Bookworm Minimal / IOT 的镜像,用 rufus 刷进 U 盘,插上机器,开机按 F9 选择 U 盘启动,设置 Root 密码,就直接进到了系统。

我们用上文的 ls /sys/class/usb_role/ls /sys/class/udc/ 命令可以看到,USB 模拟设备所需要设备已经出来了,接下来就可以直接按照正常的步骤去安装 docker 及配置 One-KVM 了。

PixPin_2025-05-05_11-47-30.png

然后有个点我没提的是,这个 OTG 口好像每次启动都是默认 host 模式,我尝试过在 BIOS 中修改 Default DRD ConfigDeviceMode,但是没有任何效果,所以每次开机都要手动切换一次,但应该难不倒各位自己编写个脚本来开机自动切换。

我知道有的朋友会说,Armbian x86 不也是个 Debian 吗?

我的回答是,Armbian x86 是个 Debian,但它是个专门为单板机定制的 Debian,默认开启了很多单板机的功能和驱动,例如像 USB OTG 这种功能,直接就可以用,而 Debian 需要自己去编译内核加驱动。

HP t240 玩 USB OTG 跑 One-KVM

事情是这样的,一开始是随便看的 Intel Atom Z3735F,后面咸鱼推给我一个 Wyse 3040,不是一个 U,是个 Z8350,2G 内存,8G 存储,然后突然注意到,这玩意供电是 5V !这不就可以从主板插的 ATX 电源的 5Vsb 偷电吗?然后开始就去查这 CPU 的资料,结果搜到了一份 datasheet,看到上面写着居然支持 USB3.0 OTG,就开始猛猛逛咸鱼,结果又冒出一个东西截胡,这玩意是 HP T240,配置一样,似乎还便宜点,然后我就一时冲动买了。

理论支持

首先,得确定这玩意真能跑 OTG 好吧,然后还是在那份 datasheet 里面,看到 USB 部分,有个 USB_OTG_ID 的针脚,心想,这下稳了,这机器百分百有个 USB OTG 功能,然后就是看看在 x86 环境下有没有人搞过 OTG,然后就发现有个哥们干得比我还猛,他是直接把两个 thinkpad 连起来了,这个也是我后续的一个重要的操作指导。

机器开箱

就一个瘦客户机加一个欧陆通的电源,不确定是不是后配的电源。

机器正面有极为先进的 3.5mm 耳机和麦克风接口,一个 USB3.0 接口,一个 USB2.0 接口,还有一个电源按钮。

机器后面有一个 5.5mm 圆头的电源接口,一个千兆网口,一个 VGA 接口,一个 HDMI 接口和两个 USB2.0 接口,以及还有一个你永远不用用上的肯斯顿锁孔。

底部是两个脚垫还有一个 VESA 100mm 的安装支架,对的,完整是 4 个脚垫,但是支架的安装方式是拆掉两个脚垫露出螺丝孔固定的,所以只剩下两个脚垫了。

根据 SN 号信息查询,显示还有 8 个月的保修期,真是意外之喜,但好像又没有什么用。

上电后是进入到自带的 ThinPro 系统,很可惜我没有做任何备份就直接覆盖了它,我后面试图自己重新安装这个系统,但好像没找到正确的安装方式,所以这里没有仔细评测这个系统了。

系统安装

拿个 U 盘,直接用 Rufus 刷入 Debian 12 的 ISO 镜像,插上机器,开机按 F9 选择 U 盘启动,直接安装就行了。

真那么简单吗?只是到这里是的,但是后面就不那么简单了。

找到支持 OTG 的 USB 口

我不是很确定这块的接口是不是默认有的,你可以先 ls /sys/class/usb_role/ 看看有没有 intel_xhci_usb_sw-role-switch 这个文件夹,如果没有,可能要到后面 BIOS 里面改选项后才能看到了。

我们把那个 USB OTG 接口的模式改成 device 模式,命令如下

1
echo device > /sys/class/usb_role/intel_xhci_usb_sw-role-switch/role

如果你想要切回 host 模式的命令是

1
echo host > /sys/class/usb_role/intel_xhci_usb_sw-role-switch/role

在 device 模式下,我们拿个 U 盘怼上去,然后 lsusb 看看有没有显示出来,那个口就是我们要找的 OTG 口了。

修改 BIOS 隐藏选项

进去系统之后,我们 ls /sys/class/ 可以看到设备上的设备类型,但是,偏偏没有 udc,这个 udc 是什么东西呢?是 USB Device Controller 的缩写,有这个你才有机会跑 OTG。

但我们前面已经提到这个 CPU 明明是支持 OTG 的,为什么没有呢?根据文章提示,要去 BIOS 里面改选项,然而,,,这个 HP 的 BIOS 似乎被极端精简了,很多选项都消失了,也完全没看到与 USB OTG 相关的选项,什么 OTG Support 什么 xDCI 通通没有。

这时候有些人可能就放弃,但我想了想,要不试试干 BIOS,反正别人也试着干了,于是我就去 hp 的支持页面找 BIOS,幸好,恰巧有一个 BIOS 下载,于是我就拉了下来,然后尝试了一下刷 BIOS,你猜怎么着,刷不上!(乐

不过,既然都下载下来了,也不是完全没有研究价值,至少先看看能不能有没有相关的选项好吧。

我们请出了 UEFITool , IFRExtractor-RS , UEFI-Editor 还有 AMIBCP 试图修改 BIOS,经过一番翻找啊,他确实有那么一堆隐藏选项,但是不知道怎么解锁,其中有一项叫做 USB OTG Support 这似乎有戏,但又没戏,毕竟你还得小心人家 BIOS 有什么签名验证之类的。

最后我还是放弃了,毕竟我没这个能耐,我也不想把它搞坏。

翻了翻几个工具的文档,发现 UEFI-Editor 底下的文档里面有一项 How to change hidden settings without flashing a modded BIOS 哦吼,翻译过来就是 如何在不刷修改过的BIOS的情况下修改隐藏设置,(后面翻看开头那位 thinkpad 互联大佬也是走的这招),这不正合我意,反正主板上的 BIOS 和我现在下载到的这个 BIOS 是一样的也不是不行嘛。

首先前提是你的 BIOS 得是 AMI 家的出品或者变种,如果不是的话,你就没戏了。

首先是到 UEFITool NE 这里下载一个最新的 UEFITool_NE_A**_win64.zip 如果没看到这个文件,你需要点一下 show all ** assets,这里星号代表任意数字,请仔细注意名字,如果你是其他系统,可以把 win64 换成相应的,但一般是 win64,下载解压后,我们得到一个 UEFITool.exe 的文件,我们打开,把前面拿到的 BIOS 文件拽进去,按下Ctrl+F选 Text 输入above 4g搜索。

大概搜索就是这样

然后可能有多个结果,双击点开,大概应该都是指向同一块的且是在Setup底下的

PixPin_2025-04-30_00-59-36.png

我这里是 Setup/LzmaCustomDecomprressGuid/PE32 image section

对着PE32 image section右键,选择 Extract as is,得到一个文件 Section_PE32_image_Setup_Setup.sct

然后我们再掏出另一个工具 IFRExtractor-RS,我们选择ifrextractor_1.6.0_win32.zip 下载,其他操作系统的自行选择合适的,解压后得到ifrextractor.exe

(此处我偷了两步可能用不到结果的步骤)

我们在ifrextractor.exe所在文件夹按住 shift+右键,选择在此处打开 Powershell 窗口,然后输入

1
.\ifrextractor.exe "Section_PE32_image_Setup_Setup.sct" verbose

然后我们打开这个文件,搜索 USB OTG Support,你会找到

1
2
3
4
5
6
0x19B6F:         OneOf Prompt: "USB OTG Support", Help: "Enable/Disable USB OTG Support", QuestionFlags: 0x10, QuestionId: 0x1B2, VarStoreId: 0x1, VarOffset: 0x1BF, Flags: 0x10, Size: 8, Min: 0x0, Max: 0x3, Step: 0x0 { 05 91 3A 04 3B 04 B2 01 01 00 BF 01 10 10 00 03 00 }
0x19B80: OneOfOption Option: "Auto" Value: 3, Default, MfgDefault { 09 07 76 03 30 00 03 }
0x19B87: OneOfOption Option: "ACPI mode" Value: 2 { 09 07 3D 04 00 00 02 }
0x19B8E: OneOfOption Option: "PCI mode" Value: 1 { 09 07 3C 04 00 00 01 }
0x19B95: OneOfOption Option: "Disabled" Value: 0 { 09 07 78 03 00 00 00 }
0x19B9C: End { 29 02 }

然后我们可以看到这个选项的 VarOffset0x1BF,而且 VarStoreId0x1

然后搜 VarStoreId: 0x1,找到类似这样的一行

1
0x129F9:     VarStore Guid: EC87D643-EBA4-4BB5-A1E5-3F3E36B20DA9, VarStoreId: 0x1, Size: 0x27A, Name: "Setup" { 24 1C 43 D6 87 EC A4 EB B5 4B A1 E5 3F 3E 36 B2 0D A9 01 00 7A 02 53 65 74 75 70 00 }

然后我们可以看到这个 VarStore 是叫做 Setup 的,接下来我们就可以用 datasone’s modded shell

我们下载 modGRUBShell.efi 并将其重命名为 BOOTX64.EFI

将一个 U 盘格式化为 FAT32,并将 BOOTX64.EFI 移动到 USB:\EFI\BOOT\ (手动创建文件夹 EFIBOOT)。最终的 shell 路径应为 USB:\EFI\BOOT\BOOTX64.EFI

把这个 U 盘插入机器,开机按 F9 选择这个 U 盘启动,进入 grub 命令行界面。

1
setup_var_3 0x1BF

输入这个命令,这个命令应该会找到一个 0x3

为什么是 0x3 呢?因为我们在前面看到的 OneOfOption 里面有一个 Auto 的选项,而且是默认选项,我们可以大致推测这个 0x3 是代表 Auto 的。

于是我们就可以把它改成 0x1,也就是 PCI mode

1
setup_var_3 0x1BF 0x1

然后 Ctrl+Alt+Del 重启机器,进入系统。

到这里我们在 BIOS 里面已经开启了 USB OTG 的选项,

我们进入系统后,执行lspci,可以看到有一个 Intel Corporation Device 22b7 的设备,搜索 8086:22b7 可以看到这个设备是 Intel USB Synopsys Controller 需要的驱动是 dwc3_pci,但这个驱动系统默认是不带的,由此引出了下一步。

修改内核构建参数

这里 我们可以知道需要打开的配置项是 CONFIG_USB_DWC3

构建的时候,建议使用虚拟机或其他机器来编译内核,本机编译实在太慢了。

这里我建议参考 Debian 官方内核构建手册,我这里感觉自己还是有些问题的,所以就仅给出我使用的命令,不作详细解释。

先说我的步骤目前遇到的问题:

  1. 破坏了依赖关系,导致无法正常使用 apt 安装各种库之类的
  2. 每次升级内核都需要重新编译一次,太麻烦了

命令:

1
2
3
4
5
6
7
8
9
10
apt-get install build-essential libncurses-dev
apt-get build-dep linux
apt-get source linux
cd linux-6.1.133
export MAKEFLAGS=-j$(nproc)
export DEB_BUILD_PROFILES='pkg.linux.nokerneldbg pkg.linux.nokerneldbginfo'
make -f debian/rules.gen setup_amd64_none_amd64
make -C debian/build/build_amd64_none_amd64 nconfig
make -C debian/build/bui1d_amd64_none_amd64 clean
make -C debian/build/build_amd64_none_amd64 bindeb-pkg

在 nconfig 这一步时,找到 Device Drivers -> USB Support -> USB Gadget Support 选中 USB Gadget SupportDesignWare USB3 DRD Core Support

构建完成后在debian/build下会生成一个 linux-image-6.1.133_6.1.133-1_amd64.deb 的文件,复制到 t240 上,用 dpkg -i linux-image-6.1.133_6.1.133-1_amd64.deb 安装然后重启。

如果卡住了,你可以强制重启,在 grub 中进入高级选项,选择其他版本内核进入系统,卸载删除自己构建的内核并安装原版内核,命令没记错的话 apt --fix-broken install

如果你成功进入了你自己构建的内核,那么我们可以用下面的命令快速检查下是否成功

1
ls /sys/class/udc

如果你看到 udc 这个文件夹,那么恭喜你,你的 OTG 功能已经开启了。

运行 One-KVM

我这里采用的是 Docker 方式运行的 One-KVM。

首先是安装 Docker 这里和其他机器没有区别,正常安装就行,建议在安装自己构建的内核前完成安装。

然后我们把那个 USB OTG 接口的模式改成 device 模式,命令如下

1
echo device > /sys/class/usb_role/intel_xhci_usb_sw-role-switch/role

然后是安装 One-KVM,直接用下面的命令就行了

1
2
3
4
5
docker run --name kvmd -itd --privileged=true \
-v /lib/modules:/lib/modules:ro -v /dev:/dev \
-v /sys/kernel/config:/sys/kernel/config -e OTG=1 \
-p 8080:8080 -p 4430:4430 -p 5900:5900 -p 623:623 \
silentwind0/kvmd

(其实就是官方给出的命令)

参考及工具

https://github.com/datasone/grub-mod-setup_var

https://github.com/LongSoft/IFRExtractor-RS

https://github.com/BoringBoredom/UEFI-Editor

https://xairy.io/articles/thinkpad-xdci#-enabling-xdci-via-nvram

https://linux-hardware.org/?id=pci:8086-22b7-8086-7270

https://kernel-team.pages.debian.net/kernel-handbook/ch-common-tasks.html#s-common-official

为什么我每次开机都要重启HNS

其实这事也没啥必要的,大家都用 clash,不过好像多数人都不会去改端口号,而我改了,改成了 1080,就多了挺多麻烦事的。

这个问题好几年前就碰到过了,之前也解决了,但就是想不起来怎么解决的了,所以每次都是重启 HNS,然后再重启 clash。

今天终于想起来了,这个问题是系统的默认动态端口范围是:1024-15000,而我把 clash 的端口改成了 1080,然后别的程序要随机分配端口的时候就会把这些端口占用了,所以我指定的 1080 就会被占用,然后 clash 就会启动失败,报错:permission denied

我们可以用 netsh int ipv4 show dynamicport tcp 来查看被占用的端口范围。

1
2
3
4
5
6
> netsh int ipv4   show dynamicport tcp

协议 tcp 动态端口范围
---------------------------------
启动端口 : 1024
端口数 : 13976

微软官方也注意到这个问题,并建议修改动态端口范围,避免和其他程序冲突。我们可以用 netsh int ipv4 set dynamicport tcp start=49152 num=16384 来修改动态端口范围。

1
2
> netsh int ipv4 set dynamicport tcp start=49162 num=16374
确定。

注意,需要在使用管理员权限的终端中执行才能生效。

参考:

https://learn.microsoft.com/zh-cn/troubleshoot/windows-server/networking/default-dynamic-port-range-tcpip-chang

Tera2220 上手速评——也就在当年很牛逼

省流:垃圾,别买

事情是这样的,因为工作上的需要,我在寻找一张 100 块以内的 IPMI/KVM 卡,在这个价格范围内,能找到看起来性价比最高的玩意就是这个,于是,我在咸鱼上以 60 块不包邮的价格收了一张回来试了试。

先聊聊这卡的纸面数据吧。

这张卡有两个 minidp 输入, 一个 rj45 网口,最大支持传输一个 3840x2160 或一个 2560x1600 或两个 1920x1200 画面,帧率最高 60fps,内置 512MB DDR3 ECC,走 PCoIP (PC over IP) 协议传输,支持通过按键开关或 pcie 开机。

到手之后,上机,很快,我就从路由器上找到了这个设备的 IP。

SSL 问题

接着我们就碰到第一个问题,我们登录上去,诶,有密码,但好在可以重置,在关机状态下将把 J15 调整 2,3 的位置,然后开机,这张卡就被重置到了没有密码的状态,然后关机恢复到正常 1,2 位置,这样我们就解决了第一个问题。

既然登录过了,那么我们就该尝试连上去了,对吧,但是这里开始,就碰到了折腾我足足半天的问题,SSL 证书问题,按说直接无脑忽略证书错误不就完事了吗?

一开始,我以为是卡上的固件太老了(4.x,忘了),ssl 加密方式都不支持了,于是我就去找固件了,这时候我就开始意识到,选择这张卡就是个错误。

Teradici 公司在 2021 年被 HP 收购,改名 HP Anyware,主要做的就是基于 PCoIP 协议下的各种周边产品和专利授权,包括这张卡、还有零客户端、集中管理平台还有这张卡的远程访问服务之类的。

从这开始,这张卡的各类技术支持开始断了,获取固件需要登录账号,登录账号后发现要注册产品,可我这咸鱼二手的,又哪来那些资料来填进去注册呢?

但好在功夫不负有心人,在谷歌上经过仔细搜索,总算找到了固件刷了上去,但问题并没有解决。

所以问题出现在哪了呢?

我手上有几个服务器上用的通配符证书,经过一番折腾,上传了上去,然后本地写了个 hosts,连上了了!我日!

所以,我猜测问题应该是:

这张卡的 https 证书选择策略有问题,他不会默认返回里面带的那张自签名证书,而是选择了直接掐断连接
又或者是客户端这边完全不提供忽略证书的功能。

不支持 BIOS

既然连上了,那么就要来解决我主要的问题了,就是进 bios 操作,这时候,我发现这张卡的一些阴间特性了。

这张卡他关机状态跟着关机了,这意味着关机状态下,就无法找到这个卡。

同时这张卡启动时间也长,总所周知,AMD 的内存训练时间长,我这 2x24gb 的内存的主机,内存训练完了,这个卡才被 ping 通了,这意味着几乎不可能进入 bios 了。

同时这张卡在未连接状态下,他不会向显卡注册显示器,意味着就算你连接上了,在 bios 枚举显示器阶段,也选不上这个显示器,更别说指望停留那几秒去按进 bios 了。

于是我找这张卡最大的需求就随之破灭了,毕竟我是希望借助这张卡来进 bios 调整参数,顺带完成重装系统的。

总结

tera2220 这张卡作为一张在 2012 年甚至更早发布的远程卡,在他的预定目标领域,高性能渲染设计,他曾经也许是一个划时代的产品,但在当下,随手就能抓一堆高性能远程控制软件,配合上显卡自带的编码器,很轻松就能实现低延迟的远程控制同时几乎不会带来任何的性能损失。同时在 ipmi/kvm 领域,他是一个不合格的替代品,支持 4k 的 ms2130 采集卡也不过 40 元左右,也许需要带上一只 ch9329 之类的,再来一个类似树莓派的 arm 开发板或矿渣,就能组成一个 kvm 盒子,甚至还能提供虚拟光驱的功能,加起来也不过百元左右,虽然延迟可能比不上 tera2220,但在功能性上也算是碾压了,那么 tera2220 这种东西也是该丢进垃圾桶了。

RemoveAllEventListeners

没法直接移除所有监听器,难受死了,不过查了下 stackoverflow,发现有个叫做getEventListeners可以获取 EventTarget 的所有监听器。

于是我就基于这个函数,给 EventTarget 补上了RemoveAllEventListeners这个方法。

1
2
3
4
5
6
7
8
EventTarget.prototype.removeAllEventListeners = function (eventname) {
let listeners = getEventListeners(this)
if (listeners[eventname]) {
listeners[eventname].forEach((e) => {
this.removeEventListener(e.type, e.listener);
})
}
}

IPv6爬虫猛爬

IPv4的稀少让人很无奈,无法获得大量IP,而IPv6国家正大力推进,而且只要家里宽带支持ipv6,一般都会发下来最小一个/64段,大的可能给到/48甚至更大,同时,由于ipv6的海量性,除了依靠运营商提供外,还可以从不少的网站上直接申请到很大的一个ipv6段来使用,只不过要花点钱找支持bgp session的vps供应商,学习一堆相关的知识配置后才能使用。

受 zu1k 的 http-proxy-ipv6-pool的启发,结合我对于nodejs的理解,配置出了一个算是半起飞级别的爬虫。

本文将会简单介绍我在我的树莓派上配置ipv6爬虫的过程,从系统配置到删库跑路全过程。

首先,你需要确认你能够使用ipv6网络且有大段的ipv6使用,你可以在路由器上查找确认是否获得了公网ipv6地址,并有可用的公网ipv6 Lan前缀,如果你能够看到上面提到这些,并且能够在test-ipv6上去的10/10,那么恭喜你,你已经满足了一半的前提了。

然后,确认你的目标爬取站点是否支持ipv6,通常情况下,你只需要在命令行中打开nslookup,设置查询类型set type=AAAA,然后查询你所需要爬取的网站的域名,看返回的结果是否有ipv6地址,有的话,就满足另一半的前提了。

接下来是系统的配置工作,首先你需要安装一个ndppd,于是就sudo apt install ndppd,然后,因为我不会配置系统服务启动失败不影响重启,我是直接先systemctl stop ndppd,按需要去启动这个ndppd。ndppd的作用是向周围设备通报,我这里有这个段的地址,请把这些数据包发给我。我们首先创建一个ndppd的模板:

1
2
3
4
5
6
7
8
9
10
11
12
# /etc/ndppd.template.conf
route-ttl 30000

proxy eth0 {
router no
timeout 500
ttl 30000

rule 240e::1/64 {
static
}
}

然后我们编辑ndppd的服务脚本,我在他的启动部分增加了自动获取ipv6前缀并配置ndppd的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# /etc/init.d/ndppd
do_start()
{
sleep 5
ndppd_6=`ip -6 route | grep 240e | sed 's/::\/64.*$//g'`
log_daemon_msg "Grep IPv6 Prefix: $ndppd_6"
cat /etc/ndppd.template.conf | sed 's/240e::1/'$ndppd_6'/g' > /etc/ndppd.conf
ip -6 route add local "$ndppd_6"::/64 dev eth0
echo $ndppd_6:1794 > /etc/ndppd_ipv6_prefix.txt
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS || return 2
}

完成这一步之后,我们只需要systemctl start ndppd就开始使用这个ipv6段了,我一般建议是比你路由器上的Lan前缀小一点,确保不会干扰到你正常的ipv6上网。

这时候我们可以使用curl来测试你的ipv6配置是否正确

这里我是用zulk的例子

1
2
3
4
5
$ curl --interface 2001:19f0:6001:48e4::1 ipv6.ip.sb
2001:19f0:6001:48e4::1

$ curl --interface 2001:19f0:6001:48e4::2 ipv6.ip.sb
2001:19f0:6001:48e4::2

我们可以看到成功返回了我们指定的地址。

接下来就是结合你自己的爬虫程序,设定好请求时的源IP即可。

通常来说,家宽会每隔24小时强制重新拨号一次,这种情况下,你只需要重新启动,然后使用 systemctl start ndppd 启动我们的ndppd 即可恢复正常的继续爬取网站。

这里有很多不规范的东西,欢迎私信告诉我怎么修改。

WinSpy介绍

偷个懒,让bing介绍吧:

WinSpy是一个开源项目,它仿造了微软的Spy++工具。微软的Spy++是Visual Studio上的工具,用于检查和修改任何Windows程序的窗口属性。如果您没有安装VS,可以选择使用WinSpy。
原项目地址为: https://github.com/strobejb/winspy ,但是原项目最后更新时间为9年前。好在GitHub还有其他人维护该项目,在其最受欢迎的分支中,找到了最近的更新: https://github.com/m417z/winspy
您想了解更多关于WinSpy的信息吗?

我为了搜这个东西搜了两个小时你会相信。。。

CPP与CodePage最终解决之路

因为https://github.com/shugen002/DesktopLricsFix这个项目再次和Github Action打架。

这个项目是个C++的随手项目吧,中间夹了一堆中文,本地编译还好好的,结果上去编译就给我炸了

1
2>D:\a\DesktopLricsFix\DesktopLricsFix\DesktopLricsFix.cpp(10,15): warning C4566: character represented by universal-character-name '\u7F51' cannot be represented in the current code page (1252) [D:\a\DesktopLricsFix\DesktopLricsFix\DesktopLricsFix.vcxproj]

显然又是一个CodePage的导致的错误,我试了一堆解决方案都不行,最终看了这篇文档后 https://learn.microsoft.com/en-us/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-170 ,发现原来/utf-8实际上是/source-charset:utf-8 /execution-charset:utf-8的结合,根据我项目的实际情况,代码是用UTF-8编写的,而最终执行环境是个简体中文的GB2312,抱着垃圾巨硬的心态试了试本地编译直接加/utf-8,符合预期的乱码了,于是又试了下/source-charset:utf-8 /execution-charset:gb2312,欸,正常了,上传到Github编译一波试试,成了!。

项目配置

成果

解释一下这两个选项吧,/source-charset:utf-8表示源码是个utf-8/execution-charset:utf-8表示最终执行环境是个gb2312,在没有指定的情况下,前者会根据BOM头判断,没有则按系统代码页,而后者则是直接按系统代码页。

在这里,由于Github Action上面的执行环境是个英文的cp1252导致代码中的中文全部寄掉了。

顺带一提,你在msbuild前面加chcp 936 &&之类的做法没用。

linux 连不上 127.0.0.1

碰上了点阴间的情况,debian 11系统居然连不上127.0.0.1

查了一轮,最后竟然是环回网卡lo没有地址,过于惊讶,特此记一笔。

先来一波ip addr

1
2
3
4
5
6
7
8
9
10
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
altname enp0s17
altname ens17
inet xx.xx.xxx.xx/24 brd xx.xx.xxx.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::dad5:d8ff:fe00:74e/64 scope link
valid_lft forever preferred_lft forever

可以看到lo下面是没有地址的,这时候只需要来一句 ip addr add 127.0.0.1/8 dev lo 就能解决问题,如果开启了ipv6,建议再来一句 ip addr add ::1/128 dev lo

::1/128是ipv6的环回地址。