searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

镜像对比

2024-03-15 03:22:57
22
0

原理

获取或导出镜像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工具来实现,具体操作步骤如下

  1. 确认是否有nbd的ko文件:

    ls -al /usr/lib/modules/$(uname -r)/kernel/drivers/block/nbd.ko

    如果没有需要自行编译,不过一般Linux发行版都会带这个ko文件,包括uos和kylin

  2. 加载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
  3. 启动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块设备也处于挂载中

  1. umount对应的目录(nbd设备所有mount上的目录都需要umount,比如uos上自动挂载的目录):

    sudo umount your_mnt_1
    sudo umount your_mnt_2
  2. 断开镜像文件与nbd块设备的关联,同时关闭nbd server

    sudo qemu-nbd --disconnect /dev/nbd0
    sudo qemu-nbd --disconnect /dev/nbd1
  3. 卸载nbd模块:

    sudo rmmod nbd

其它补充

镜像对比可以精确定位不同版本间的差异,有需要的同学可以经常使用,不仅可以对比各版本间的差异,也可以对比uos的初始镜像和我们镜像之间的差异,可能会发现平时难以发现的问题,毕竟视角不同了

0条评论
0 / 1000
刘****聪
3文章数
0粉丝数
刘****聪
3 文章 | 0 粉丝