普通视图

入手小牛电动FX风速版

2025年12月7日 22:23

10月中,在二手东订购了小牛FX风速版。当月底提车,骑行一个月,浅水几句,聊作记录。

小牛FX风速版

动机

广州算是国内禁摩持续时间比较长的区域。本人身居广州郊区,属于此政策受害者。因为摩托车是中短途出行的最经济方式,特别在郊区这种公共交通线路尚不完善的区域。虽然属于禁摩区域,是因为郊区原因,交管部门也没有太充足的资源去执行禁止相对庞大的出行需求。这里的郊区还是很多外地摩托车或者其他不太合规的摩托车在道路上形式。

虽然管理上没有太严格,但是由于禁摩衍生出来的一条奇葩规定让我比较麻烦:禁摩区域内的加油站不得给摩托车加油。这规定的杀伤力比禁摩本身还强。目前只能通过技术性手段在个别管理比较通融的油站进行加油。我原来有一辆GY6鬼火摩托车(RSZ祖国版),油箱大概5L。化油器版本本来就比较耗油,油箱容积又比较少,因此加油便成了难题。

结合家里2年前购置的深远电动车使用情况,决定将上面的GY6替换成电动车。

价格定得精准,GY6在海鲜市场一放便被秒😄。

选择

家里已经有一辆电动自行车,因此选择电动摩托车会是一个相对更优的选择。时下热门的电动车品牌主要是那几家。逐家试驾了一下,驾驶感受最好的是极核,可能是因为春风旗下的产品,有一定的摩托车制造基底。智能做得好的是九号。相对于前面两家,小牛这波可能广告做得不错。其实选择小牛的主要原因是:极核做得太像摩托车,但我还有一辆踏板摩托车,实际驾驶质感比电动的好很多;九号智能化做得好,也是我很喜欢的,但是车架看上去很单薄,我体重直逼90KG,骑起来好像胖子骑狗的既视感。小牛相对平庸一点,但各种参数看上去比较适合我,因此就选择了它。

电瓶选择

原车自带的是铅酸电瓶,对于3kw电机无法胜任。后来结合自身使用需求,在店家的推荐下,上了72V80A的三元电瓶。以1A跑2KM的能耗估算,电瓶正常跑100KM出头的续航里程是比较经济的选择。可以使用我前段时间手搓的充电器,充满大概10小时。充电效率慢了点,后来又挫了一个20A的充电器,充电时间可以缩短1半。

使用感受

速度

前后骑行了1个月时间,主要是附近溜达。公路上弹射模式速度能到80KM/H左右。日常主要是以舒适挡位模式行驶(速度约40KM/H),完全能满足短途个人出行需求。

载货

大踏板有比较强的载货能力,也是这个原因被定义为外卖车。这个载货能力是我比较满意的。

适应性

在附近的非铺装路面骑行,减震和动力尚能接受,但驾驶质感相对于150龙骨踏板还是差很远,感觉不是同一类产品。
非铺装路面

缺点/不足

因为我预订的时候尚无带ABS版,在一次拐弯急刹过程中,后轮出现打滑情况,因为车速本身不快,结果也没有出状况。如果在雨天,骑行时可能要关注因为无ABS辅助刹车功能引起的适用性状况。

总结

第一次买电摩,相对于传统摩托,还有很大的提升空间。
特写

手搓小钢炮

2025年10月16日 21:25

两年前入手一辆电驴,勉强吃到时代的红利,作为广州路权最大的交通工具,无敌的存在。

快乐的时光总是显得那么短暂,电瓶在坚持2年后终于倒下。其中2节电芯鼓包挂掉,维修难度很大,原来的电芯健康状况也一般。检查发现主要原因除了电芯本身质量一般外,日常充电习惯也有关系。2年来,一直是循环充电,没有按照磷酸铁锂电芯的特性进行使用,存在较多过充过放,以致加速电芯损耗。

[...]

Google域名福利番外

2025年9月25日 23:00

一年前在《Google域名福利终篇》提到 Google 将整体域名业务出售给 Squarespace 。域名价格从 TRY195+ 涨到 TRY400+,比较价格优势荡然无存。这一年多时间里,经综合评估性价比后,我陆续转出了部分域名到 Cloudflare 。

近期有域名到期,因此今天我再次进入 Squarespace 准备将临期域名转移到 Cloudflare 。看到 Squarespace 面板上依旧简约地标注着“Add year for TRY400”心想:这价格还是贵。不过身体鬼推神差地将鼠标点选页面上的”TRY400”,顺手Google出价格。

土耳其里拉汇率图

搜索结果如上图。

