从磁盘映像文件装载多个分区



我正在尝试编写一个小型bash脚本,该脚本将从给定的磁盘映像文件装载所有分区。我知道这是有效的,因为我在过去就已经这样做了,但我已经记不清了。也许我用了/dev/mapper,但我记不清了。对于sizelimit参数,我使用的是分区的实际大小,而不是分区的绝对扇区端。

抱歉我英语不好。

#!/bin/bash
source=$1
destination=$2
if !(fdisk $source -l); then
exit 1
fi
echo ""
partdata=$(fdisk $source -l|grep $source|tail -n +2)
offset=0
sizelimit=0
while [ "$partdata" != "" ]; do
read -ra ARRAY <<< "$partdata"
echo "ARRAY: ${ARRAY[0]} ${ARRAY[1]} ${ARRAY[2]} ${ARRAY[3]}" #echo for debugging
mkdir $destination"/"${ARRAY[0]}
((offset=512*${ARRAY[1]}))
((sizelimit=512*${ARRAY[3]}))
echo "#mount -v -o ro,loop,offset=$offset,sizelimit=$sizelimit -t auto $source $destination/${ARRAY[0]}" #echo for debugging
mount -v -o ro,loop,offset=$offset,sizelimit=$sizelimit -t auto $source $destination"/"${ARRAY[0]}
echo ""
partdata=$(echo "$partdata"|tail -n +2)
done
exit 0

编辑:翻译错误消息:

mount:/mnt/raspi_qr_prototype_testrongample.img2:错误的文件系统类型,无效选项,/dev/loop1的超级块已损坏,缺少编码页或其他错误。

考虑一种不需要进行一些偏移计算的不同方法。让我们首先用DOS分区表创建一个示例文件:

truncate -s 20M file.img
printf "%sn" o n p 1 '' +10M n p 2 '' '' p w | fdisk ./file.img

那么你可以:

loopf="$(sudo losetup -f)"      # ie. /dev/loop0 for example
sudo losetup "$loopf" ./file.img
sudo partprobe "$loopf"

然后我会得到:

$ ls /dev/loop0*
/dev/loop0  /dev/loop0p1  /dev/loop0p2

您可以使用p1p2作为正常分区,就像您通常使用的那样:

for i in "$loopf"p*; do
sudo mount "$i"  "somwheere/$(basename "$i")"
done

完成后,umount所有目录并用断开环路设备

sudo losetup -d "$loopf"

相关内容

  • 没有找到相关文章

最新更新