冬天温泉的小庭院

记录开发生活中的点点滴滴

0%

问题现象

当在Cargo.toml中应用了rust-lzma的依赖的时候,在rust-analyzer会有错误消息出现,如果不处理这个错误的话代码提示的功能将无法使用。

解决方法

  • 出现 Could not find liblzma using vcpkg: VcpkgNotFound("No vcpkg installation found. Set the VCPKG_ROOT environment variable or run 'vcpkg integrate install'") 的错误

    意思是本地没有安装 vcpkg,按照该项目的文档在电脑上安装上 vcpkg 即可。

    如已经安装了 scoop 的话能更方便的进行安装。

    1
    2
    3
    > scoop install main/vcpkg
    > vcpkg --version
    vcpkg package management program version 2023-08-09-9990a4c9026811a312cb2af78bf77f3d9d288416
  • 出现 Could not find liblzma using vcpkg: LibNotFound("package liblzma is not installed for vcpkg triplet x64-windows-static-md")的错误

    这是因为没安装依赖的liblzma 类库造成的错误,安装错误消息的提示安装上即可。

    1
    > vcpkg install liblzma:x64-windows-static-md

OMS

如果是在 Ubuntu 的环境下的话则需要安装 liblzma-dev 这个包。

1
sudo apt-get install liblzma-dev

不知为何在 M.2 的插槽中安装了新的网卡的之后,Dabian 不能同时让板载网卡跟M.2的网卡同时生效。

那么进行以下步骤即可同时使用双网卡,并且在设置面板的“网络”选项中同时看到两张网卡的情况。

首先通过命令 ip a 查看系统中安装了的网卡信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
root@debian11:~# ip a
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
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 02:42:73:f5:b8:4c brd ff:ff:ff:ff:ff:ff
inet 192.168.56.106/24 brd 192.168.56.255 scope global dynamic noprefixroute enp0s2
valid_lft 369sec preferred_lft 369sec
3: enp0s31f8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 02:42:73:78:55:0f brd ff:ff:ff:ff:ff:ff

这里看到两张网卡 enp0s2enp0s31f8 都已经被系统识别。然而只有 enp0s2 被 DHCP 分配了 IP 地址。

通过 nmcli 的命令查看的话却只看到 M.2 插槽的网卡的信息。

1
2
3
root@debian11:~# nmcli connection show
NAME UUID TYPE DEVICE
lan1 67dda268-1805-4409-a9f5-deba87d82ba6 ethernet enp0s2

这时只需要把未识别的网卡给添加上即可。

1
root@debian11:~# nmcli connection add type ethernet ifname enp0s31f8 con-name enp0s31f8

然后再通过 nmcli 的命令查看,这时会显示两张网卡的信息。

1
2
3
4
root@debian11:~# nmcli connection show
NAME UUID TYPE DEVICE
lan1 67dda268-1805-4409-a9f5-deba87d82ba6 ethernet enp0s2
enp0s31f8 a0195097-3012-4342-a326-f1851d0cbde1 ethernet enp0s31f8

并且通过 ip a 查看的话也能看到添加之后的网卡的 IP 信息。

而想修改链接名字的话用 nmcli connection modify 即可。

1
2
3
4
5
6
root@debian11:~# nmcli connection modify 'lan2' connection.id enp0s31f8

root@debian11:~# nmcli connection show
NAME UUID TYPE DEVICE
lan1 67dda268-1805-4409-a9f5-deba87d82ba6 ethernet enp0s2
lan2 a0195097-3012-4342-a326-f1851d0cbde1 ethernet enp0s31f8

下载安装时所需的镜像,这里使用的是 ubuntu

1
$ sudo docker pull ubuntu:22.04

接下来创建一个容器,并挂把当前目录下的 /imagebuilder 目录挂在到容器中。

1
2
3
4
5
6
$ sudo docker run -d -it \
--name openwrt_imagebuilder \
-v `pwd`/imagebuilder:/root/imagebuilder \
-w /root/imagebuilder \
ubuntu:22.04 \
bash

在容器中安装编译 openwrt 固件所需要的依赖。

1
$ sudo docker exec openwrt_imagebuilder apt-get update && sudo docker exec openwrt_imagebuilder apt-get install -y build-essential libncurses5-dev zlib1g-dev gawk git gettext libssl-dev xsltproc wget unzip python3 curl rsync file

在容器中下载红米AX6S的openwrt imagebuilder 文件。

