指南:将 EXT4 文件系统上的 Arch Linux 迁移至 ZFS

为了享受 ZFS 文件系统的 mirror 带来的数据安全保障,我将 Arch Linux 系统从 ext4 文件系统迁移至了 ZFS 文件系统。相关的限制条件包括:原来的硬盘是 三星 840 EVO 256G,需要与 金士顿 SA400S37 480G 组合成一个 mirror pool,也就意味着需要先从 三星 复制到 金士顿,再把 三星 做成 ZFS,将数据重新复制到三星,然后重启进系统把金士顿 attach 到 三星 变成一个 mirror pool;另外,我不想按照 Arch Linux 的指南对三星进行分区,想要让 ZFS 直接管理整个三星硬盘,所以需要外置引导设备。

阅读更多

Unbound与TLS、proxy_protocol

unbound 是支持提供 DNS-over-HTTPS 和 DNS-over-TLS 的,但是为了能够用上 subnetcache 这个模块来给国内用户提供正确的国内IP结果(附上 edns client subnet 并发送给国内的公共DNS),如果处于 Caddy 后面做 upstream server,就不得不使用 proxy_protocol 了,否则 ecs 地址不是 client 的 IP 地址。 首先最重要的是要用 Caddy,而且是构建了 caddy-l4 这个插件的 Caddy,因为 nginx 不支持对 upstream 发起proxy_protocol v2。此外,对于用作DoT的域名,l4这个插件的 handle 部分需要先 terminate TLS 然后再 proxy v2,如下所示: 1 2 3 4 5 6 7 8 9…

x86 兼职路由器 AP

由于之前买的中兴路由器没有办法完全关掉 DHCP 服务器,所以如果 x86 重启,它就会启动自己的 DHCP 服务器,自作主张为客户端分配另一个网段(192.168.5.x)的 IP ;即使 x86 重启之后 DHCP 服务器重新上线,由于 DHCP lease 的刷新时间还没到,客户端们不会询问新的 IP ;而中兴自己则在上游 DHCP 恢复之后抛下客户端们不管了、自己以 10.x.x.x 的 IP 重新回到下级路由的位置,直接导致网烂掉。 为了改善体验,在网上冲浪一番之后决定让中兴退休,x86 把这活也揽过来(真正的 All-in-One )。于是需要挑选能够做 AP 的无线网卡,并且对 x86 上的 Archlinux 进行配置来完成这个任务。 硬件 兼职路由器,很多极客前辈们都是用的 openwrt 。恩山论坛的这个帖子是我的起点: [openwrt(x86)] 2024-4-18—官方源码—史上最全驱动—支持无线AP模式—openwrt x86-64 23.05.3版 。 根据帖主的建议,第一张卡我没有买高通的,只是买了一个便宜大份的 MT7921E。需要注意的是, QCA9882 、 MT7921 等都是芯片,整个网卡还需要其他电路才能成型;MT7921E 我的是…

Gitlab Runner Lxc Executor

此前写过一篇文章介绍如何用Virtualbox Executor和Docker Executor来提供Gitlab Runner,但是这两个executor部署都比较繁琐复杂,特别是Virtualbox在同为AMD64 Linux的情况下可以用Linux Container来更加方便地进行配置。本文记录的是如何配置一个基于Linux Container的Gitlab Runner。 关于安装Linux Container,这篇文章已经介绍过这里就不重复了。 准备模板Container 为了节省时间,我们可以提前准备一个模板Container,这样就不用每次都安装dependency了。在接下来的步骤里我们创建一个名为grbase(gitlab runner base)的ubuntu 22.04 amd64容器: 1 2 3 4 # 使用清华镜像源,使用储存池pool1存储数据 lxc launch mirror-images:ubuntu/jammy/amd64 grbase -s pool1 # 连接容器 lxc exec grbase bash 在容器里面根据自己的需要安装各种依赖,比如常见的build-essential、ruby-full,以及openssh-client、rsync等。其中作为Runner必须装的有git、git-lfs和(直接野binary安装的)gitlab-runner: 1 2 3 4 5 6 # git和git-lfs curl -s "https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh" | sudo bash apt…

Linux Container 与 Lxd

之前一直使用docker来部署服务,但是docker的运作方式对于备份是不太方便的:如果不stop掉容器,那么备份的时候很可能会发生“对正在写入的数据库进行备份”这种灾难性的事情;其他次要原因包括大量的image占据的无效备份空间、坚持使用iptables导致不能用nftables等等。相对而言,linux container同样提供了application和host隔离的安全性,而且每个container都是一个独立的linux环境,配置起来更加直观;网络比docker更加灵活、host可以进行更深度的控制;最重要的是,可以用snapshot + zfs send的方式进行可靠备份。 安装 根据Archwiki的指导安装lxd包,然后system enable –now lxd来开机启动lxd daemon,这样才能通过后面的配置让容器也开机启动。如果报错提示端口已占用,那么需要排查主机上的DNS和DHCP(server)是不是监听得太广泛了——lxd使用dnsmasq监听它创建的网络(默认是lxdbr0)上的67端口以及53端口来为容器们分配IP和提供DNS解析,所以主机上特别是DNS服务不要配置成监听全部interface;可以改成只监听127.0.0.1以及LAN的gateway(比如10.0.0.1),这样就不冲突了。 在成功启动lxd.service之后,来做id mapping。为了安全性,通常会使用unprivileged containers,简单而言就是通过uid/gid mapping的方式让容器里的root到了主机上是一个没有权限的用户,从而保护主机不被篡改。参考archwiki用usermod -v 1000000-1000999999 -w 1000000-1000999999 root来设置就好。 然后先做lxc init,但是跳过储存池的那个问题,我们稍后搞定。 搞定储存池的问题。lxd需要设置储存池来给容器们用,虽然官方提供了很多storage driver,但是最适合我的是ZFS。这里我是把某个SSD整个提供给ZFS管理了。执行以下几步创建pool并添加到lxc里面: 1 2 3 4 # 用zpool创建一个名为lxd1的储存池 zpool create lxd1 /dev/sda # 将lxd1储存池添加到lxd(注意用的是lxc命令)并命名为pool1 lxc storage create pool1 zfs source=lxd1 之后就可以创建容器了。创建新的容器的命令格式是: 1 lxc launch 源:系统/版本/架构 容器名字 -s 储存池名字…

