最近我需要从服务器上下载到本地windows系统中,本来想的是校验文件的md5值,就可以对比下载的文件完不完整了,其实在linux系统中,我们可以采用递归的命令来计算md5值,如下:
pushd 计算目录全路径
find . -type f -exec md5sum {} \; > md5sums.txt
这样生成的txt每一行展示了一个文件的md5值及对应的文件地址。
可是轮到windows这一头,我就头大了,尽管有一些比对工具或是下载工具可以比较下载文件的大小来确认是否需要重新下载(间接确认文件是否一样),但是这批下载的文件中还有一些比较大的压缩包,我还是想通过md5值来比较文件的完整性。折腾了一段时间,总算解决了。
既然问题出在系统不一样,那么联想起前段时间使用VirtualBox(下面简称vbox)安装AlmaLinux虚拟机的事,我们只需要解决让文件共享到虚拟机里就行了,说干就干!
vbox的共享文件夹和共享粘贴板等功能,均需要开启增强功能,而安装增强功能前,需要安装一系列依赖等,且需要记得重启虚拟器,下面给大家介绍具体步骤,我摸索过程中的bug,尽量告诉给大家。
如果虚拟机是图形界面,可以在虚拟机开启状态下,点击上方控制栏中下拉框有一个安装增强功能,他会自动下载需要的iso文件。因为我们使用的是AlmaLinux,所以首先去官方下载文件:
http://download.virtualbox.org/virtualbox/7.0.10
其中7.0.10是我的vbox版本,可以自行修改为你的版本号,进入选择文件页面
如图选择 VBoxGuestAdditions_7.0.10.iso点击下载,记住下载的目录,下面要用。
这一步是让虚拟机系统加载我们下载的iso文件。
按上图步骤选中该文件,第一次加载点击选择虚拟盘,选到刚下载的iso文件。
打开虚拟机,挂载iso,一般是/dev/cdrom
mount /dev/cdrom /mnt/cdrom
进入挂载目录,我们可以找到安装的脚本VBoxLinuxAdditions.run,但先不执行。
cd /mnt/cdrom
接着我们安装需要使用到的依赖文件。
dnf install kernel-headers
dnf install kernel-devel
dnf install gcc*
dnf install make
dnf install tar
dnf install bzip2
dnf install xorg-x11-drivers xorg-x11-utils
安装好依赖后,执行安装脚本
./VBoxLinuxAdditions.run
这个时候,我遇到了报错。
Kernel headers not found for target kernel
实际情况是我已经安装了kernel及其依赖。比较安装提示,发现是版本不对。
参考解决方案,我搜了网上的一大堆,重新安装了对应的版本,再执行安装命令,也是一样的报错。
参考地址:https://blog.csdn.net/qq_44497995/article/details/125189049
还有一个删除低版本内核的解决方案,我还没有尝试,网址如下:
https://blog.csdn.net/MR_Zhan_C/article/details/113247332
我的解决方案:
其实在安装脚本的报错中,有提示如果要增加其他版本的kernel模块支持,需要执行的命令
./VBoxLinuxAdditions.run #执行报错后
/sbin/rcvboxadd quicksetup all
在不改变之前安装依赖的命令时,我记得没错的话,我系统报错找不到的kernel是284版本,而我安装的是285版本,我的内核版本uname -r也是284版本。
不过没有关系,在运行/sbin/rcvboxadd quicksetup all命令后,提示新支持的285版本的字样。
此时增强功能已经安装完成了,不需要再执行安装脚本。
关闭后设置共享的文件目录
如上图,注意选中共享的目录,设置共享的文件名称data_file,后续要用,注意不要点击自动挂载,我们采用自己挂载的方式(自动大家可以尝试,好像是自己挂载到/media目录下)
设置好了,打开虚拟机。
挂载目录
cd /mnt # mnt为你需要共享的文件夹路径
mkdir share # 新建共享文件夹
mount -t vboxsf data_file /mnt/share # 挂载共享文件夹,data_file对应vbox设置中的共享文件夹名称,此处错误则无法挂载,名称下均不加“/”
挂载完毕后,进入/mnt/share后即对应windows中的目录,可以愉快的进行md5递归校验的操作了。
pushd 计算目录全路径
find . -type f -exec md5sum {} \; > md5sums.txt
原计划是拿到递归校验的md5文件,再对此做md5值计算,比较md5值即可,但是不凑巧的是同样的文件内容,如果行顺序不对,最后算出来的md5值也是不对的。
举例如下:
cat 1.txt
1
2
3
4
5
cat 2.txt
3
2
1
4
5
md5sum 1.txt 2.txt
a7b1ac3a2b072f71a8e0d463bf4eb822 1.txt
d3d0fa09972d97430e8d7449051084b6 2.txt
解决方案:
grep -wvf 2.txt 1.txt #对比两个md5文件不同的行 1中有2没有的行
grep -wvf 1.txt 2.txt #对比两个md5文件不同的行 2中有1没有的行
若是上面举的例子,则不返回任何值,代表1文件的内容完全被2包含。
顺序颠倒,则代表2文件的内容完全被1包含。即完全一致。
那么至此,我们就可以比较下载源Linux系统中的md5sums.txt文件和虚拟机中计算的md5sums.txt文件的内容是否一致了,且可以根据不一致的行,补充下载 下载不完整或出错的文件。