1
$ sudo docker exec openwrt_imagebuilder bash -c "curl https://downloads.openwrt.org/releases/22.03.3/targets/mediatek/mt7622/openwrt-imagebuilder-22.03.3-mediatek-mt7622.Linux-x86_64.tar.xz | tar Jxv -C /root/imagebuilder"

进入到容器中。

1
$ sudo docker exec -it openwrt_imagebuilder bash

这时默认登录进入的目录为/root/imagebuilder,接下来进入到刚才下载 imagebuilder 的目录中。

1
$ cd ./openwrt-imagebuilder-22.03.3-mediatek-mt7622.Linux-x86_64

首先运行 make info 查看该 imagebuilder 都支持了哪些硬件。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ make info
Current Target: "mediatek/mt7622"
Current Architecture: "aarch64"
Current Revision: "r20028-43d71ad93e"
Default Packages: base-files ca-bundle dropbear fstools libc libgcc libustream-wolfssl logd mtd netifd opkg uci uclient-fetch urandom-seed urngd busybox procd procd-ujail procd-seccomp kmod-leds-gpio kmod-gpio-button-hotplug kmod-mt7615e kmod-mt7615-firmware wpad-basic-wolfssl uboot-envtools dnsmasq firewall4 nftables kmod-nft-offload odhcp6c odhcpd-ipv6only ppp ppp-mod-pppoe
Available Profiles:

# 省略部分输出内容
xiaomi_redmi-router-ax6s:
Xiaomi Redmi Router AX6S
Packages: kmod-mt7915e
hasImageMetadata: 1
SupportedDevices: xiaomi,redmi-router-ax6s

这时会看到这里有一个名为 xiaomi_redmi-router-ax6s 的可用配置,说明官方固件已经支持红米 AX6S。

接下来就开始进行编译固件。

1
2
3
$ make image \
PROFILE="xiaomi_redmi-router-ax6s" \
PACKAGES="luci luci-i18n-base-zh-cn"

简单说明一下该命令参数的意思。

  • PROFILE : 需要编译的配置,不填写的话它会编译默认的配置,比如这个 imagebuilder 中默认的为 bananapi_bpi-r64(貌似就是 make info 出来的第一个配置)。
  • PACKAGES : 编译时需要添加或删除的插件名字,用空格分割。在 imagebuilder 中默认是不带后台管理的插件,因此加上 luci 以及所需语言包。

等待编译结束后,在 ./bin/targets/mediatek/mt7622 目录中就可以看到已经编译好的openwrt的固件了。

  • openwrt-22.03.3-mediatek-mt7622-xiaomi_redmi-router-ax6s.manifest
    记录该固件中编译了的插件以及版本

  • openwrt-22.03.3-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-factory.bin
    用于从头开始安装OpenWrt的bin文件

  • openwrt-22.03.3-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-sysupgrade.bin
    用于系统升级的bin文件

请自行解决网络问题。

Optional: 一些额外的小知识

  • 使用 imagebuilder 编译 x86 的固件的时候,在生成固件时会出现以下消息。

    1
    /root/imagebuilder/openwrt-imagebuilder-22.03.3-x86-64.Linux-x86_64/staging_dir/host/bin/grub-bios-setup: warning: Your BIOS Boot Partition is under 1 MiB, please increase its size..

    解决方法是修改 imagebuilder 目录下的 ./target/linux/x86/image/Makefile 文件,在文件中的56行处的 256 改成 1024 后,再次编译即可。
    也可用如下命令直接修改文件内容。

    1
    sed -i 's/256/1024/g' ./target/linux/x86/image/Makefile
  • 如果编译出来的固件只当作AC用,不需要AP的功能的话,可以把 wifi 相关的插件都给去掉后编译,相关的插件如下。

    1
    2
    3
    4
    5
    6
    7
    iw
    iwinfo
    libiwinfo-data
    libiwinfo-lua
    libiwinfo*
    rpcd-mod-iwinfo
    wireless-regdb

    去除插件的方法是在 PACKAGES 中插件名前添加 - 字符标识删除该插件即可。

    1
    PACKAGES="-iw -iwinfo"
  • 编译 OpenWrt 需要在大小写敏感的文件系统中才能运行。

via form Image Builderでカスタムimage作成

假设需要把当前目录下的 work 目录加载到 Docker 容器中的 /root/work 目录下的时候,通常是使用这种写法。

1
2
docker run -it -d -v "$(pwd)/work:/root/work" -w /root/work --name ubuntu ubuntu:latest bash
docker run -it -d -v `pwd`/work:/root/work -w /root/work --name ubuntu ubuntu:latest bash

在纯粹的 Windows 下的话是这种写法。

