FreedomBox 自由的盒子

去他们家官网下载了一个 x64 IMG,放到了 Proxmox 里,DHCP 拿到了地址,并能解析,通过 PVE Web Console 界面登录,以为有默认的 root 口令,然而我错了,原来是要通过浏览器来设置第一次登录的,这个主意好!
FAQ 介绍很详细。

然后去安全选项把限制控制台访问的打勾去掉后,就可以用创建的 Web 账号 ssh 登录操作系统了。

Web 界面上搞了一堆 App 可以下载, 但是真心不适合国内用户。


系统配置里的功能也乏善可陈

只是好奇这个产品从 2013年的 0.1 版本,到现在还在一直更新。

Proxmox VE 命令行大全 CLI Cheatsheet

说大全,其实根本就不是。 如果你通过搜索来到这篇文章一定是 Google 或者某度发挥了作用。 各个功能之间用颜色区块分开显示,有利于阅读。For better reading we are using different color block for different functions.

Proxmox 绝对是个好东东,每天在操作有很多问题,希望能积累在这篇文章里,给后来者借鉴. This will be an Biligual post for non-Chinese users to read as well.

命令行下进入虚拟机的控制台, Enter into VM console through PVE command line.
# qm terminal VMID
用 Ctr-o 退出, Use Ctr-o to exit the VM console.

查看存储上的卷,Check volumns on storage.
# pvesm list STORAGE_NAME
查看指定的存储状态,Check status of a specific storage
# pvesm status -storage STORAGE_NAME
不指定 -storage 时,显示当前节点上的所有存储

Ubuntu apparmor 导致的 Unbound DNS 服务日志文件不能读写错误

开启 Apparmor 的 debug ,我们就可以在系统日志里看到如下的记录:

Dec 19 11:56:42 localhost kernel: [45483.551927] audit: type=1400 audit(1576727802.918:1755): apparmor=”DENIED” operation=”mknod” profile=”/usr/sbin/unbound” name=”/var/log/unbound/unbound.log” pid=23316 comm=”unbound” requested_mask=”c” denied_mask=”c” fsuid=115 ouid=115

vim /etc/apparmor.d/usr.sbin.unbound
在 root hints 后添加一行:

