还记得我在拯救造富机上的宝贵数据所费的周折吗?先是用dd
指令读取出整个磁盘的数据到文件,然后用losetup
绑定到loop设备,然后再mount
到磁盘目录,超级麻烦。
<p dir="auto"><img src="https://images.hive.blog/DQmPQVkwTyjuqZgb9w6QZ7MiGRFwLS73NiNcZZiujsfsSDj/image.png" alt="image.png" /><br />
(图源 :<a href="https://pixabay.com/photos/lightbulb-idea-creativity-base-3104355/" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">pixabay)
<p dir="auto">而这个环节最容易出错的是<code>losetup计算偏移量的问题,稍有不慎就会翻车。就好比我,明明小学已经毕业了,还弄错了好几次。
<p dir="auto">那么在已经成功读取数据到文件之后,有没有什么相对简单的方法去绑定呢?按说计算机这么先进,应该可以自动计算便宜量啊,怎么还要我去那计算器程序算一遍呢?
<h1>使用<code>kpartx
<p dir="auto">功夫不负有心人,经过O哥一番努力,还真找到了一个工具(Linux系统自带哦),那就是<code>kpartx。
<p dir="auto">现在就让我们一起来学习如何使用<code>kpartx组合<code>mount,来实现镜像文件中数据的读取操作吧(写入也可以哦)。
<h3>介绍
<p dir="auto">kpartx的介绍信息:
<blockquote>
<p dir="auto">kpartx - Create device maps from partition tables.
<p dir="auto">更详细的描述:
<blockquote>
<p dir="auto">This tool, derived from util-linux' partx, reads partition tables on specified device and create device maps over partitions segments detected. It is called from hotplug upon device maps creation and deletion.
<p dir="auto">简单来讲就可以可以通过读取指定设备(文件也是一种设备哦_上的分区表并在检测到的分区段上创建设备映射。有关详细的介绍和使用信息可以通过<code>man kpartx获得。
<p dir="auto">我们可以直接输入指令来查看简版的使用信息:
<blockquote>
<p dir="auto"><code>kpartx
<p dir="auto">信息如下:<br />
<img src="https://images.hive.blog/DQmWU2cFqqxHaEsXxyGuesGDRgLpwxhdQi2LMe8w8zpxnqM/1732017312564.png" alt="1732017312564.png" />
<h3>使用
<p dir="auto">所以可以可以通过如下指令来给我的镜像文件创建设备映射:
<blockquote>
<p dir="auto"><code>sudo kpartx -v -a /lv_main/test/image
<p dir="auto">创建成功后返回信息如下:<br />
<img src="https://images.hive.blog/DQmWY2wqBKwJwFjyDDh6Z1U7MCtXbExJi2UD3GkvR6LAWW5/1732017409226.png" alt="1732017409226.png" />
<p dir="auto">这时我们其实是可以通过<code>sudo fdisk -l看到设备:<br />
<img src="https://images.hive.blog/DQmV1S4ekJUK6Rpx5XvJbbm5E91CBWEdHMgELnMubvCNP5Z/1732017526279.png" alt="1732017526279.png" />
<p dir="auto">但是我尝试直接mount指定分区时,却出错了,mount指令如下:
<blockquote>
<p dir="auto"><code>sudo mount /dev/loop7p2 media
<p dir="auto">然后竟然提示这样的错误:
<blockquote>
<p dir="auto">mount: /home/xxxx1234/media: special device /dev/loop7p2 does not exist.
<p dir="auto">(<strong><em>研究了半天还是没理解为啥会这样,果断放弃)
<p dir="auto">正确的挂载方式是这样:
<blockquote>
<p dir="auto"><code>ls -l /dev/mapper/*
<p dir="auto">返回如下信息:<br />
<img src="https://images.hive.blog/DQmdrbNC8tRXZCFJhuqNbVXmBBZF2owVNb6HC5rus41nKJB/1732018520050.png" alt="1732018520050.png" />
<p dir="auto">其中<code>/dev/mapper/loop7p1和<code>/dev/mapper/loop7p2,就是我image文件中的两个分区(启动分区和数据分区)啦。
<p dir="auto">现在再试试<code>mount相应的分区,拿启动分区试试:
<blockquote>
<p dir="auto"><code>sudo mount /dev/mapper/loop7p1 media
<p dir="auto">一下子就成功啦,然后再去看看里边的数据:<br />
<img src="https://images.hive.blog/DQmfYiF7zHSionjHB5g9oopTkH9TFC1Ha29Br1pxyg2WNmT/image.png" alt="image.png" />
<p dir="auto">不管你能不能看懂这是什么,反正我是看不懂的啦,哈哈哈。
<p dir="auto">再EFI目录下写个文件试试看:
<blockquote>
<p dir="auto"><code>sudo touch O哥到此一游
<p dir="auto"><code>sudo umount media,再次<code>mount,然后再次查看:<br />
<img src="https://images.hive.blog/DQmRXKwSVFjtTULanCG77Jo23BAmNHAbHYZturw4uS3gsWY/1732026871794.png" alt="1732026871794.png" />
<p dir="auto">哈哈,所以O哥变成了真正的数字人,穿越到目录里边去了呢。
<h3>解除设备映射
<p dir="auto">当我们完成相应的工作之后,应该解除设备映射,指令如下:<br />
<code>sudo kpartx -v -d /lv_main/test/image
<p dir="auto">显示信息如下:<br />
<img src="https://images.hive.blog/DQmZJ3c9SEo5bzUVyCoChsjTfrNMRMheDyzeUxq5Me4hj4N/image.png" alt="image.png" />
<h1>重新学习<code>losetup
<p dir="auto">在学习<code>kpartx又多少去了解一下<code>losetup,为了和<code>kpartx做一些对比,突出<code>kpartx的优越性,结果发现其实<code>losetup也能这样做,且更简单。
<p dir="auto">先上帮助信息<code>losetup --help
<p dir="auto"><img src="https://images.hive.blog/DQmasKRQShtiL5Nd35WGLtkMP3bReaPRJ4jVNmfByaHZwYb/image.png" alt="image.png" />
<p dir="auto">所以这个<code>-f和<code>-P加上<code>--show就会是我们的救星,来测试一下:
<blockquote>
<p dir="auto"><code>sudo losetup -f -P --show /lv_main/test/image
<p dir="auto">输出<code>/dev/loop7,<code>sudo fdisk -l /dev/loop7看一眼:<br />
<img src="https://images.hive.blog/DQmbVS2ZgR5fXbqbmuiNnYyvEV4NDPjHoZgvUaevFNvrJuG/1732028019087.png" alt="1732028019087.png" />
<p dir="auto">怎么和之前kpartx创建映射后效果差不多呢?这次我在试试直接绑定<code>/dev/loop7p2:
<blockquote>
<p dir="auto"><code>sudo mount /dev/loop7p2 media
<p dir="auto">它竟然,它竟然直接成功了,让我来看看数据:<br />
<img src="https://images.hive.blog/DQmdC5YKiEiFD4dUcXcSvGpj9Dn6bnkZTAygC4DngUdPg9x/1732028245872.png" alt="1732028245872.png" />
<p dir="auto">这就有点尴尬了,所以我之前折腾那么久计算偏移量,以及有折腾这么久来学习和测试<code>kpartx是为了啥?
<p dir="auto">好吧,有道是<strong><em>技多不压身,就好比武林高手无论是十八般兵器中的那一样都能耍耍不说,且能拿起来御敌制胜,所以O哥也要像高手们学习呀。
<p dir="auto">嗯,只能如此安慰自己才不枉自己辛苦一场呀。
<p dir="auto">哦,对了,补充一下解除操作:
<blockquote>
<p dir="auto"><code>sudo umount media<br />
<code>sudo losetup -d /dev/loop7
<h1>相关链接
<ul>
<li><span><a href="https://linux.die.net/man/8/kpartx" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://linux.die.net/man/8/kpartx
<li><span><a href="https://linux.die.net/man/8/losetup" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">https://linux.die.net/man/8/losetup
👍👍
我有点好奇O哥的智商是不是在150以上,真心佩服。
要是智商真那么高,就不会总犯低级错误啦
您谦虚了!!🙃
咱们的O哥太优秀啦!棒棒哒!我们都是你忠实的fans!🤩
@tipu curate 3
Upvoted 👌 (Mana: 23/63) Liquid rewards.