好家伙,一年多时间,土耳其新里拉居然跌成这个熊样。马上查最新的域名转移及续费优惠比价清单,如今域名常规优惠低价基本都压在 $10 附近。虽然 Squarespace 价格依旧是 TRY400,通过汇率差实际价格从原来的 $12 跌到 $9.64 ,比较起来价格优势已经出现了。于是,我把计划转移的临期域名直接在 Squarespace 上续费作罢,相比 Cloudflare 不但价格能便宜一点,还省事。

友情提示

  1. Squarespace 收购 Google Domain 后差强人意,搞不好有再次被出售的风险。
  2. 除非本身有米在 Squarespace,不建议盲目转入。
  3. 关注付款方式,大部分信用卡(如万事达和VISA,PayPal)汇率转换(如国内的信用卡外币信用额度一般只有美刀,消费美刀以外的外币实际计算方法是把消费的币种先转换成美元计算)需要手续费,费用一般是账单金额的 2% - 8% 。

手搓点焊机

2025年5月5日 21:47

需求

对于偏爱折腾电子产品的中年男人,拆装电子设备的工具必须配置齐全的。不过,由于使用率偏低,而且受成本因素影响,我至今未增设点焊机。

近日,常使用的短途出行工具GY6小型摩托车频繁出现打火不顺畅的故障。经过排查是电瓶故障引起的,因使用率偏低(一周大概骑行2天,总路程大概10KM),电瓶由于长时间无法及时进行充电,长期亏电损耗导致的容量下降,一般解决方案是修复或者更换新电瓶。观察电瓶生产日期,使用仅大半年,不至于会出现电瓶内部隔板损坏的情况,倘若直接更换有点浪费,因此尝试使用电瓶脉冲修复工具对其进行修复。经过数个小时的修复工作,电瓶容量虽恢复到能用水平,但实测撑不过超一周的停车自然损耗。每次出现亏电无法打火情况便需要拆卸电瓶回家进行数小时修复充电,显然这不是科学解决方案,眼下购置应急启动电源成为一个优选方案。
GY6电瓶

优选法拉电容方案

常见的应急启用电源方案:

方案一:锂电池电芯

这个方案和日常用的移动充电宝类似,使用锂电池作为电源,提供较大电流输出实现启动车辆的效果。还有一个优点,日常不用的情况下,还能当充电宝使用。缺点也比较明显,和锂电一样需要定期对其进行充放电维护,且日历寿命较短。

方案二:法拉电容

这个方案使用多个大容量法拉电容进行串并链接组合使用,提供短时间大电流输出实现启动车辆的效果。优点是寿命长,日常无需维护,因此无法当充电宝使用。缺点也比较明显,需要先进行充电后才能使用,充电后能使用次数较少。

应急充电宝技术原理是提供短时间大电流输出,这和点焊机是一致的,因此两个需求的方案可以综合一起进行筛选。因为日常车辆维护会对电瓶健康情况进行检查,这些年需要小车进行应急启动的次数真的屈指可数,而且目前汽车保险公司均免费提供汽车搭电服务,因此个人自备应急启动电源作为汽车应急使用算是伪需求。

方案容量充电时间寿命单次可用价格
锂电芯≥8000mha5V2A,≥4小时3-5年充电一次500焊¥150
法拉电容摩托车50F,小车200F电源16V5A:50F,3分钟;200F,12分钟;10年单次焊接回电大概1-2秒50F,¥60,只能启动摩托车;300F,¥200,大部分汽车

综合上表,最终我选择50F的超级电容方案,实测能启动3次摩托车,点焊基本能秒回电。如果本身有应急启动电源,直接买点焊板会更划算。

组装和物料费用

物料参数价格渠道备注
法拉电容2.7V,6串,带均衡板60海鲜市场
充电板16V5A5.3首富家
外壳200x120x1139.7首富家
端子EC5x1,XT60Ex1,18首富家、PDD
电压表DC4-100V4.6首富家
点焊板K838PDD
搭电钳EC5,50CM15PDD
192

电容预充电

点焊板

组装前调试

焊接2个21700试手

组装了个充电宝

建议和提醒

DIY电子产品有风险,并不适合大部分人使用,综合成本并没有太大价格优势,请谨慎选择。如无法评估自身动手能力,请选择合格的厂家生产的成品。

批量提交BT种子到Aria2下载

2025年1月12日 21:35

概况

家里的NAS是我主要文件存储系统,Aria2作为日常常用下载工具也一同部署在上面。

该Aria2以docker容器的形式部署,这样可以带来更好的独立性以便于日常维护。由于众所周知的原因,尝试过一段时间通过openwrt对其进行留学分流,但效果不是太理想。总会发生偶发性的偷跑流量情况,且会损失部分下载速度。为避免钱袋受到伤害,最终还是把Aria2设置为直连方式下载。

aria2NG

