未经作者许可禁止转载
本文地址:https://jxcn.org/2022/03/laojifuli-yuanli/

之前我实现QTS支持官方的升级的时候老骥伏枥还没有推出支持官方升级的补丁包,后来老骥伏枥推出了牛年大礼包支持系统升级,我很好奇他是怎么实现的,但是nasyun论坛上的文章要10阅读权限才能看,可我连账号都没有,直到最近偶然看到别人分享的系统镜像,这才解除困惑。

老骥伏枥的官方升级补丁原理

  • 重新为系统写入启动分区,使用grub-efi
  • 为补丁包生成一个initrd格式的文件patch.gz
  • grub启动时加载固件的initrd以及补丁包,initrd initrd.boot patch.gz

这样系统启动后就覆盖了rootfs内的内容,而没有对initrd做出改动,然后在patch里覆盖init,这样系统启动的时候就会自动运行定制的脚本了。

不得不说,确实很厉害,比我之前在grub.cfg嵌入bash脚本的做法要简单很多,而且因为initrd是被grub读取的,所以也不需要确定从哪个硬盘启动,直接和grub放一起都可以。

而至于patch.gz中补丁实际上做的事情,我不做更多分析。


“附注:

其实写本篇的本意,是发现自己做的东西居然有人弄了一样的东西出来,下意识就会以为肯定参考了我的,于是准备开一篇专门嘲笑一下。

但是起码得拿出证据来吧,于是我在virtualbox上运行了老骥伏枥的iso,然后看看他怎么做的, 可恶,居然都是编译好的程序实现的,strings一下看看,啥都没有,不知道是加了壳还是加密了数据段。逆向是不可能逆向的,我于是下载了一个镜像打个补丁看看最后更改了啥。

没想到虽然原理差不多(都是不更改initrd来启动系统),但是别人做的高级多了,我还学到了新的知识,只感觉啪啪啪打脸的声音在耳边萦绕,心中很是惭愧。

在此反省一下自己。