1
docker run -it -d -v "%cd%\work:/root/work" -w /root/work --name ubuntu ubuntu:latest bash

注意 %cd% 后跟的是个反斜杠 \

但是在 wsl 环境下的话,或许需要这种写法才行。

1
docker run -it -d -v "$(realpath ./work):/root/work" -w /root/work --name ubuntu ubuntu:latest bash

要为了给 WSL 的 Ubuntu 设置代理,需要进行以下步骤。

系统的全局代理设置

~/.bashrc 文件中追加如下系统变量。

1
2
3
4
export http_proxy="<proxy_url>:<port>"
export https_proxy="<proxy_url>:<port>"
export HTTP_PROXY="<proxy_url>:<port>"
export HTTPS_PROXY="<proxy_url>:<port>"

之后 wgetcurl 等工具应该就可以使用了。

apt 的设置代理

/etc/apt/apt.conf 文件中追加如下设置。

1
2
Acquire::http::Proxy "<proxy_url>:<port>";
Acquire::https::Proxy "<proxy_url>:<port>";

不要忘了每行后的分号。

(Optional)Docker 的代理设置

  • 修改 /etc/wsl.conf 文件让 systemctl 功能生效。

    1
    2
    [boot]
    systemd=true

    修改完之后 wsl 得重启。

    1
    PS C:\wsl.exe --shutdown

    接着在 wsl 里面输入以下命令查看是否生效。

    1
    systemctl list-unit-files --type=service
  • 通过 curl -fsSL https://get.docker.com/ | sh 安装 docker。

  • /etc/systemd/system/docker.service.d/http-proxy.conf 文件中追加如下设置。

    1
    2
    3
    4
    [Service]
    Environment="HTTP_PROXY=<proxy_url>:<port>"
    Environment="HTTPS_PROXY=<proxy_url>:<port>"
    Environment="NO_PROXY=localhost,127.0.0.1"

    之后在 docker 里面就可以使用 apt update 等命令了。

之前部署的博客服务 Heroku,它在今年11月28日起就不在提供免费的 Heroku Dynos了,虽然它之后还发布消息说提供了一个 eco planmini plan但是还得花钱–总之就是它不会提供免费的 dyno 了。对于像几乎没啥流量的网站(没错说的就是现在看到的这个网站)得给换另一个地方,要不然就要自己买 VPS 搭建服务了。还好找了一圈发现还有 Vercel 提供免费的额度使用,在迁移到 Vercel 的同时顺便升级了一下 hexo 跟使用的主题 theme-next。主题的配置文件还挺老了升级的时候还花了不少时间。

迁移过程还是挺顺利的,

  • 注册账号
  • 关联相关Git库,支持从Github的私有库进行部署
  • 配置项目,它自动识别出来是 hexo,直接用它提供的默认配置即可
  • 完毕
  • (option)使用自己的域名的话在 Domains 配置即可,并且还自动配置 https

而部署到 Heroku 的话,

  • 安装它的 CLI 工具
  • 在命令行中敲命令
  • (option)绑定自定义域名还算是方便但免费的 dyno 是不支持开启 https

跟 Vercel 提供的服务相比这简直就是上个世纪的东西。

后知后觉 next.js 也是由 Vercel 开发的。

另外还可以选择 Render,部署方式跟 Vercel 一样简单,免费的额度也够用了。

最後に、Heroku さん、お疲れ様でした。

