我家云/粒子云刷CentOS

最近又发现一个矿渣,我家云或者粒子云,配置是 RK3328 + 1G RAM + 8G EMMC。单看配置确实没啥看的价值,但是好就好在他可以内置一个3.5寸的硬盘,磁盘读写速度比起只有 USB 2.0 的 N1 盒子来说完全不可同日而语。矿难以后价格一度降到五六十块包邮,然而我总是后知后觉,发现的时候价格又都涨到 80 左右包邮了,无论如何,如果有接硬盘的需求,比现在入 N1 还是合算一些的。

这个东西其实硬件是有毛病会掉盘的,看了一下论坛上的说法,基本都是说供电有问题,USB -> SATA 的转换芯片本身也有问题(RK3328 不支持 SATA,他的内置 SATA 是用 USB3 加上转换芯片实现的)。不过我们要求不高,不会疯狂一次性给硬盘写入上T的数据,硬盘也用功耗比较低的西数绿盘之类的话就还好,至少我目前还没遇到掉盘的问题。

刷机过程和固件网上都有非常多了,这里不再啰嗦,网上固件基本都是弄好的 NAS 系统,要么就是基于 Debian 的 Armbian,但是对于我们 CentOS 爱好者来说,用着实在是不爽,所以就有了这篇文章,讲如何用 Armbian 的镜像和 CentOS 的 root 文件系统杂交出来一个 CentOS 的镜像给我家云用。

需要手边有一个可用的 Linux 系统

首先需要获得一个我家云可用的 Armbian 镜像,这里推荐 ride_wind 的 Armbian 固件,下载地址 https://cloud.189.cn/t/vA736bn2EfEb 密码 3997

里面 Armbian 开头的,看起来长得顺眼的下一个就可以,比如 Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.7z 。解开得到 Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img

此外我们还需要一个 CentOS 7 的镜像, 8 里面 aarch64 被合并进主流了,所以就没人做根文件系统镜像了,只有启动的 iso,当然也不是不能做,就是麻烦很多,我们先用现成的 7 来做。

下载链接

http://mirrors.aliyun.com/centos-altarch/7.8.2003/isos/aarch64/images/CentOS-Userland-7-aarch64-generic-Minimal-2003-sda.raw.xz

将两个文件都复制到 linux 系统下面,CentOS 的镜像需要用 xz -d 解压缩一下

xz -d CentOS-Userland-7-aarch64-generic-Minimal-2003-sda.raw.xz

先研究 Armbian 的镜像,用 fdisk 看一下这个镜像里面的样子

fdisk Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img

大概会出现如下结果,用 p 命令查看现在分区状态

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img: 1.3 GiB, 1413480448 bytes, 2760704 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xbfdae994

Device Boot Start End Sectors Size Id Type
Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img1 32768 2760703 2727936 1.3G 83 Linux

注意到没有这个分区开始位置比较靠后,在 32768 扇区位置, 32768 * 512 = 16M ,也就是说这个镜像前面 16M 不在分区里面,应该都是 bootloader 一类的。我们把它 mount 上看看啥样子

losetup -o 16777216 -f Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img
losetup -a
/dev/loop0: [2049]:29097987 (/data/share/tmp/Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img), offset 16777216
mount /dev/loop0 /mnt # 这里不要照抄,要看 losetup -a 出来结果里面对应的 loop 设备是哪个

然后进入 /mnt 就可以看到分区里面的内容了。

我们的基本思路是用 Armbian 的内核和 CentOS 的文件系统杂交,所以 Armbian 这个文件系统里面对我们有用处的就是内核和对应的模块,我们先把他 tar 出来备用,在 /mnt 下面执行

tar czf /tmp/armbian.tar.gz boot/ usr/lib/modules usr/lib/firmware

之后就可以开心的把 armbian 文件系统都给删光光了。

