原理
获取或导出镜像A和B,将镜像分别mount到ma和mb文件夹,用beyond compare直接对比ma和mb这两个文件夹
具体操作步骤和方法
获取镜像
镜像可以是我们自己打包的公共初始镜像,也可以是用户使用一段时间后的镜像,初始镜像可以从测试那边获取,用户镜像则需要让运维导出(可能需要更多时间),格式均为qcow2
传输镜像
测试或运维处的镜像如何给到我们呢? 折腾一番后,暂时想到的相对比较好的办法如下:
让测试或运维传到共享盘: (最好建个独立文件夹以免搞乱共享盘)
通过天翼云电脑同步工具将镜像同步到x86_64的Linux云电脑中
我们开的云电脑一般会自带天翼云电脑同步工具(账号密码同邮箱账号密码),如上图所示,使用方法如下图所示(传输速度大概2M/s,根据镜像大小,需要一些时间)
这里有两点需要解释:
1. 为什么传到共享盘后还要再用工具同步到x86_64的Linux云电脑中: 只有windows和arm64的Linux云电脑可以访问到共享盘,x86_64的云电脑访问不到(基础设施限制了)
2. 为什么只能拷贝到x86_64的的Linux云电脑中: 首先必须是Linux,镜像中的文件系统天然跟Linux兼容,如果要从windows中访问会可能有不兼容的情况发生(比如文件长度和特定的文件名在windows上可能会不支持)。其次必须是x86_64,因为后面用到的beyond compare工具没有arm版本
如果后面beyond compare有arm版了就不需要这么麻烦了
挂载镜像
需要依赖nbd内核模块和qemu工具来实现,具体操作步骤如下
-
确认是否有nbd的ko文件:
ls -al /usr/lib/modules/$(uname -r)/kernel/drivers/block/nbd.ko
如果没有需要自行编译,不过一般Linux发行版都会带这个ko文件,包括uos和kylin
-
加载nbd模块:
lsmod | grep nbd
如果没有输出,说明nbd没有加载,多数Linux发行版默认不加载nbd,需要手动加载:
sudo modprobe nbd
加载成功会自动生成块设备节点,默认应该是16个:
$sudo ls -al /dev/nbd* brw-rw---- 1 root disk 43, 0 Oct 12 14:54 /dev/nbd0 brw-rw---- 1 root disk 43, 32 Oct 12 14:54 /dev/nbd1 brw-rw---- 1 root disk 43, 320 Oct 12 14:54 /dev/nbd10 brw-rw---- 1 root disk 43, 352 Oct 12 14:54 /dev/nbd11 brw-rw---- 1 root disk 43, 384 Oct 12 14:54 /dev/nbd12 brw-rw---- 1 root disk 43, 416 Oct 12 14:54 /dev/nbd13 brw-rw---- 1 root disk 43, 448 Oct 12 14:54 /dev/nbd14 brw-rw---- 1 root disk 43, 480 Oct 12 14:54 /dev/nbd15 brw-rw---- 1 root disk 43, 64 Oct 12 14:54 /dev/nbd2 brw-rw---- 1 root disk 43, 96 Oct 12 14:54 /dev/nbd3 brw-rw---- 1 root disk 43, 128 Oct 12 14:54 /dev/nbd4 brw-rw---- 1 root disk 43, 160 Oct 12 14:54 /dev/nbd5 brw-rw---- 1 root disk 43, 192 Oct 12 14:54 /dev/nbd6 brw-rw---- 1 root disk 43, 224 Oct 12 14:54 /dev/nbd7 brw-rw---- 1 root disk 43, 256 Oct 12 14:54 /dev/nbd8 brw-rw---- 1 root disk 43, 288 Oct 12 14:54 /dev/nbd9
-
启动nbd server——qemu-nbd,根据nbd的架构,肯定需要一个server来处理请求,最简单的处理办法就是让qemu-nbd来当这个server(nbd的相关知识不是本文章的重点,此处略过),先看下有没有qemu-nbd工具:
which qemu-nbd
如果没有任何输出,则需要手动安装:
sudo apt-get install qemu-utils
将qcow2镜像文件和某个nbd块设备文件绑定:
sudo qemu-nbd --connect=/dev/nbd0 your_file_1.qcow2
看下nbd块设备的分区情况:
$ sudo fdisk -l /dev/nbd0 Disk /dev/nbd0: 80 GiB, 85899345920 bytes, 167772160 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: gpt Disk identifier: 667F23E3-27EB-43BD-9379-C4AECE66C2AB Device Start End Sectors Size Type /dev/nbd0p1 2048 616447 614400 300M EFI System /dev/nbd0p2 616448 167772126 167155679 79.7G Linux filesystem
这里的/dev/nbd0p1是系统引导相关的分区,不是我们关注的,我们挂载/dev/nbd0p2即可:
sudo mount /dev/nbd0p1 your_mnt_1
我们用同样的方法处理另外一个镜像:
sudo qemu-nbd --connect=/dev/nbd1 your_file_2.qcow2
$ sudo fdisk -l /dev/nbd1 Disk /dev/nbd1: 80 GiB, 85899345920 bytes, 167772160 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: gpt Disk identifier: 667F23E3-27EB-43BD-9379-C4AECE66C2AB Device Start End Sectors Size Type /dev/nbd1p1 2048 616447 614400 300M EFI System /dev/nbd1p2 616448 167772126 167155679 79.7G Linux filesystem
sudo mount /dev/nbd1p2 your_mnt_2
分别看下your_mnt_1和your_mnt_2,发现镜像中完整的文件系统已可访问:
$ ls -al your_mnt_1 drwxrwxrwx 20 ctyun ctyun 4096 Aug 23 17:02 . drwxr-xr-x 4 root root 4096 Oct 12 16:05 .. -rw-r--r-- 1 root root 0 Aug 19 2022 .autorelabel lrwxrwxrwx 1 root root 7 Nov 25 2020 bin -> usr/bin drwx------ 5 root root 4096 Feb 14 2023 boot drwxr-xr-x 4 root root 4096 Nov 27 2020 .cache drwxr-xr-x 4 root root 4096 Nov 25 2020 dev -rw-r--r-- 1 root root 6148 May 9 2022 .DS_Store drwxr-xr-x 157 root root 12288 Aug 23 17:02 etc drwxr-xr-x 3 root root 4096 Dec 11 2022 home lrwxrwxrwx 1 root root 7 Nov 25 2020 lib -> usr/lib drwx------ 2 root root 16384 Nov 25 2020 lost+found drwxr-xr-x 14 root root 4096 Aug 23 16:52 media drwxr-xr-x 8 root root 4096 Feb 21 2023 mnt drwxr-xr-x 18 root root 4096 Apr 7 2023 opt drwxr-xr-x 2 root root 4096 Nov 25 2020 proc drwx------ 7 root root 4096 Apr 18 20:38 root drwxr-xr-x 9 root root 4096 Nov 25 2020 run lrwxrwxrwx 1 root root 8 Nov 25 2020 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 25 2020 srv drwxr-xr-x 2 root root 4096 Nov 25 2020 sys drwxr-xr-x 2 root root 4096 Mar 16 2023 .Templates drwxrwxrwt 15 root root 20480 Aug 23 17:12 tmp -rw-r--r-- 1 root root 1761 Nov 25 2020 TRUSTED_PART drwxr-xr-x 13 root root 4096 Aug 19 2022 usr drwxr-xr-x 16 root root 4096 Feb 25 2023 var
在uos上,/dev/nbd0p2或/dev/nbd1p2会被自动挂载,所以无需执行mount的操作:
/dev/nbd0p2 on /media/ctyun/279e1a04-01d7-4b83-9f82-1fa151d65737 type ext4 (rw,nosuid,nodev,relatime,uhelper=udisks2) encrypte_file on /home/ctyun/.config/browser/Default/virtual type fuse.encrypte_file (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000) /dev/nbd1p2 on /media/ctyun/279e1a04-01d7-4b83-9f82-1fa151d657371 type ext4 (rw,nosuid,nodev,relatime,uhelper=udisks2)
对比镜像
需要用到beyond compare工具,为了避免权限问题,可直接在root下启动beyond compare,由于beyond compare是收费的商业软件,建议购买正版,我也尝试了很多其它对比工具,体验远没有beyond compare好(如果却有需要,也可参考我的另一篇文档来安装和破解beyond compare)sudo bcompare your_mnt_1 your_mnt_2
对于20G左右的镜像,大概1分钟左右可以出结果,效果如下:
我们一般会重点关注可执行文件,动态库,脚本和配置文件等的更新,对于文本文件可点击来查看具体细节:
补充几点beyond compare的配置和使用技巧,具体的话大家自行摸索:
清理现场
对比完成关掉beyond compare后,我们需要清理一下现场,毕竟nbd server还在跑,设备nbd块设备也处于挂载中
-
umount对应的目录(nbd设备所有mount上的目录都需要umount,比如uos上自动挂载的目录):
sudo umount your_mnt_1 sudo umount your_mnt_2
-
断开镜像文件与nbd块设备的关联,同时关闭nbd server
sudo qemu-nbd --disconnect /dev/nbd0 sudo qemu-nbd --disconnect /dev/nbd1
-
卸载nbd模块:
sudo rmmod nbd
其它补充
镜像对比可以精确定位不同版本间的差异,有需要的同学可以经常使用,不仅可以对比各版本间的差异,也可以对比uos的初始镜像和我们镜像之间的差异,可能会发现平时难以发现的问题,毕竟视角不同了