Caddy 是一个用 go 语言写的代理服务,类似 Nginx 但是从配置文件来说比 NGX 要方便不少,并且自带 https 的支持以及到期自动续期。
话不多说用 SpringBoot 的项目来举个如何部署项目的例子。

  • 上 Caddy 的官网 下载 编译好的二进制文件,注意选择部署的机器。
    想自己编译的话也可以从 Github 把代码下回来自己编译。
  • 下载回来的文件「caddy」放到服务器上,然后设置该文件权限为「744」chmod 744 ./caddy。运行 ./caddy help 确认该文件可执行。
  • 在「caddy」的同目录下生成配置文件「Caddyfile」(该配置文件所在目录可按需求修改,为了方便部署这次是在同目录下生成)。
    文件内容根据下面给出的注释进行修改。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    {
    # 全局配置,关闭 admin endpoint
    admin off
    }
    # 需要部署的端口号,支持域名。不需要用默认的HTTPS的证书的话需要单独配置HTTPS证书
    :8300 {
    # 前端编译后代码所在目录,这里 SpringBoot 使用的是前后端分离的方式
    root * /home/www-user/opt/springboot-vue-dist
    # 代理前端所有「/api」的请求
    handle_path /api/* {
    # 「apicontext」是 SpringBoot 项目的 context-path
    rewrite * /apicontext/{path}
    # 需要代理到的IP以及端口号
    reverse_proxy http://localhost:8080
    }
    # 开启压缩
    encode gzip
    # 固定写法(??)
    file_server
    }
  • 运行 ./caddy adapt --config ./Caddyfile 查看配置文件是否有问题。
  • 运行 ./caddy start --config ./Caddyfile 让其在后台运行。
  • 其他命令请参照官方文档

EOL

下载树莓派版本的ubuntu

https://ubuntu.com/download/raspberry-pi

我推荐选择 Server 版本,树莓派2 的话只能用 32 位的版本。如果要用 Desktop 版的话当前的 21.04 只支持 树莓派4 跟 400。

烧录 img 到 SD 卡

参考 Installing operating system images 这篇文章,windows下的话是用这三个软件 balenaEtcher(有免安装版本)Win32DiskImagerUpswift imgFlasher 即可。

启动前的设置

烧录好的SD卡的卷名为 system-boot

需要设置wifi连接的话在这里面找到名为 network-config 的文件,在最下方添加如下内容。

1
2
3
4
5
6
7
8
9
10
11
12
wifis:
wlan0:
dhcp4: true
optional: true
#addresses: [192.168.1.XX/24] #设定的IP
#gateway4: 192.168.1.1 #网关地址
#nameservers:
# addresses: [192.168.1.1] #网关地址相同
# search: []
access-points:
"WIFI名":
password: "wifi密码"

注意缩进。

登录的用户名密码在 user-data 文件中查看,默认都为 ubuntu
第一次登录后提示需要修改密码,对密码强度有要求。
如果不想更改,把 23 行附近的 expire 改成 false

1
2
chpasswd:
expire: false
使用前的设置
  • 计算机名的修改在 /etc/hostname 文件中,修改后用 hostnamectl 命令查看输出的第一行。
  • 通过命令 sudo timedatectl set-timezone Asia/Shanghai 修改时区,其他时区的话修改对应的城市即可。
  • 运行 sudo apt update && sudo apt upgrade -y 进行升级。
  • 运行 sudo shutdown -r now 重启。

把 hexo 更新到最新版(3.9.0)之后,在运行 hexo deploy --generate 发现无法部署,控制台提示如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
!     ERROR: Application not supported by 'heroku/nodejs' buildpack
!
! The 'heroku/nodejs' buildpack is set on this application, but was
! unable to detect a Node.js codebase.
!
! A Node.js app on Heroku requires a 'package.json' at the root of
! the directory structure.
!
! If you are trying to deploy a Node.js application, ensure that this
! file is present at the top level directory. This directory has the
! following files:
!
! index.php
! Procfile
! public/
!
! If you are trying to deploy an application written in another
! language, you need to change the list of buildpacks set on your
! Heroku app using the 'heroku buildpacks' command.
!
! For more information, refer to the following documentation:
! https://devcenter.heroku.com/articles/buildpacks
! https://devcenter.heroku.com/articles/nodejs-support#activation
More info: https://devcenter.heroku.com/articles/buildpacks#detection-failure
! Push failed

然后看了一下 .deploy_heroku 文件夹里的 Procfile 文件,这是已经从原来的 nodeje 项目变成了 nginx 的了??这跟之前运行时环境不一样,造成了部署无法成功。

看了控制台出现的那两链接,以及 stackoverflow 的回答,需要把原来的 buildpack 给删掉,之后再部署就行了。那么就好办了

1
2
heroku buildpacks:remove heroku/nodejs -a APP
hexo deploy --generate

结束。

因为需要修照片用,手上 2010 年 11 月买的戴尔 Inspiron 14R 5420 现在来看实在是太为难它了,而在之前配的吃鸡电脑因为各种原因留在国内,因此在某次发了工资之后就开始研究买啥电脑了。

因为住的地方比国内要小不少,本着节省空间来考虑打算买台游戏本来着,看了一圈发现要来个 1070 显卡的都要 1w3 左右(Orz。在发出人类科技或许被智子封锁了的感叹后,无意中开始看起了 imac –反正修图都是丢到 lightroom 跟 photeshot 里用 Mac 也没什么不妥,然后在看 B 站时无意看到翼王的 Mac Pro 2009 款改造的视频后,本着看看的原则上雅虎日拍搜索了一下,这配置一般的 Mac Pro 都不算贵啊,要不直接来台 Mac Pro 好了。花了点时间了解各种型号的差别,直接就买了这台双 CPU 款的 Mac Pro 2010。

阅读全文 »