/var/log/unbound/** rw,

重启 apparmor,重启 unbound 服务后,就可以看到日志能正确的写入了。

解决问题后关闭 Apparmor 的 debug:

echo 0 > /sys/module/apparmor/parameters/debug

在线升级 Proxmox VE 6.0 集群到 6.1

首先确认删除企业版订阅的源文件:/etc/apt/sources.list.d/pve-enterprise.list
然后在 /etc/apt/sources.list 添加:
deb http://download.proxmox.com/debian/pve buster pve-no-subscription

然后 apt update && apt upgrade;这是 39 个等待更新的包:

总共 700 多兆的下载,经过 proxychains 的“加速”,下载速度稳定在 1.6MB/s,10分钟不到一个节点就升级完成了。

为了安全起见,在我们准备重新启动升级完成的节点之前,把所有的虚拟机手工在线迁移到另外的节点: # qm migrate <VM-ID> <Node-Name> –online
在启动 pve-03 这个节点的时候,我们准备升级 pve-02,升级前的集群状态:

pve-03 节点启动完成后再看集群状态:

登录 pve-03,我们可以看到内核版本已经是 5.3 了
Linux pve-03 5.3.13-1-pve #1 SMP PVE 5.3.13-1 (Thu, 05 Dec 2019 07:18:14 +0100) x86_64 GNU/Linux
之前的版本是:
Linux pve-03 5.0.15-1-pve #1 SMP PVE 5.0.15-1 (Wed, 03 Jul 2019 10:51:57 +0200) x86_64 GNU/Linux

无缝升级大功告成!

不需要重建分区的SD 卡分区扩容方案

OpenWrt 等一些操作系统刷完 img 到 SD 卡后, 16G 的 SD 卡,只用了一点点,经常需要“扩容”。之前的做法比较傻,就是重建分区,每次还要敲很多命令,还要把删除分区的起始扇区记录下来。

现在有了这段简单的代码,三行核心的代码就把这个工作自动化了,无需关心 SD 卡容量是 8G 还是 16G 还是更多,反正既然烧了,就是整张卡都是用在操作系统上了。

代码里的 DISK 就是类似 /dev/sdb 这样的, PART 就是分区 /dev/sdb2 这样的。 这里默认是第二分区。分区文件系统格式默认是 ext2/3/4 而不是其他。

burn () {
        fdisk -l ${DISK}>> /dev/null 2>&1 || (echo "could not find device $DISK - please check the name" && exit 1)
        # 烧写
        dd if=$IMG of=${DISK} bs=4M
        [ $? != 0 ] && echo "烧写出错了!" && exit 10
        MAXSIZEMB=$(printf %s\\n 'unit MB print list' | parted | grep "Disk ${DISK}" | cut -d' ' -f3 | tr -d MB)
        echo "[ok] ${PART} Will change to ${MAXSIZEMB} MB "
        parted ${DISK} resizepart 2 ${MAXSIZEMB}
        [ $? != 0 ] && echo "扩展分区出错了!" && exit 2
        e2fsck -y ${PART}
        resize2fs ${PART}
        [ $? = 0 ] && echo "文件系统扩展成功"
}

刷机愉快!

定制自己的 OpenWrt

每次安装 OpenWrt, root 口令都是空的,然后每次进入都是需要手工设置一把;每次都要修改时区;我们想把 OpenWrt 的“主机名”修改为自己的品牌名称;我们还想修改 ssh 登录的 Banner … …

下载 ImageBuilder 是最快定制自己 Image 的办法。不同的 Target , 这个 ImageBuilder 也会不一样,例如 香橙派 Zero 的文件是:openwrt-imagebuilder-sunxi-cortexa7.Linux-x86_64.tar.xz 所以,我们需要先选择好 Target。所有不同的 profile 其实在 .targetinfo 文件里都有定义。选择到合适的 target profile 后,我们只需要运行
# make -j 4 image PROFILE=”xxx” PACKAGES=”xxx xxx ” FILES=”xxx” 即可安装指定的软件包,并把额外的文件在 FILES 路径下包含进来。另外,要用国内的源:中科大: http://mirrors.ustc.edu.cn/lede/releases/18.06.5/targets/x86/64/ 更新 repositories.conf 把其中的 downloads.openwrt.org 修改为:mirrors.ustc.edu.cn/lede

默认刷的就是 snapshot 版本, 不带 Web 界面的, 要刷 Web 界面,进入 ssh 后运行:
# opkg update; opkg install uhttpd uhttpd-mod-lua luci-i18n-uhttpd-zh-cn luci-theme-bootstrap luci-i18n-base-zh-cn

在想到要修改这些东西的时候,我们需要知道这些东西其实是在一个 /bin/config_generate 里面完成的,就让我们先从这个脚本开始,顺藤摸瓜来解剖 OpenWrt 吧。开头的这几行就是说,如果系统已经初始化过了,就不执行这个脚本了。反过来说,如果我们要初始化板子,直接删除 /etc/config/network 和 /etc/config/system 两个文件,然后执行 config_generate 就好。

在开发过程中,为了每次烧写后有自己网络的 IP 地址,我们把原始的 192.168.1.1 修改了一下。也就是说,如果不想让 OpenWrt 默认 IP 是 192.168.1.1 我们可以修改为其他的 VLAN。

系统名和时区,也可以在脚本里直接修改,注意上海是“UTC-8”哦!(里面的 CST 其实也只是显示为 CST 而已,你可以写任意其他的名字,但是 -8 不能修改)

修改登录的 Banner 当然是 /etc/banner 文件。

那 root 口令怎么初始化呢?我们只能手工生成一个带有 root 口令的 shadow 文件,覆盖初始化时的 /etc/shadow ,这样就完成了以上这些初始化需要注意的步骤。

如果板子是从 SD 卡启动的话,一般 SD 卡是从 img 文件直接用 dd 命令烧写的。烧写完后,挂接 SD 卡的第二个分区(根文件系统分区),用脚本修改 /bin/config_generate ,然后 unmount ,也算一种方法。

另外一种比较正式的方法就是修改包文件 base-files.ipk ,我们现在进阶到 opkg 软件包的解剖了。 ipkg 文件实际上就是一个 .tar.gz 文件。

我们用
# zcat base-*.ipk |tar xvf –

就能得到三个文件:

  • ./debian-binary
  • ./data.tar.gz
  • ./control.tar.gz

其中 data.tar.gz 就是所有这个基本包的文件,包含了这个 /bin/config_generate 脚本。我们把 data.tar.gz 包内的文件解开来,可以看到基本上都是 /etc 下核心的内容。

这里有一个我们认为比较核心的脚本是 ./lib/functions/uci-defaults.sh , 我们可以看到,其实板子启动后会自动往 /tmp/sysinfo 目录里写一些文件的,然后后面的这些启动脚本会读取里面的信息,做对应的处理。

总结:实际上修改包文件其实不符合常规的整体的包的完整性,所以,在实际的操作中,为了烧写定制的 SD卡,我们完全不必定制自己的 ipk 文件,而是用官方的 img 文件烧写完毕后,挂接第二分区,再修改相应的文件,反正烧写完以后,SD 卡是必须扩容的。所以,这个修改文件的动作,也不过是顺水推舟而已。

怎么用脚本自动扩展SD 卡的分区?且听下回分解!

香橙派 Pi Zero Plus 上手记

废话不多说,树莓派玩了几台,之前买的是 Google AIY,还托兄弟从美国买了4台,69美刀一台,送了2台,自己留了2台,号称有 Tensorflow Lite 版本。但是自己没时间玩。后来又买了树莓派 4B,1G 内存的各种操作系统刷。 打算做一款屏蔽广告的产品,先要低成本啊, 搜到了老外用 Aliexpress 买的 Pi Zero,再一搜原来是深圳迅龙的产品,当然是挑 100 RMB 内的产品买,而且是要有有线网口的。所以就选了 Zero Plus。坑的是支持的操作系统版本没几个。 Arch Linux 的下载只有 135M,所以先从 Arch Linux Server 开始干起。

安装软件包,一定很慢, 所以先找国内的镜像, 国内有清华的,中科大的, 我们就把 /etc/pacman.d/mirrorlist 第一行修改为:
Server = https://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo
然后 pacman Syuw 就可以去掉那个更新时的因为 ca-certificates 的冲突报错的问题。


再返回去,说一下板子的镜像烧写问题,因为有之前树莓派的经验,所以,手册也没看,就下载了其他不相关的镜像,导致以为板子坏了,投诉了售后的黄小姐,在她热情的指点下,终于明白了,这个板子是必须插 SD 卡才能会亮灯的。正常的启动后是 DHCP 拿地址的,然后板子是红灯亮,网口灯黄灯亮(100M?),绿灯闪。
吐槽一下他们家的百度下载,那个百度网盘实在坑爹,从 Google 网盘下载都有 4M每秒,可是百度上就只能是 100多 Kb/秒。

然后就是 pacman -S vim sudo proxychains dnsutils 等各种工具了

且慢! 磁盘空间不够了!根文件系统只有 1.1G,已经 100% 满了!

这个难不倒我们, 把 SD 卡拔出来放到一台 Linux 机器下, 用 fdisk 删分区,建分区,扩展,然后挂接, growfs 就可以。

敲入 shutdown -h now,Zero+ 就自己灭灯了, 只有绿灯还常亮。拔卡!

前面具体删分区,建分区的步骤就是比较简单, 建分区的时候要注意起始扇区要用前面删除之前的那个起始扇区号,其他都是默认就可以。 然后挂接到 /mnt 的时候,可能会遇到超级块错误,也不要慌, 先用 fsck.ext4 -y /dev/sdb2 来做好 fsck 就可以挂接了。 我们看下挂接好之后, resize2fs 前后的磁盘空间

好了, SD 卡已经扩容完毕,我们umount /mnt; eject /dev/sdb 把 SD 卡插回 Pi Zero+

接下来就是安装其他软件的事情了,我们且听下回分解 … …

用Firefox 的 DoH 功能直接测试 ADGuard 的广告屏蔽效果

在火狐浏览器(Firefox) 的网络设置里,我们手工输入 DNS over HTTPS 的解析器名称:adguard-dns-ns1 ,禁用或者删除原先安装的 AD Block 等插件,来看下访问新浪,搜狐等网站的广告效果。

看新浪财经首页,明显的,该有的广告还是在。

点击文章,可以说除了其中一个 Google 的广告因为墙的问题不能展示,其他该有的都有。

去搜狐教育首页,中间资讯部分一大块天窗,是某个 js 的域名被屏蔽了。

点击进入文章详细,左右两侧有两块英文的提示

可以说 Adguard 的效果比较差,而且速度很慢。Adguard 也有各种插件,在 PC 端有直接的客户端,这些额外的软件安装,对于消费者而言充满疑问和疑虑,对于企业级客户而言,更加不可取。

Proxmox VE 6 的 NFS ServerName 不能解析的惨案

在安装系统之前,做好规划绝对是非常重要的,但是总是有漏网之鱼,有些事情会没有提前想到,导致有点灾难性的后果发生。

在把 KVM 下的虚拟机迁移到 Proxmox 的时候,我们先前在设置 Proxmox NFS Pool 的时候,设置的 NFS 服务器采用名字而不是 IP ,这就埋下了雷。也就有了本文。

尽管在迁移之前 KVM 环境下有 dns-01 和 dns-02 两台 dns 解析的机器,甚至 dns-02 已经成功的迁移到了 PVE 下面。但是在迁移 dns-01 的时候,灾难发生了,因为磁盘 Pool 再也不能解析名称了, 所有的 NFS 存储都挂了。

解决办法:
通过 IP 地址分别登录每台 PVE 主机,修改 /etc/pve/storage.cfg,把 NFS 的 server 修改为 IP 地址,重新启动 PVE 主机

PVE 使用了 Corosync Cluster Engine 用于集群通信,并把配置存储在 SQlite 数据库,通过 FUSE 挂接到每个节点的 /etc/pve 目录下。

修改 Proxmox 6 VE 虚拟机的 VM ID

KVM 的虚拟化环境里, 只有 domain name 这一说, domain ID 是会随着每次重启, ID 会改变的。

Proxmox 创建虚拟机如果不指定 ID,这个 ID 会自动递增,而且这个 ID 在一个集群里是唯一的,是一直绑定虚拟机的。为了方便管理,类似网络环境的 DHCP IP Pool 的管理,我们会对某一段 ID 做一个特定的用途,加以区分。例如 100-199 是基础架构类的, 200-299 是模版,300-399 是数据库层, 400-499 是应用层, 500-599 是测试机, 600-699 是Windows 客户机。

如果不小心分配错了 VM ID,没有按照我们自定义的规则,需要修改 VM ID,怎么办呢?

在虚拟机已经关闭的情况下, ssh 登录进入集群内的任意一个节点,例如 pve-01,把 VM ID 111 修改为 211:
# cd /etc/pve/nodes/pve-01/qemu-server
# mv 111.conf 211.conf
# vim 211.conf
把里面的虚拟机磁盘映像路径修改掉,同时去真实的物理路径,把磁盘映像的文件名修改掉
假定磁盘 NFS Pool 的顶层路径为: /mnt/pve/vmpool/images,那么就是:
# mkdir 211
# mv 111/vm-111-disk-0.qcow2 211/vm-211-disk-0.qcow2
就可以