分类 技术 下的文章

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

截止2022年6月14日,在Ubuntu 20.04.4 LTS中使用apt包管理通过自带默认源来安装golang的话,还是老旧的1.13版本。
而目前一些工程都已经要求使用1.18版以上的编译器来编译。

直接通过官方发布的包来更新终究是麻烦,还想用apt来更新就得添加第三方的源了。

sudo add-apt-repository ppa:longsleep/golang-backports

如果还未安装,就直接安装。

sudo apt install golang-go

如果已经安装了默认源的旧版本,可以先更新到新版本,再删除掉旧版本。

sudo apt upgrade golang-go
sudo apt autoremove

这个源目前已经更新到最新的稳定版本1.18.3

chrome是目前地球上最成功的浏览器,而它的开源项目chromium也是最重要的开源项目之一。
研究chromium的源码,就成为很多人(比如我)重要的工作与学习手段。但是在国内想要check一份可构建的chromium源码其实并不太容易。除了众所周知的原因外,也因为chromium经过长期高速的开发和迭代之后,积累下来了庞大的源码。

如果按官方文档中的方法check源码,默认会check出当前最新的开发版代码。
或者拉回完整的git仓库,再check到指定的稳定版tag。这样很可能会拉回很多我们根本不需要的分支和tag。

实际上,是可以从零开始,直接check出指定的tag代码的。

那么让我们开始之前,假设已经满足了以下条件。

  1. 克服了众所周知的问题。这个只能自己想办法……
  2. 安装了所有需要的开发环境,比如depot_tools等。这个可以参考官方文档。

此方法适用于所有平台。以目前最新官方正式版本102.0.5005.63为例。

首先创建存放代码的目录:

mkdir chromium
cd chromium
mkdir src

创建纯文本文件.gclient并写入以下内容:

solutions = [
  {
    "name": "src",
    "url": "https://chromium.googlesource.com/chromium/src.git",
    "managed": False,
    "custom_deps": {},
    "custom_vars": {"checkout_pgo_profiles": True,},
  },
]

如果是要构建android平台的浏览器,就在这个文件最后添加一行内容:

target_os = ["android"]

接下来创建一个空的git仓库,来同步指定的tag。

cd src
git init
git remote add origin https://chromium.googlesource.com/chromium/src.git
git fetch origin tag 102.0.5005.63

最后一步就是在从官方的git中同步指定的tag。这个步骤是整个过程中最耗时的一步。具体的时间取决于网络情况与tag的新旧程度。越新的tag,需要同步的数据也就越大。
耐心等待tag同步完成。完成后src目录下还是空空如也,并没有代码文件。这时候就需要创建一个本地分支,从tag中check出代码。

git checkout -b local_102.0.5005.63 102.0.5005.63

这个步骤很快,完成后目录下就有chromium的代码了。但是目录中的代码还是不能构建出chromium浏览器,还缺少依赖的一些第三方工程,和构建需要的工具链。
接下来继续同步这些内容:

cd ..
gclient sync -D --with_branch_heads --with_tags

这个步骤也会花费一些时间,并且网络不佳的情况下还有可能会失败。不断重试直到最后全部成功就好。

当这个步骤完成后,完整的一份可构建的chromium源码就完成了。你可以构建出自己的chromium浏览器了,具体方法还是参考官方文档。

在这份代码上,还可以继续同步别的tag代码。只要把上面步骤中出现的版本号换成需要的tag版本号就可以了。这样可以节省不少的时间。

2025年3月更新:
此方法已经失效!
至2025年3月,openwrt lede分支已经更新到23.05版本。已默认集成了argon主题,直接在原生代码的配置中打开即可。


自己编译了openwrt固件,朋友试用之后,说web管理界面太丑了……
我是实用派,一开始完全没在意外观的问题。听朋友这么一说决定给换个默认主题。

看了一下目前lean使用的主流界面是argon,就决定用它了。

https://github.com/jerrykuku/luci-theme-argon.git

根据argon官方文档的说法,他的主分支是跟随openwrt官方版本的。而lean目前只支持18.06这个分支。

首先进入lede的根目录中,拉取最新的代码:

cd lede
rm -rf package/lean/luci-theme-argon
git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git package/lean/luci-theme-argon

替换默认主题:

sed -i 's/luci-theme-bootstrap/luci-theme-argon/' feeds/luci/collections/luci/Makefile

因为个人有点小洁癖,不喜欢带不需要的东西,所以只想带一个主题。运行:

make menuconfig

进入LUCI->Theme,选中Luci-theme-argon,并去掉原来默认的luci-theme-bootstrap主题。

接下来正常编译就行了。