直连方式也带来一个问题:部分种子在墙外被限制直连,若直接将链接地址发送到Aria2,是无法被正确下载的。每次遇到这种情况,我只能先通过浏览器把种子文件下载下来后,再通过Aria2NG发种子发送到Aria2进行下载,显得比较繁琐。Aria2NG也有一个问题:每次只能上传一个种子。如果有多个种子文件,操作就显得相当机械繁琐而无趣。我想,能不能一步到位直接把下载好的种子文件统一推送到Aria2自行下载呢?搜索了一下,果然有老哥为此建了个项目,该项目是通过xmlrpc的方式管理Aria2,但缺少密钥验证功能。因此我拿该大佬的项目改了一下,以支持密钥验证方式。有需要的朋友可以直接抄下作业。

实现我需求的思路主要是两个部分,第一部分是脚本处理,第二部分是系统快捷键的部署(我的是MacOS,win部分可能需要一些系统快捷键软件支持才能实现)。

批量提交BT文件到Aria2

脚本

import xmlrpc.client
import xmlrpc
import os
import argparse

def handle(s, btFile, token):
    print('handle bittorrent file: ', str(btFile))
    token = "token:" + token
    ret=s.aria2.addTorrent(token,xmlrpc.client.Binary(open(btFile, mode='rb').read()),[],{'pause':'true'})
    print("add bt: ",str(ret))
    waiting = s.aria2.tellWaiting(token,0, 1000,
                              ["gid", "totalLength", "completedLength", "uploadSpeed", "downloadSpeed", "connections",
                               "numSeeders", "seeder", "status", "errorCode", "verifiedLength",
                               "verifyIntegrityPending", "files", "bittorrent", "infoHash"])
    for w in waiting:
        gid=w['gid']
        if gid!=ret:
            continue
        #print(w['gid'],w['files'])
        # max-selection strategy
        maxLen=0
        maxFPath=''
        maxFIndex='0'
        for f in w['files']:
            #print(f['length'],f['path'])
            if int(f['length'])>maxLen:
                maxLen=int(f['length'])
                maxFPath=f['path']
                maxFIndex=f['index']
        print('max file: ',str(maxLen),maxFIndex,str(maxFPath))
        # max-selection strategy end
        cret=s.aria2.changeOption(token,gid,{'select-file':maxFIndex})# select multiple files example: 'select-file':'5,6,7,8'
        print('select file: ',cret)
        tret=s.aria2.tellStatus(token,gid)
        print('after selection: ', tret['files'][int(maxFIndex)-1])
        uret=s.aria2.unpause(token,gid)
        print('unpause: ',uret)
    print('over: ',str(btFile))



if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.description = 'bt批量导入aria2,并选择文件大小最大的文件进行下载'
    parser.add_argument("server", help="like: http://192.168.3.99:6800", type=str)
    parser.add_argument("token", help="验证密钥", type=str)
    parser.add_argument("dir", help="存放种子目录", type=str)
    args = parser.parse_args()
    s = xmlrpc.client.ServerProxy(args.server+"/rpc")
    flist=os.listdir(args.dir)
    for i in range(0, len(flist)):
        if flist[i].endswith(".torrent"):
            btFile = os.path.join(args.dir, flist[i])
            if os.path.isfile(btFile):
                handle(s,btFile, args.token)
    print("Done")

使用方法

把上述代码保存为bb2a.py,需要使用Python3运行。

帮助(Help):

python3 bb2a.py --help

启动(Start to Add):

python3 bb2a.py <server> <token> <bt-dir>

参数(parameters):

server      如(like): http://192.168.3.99:6800
token       验证密钥:设置在Aria2配置文件的密钥
bt-dir      bt文件的目录(the dir of your bittorrents)

例子(example):

python3 /path/to/bb2a.py http://192.168.1.100:6800 123456 /home/root/bts/

MacOS增加快捷指令

command + 空格,在快捷运行窗口输入“快捷指令”打开系统的快捷指令模块。点击窗口右上角➕新增一个快捷指令。
新增快速指令1.png

按照下图方式创建快捷指令内容
新增快速指令2.png

参考shell内容如下,请按照自己配置情况修改相关参数。sleep 3是暂停3秒。后面的rm命令是顺便删除下载目录中的bt种子文件。

