前言:

其实,很多时候使用 Gentoo Linux 系统出现一些问题是非常正常的事情,有些朋友会认为本身就是源代码发行版固有存在的一种问题,比方说都是用最新版本的软件,都追随最新的内核等等。那么具有发现问题和解决问题的能力就是学习和使用 Gentoo 所必须,也是很重要的技能。如果你是一个喜欢稍微折腾一些,喜欢把玩系统的朋友,而不是开机就专注于工作的用户,那么 Gentoo 非常适合用于测试各种有趣的配置和折腾。

ZFS 文件系统更换硬盘

现在很多笔记本都能够同时使用多块硬盘,而不像从前,只能用一块机械硬盘。那么,多块硬盘一般在 Windows 系统中的利用,大部分就是一个主盘,另一块作为从盘,那么具体使用方式由用户自己根据实际情况进行操作,不过都会存在同样的问题,比方说你的一个盘存在问题,比方说坏道,那么上面的数据有极大的可能全部会丢失(当然,如果你平时有备份的习惯),也许,情况并不会比想象中的糟糕。那么,我们如何能够保住数据,但是不用担心盘坏掉呢。

在 Windows 系统中,如果你愿意折腾,可以在安装系统前,将两块盘做成镜像卷,然后再安装 Windows 系统,这样,如果有一块盘出现问题,我们只需要更换损坏的硬盘就行了,而系统仍然可以继续保持运转。

(当然,如果你问我如何具体操作,这方面我就不清楚了,因为,我不用 Windows)

那么在 ZFS 文件系统中,遇到这样的情况我们怎么处理?或者需要什么样的思路解决呢?

首先看看我遇到的问题,我的联想拯救者里面原始的 nvme 盘是海力士,这块盘很不错,没有问题。但是我加的另一块 nvme 盘体质就差很多了,是西部数据的 SN550,容量和原始的海力士是一样的,都是500G。

我分区遵循的方案想必了解我的朋友都知道,将 /boot 放在相对体质最好的那块 nvme 上,随后将剩下的容量与另一块 nvme 几乎相同的容量做成 ZFS 的 mirror 卷,而这个卷就是我的 / 目录了。

/boot 目录存放在体质较为好的 nvme 中

前些天,在使用系统的时候,就出现整个系统小卡一下,然后发出了清脆的“卡他”声,一般就是意味着你的某个储存设备弹出了,我一查:zpool status 就出现了下图:

西部数据 SN550挂了

这里就出现了 nvme1n1p1 UNAVAIL 的情况,并且在上面我们也能看到 zpool replace 命令提示。所以我们只需要更换硬盘,将 nvme1n1p1 替换掉就可以了。随后就在京东下单了一条体质和性能中规中举的金士顿A2000。后续更换硬盘通过如下命令就能顺利替换硬盘:

zpool replace rpool nvme1n1p1

具体操作之前需要注意:

  • 新的 nvme 盘必须分区一个和挂掉的盘分区相同名字,容量大致相同就可以了(大太多会比较可惜);
  • 整个替换过程可以关机操作,也可以在线操作,如果是台式机在线操作会方便些,笔记本关机操作比较安全些。
  • 替换完成后,需要一段时间从好的盘同步数据到新盘,我 / 目录里面的数据有155G左右,这个过程在 nvme 上大概花了4~5分钟 ,完成之后就可以正常使用了。
替换前
替换后

小结:

数据永远是最重要的。耗材是为数据服务的。

关于 gentoo-zh 源中我维护的内核源码

gentoo-zh 源中,我维护两个内核源码,一个是 xanmod-hybrid ,另一个是 linux-tkg-sources,这两个内核的维护整个过程充满了曲折,不过总的过程非常有意思,容我慢慢道来。

原先最早我开始使用 Gentoo 的原因就是因为我可以自己管理和控制这两个内核,xanmod 大家都挺熟悉的,是一个非常有名的第三方魔改内核,但是其中有两个我非常喜欢的补丁,作者觉得没有添加的意义,一个就是能在 TTY 下显示中文的 cjktty 补丁,另一个是能够在内存比较小的情况下,合并内存页面的 uksm。后者维护因为停滞所以被遗弃,但是我在一个 Arch 开发者的代码库里发现了一直跟随主线,保持维护的 uksm 版本。

随后我将这些补丁融入了 xanmod 和 linux-tkg ,编译和运行是没有问题的。那么就是开始学习编写 ebuild 脚本了。真个 ebuild 脚本其实就是 bash 脚本,用我们的 emerge 去解析他们,并且自动化完整编译和安装。那么一开始我几乎完全照搬了 src_prepare_overlay 提供的 ebuild ,一般配合 ebuild 的还需要一个叫做 eclass ,在 eclass 中定义了一些变量和函数,通过这些变量和函数的功能才能完整 ebuild 的创建。

所以我基本上把上面那个链接中的整个 sys-kernel 部分搬到我的 github 上开始魔改,后来运气不错,也顺利魔改并开始使用自己的内核 ebuild 了,这大概是去年年底左右完成的。后续更新了一段时间后,我决定融合进入 gentoo-zh 中。

融入并不难,只要相关的内容符合要求就非常容易合并进入 gentoo-zh 中。直到最近,我们 gentoo-zh 社区逐渐开始活跃以后,永祥发现不少 ebuild 存在问题,我的也存在问题。

  • 首先是 ebuild 使用 EAPI 版本比较老,是EAPI6,而官方内核源码的 ebuild 采用的 EAPI 是 EAPI7;
  • 其次是 eclass 使用的是 src_prepare_overlay 提供的魔改版本,该版本不兼容 EAPI7;
  • 再次是整个 ebuild 脚本,格式不规范,Tab 和空格混用,对齐不规范;
  • 另外是 metadata.xml 文件中没有对 USE 做相关解释;
  • 最后是 ebuild 中最好使用外联下载补丁,而不是包含在文件夹中。

后续通过不断学习,和永祥和ry的交流中不断改进,才逐步解决了上面这些问题,大概花了半年左右的时间,直到最近才稳定下来。

小结:

别看是两个简简单单的 ebuild 文件,从中需要了解很多东西,最重要的交流和沟通能力,其次才是学习和实践的能力,最后才是意志力。当然,兴趣是我们永远需要的动力。

4 thoughts on “记录 Gentoo 系统维护(三)

  1. 大佬,能否考虑维护一份jellyfin的包?官方仓库和zh都没这个包。

  2. 老哥,你好!最近Gentoo运行发现一个问题,但是完全不知道怎么解决,如下:
    当我把移动硬盘挂载后,发现整个系统startx启动变慢了,甚至启动firefox也是变慢了。当我把移动硬盘取消挂载后,一切又恢复了正常。。。

    1. 朋友可以用 dmesg -w 查看日志,这个时候差拔下移动硬盘看看日志有什么提示~

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注