一般情况下,直接在git个新建一个分支,那新分支会继承之前分支的所有历史节点。
但是,有时候需要创建一个干净的分支。比如当前项目要开始一个全新的大版本。

这时候在创建分支的时候,就可以加上--orphan参数,这将创建一个干净的,没有历史节点的分支。
比如:

git checkout --orphan dev_109

这个时候,之前分支下的文件都会被标记为删除。添加需要保留的文件,提交后就可以把这个新分支推送到服务端。

git commit -am "new branch for chromium 109"

前阵子,谷歌不知道抽什么风。对ipv6的归属地判断出现严重的问题。我明明是东京的vps上的ipv6给判定到了美国去了。导致我油管的会员直接失效。测试了同一台机器的ipv4就没有这个问题。

目前打算临时关闭ipv6,先用ipv4。等哪天谷歌修复了这个问题后,再启用ipv6。
最简单的方法就是直接运行以下命令。

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1

想恢复的时候,重启一下网络服务就可以。

oracle云免费的x86主机,只是区区的1G内存,而且oracle的ubuntu镜像还默认禁用了swap分区。
因此进行一些需要消耗较大内存的操作时,就可能出问题。
比如尝试编译r2s专用的openwrt时,直接把系统给卡死了。在发现系统完全没有swap分区后,就着手加个swap分区。

此时使用free -h应该看到完全没有swap的情况。

Swap:            0B          0B          0B

因为实际有1G的物理内存,所以添加个2G的swap。
首先创建一个做为swap的空文件,并指定大小。

sudo fallocate -l 2G /swap

要做为swap使用,必须为0600权限。因此修改文件权限,并转为swap格式文件。

sudo chmod 600 /swap
sudo mkswap /swap

然后启用swap

sudo swapon /swap

这时候再用free -h查看就可以看到已经启用的swap了。

Swap:         2.0Gi        89Mi       1.9Gi

这个时候还只是临时启用,重启之后就会失效。需要把配置写入/etc/fstab中,才可以在系统重启后自动挂载。
将以下配置写入fstab中:

/swap swap swap defaults 0 0

添加了swap之后,就顺利的把r2s的openwrt编译完成了。效果还是很明显的。

最后,如果想停用swap。可以使用以下命令停用,再去掉fstab中的配置并删除文件。

sudo swapoff /swap

xray是一个非常优秀的网络联通框架,很多科学爱好者都在使用~~~

xray集成了流量统计功能,但是通过api查询输出的结果为json格式,且结果单位为字节数。大概是为了方便别的程序使用,但是却不利用人眼直接查看。

为了方便查看流量统计结果,就用python写了一个脚本,格式化输出结果。
至于如何打开xray的流量统计功能,可以参考官方文档的描述,这里不做赘述。
脚本具体内容如下,可以保存成文件traffic.py,并加上可执行权限chmod +x traffic.py,就可以直接运行。
其中toolserver根据实际情况修改。

#!/usr/bin/python3

import json
import subprocess
import sys

tool = "/usr/local/bin/xray"
server = "127.0.0.1:8080"

result = {"inbound": {}, "outbound": {}, "user": {}}


def get_data():
    arg = ""
    if len(sys.argv) > 1 and sys.argv[1] == "reset":
        arg = "-reset"
    return subprocess.check_output(
        ([tool, "api", "statsquery", "--server=%s" % server, arg])).decode("utf-8")


def numfmt(num: int):
    if num >= 1024*1024*1024*1024:
        return "%.2fTB" % (num / 1024/1024/1024/1024)
    elif num >= 1024*1024*1024:
        return "%.2fGB" % (num / 1024/1024/1024)
    elif num >= 1024*1024:
        return "%.2fMB" % (num / 1024/1024)
    elif num >= 1024:
        return "%.2fKB" % (num / 1024)
    else:
        return "%.0fB" % num


def print_result(bound):
    data = result[bound]
    up = down = 0
    for key in sorted(data.keys(), reverse=True):
        if key.find("up") != -1:
            up += data[key]
        else:
            down += data[key]
        print("%-25s %9s" % (key, numfmt(data[key])))
    print("%-25s %9s" % ("SUM->up", numfmt(up)))
    print("%-25s %9s" % ("SUM->down", numfmt(down)))
    print("%-25s %9s" % ("SUM->TOTAL", numfmt(up+down)))


if __name__ == "__main__":
    for it in json.loads(get_data())["stat"]:
        key = it["name"].split(">>>")
        result[key[0]][key[1]+'->' +
                       key[3].replace("link", "")] = int(it.get("value", "0"))

    print("---------------Inbound-------------")
    print_result("inbound")
    print("---------------Inbound-------------\n")
    print("---------------Outbound-------------")
    print_result("outbound")
    print("---------------Outbound-------------\n")
    print("----------------User---------------")
    print_result("user")
    print("----------------User---------------")

原本的输出:

{
    "stat": [
        {
            "name": "outbound>>>direct>>>traffic>>>downlink",
            "value": 4257067673
        },
        {
            "name": "user>>>alundra>>>traffic>>>uplink",
            "value": 23392201
        },
        {
            "name": "user>>>alundra>>>traffic>>>downlink",
            "value": 3231432347
        },
        {
            "name": "user>>>winger>>>traffic>>>uplink",
            "value": 8298513
        },
        {
            "name": "user>>>winger>>>traffic>>>downlink",
            "value": 1025635326
        },
        {
            "name": "inbound>>>api>>>traffic>>>uplink",
            "value": 8653
        },
        {
            "name": "inbound>>>api>>>traffic>>>downlink",
            "value": 19613
        },
        {
            "name": "outbound>>>direct>>>traffic>>>uplink",
            "value": 31690208
        }
    ]
}

脚本运行的效果:

---------------Inbound-------------
api->up                      8.62KB
api->down                   19.61KB
SUM->up                      8.62KB
SUM->down                   19.61KB
SUM->TOTAL                  28.23KB
---------------Inbound-------------

---------------Outbound-------------
direct->up                  30.22MB
direct->down                 3.96GB
SUM->up                     30.22MB
SUM->down                    3.96GB
SUM->TOTAL                   3.99GB
---------------Outbound-------------

----------------User---------------
winger->up                   7.91MB
winger->down               978.12MB
alundra->up                 22.31MB
alundra->down                3.01GB
SUM->up                     30.22MB
SUM->down                    3.96GB
SUM->TOTAL                   3.99GB
----------------User---------------

配合 watch 命令,可以持续查看流经 xray 的流量增长情况。使用 reset 参数重置流量统计,即可查看每秒实时流量速度,如:

 watch ./traffic.py reset

今年618买了两台红米AX6S路由器,组mesh网把家里面的wifi全线升级一下。然而,次卧里面的信号还是不太好,老爸还是有意见。为了不破坏mesh组网的漫游功能,只能再搞一台小米路由器加入mesh网。

因为已经花了不少钱了,于是准备尽可能少花钱把这事给办了。研究了一通之后,发现最便宜的能组mesh的小米路由器是与网络运营商合作的机器。运营商合作款系统上都是绑定网络,就需要刷机成官方系统后才能与其它小米路由器组mesh。

再研究之后,其中cr660x系列是便宜,也是最简单可以刷机的机器。咋一看所有的说法都是,直接用官方恢复工具,刷入AX1800的系统,就可以当官方AX1800来用了。因为没有再提到别的什么注意事项,于是在某拼上以最便宜的价格随便入手了一款。

到手时一看是联通订制的cr6606,上手就开始刷机。然而刷机之后却发现,并没有刷机成功的蓝灯。而是闪烁着一种奇怪的紫灯。系统也没有成为AX1800,还是cr6606。几次折腾后去网上一搜,发现居然也有不少人说有同样的问题。cr6606无法刷机!
当时我就慌了,图省钱买个便宜货来刷机。难道反而要亏掉这一台路由器的钱……
幸好后面看到有人提到,他解锁ssh后,刷了cr6608(移动订制款)的bootloader后,可以刷ax1800固件。
顿时我就觉得我又行了!

因为解锁ssh需要另外一台支持wifi的openwrt路由器,家里面没有。只好找玮哥借了一台传说中的K3让我折腾,恩人啊……

借到K3后,就正式开始了折腾之旅……
首先,解锁ssh就基本上把能踩的坑都踩了一遍。具体过程省略1000字……
ssh联上后,立马又出了一个问题,没有root密码…… 搜索了一番后,有人说到密码是通过SN计算出来的,并提供了计算的工具网站。但是我怎么算也还是登不上去,一度十分绝望…… 最后,终于发现有人提到。联通定制版的密码计算方式与官方版本不一样,那个网站只能计算官方版本的密码。于是我又必须先刷官方的cr6606固件……

一番折腾刷成官方cr6606固件后,终于成功的登录了ssh。这时又发现通过scp无法复制文件到到路由器上,报了一个找不到sftp的错误。差点准备在本地搭一个ftp服务端,然后从路由器上拉文件过去了。再研究了一下发现原来是不支持sftp协议,强制指定scp协议后就可以拷文件了。

因为看到有人提到他们的cr6606是可以直接刷ax1800固件的,加上总觉得刷6608的bl会不会有风险。所以决定先刷一个他们提供的6606的bl看看能不能解决问题。
这次刷6606的BL,再刷AX1800的尝试喜闻乐见的失败了……
最终再次解锁ssh后(每次重启路由器都要重新解锁),刷入cr6608的bootloader,成功通过官方恢复工具刷入了AX1800的固件。
重启后成功被识别为AX1800路由器,并与之前的AX6S路由器成功组成mesh网络。这几乎一天的艰难折腾,总算没有白费……

最后总结一下整个最简刷机流程。

联通cr6606 -> 刷官方cr6606固件 -> 解锁ssh(最烦步骤) -> 刷移动cr6608 Bootloader -> 刷官方AX1800固件

感受就是实在是麻烦得半死…… 有类似打算的哥们千万直接购买移动cr6608版本,可以直接刷AX1800固件。省去非常多的麻烦……