github actions 单repo build多个docker image

示例repo:docker-jekyll – sieveLau 多个docker image可以单纯是tag不一样,也可以是连名字都不一样。至于platform不一样的话,docker/build-push-action本身就支持这个功能。 原理是使用github actions的matrix功能把Dockerfile跟其他属性连接起来,从而生成多个image。比如示范repo做的就是build两个tag出来。 ./ |– .github/ │ `– workflows/ │ `– docker.yaml ├── Dockerfile.cli ├── Dockerfile.server └── entry.sh 显然Dockerfile.cli是给clitag用的。我们有两个tag,所以就是两个Dockerfile,用一个1×2的matrix来跑。首先我们需要把对应关系定义好,用matrix的include来进行定义: 1 2 3 4 5 6 7 8 9 10 jobs: build: runs-on: ubuntu-latest strategy: matrix: include: – dockerfile: ./Dockerfile.cli tag: sievelau/jekyll:cli – dockerfile: ./Dockerfile.server tag: sievelau/jekyll:server…

Gitlab Runner

不建议使用docker in docker,会有安全风险。 在.gitlab-ci.yml中,在job里面定义tags就可以用设置了某个tag的runner来执行。对于同时有多个runner而且executor类型不同的情况下是很有必要的。 获取token 每个runner都需要自己的token。 首先以管理员账户登录gitlab,然后点击“Configure GitLab”,点左侧CI/CD,子菜单点击Runners 点击右上角New instance runner,根据自己的需求填内容(比如钩上Run untagged jobs) 拉到页面最下面,点击Create,记下token。 Virtualbox 以Archlinux作为Host,安装Ubuntu 22.04 LTS作为Guest。内容主要参考自: Setting Up a Self Managed GitLab Runner with the VirtualBox Executor – Lup Peng Unattended Headless Install of Ubuntu Server 22.04 on VirtualBox 7 via VBoxManage CLI – Lup Peng 安装Virtualbox 根据Archwiki…

Build一个自己的docker image

参考

https://stackoverflow.com/questions/38597955/what-docker-image-size-is-considered-too-large
缩小成品image的大小的方法,本文使用了其中的multi stage技巧:How to Reduce Docker Image Size: 6 Optimization Methods – Bibin Wilson and Shishir Khandelwal
3.

Webhook生成静态博客

当静态博客生成器和Git都是实机部署的时候,直接用post-recieve这个hook来调用生成器是非常方便的事情。但是当Git是用docker部署,或者是Gitlab这样不支持repository hook的解决方案的场景下,就需要用webhook来调用生成器了。本文会介绍以下内容: 如何写uwsgi作为响应webhook的backend 如何生成token以无密码clone private仓库 本文假设已经按照 archlinux部署gitlab 完成部署。 UWSGI安装 由于处理响应的是python写的程序,所以除了安装uwsgi之外还需要安装python插件:sudo pacman -S uwsgi uwsgi-plugin-python。 安装完成之后不需要做其他操作,因为我们后续会用systemd service的方式托管,不需要用到uwsgi自己的什么“emperor”模式。 webhook设置 GitLab 解决webhook无法请求本机的问题 默认安装下gitlab是不允许webhook请求localhost的地址的,也就是不能在URL里填127.0.0.1+端口。解决这个问题有两个办法,一是简单粗暴允许所有webhook访问localhost,但是会有安全隐患,所以放在后面说;二是用让nginx监听一个server_name,把server_name填进allowlist里面。 首先来配置nginx,顺便把转发给python的部分也写上。假设我们的repo在收到push之后,会发送一个webhook给http://blogbuilder.internal:25666,那么nginx的server配置就应该这么写: 1 2 3 4 5 6 7 8 9 server { listen 127.0.0.1:25666; server_name blogbuilder.internal; location / { include uwsgi_params; # 我们的uwsgi应用监听这个9091端口 uwsgi_pass 127.0.0.1:9091; } } 测试并重载nginx:sudo nginx -t…

Archlinux部署gitlab

Docker 使用docker来部署gitlab-ce,基本上就是两步走:首先创建文件目录,然后编写docker-compose.yml,就完了。 目录结构是这样的: /opt/gitlab/ |– config/ |– data/ |– logs/ `– docker-compose.yml docker-compose.yml的内容修改自官方的文件,主要去除了gitlab-runner的内容1。 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 26 27 28 29 30 31 32 33 34 35 36 37…