python3 /Users/ccchen/autobt/bb2a.py http://192.168.12.5:6800 123456 /Volumes/FAT12T/down2025/
sleep 3
rm -f  /Volumes/FAT12T/down2025/*.torrent

按窗口右上角的详情按钮,设置快捷指令的允许执行shell权限。
新增快速指令3.png

最后给快捷指令设置快捷键.我设置的快捷键是“Ctrl + Option + W”这个组合键。
新增快速指令4.png

完结

到此,所有配置已完成。只要下载bt种子到对应的目录。完毕后按快捷键“Ctrl + Option + W”,脚本便自动将该目录中所有种子文件发送到aria2进行下载。同时会把下载目录中对应的种子清理掉。

入手N100工控机

2024年7月7日 12:26

接上次硬撸ROS失败。平衡需求和成本预算,最终还是决定选择虚拟机方案。

硬件选择

需求:

  1. 设备放置在弱电箱
  2. 作为家庭互联网接入的主要设备,同时兼顾局域网设备通信的核心路由及数据交换服务
  3. 满足宽带双拨的千兆解决方案

通过上述需求分析,进行简单筛选。主流工控方案,N5105和N100进入了我的最终抉择名单中。通过性能对比,N100方案比N5105方案领先那么一丢丢,成本也贵约莫100块。通过和博友往记的讨论,最终敲定了N100方案,主要是基于自身对ROS的特殊使用需求。

具体配置如图:

N100配置

伪开箱

目前首富家开售的N100方案分为两类:一类是小主机;另一类是工控机。观感主要区别在于外扩接口的差异。由于我需求的主要功能是用作软路由,因此选择4网口版本。外观照片走一波:

蓓控N100

蓓控N100_散热器

蓓控N100_前面板

蓓控N100_网口

安装部署

开箱后进行简单硬件测试,没有发现问题,开始装机。

内存测试

厂家预装了iKuai软路由系统,其实一般家用应用需求其实也能满足,但我是个爱折腾的人,目标自然是ROS。由于设备单跑ROS性能相对会比较富余,因此我决定以虚拟机方式部署ROS,作为前瞻部署为日后功能扩展预留空间。母鸡系统使用的是自己比较熟悉的PVE。

轻车上路,很快就安装完了。
PVE

简单配置了ROS,并进行一些基本测试,基本满足日常使用需求。没有出现之前使用WR330撞到硬件性能墙的问题。

ROS

网络测速也能跑满运营商的宽带。
测速

2.5G网口也能聚合到局域网交换机上跑满端口带宽
聚合测速

待机功耗也在预期范围内

功耗

使用感受

经过1个月的使用,基本能满足家里日常使用需求。

在选择前博友往记也曾提醒过我N100发热量比较大,若放在家里的媒体箱可能应付不来。刚开始我还想一个TDP不是只有6W的小盒子,能有多少热量?

结果现实狠狠给我一记大嘴巴。广州今年夏天确实比较热,放媒体箱一天不到就热挂了。一摸散热外壳,这温度能烤鸡蛋牛排。最后硬着头皮给媒体箱加装散热风扇,顺便改造媒体箱风道,机器的外壳温度才终于稳定在50度以内。

总体而言,本次折腾达到预期。

Google域名福利终篇

2024年5月17日 01:26

两年多前,通过切换币种结算方式可以获得 Google 域名服务的大折扣,让人意想不到的是这个状态能持续这么长一段时间。当然,在此期间,Google 曾发布“有关 Squarespace 收购 Google Domains 注册业务”的消息,也预告这优惠状态的终结时间不会太远。

Squarespace Domain

影响

优惠政策刚出现的时候,我便把名下大部分域名转移到 Google 上托管

打去年其出售协议达成后,便不能再在 Google 注册或转入域名,不过原来托管的域名可继续执行续费和转出操作,且依旧保持原有费率。由于我对部分域名进行了最大期限的续费,倘若转出到新的注册商,也无法再增加年限。为节约持有成本,将该部分域名继续托管在 Google 中,因此拖到最后期限(2024 年 5 月 15 日)被全部迁移到 Squarespace 中。经过核对,没有发现域名丢失的情况。当前已无法再通过 Google Domain 管理域名,后续域名管理操作必须使用 Squarespace 管理面板。

Google Domain 提示

现状

域名被迁移到 Squarespace 后,可以通过 Google 验证方式直接登录 Squarespace 站点,原来 Google Domain 持有的域名便在 Squarespace 域名清单中。遗憾的是,Squarespace并未提供中文服务(这应该对于一般使用者影响不大)。

被迁移到 Squarespace 的域名,目前仅提供转出服务,不支持主动续费功能,无法通过主动续费增加年限,因此并不知晓续费价格。不过,为避免域名到期,它提供自动续费功能,只要域名到期系统便会自动续费 1 年,而且上面显示的价格和在 Google Domain 时的价格一致。

自动续费

通过 Squarespace 主页尝试注册新域名,发现价格和原来 Google Domain 定价差别很大。因此有理由推断将来其域名政策难以保留 Google Domain 时期的优惠措施。

演示费率

不知道是否由于太多人薅土耳其支付优惠的羊毛这个原因,Squarespace 提供了土耳其语的 BETA 版本服务。我们是否可以由此做个猜想:有一定概率原来 Google Domain 的域名会持续享受原来的优惠?

对于域名去留问题,个中风险请自行斟酌。

语言选项

操作建议

  1. 为避免丢失域名,如果是贵重的域名,建议适时转出 Squarespace 。
  2. 尽快对 Squarespace 账号设置二次验证登录,避免域名被盗取。
  3. Squarespace导入了原来 Google Domain 的支付方式,如非必要切勿修改,Squarespace 貌似不支持 TRY 付款方式,切换到其他币种后将无法切回,这可能会导致自动续费失败。

更新于2024年12月29日,目前Squarespace最新的域名更新价格是TRY400(折美刀12,软妹币84),这个价格已经没有优势了。

Squarespace最新续费价格

NAS 能耗小测

2024年5月12日 23:30

前言

前段时间搬家,对家庭网络进行重新部署。由于目前正在使用丐版mbp,外部存储空间需求显得十分紧迫,所以把部署nas的计划进行提前。品牌nas非常好,除了贵。因此追求性价比的我(垃圾佬)自然选择了DIY方案。

天生好大喜功的性格,让我在硬件选择上容易吃亏。几十块一个CPU,不香吗?查了一下,老伙计E5系列居然还有TDP是45W的低功耗产品勘误: E5-2630LV4 TDP: 55W,但价格是普通版本的几倍,忍了!于是在低价和好奇心驱使下,我上马了x99方案。

CPU

功耗难题

装机

配置清单

万能的海鲜市场,配置很容易拿到。作为资深垃圾佬,这种装机配置自然也没有什么难度,手到拿来。

上机图(又不是二次元,插线那些就不讲究了😀)

插电,开机。

风扇狂转,一摸CPU散热器,能煎牛排了。坏了!功耗肯定不低。于是拿出功率计一测,功率在50-70间不断的跳变。这待机功耗也太吓人了吧,说好的TDP 45W呢?

怀着忐忑的心情把PVE安装上,功耗也是这样。

节能方案

为了不白交冤枉钱,在网上搜索了一下节能方案。有的直接下定论:都服务器CPU了,能耗都不是主要考虑的问题。

这好像也对。

但是家用这机器,裸机(含万兆光口网卡,待机功耗约 8W)就上到50W+就太坑人了,如果多带几个硬盘,轻松到100W,一天2.4度电。这功耗确实夸张了。

后来看到有老哥说可以通过关闭内核降低能耗。目前确实在大部分使用场景下没有刚需使用到10核的情况。于是我测试了一下几个内核方案,全开10核,6核,和4核。发现待机功耗几乎没有变化。回头想想这逻辑不对,牙膏厂虽然挤牙膏多年,但是服务器市场一直是他们重视的大头,肯定是有自动模式弹性配置内核数量以应对功耗问题,而无需人手操作限制的。所以手工关闭内核数量能降低峰值能耗,而无法降低待机能耗。这操作显然和我需求不相关。
6核

10 核

解决方案

前面那些不靠谱的乱设置浪费了一些时间。我整理了一下思路后,专心看主板BIOS的能耗配置选项,发现服务器对这方面还是非常全面的,而且 HP 主板 BIOS 的提示信息也比普通家用主板 BIOS 要详尽很多,基本不用看手册便能完成大部分设置。

bios设置

于是,我按照BIOS里面的选项提示,把能耗设置成最低模式:包括内存限定在1333,关闭内存交错,关闭不需要的PCIe通道等。待机功耗下降到35W左右的合理水平。

后来配合自己的需求设置相应的能耗方案,目前待机能耗在 38W 左右。内核和内存性能上,我没有做出妥协,日后加载硬盘设备后,总体功耗预计在 50W 左右。能耗 1 天约 50W x 24h = 1.2度电,以第三档电费 0.9元/度 算,日电费约1.08 元,月电费约32.4 元,年电费约388.8元。这样算下来也算一笔不小的开销了。

配置后功耗

后话

从能耗方面而言,X99 方案并不适合大部分家庭用户使用。当然在性能和扩展性方面近乎是不可匹敌的,特别是对 PCIe 扩展的需求。最后,回到最基本,需求才是方案选择的核心。普通用户还是建议直接选择品牌 NAS。

矿渣再利用:狗东亚瑟AX1800 pro刷iStoreOS

2024年4月27日 22:58

前言

前段时间,发小致电我寻求帮助。事因其从事外贸行业,和境外客户通信大多使用互联网方式。基于国情,近期出口网络质量不如人意,其公司有相关的方案,但家里收发邮件都存在一定困难。需求明确,用于收发邮件,邮件系统在境外。对于此类需求不大的应用场景,普通软路由便能解决,但由于是家用,所以还需要无线等功能。兼顾性价比,计划帮他找能刷 openwrt 的家用路由器。

入手亚瑟AX1800 PRO

简单查了下能刷 openwrt 的设备,首选江湖人称“刷机小王子”的友华WR330,后来发现 ROM 只有 16M ,这对于有科学需求而言,就不是很方便了。

近期由于运营商进一步打击滥用个人带宽行为,导致出现一小波 PCDN 矿难的情况,这说不定是一个机会。我在海鲜市场蹲了半天,80 块收到了一台狗东亚瑟AX1800 pro,64G 版本,性能比“刷机小王子”强不少。具体配置参数如下:
亚瑟AX1800PRO

AX1800 Pro采用的CPU是高通的IPQ6000,四核心频率1.2GHz,64位 ARM Cortex-A53架构,14nm制程,内置1.5GHz NPU(network processing unit),算力11040DMIPS;内存512MB内存;还有64/128/256G闪存,还可以通过USB3.0接口外接移动硬盘或U盘的扩展存储;无线参数方面,2.4G支持最高速率574Mbps(2x2mimo 40MHz频宽),5G最高速率1201Mbps(2x2mimo 80MHz频宽)。

刷机

这个设备的刷机教程,网上大部分都不是太完整。看评论说是比较忌讳狗东,因为便宜拿了本来用来做 PCDN 的设备做其他事情,损害到他的利益。我刷机主要参考了恩山大佬收集的资料顺利完成的,资料有些适合,有些可能不适合,所以这个刷机操作建议有一定动手能力的人进行,切忌盲目刷机。材料在阿里云盘,可以点击这里下载。同时也参考了张大妈某位值友的物理拆机教程

亚瑟 AX1800PRO 拆解后主板

刷机总体分为两部分:第一部分是刷uboot;第二部分刷固件。综合上面的两个教程基本能顺利完成。我补充一些自己遇到的问题(主要是 MacOS 的处理方案):

USB to TTL 模块的选择和使用

匹配的是 CH340G 串口模块。该模块在 MacOS Sonoma 使用免驱,没有遇到任何问题。杜邦线使用 3 条,不用管串口转换器电压是5V还是3.3V,不要接电源那路线直接主板供电,接线方式如下:

TTL主板
GNDG
TXDR
RXDT

CH340G

AX1800主板预留了 TTL 调试孔,但没有安装针脚。用几个牙签把杜邦线塞进进孔里固定。TTL 接 USB,电脑网口接 AX1800 LAN网口,通电后 TTL 调试器开始跑马灯就表示正常了。

TTL方式链接调试

MacOS使用 TTL 刷机方法

MacOS 自带终端和 tftp 服务器 ,无需像 Windows 那样还需要配套的刷机程序。访问串口的方法:

在终端(有条件也可以用Termius)输入下列命令,找到你的 com 设备,不行就拔插USB TTL 对比测试找出来

    ls /dev/tty.*

通过 screen 命令访问你的 TTL

    screen /dev/tty.[yourSerialPortName] [yourBaudRate]

例子:

    screen /dev/tty.usbserial-A6004byf 9600

使用内置tftp服务器就更简单了:

tftp默认目录在 /private/tftpboot(建议将该目录权限设置为777)

    # chmod whole folder to 777
    sudo chmod -R 777 /private/tftpboot

合并固件

我使用的 iStoreOS 固件是 L大 制作的,下载地址在这里

刷完 uboot 后,通过 uboot 的 web 方式刷入 istoreOS 固件。刚开始,我误以为只要刷入 rootfs 部分即可。结果刷完后,路由器不断重启。通过先刷 kernel 分区再刷 rootfs 分区依旧不行。后来尝试把两个固件合并成一个固件刷进去就成功了。windows 合并的方式是通过软件 ubin。而 MacOS 则直接通过系统自带的 dd 命令完成:

    dd if=$BOOT_BIN >>$IMG_NAME

其中$BOOT_BIN是kernel固件文件名,$IMG_NAME是rootfs固件文件名。最后得到的rootfs固件直接通过 uboot 的网页方式刷进去即可。如果懒得合并也可以使用我合并好的固件直接刷进去,点击这里下载

扩展overlay分区

iStoreOS 顺利运行起来,但是 overlay 分区只有 4M,这样跑啥都不行,网上教程很多,具体操作可以搜索一下。这里总结下大概得扩容思路:

  1. 把原来overlay分区的内容备份到新分区上;
  2. 解挂原来overlay分区;
  3. 重新挂载新分区作为overlay分区。

实测/dev/mmcblk0p27分区是用于存放 PCDN 缓存作用的,因此可以直接清空它。但是由于运行在虚拟分区表上,无法对该分区直接修改,同时我发小对docker 服务没有要求,因此我直接把/dev/mmcblk0p27清空了,作为新的 overlay 分区。

AX1800分区

iStoreOS分区

小结

至此,刷机工作全部完成。经过几个小时测试,工作稳定,有线无线方式都正常。开通科学功能,CPU 占比也稳定范围。这次算是小成本解决了需求。

iStoreOS

硬撸ROS失败

2024年4月23日 23:09

前言

自从撸上软路由后,一直使用ROS作为家庭网络的骨干路由系统。近期由于搬家,需要对网络重新部署。ROS 自然成为部署主路由系统的首选。为便于管理和节省连通距离,此前一直使用 ALL IN ONE 模式部署相关服务系统,ROS 以虚拟机模式运行在 NAS 中。虽然管理方便,但是稳定性容易受到母鸡影响,导致整个网络瘫痪,家里连普通的上网都受到影响。因此,在部署新网络环境时,我优先考虑把 ROS 独立出来,首选方案是硬件 ROS 设备。

购入RB450G

宽带只有300m,接入需求不大。此前使用虚拟机跑ROS,只分配1C256M资源,从来没有出现过性能瓶颈问题,因此主观地认为,简单的家庭网络响应对 ROS 并不会形成网络瓶颈。 基于这些预设前提,我在海鲜市场花了100 多入手了一台二手RB450G,带 L5 授权的 4 口千兆硬件软路由。

RB450G

把光猫切换到桥接模式,使用 ROS 进行拨号,链接好像都正常,但是刷视频什么的总感觉有点卡卡的。进行简单网络测速,300m 的宽带,运营商测速结果为 100m 左右,速度不达标!刚开始还以为更换设备时候不小心把光纤折弯过出现了线损的情况。后来直接用光猫拨号测试,结果是速度正常,所以判定问题出现在内部网络。于是我把开发商预埋的网线全部换成 Cat6A ,重新再测速,结果还是一样。因此,问题就落在 RB450G 身上了。

友华WR330刷ROS

为确认网络瓶颈是否真由RB450G引起的,我决定做个对比测试。此前,我 30 块收到个江湖号称“刷机小王子”的路由器:友华WR330,正好它能刷 ROS。因此,轻松地完整抄袭了恩山大神的作业,把 ROS 刷进去,并申请了个免费的 L1 授权。

RB450G硬件信息

友华WR330硬件信息

从配置信息不难发现,两个设备是不同时代的产物,CPU 性能应该差别巨大。

测速

使用 ROS 自带的带宽测试工具进行测试。该功能是通过两个 ROS 系统进行链接,测试两设备间的性能和网络状况,有点类似 iperf3。
友华WR330连RB450G测试结果
从结果可知,WR330连RB450G,带宽只能去到 338Mbps,此时其 CPU已经被完全占用,相反 WR330 只占用一半左右,而且只是使用单收或单发模式,如果使用同时收发模式测试,速度只去到几十 Mbps。换 RB450G 连 WR330,速度就只剩 100Mbps 左右。上面的结果很好地解释了为何刷视频会出现一点卡卡的感觉,因为流量峰值出现的时候,RB450G遇到运算瓶颈。

为印证上面的结论,我还专门爬了一下ROS 论坛的信息,发现果然在2013 年已经有大佬提过类似问题,而官方人员回应答案是 :RB450G 实际应用建议的带宽是40-50MBps(约为320-400Mbps),对于超过这个数值的需求,建议更换性能更好的设备……啊,屈指一算它已经是十多年前的产品了。

官方建议的应用范围

问题与解决方案

基于前面的测试结果,我把 WR330 更换掉 RB450G,再次进行网络测试,结果和光猫拨号相近,速度达标。
测速结果

作为主路由,L1 授权功能太少,单独购买其他等级授权确实负担不起。想来想去,还是回到虚拟机那条老路了,毕竟性能和授权都不是问题。

这个坑同时教育了我:捡垃圾,要做好功课。不然,还是花钱走正规途径省时间。

给PVE虚拟机磁盘无损扩容

2023年11月19日 01:26

家里使用的NAS是DIY的All In One主机,母鸡是PVE(Proxmox Virtual Environment)。

为便于管理和维持良好的独立性,我把主要的Docker服务部署在基于PVE虚拟机的开源NAS系统OMV(openmediavault)上。由于计划赶不上变化,原先给OMV预分配的磁盘空间已经耗尽,以致web管理页面也无法登录,只能通过ssh方式管理。为解决这个问题,在保数据的前提下,从母鸡分配磁盘空间进行扩容已是唯一选择。

原本以为扩容操作可以直接通过PVE的web管理页面便能轻松实现(我部分虚拟机确实是这样)。但是,OMV这个情况和我预想的还是有点偏差,扩容后的空间无法合并到根目录上。具体原因是部署OMV时,我使用安装方式为虚拟机IOS镜像直读模式。从win32开始遗传的电脑使用习惯(安装直接点“下一步”)安装的OMV,自然自带swap分区。由于swap分区的存在,导致pve扩容的空间无法和原来OMV磁盘组成连贯分区,无法实现根目录扩容的目的。网上清一色的教程均为简单的独立分区无损扩容,并没有提及这种带其他分区的磁盘该如何扩容。因此,我写下这个笔记供后续遇到类似需求的朋友作为参考,避免踩坑。

存在swap分区的PVE虚拟机磁盘如何扩容?

母鸡扩容

母鸡扩容的方法很简单,可通过PVE的Web管理系统->目标主机->硬件->选定目标磁盘->操作菜单:磁盘操作->调整大小,给你目标的主机设置需扩容的磁盘空间。

扩容操作

信息确认

通过ssh工具访问OMV,查看磁盘的基本情况。

PS:本例子使用的磁盘均为sda

$sudo parted /dev/sda 'unit s print' free
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 14336000s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start      End        Size       Type      File system     Flags
        63s        2047s      1985s                Free Space
 1      2048s      10485759s  10483712s  primary   ext4            boot
        10485760s  10487805s  2046s                Free Space
 2      10487806s  12580863s  2093058s   extended
 5      10487808s  12580863s  2093056s   logical   linux-swap(v1)
        12580864s  14335999s  1755136s             Free Space

如上面shell信息所示,sda1被扩容的空间在磁盘分区的最后,中间隔着一个swap分区,这样扩容的空间是无法直接分配到sda1上。

如果要实现无损扩容必须把swap分区删除,然后把sda1扩容后再重建swap分区。

第一步,关闭swap分区

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           992M         52M        464M        3.2M        475M        784M
Swap:          1.0G          0B        1.0G

通过free命令查看swap是否存在占用,如果没有,直接关掉;如果有,可以尝试重启下该虚拟机。

$sudo swapoff /dev/sda5

第二步,重新配置分区列表

$sudo fdisk /dev/sda

(注意: 假如你的虚拟机磁盘初始扇区是63而不是2048, 你需要在fdisk命令后面增加一个参数 -c=dos)

参考下面的操作步骤删除swap分区和重建分区列表。

PS:本操作虽然是无损扩容,但数据无价建议有条件的一定要先备份数据!!!

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk /dev/sda: 6.9 GiB, 7340032000 bytes, 14336000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9e11c6df

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 10485759 10483712    5G 83 Linux
/dev/sda2       10487806 12580863  2093058 1022M  5 Extended
/dev/sda5       10487808 12580863  2093056 1022M 82 Linux swap / Solaris

Command (m for help): d
Partition number (1,2,5, default 5): 2

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-14335999, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-14335999, default 14335999): 12242941

Created a new partition 1 of type 'Linux' and of size 5.9 GiB.

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (12242942-14335999, default 12242944):
Last sector, +sectors or +size{K,M,G,T,P} (12242944-14335999, default 14335999):

Created a new partition 2 of type 'Linux' and of size 1022 MiB.

Command (m for help): a
Partition number (1,2, default 2): 1

The bootable flag on partition 1 is enabled now.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

这部分有两个地方需要注意的:

1、sda1扩容后的总大小必须是整个磁盘减去swap分区的大小,我上面的例子sda1就是: 14335999-2093058=12242941

2、fdisk分区使用‘a’命令是用来激活主分区,这个一定要重新激活。

第三步,重载分区列表

这里使用到的是partprobe,OMV是基于Debian的,默认应该安装了,如果没有安装请自行搜索安装方法.

$ sudo partprobe

第四步,重新扫描磁盘容量

使用resize2fs命令对sda1进行扩容有重扫描容量。

$ sudo resize2fs /dev/sda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 10
The filesystem on /dev/sda1 is now 38833617 (4k) blocks long.

第五步,重新配置swap分区

因为fdisk对ext4扩展分区支持不足,建议使用cfdisk进行重新配置swap分区。

$ sudo cfdisk
            

选择sda2分区,转换成82 Linux swap / Solaris类型并保存。

第六步,重新激活swap分区

$ mkswap /dev/sda2
/dev/sda2
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none swap sw 0 0

记下上面的UUID。

用命令行重新激活swap分区。

$ swapon /dev/sda2

通过命令把上面的UUID修改到fstab中

$ sudo nano /etc/fstab
# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none            swap    sw              0       0

确保没有问题后,重启虚拟机。

至此,无损扩容工作便全部完成。

祝你好运!

❌