Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从磁盘映像文件装入多个分区_Bash_Mount - Fatal编程技术网

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

Bash 从磁盘映像文件装入多个分区,bash,mount,Bash,Mount,我正在尝试编写一个小的bash脚本,它将装载给定磁盘映像文件中的所有分区。我知道这是可行的,因为我在过去已经做过了,但我已经记不起来了。也许我用的是/dev/mapper,但我记不得了。我使用的sizelimit参数是分区的实际大小,而不是分区的绝对扇区端 对不起,我的英语不好 #!/bin/bash source=$1 destination=$2 if !(fdisk $source -l); then exit 1 fi echo "" partdata

我正在尝试编写一个小的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
#/bin/bash
来源=$1
目的地=$2
如果!(fdisk$source-l);然后
出口1
fi
回声“”
partdata=$(fdisk$source-l | grep$source | tail-n+2)
偏移量=0
sizelimit=0
而[“$partdata”!=”];做

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

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 losetop -d "$loopf"

offset=$offset,sizelimit=$sizelimit
为什么不让内核检测有哪些分区?用我的映像文件检查脚本,它有一个分区表和几个分区。至少据我所知,使用不带偏移量的mount/sizelimit是行不通的。当使用
sudo losetup“$loopf.”/file.img
时,我收到一条警告,最后一个扇区没有使用。我的图像文件的总文件大小为4294967295字节。所以最后一个扇区的大小只有511字节,而不是512字节。这可能是个问题吗?使用
sudo partprobe“$loopf”
会创建一个错误:(错误的语言翻译)错误:硬盘外的分区是不可能的
这可能是个问题吗?
取决于分区表-我会创建它,以便最后一个分区不使用最后一个文件<代码>错误:硬盘外的分区不可能-看起来无论如何都是这样。我的图像似乎已损坏。我的系统管理员已设置最大文件大小的策略。这个最大文件大小比我的图像所需的文件大小要小。不,我的图像应该是16gb左右,但只有4gb。无论如何,谢谢你的帮助。我想你提出的解决方案在正常情况下是可行的。至少我现在发现了真正的错误:-)