rm -rf /mnt/* # 千万不要敲错。。。

在往镜像里面拷贝之前还需要做个事情,就是把这个镜像扩一下容,要不然放不下 CentOS。。

cd /data/share/tmp # 你放 armbian 镜像的路径
umount /mnt
losetup -d /dev/loop0 # 同样不要照抄,和前面的保持一致
dd if=/dev/zero bs=1M count=2048 >> Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img

用 fdisk 将其扩容

fdisk Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img

然后用 d 直接删掉分区,再用 n 重建,重建的时候,Start 记得写 32768,之前我们有提到过,镜像前面 16M 是保留的。其余都用默认就可以
最后 w 写入。
大概类似下面这个吧,供参考

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img: 3.3 GiB, 3560964096 bytes, 6955008 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xbfdae994

Device Boot Start End Sectors Size Id Type
Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img1 32768 2760703 2727936 1.3G 83 Linux

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2760703, default 2048): 32768
Last sector, +sectors or +size{K,M,G,T,P} (32768-6955007, default 6955007):

Created a new partition 1 of type ‘Linux’ and of size 3.3 GiB.
Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: n

Command (m for help): w

The partition table has been altered.
Syncing disks.

losetup -o 16777216 -f Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img
losetup -a
/dev/loop0: [2049]:29097987 (/data/share/tmp/Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img), offset 16777216

先别着急 mount,文件系统还没有扩容

e2fsck -f -y /dev/loop0
resize2fs /dev/loop0

然后就可以 mount 了

mkdir /mnt/dst
mount /dev/loop0 /mnt/dst

下面需要把 CentOS 的镜像也给挂载上,这个镜像里面有分区,所以稍微麻烦点

losetup -f CentOS-Userland-7-aarch64-generic-Minimal-2003-sda.raw

用 losetup -a 查看对应的 loop 设备,假设为 /dev/loop1

partprobe /dev/loop1
mkdir /mnt/src
mount /dev/loop1p4 /mnt/src # 这个镜像的第四个分区才是 linux root

下面我们需要复制 CentOS 里面所有文件到 Armbian 的文件系统,为了保持原来的链接之类有效,直接用 tar 来全部同步

cd /mnt/src
tar c | tar x -C ../dst

接下来删掉 CentOS 里面的内核和模块之类,用刚才备份的文件覆盖回去

cd /mnt/dst
rm -rf boot usr/lib/modules usr/lib/firmware
tar zxf /tmp/armbian.tar.gz

现在 CentOS 文件复制基本完成了,但是不要着急,还差最后一步,CentOS 根分区在 fstab 里面是靠 UUID 加载的, Armbian 分区的 UUID 肯定不一样,如果不调整会导致无法进系统。需要编辑一下 fstab

首先不要卸载文件系统,用 blkid 查看一下 UUID

blkid
/dev/loop0: UUID=”575c6079-5569-4591-bb50-3a561c1b32e1” TYPE=”ext4″
/dev/loop1: PTUUID=”00012ee3″ PTTYPE=”dos”
/dev/loop1p1: SEC_TYPE=”msdos” UUID=”6085-5C8F” TYPE=”vfat” PARTUUID=”00012ee3-01″
/dev/loop1p2: LABEL=”_/boot” UUID=”0f70c468-4087-4ddb-88a6-f19d910a12ac” SEC_TYPE=”ext2″ TYPE=”ext3″ PARTUUID=”00012ee3-02″
/dev/loop1p3: LABEL=”_swap” UUID=”72adc5ad-d2a7-404f-b107-ab30c646bd51″ TYPE=”swap” PARTUUID=”00012ee3-03″
/dev/loop1p4: LABEL=”_/” UUID=”284014ff-cdc5-4a45-9454-bcefd1e9304f” TYPE=”ext4″ PARTUUID=”00012ee3-04″

然后编辑 fstab

cd /mnt/dst
vi etc/fstab

只保留第一行,其他都删掉,然后第一行的 UUID 改为刚才我们看到 armbian 镜像的那个。

好了,到此就全部结束了。卸载文件系统

umount /mnt/src
umount /mnt/dst
losetup -D

之后 Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img 就变成了一个含有 CentOS 7 的镜像。

在 Windows 下面刷入我家云即可。

开启 OCSP Stapling 来解决苹果客户端连 https 很慢的问题

最近墙不知道为何抽风把 ocsp.int-x3.letsencrypt.org 给封了,导致所有用 letsencrypt 证书的网站,用 iOS 客户端连的时候都要卡几秒验证 ocsp。 这个破 blog 当然也受到了影响。

解决还是很容易的,打开 OCSP Stapling 就可以了。这个原理简单说,就是让本来该客户端去验证 ocsp 的事情,由 nginx 替它做了,去下来 ocsp 的结果然后和证书一起发给客户端,客户端验证以后就不会再去访问了。

参考文章 https://blog.fundebug.com/2018/03/07/nginx_ocsp_stapling/

当然需要注意的是,这个破 blog 位于香港,所以 nginx 不受墙影响可以直接拿到 ocsp 的结果。如果你的服务器位于墙内,那你需要自己解决你的服务器访问 ocsp.int-x3.letsencrypt.org 的问题。

弄好了以后,可以用 https://www.ssllabs.com/ssltest/analyze.html 这个页面来验证一下是否已经成功开启 OCSP Stapling。

CentOS 7 在线升级 CentOS 8

CentOS7 上的软件逐渐已经开始落后于时代。虽然 CentOS 8 出来的时间还没有那么多,可能还需要很多小白鼠的考验。但是按照以前经验,已经需要开始试用了。

和 6 在线升 7 不一样,7 在线升 8 是没有官方支持的,只是能用而已,所以搞之前务必小心。

参考的基本贴是这里https://www.tecmint.com/upgrade-centos-7-to-centos-8/

操作命令

0: 干啥先备份,死了还有得救

0.5: 请尽可能卸载系统上所有非官方的 rpm 包和 repository,如果安装了第三方内核,并且当前启动在第三方内核下面的话,请重启进入CentOS 7 原生的 3.10 内核,然后卸载第三方内核的 rpm 包。

0.8: 警告,实体机目前有可能会出现重启没驱动找不到盘的现象,原因还没仔细研究,慎重!

1: 首先安装 epel-release,已经装过了的请跳过

yum -y install epel-release

2: 安装 yum-utils (为了使用 package-cleanup) 和 rpmconf

yum -y install yum-utils rpmconf

3: 首先用 rpmconf 来检查所有 rpm 配置文件

rpmconf -a

会不断询问一些配置文件你要使用原始的版本(按Y),还是保留你修改过的(按N),原则是尽量使用原始的版本,如果影响比较大,比如改了 ssh 端口之外的,就保留自己的

4: 卸载 rpmconf,已经没用了

yum -y remove python36-rpmconf rpmconf

5: 用 package-cleanup 检查有没有没用的 rpm

package-cleanup –leaves

这个出来的 rpm 大部分都可以安全卸载,将用不到的卸掉,但是卸载时候注意看会不会有系统关键 rpm 被卸载,有的话跳过就行,这一步不一定都要卸干净

package-cleanup –orphans

这一步出来的 rpm 一般是内核和你自行安装的第三方 rpm , 看情况卸载,内核可以不用管, 这一步也是不一定要卸载干净

6: 安装 dnf

yum -y install dnf

7: 卸载 yum

dnf -y remove yum yum-metadata-parser
rm -rf /etc/yum

8: 用 dnf 把系统更新到最新

dnf -y upgrade

9: 安装 CentOS 8 的基础信息 rpm

dnf -y install http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/centos-repos-8.2-2.2004.0.1.el8.x86_64.rpm http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/centos-release-8.2-2.2004.0.1.el8.x86_64.rpm http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/centos-gpg-keys-8.2-2.2004.0.1.el8.noarch.rpm

如果报告文件找不到,那么可能是 CentOS 又升级了,去对应的目录下面找到正确的文件名即可

10: 升级 epel 的 rpm

dnf -y upgrade http://hkg.mirror.rackspace.com/epel/epel-release-latest-8.noarch.rpm

11: 卸载 CentOS7 内核和冲突的 sysvinit 脚本

rpm -e `rpm -q kernel`
rpm -e –nodeps sysvinit-tools

12: 清理 /etc/yum.repos.d 下面的 repo 文件,将 CentOS- 系列 repo 文件都恢复成原始版本(看到有扩展名是 .rpmnew 的,就用 .rpmnew 覆盖掉对应文件) 将 epel.repo 也恢复成原始版本。

13: 进行主要升级

dnf -y –releasever=8 –allowerasing –setopt=deltarpm=false distro-sync

这步是最容易出问题的,经常会报各种奇怪错误,请参考后面的常见问题

14: 安装内核

dnf -y install kernel-core kernel-modules

15: 把 minimal 组给装上

dnf -y groupupdate “Core” “Minimal Install”

16: 找出系统上其余 el7 的 rpm 包,将其卸载

rpm -qa |grep el7 | xargs dnf remove

会报告所有需要卸载的软件包,记下对你有用的那些,再次执行

rpm -qa |grep el7 | xargs dnf -y remove

来真正卸载

17: 启用 NetworkManager 并禁用 initscript 的网络初始化,不少 CentOS 7 的安装或多或少是禁用了 NetworkManager 或者依赖于 initscript 的,这种安装如果升级不做这个的话,有可能重启网络起不来。

systemctl enable NetworkManager
systemctl disable network

18: 重启系统,把前面所有卸掉的有用软件包全都装回来,配置文件可能需要手工恢复一下,不用着急,一般都会用 .rpmsave 扩展名保存一个备份的。

常见问题

* 报告会导致受保护的软件包 dnf 被移除
一般是 /etc/yum.repos.d 没清理干净,尤其是 CentOS 的 repo 文件是旧的,导致没法升级 dnf,请清理 repo 文件

* 报告会导致受保护的软件包 kernel-ml 被移除
是因为你没听我的,在第三方内核启动状态状态下执行了升级,重启进 rescue 内核吧。能不能起得来就看你人品了。

* 报告 anonbin 和 redhat-rpm-config 依赖错误
删掉所有 kernel-devel 就好了。(和一个好的机器对比了半天终于找出来的)

rpm -qa |grep kernel-devel | xargs rpm -e

* 重启以后 pppoe 拨号起不来
原因是 CentOS 8 开始强推 NetworkManager 了, 虽然给了 network-scripts 这个包用来保持向下兼容性,但是也就只是能在有线网卡上用用而已,对于 pppoe 等冷门连接方式,你只能用 NetworkManager 了.
对于 pppoe 连接,你需要单独安装 NetworkManager-ppp 这个包

dnf -y install NetworkManager-ppp

一个好消息是 CentOS 8 上面不再需要 rp-pppoe 这个包来做内核 pppoe 了,直接配直接就是可用的。

* Zabbix agent 没了怎么办
CentOS 8 上面有 zabbix40 系列的包,可以用 dnf 装这个,但是一般来说 CentOS 7 上还是用 3.x zabbix 比较多,而 4.x 的 agent 是不能和 3.x zabbix 一起用的,所以直接去 Zabbix 的官网下载 3.x 的 rpm 就可以了。

最近评论

时光机

其他