从磁盘映像文件挂载多个分区
mounting multiple partitions from a disk image file
我正在尝试编写一个小的 bash 脚本,它将从给定的磁盘映像文件挂载所有分区。我知道这行得通,因为我过去已经这样做过,但我不记得了。也许我以某种方式使用 /dev/mapper
但我不记得了。我为 sizelimit 参数使用了分区的实际大小,而不是分区的绝对扇区末尾。
抱歉我的英语不好。
#!/bin/bash
source=
destination=
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_test_sample.img2: Wrong file system
type, invalid options, the superblock of /dev/loop1 is corrupted,
missing encoding page, or some other error.
考虑一种不需要进行一些偏移计算的不同方法。让我们先创建一个带有 DOS 分区 table:
的示例文件
truncate -s 20M file.img
printf "%s\n" 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
并且您可以使用 p1
和 p2
作为普通分区,就像您通常使用的那样:
for i in "$loopf"p*; do
sudo mount "$i" "somwheere/$(basename "$i")"
done
完成后,umount
所有目录并断开循环设备:
sudo losetup -d "$loopf"
我正在尝试编写一个小的 bash 脚本,它将从给定的磁盘映像文件挂载所有分区。我知道这行得通,因为我过去已经这样做过,但我不记得了。也许我以某种方式使用 /dev/mapper
但我不记得了。我为 sizelimit 参数使用了分区的实际大小,而不是分区的绝对扇区末尾。
抱歉我的英语不好。
#!/bin/bash
source=
destination=
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_test_sample.img2: Wrong file system type, invalid options, the superblock of /dev/loop1 is corrupted, missing encoding page, or some other error.
考虑一种不需要进行一些偏移计算的不同方法。让我们先创建一个带有 DOS 分区 table:
的示例文件truncate -s 20M file.img
printf "%s\n" 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
并且您可以使用 p1
和 p2
作为普通分区,就像您通常使用的那样:
for i in "$loopf"p*; do
sudo mount "$i" "somwheere/$(basename "$i")"
done
完成后,umount
所有目录并断开循环设备:
sudo losetup -d "$loopf"