假设 iso 磁盘映像隐藏在磁盘上未分配的可用空间中。请注意,由于它隐藏在未分配的空间中,因此文件系统无法识别它。假设给定了镜像的具体位置和大小,那么如何挂载镜像呢?
我想要两种不同的解决方案。一种解决方案是针对保存映像的磁盘被写保护*的情况,因此无法修改或创建磁盘上的分区表。
另一种解决方案是修改磁盘上的分区表,假设保存映像的磁盘是可写的,并且磁盘上的前几 GB 保存了适用于 amd64 的版本 9.2.1 的 Debian 安装 DVD-1 的可引导 isohybrid 映像。
请注意,以下不是我想要的:使用命令dd
将图像从隐藏空间复制到分配的空间,以便生成的重复图像成为文件系统可见的常规文件,然后挂载生成的图像文件。我想直接从已存储图像的位置安装图像。
这个问题是由以下情况引起的。 Debian 9.2.1 的安装程序包含在一套三张 DVD 中。 DVD-1 是可引导的 isohybrid 映像,因此该映像在刻录到 USB 记忆棒时可以使 USB 记忆棒可引导,并且可以使 DVD 可引导。与 DVD 相比,我绝对更喜欢 U 盘。 DVD-2 和 DVD-3 是普通 DVD 映像,不可启动。考虑到这些映像的大小以及当今市场上可用的 USB 记忆棒的大小,最理想的做法是将所有三张 DVD 映像放入一个 16 GB USB 记忆棒中。
DVD-1 3.7GiB 4GB
DVD-2 4.3GiB 4.65GB
DVD-3 4.4GiB 4.7GB
如今,U 盘的容量有 8 GB、16 GB、32 GB 或 64 GB。请注意,USB 记忆棒也称为 USB 闪存驱动器或 USB 存储器。
通过dd
命令(或cp
),必须将 DVD-1 映像刻录到 USB 记忆棒,从 USB 记忆棒的扇区 0 开始,这会在 USB 记忆棒上产生 4GB 分区,并在 USB 记忆棒上留下 12 GB 未分配的可用空间。 USB 记忆棒。通过dd
,DVD-2 和 DVD-3 可以写入此未分配的空间,该空间将对文件系统隐藏。
下面的 bash 脚本,在下载 Debian 9.2.1 for amd64 的三个 DVD 镜像时,将镜像直接刻录到/dev/sdb
,通常是 U 盘,写入完成后,读取生成的镜像来计算校验和在 sha1、sha256 和 sha512 中。假设 USB 记忆棒是/dev/sdb
. DVD-2 和 DVD-3 将存储在未分配的可用空间中,并且对文件系统不可见。
警告:该脚本会覆盖设备名为 的磁盘/dev/sdb
,磁盘上现有的数据将被破坏。因此,新手应远离该脚本,以免意外删除重要数据。
准备:
curl
,dd
并且openssl
必须已经安装。 (curl
下载、dd
将磁盘映像写入 USB 记忆棒,并openssl
计算校验和。每个 Mac OS X 都附带curl
。Linux 的某些发行版附带curl
,但其他发行版则没有。至于 Debian 9.2.1 ,curl
附带 DVD-2。 ) openssl
不仅必须支持 sha1,还必须支持 sha256 和 sha512。
USB 记忆棒必须已卸载,但仍处于连接状态且未弹出。
设备名称/dev/sdb
被传递给dd
命令。如果要刻录 DVD 映像的 USB 记忆棒的设备名称不是/dev/sdb
,则修改脚本,替换/dev/sdb
为正确的设备名称。在 Linux 上,启动盘通常是/dev/sda
,数据盘通常是/dev/sdb
、/dev/sdc
、/dev/sdd
等等。在 Mac OS X 上,启动磁盘通常是/dev/disk0
,数据磁盘通常是/dev/disk1
、/dev/disk2
、/dev/disk3
等等。
在 Linux 上查找设备名称parted -l
很有用。要在 MacOSX 上查找设备名称,请执行diskutil list
和Disk Utility > Info > Disk Identifier
。
此脚本dd
4K
作为块大小传递,其中后缀K
(kilo) 表示 1024 字节。 Mac OS X 上的dd
需要小写k
而不是大写K
。因此,要在 Mac OS X 上运行此脚本,您需要替换K
为k
.
此脚本从 下载 DVD 映像cdimage.debian.org
,如果距离较远,下载速度可能会很慢。您可能想用靠近您的镜子替换它。
#!/bin/bash
par="https://cdimage.debian.org/debian-cd/9.2.1/amd64/iso-dvd/"
# par for the parent directory of the DVD images on the server.
ua='Mozilla/5.0 ()' # UserAgent string to be used by curl.
vAry=() # an array to hold the number of 4K-blocks, which is obtained
# as the file size of the DVD image divided by 4096,
# for each of the three DVD images.
# HTTP header
echo "Reading the HTTP header to obtain the file size"
for (( i = 1 ; i <= 3 ; i++ )) ; do
f="debian-9.2.1-amd64-DVD-${i}.iso"
url="$par$f"
header=$(curl -ILRA "$ua" "$url") # HTTP header
echo "$header"
nBytes=$(echo "$header" | grep -E 'Content-Length: [1-9][0-9]*' | grep -oE '[1-9][0-9]*')
# nBytes is the file size in bytes
if [[ -z $nBytes ]]; then
echo "${f}: curl failed. Aborting..."
exit 1 #@@@@@@@@@@@@@@@@@@@@@@@@@@@
elif [[ $((nBytes%4096)) -ne 0 ]]; then
echo "${f}: nBytes is not divisible by 4096. Aborting..."
exit 1 #@@@@@@@@@@@@@@@@@@@@@@@@@@@
fi
((nBlk=nBytes/4096)) # the number of 4K-blocks
vAry+=($nBlk)
echo "$f $nBytes $nBlk"
echo "${vAry[@]}"
printf %b '----------------------------------------\n\n\n'
done
if [[ ${#vAry[@]} -eq 0 ]] # the number of elements of the array
then
echo "The array of nBlk's is empty. Aborting..."
exit 1 #@@@@@@@@@@@@@@@@@@@@@@@@@@@
fi
printf %b '========================================\n\n\n'
# The file sizes of DVD-1, DVD-2 and DVD-3 of Debian 9.2.1 for amd64 are
# supposed to be 3964551168, 4649189376 and 4692422656 bytes respectively,
# and the number of 4K-blocks to be 967908, 1135056 and 1145611.
# If this is the case, vAry should be (967908 1135056 1145611).
# Download
echo "Downloading to the USB stick"
unset nBlk
i=1; sk=0; for nBlk in "${vAry[@]}" ; do
f="debian-9.2.1-amd64-DVD-${i}.iso"
url="$par$f"
echo "$f $nBlk $sk"
curl -LRA "$ua" "$url" | dd bs=4K seek=$sk of=/dev/sdb ; sync
((i++))
((sk+=nBlk))
printf %b '--------------------\n\n\n'
done
printf %b '========================================\n\n\n'
# Checksum
echo "Reading from the USB stick to calculate the checksum"
i=1; sk=0; for nBlk in "${vAry[@]}" ; do
f="debian-9.2.1-amd64-DVD-${i}.iso"
echo "$f $sk $nBlk"
dd bs=4K skip=$sk count=$nBlk if=/dev/sdb | tee >(openssl sha256 | perl -pe 's/^(\(stdin\)= )?/# sha256: /' >&2) >(openssl sha1 | perl -pe 's/^(\(stdin\)= )?/# sha1: /' >&2) | openssl sha512 | perl -pe 's/^(\(stdin\)= )?/# sha512: /'
((i++))
((sk+=nBlk))
printf %b '--------------------\n\n\n'
done
脚本将 DVD 映像(针对 amd64 的 Debian 9.2.1)写入 U 盘后,DVD-1 占用从字节 0 开始的 3964551168 个字节,DVD-2 占用从字节 3964551168 开始的 4649189376 个字节,DVD-3 占用从字节 0 开始的 4649189376 个字节。字节 8613740544 中的 4692422656 个字节,其中 8613740544 = 3964551168+4649189376。这三个图像是连续存储的。 USB 记忆棒可启动并被识别为 DVD-1,而 DVD-2 和 DVD-3 对文件系统不可见。
如何安装隐藏映像 DVD-2 和 DVD-3?
我想要两种不同的解决方案。
(1) 一种解决方案是针对 U 盘被写保护*的情况,因此无法修改或创建磁盘上的分区表。
(2) 另一种解决方案是调整 USB 记忆棒上的分区表,以便 DVD-2 和 DVD-3 将被识别为与 DVD-1 分区分开的独立分区。或者,不要创建两个额外的分区,而是将保存 DVD-1 的分区扩展为足够大以容纳 DVD-2 和 DVD-3,并让文件系统将 DVD-2 和 DVD-3 识别为常规 iso 文件。
如果三个图像的连续性阻碍了(2),并且如果最好为图像之间的分区标头留出一些空间,那么我可以修改脚本,以便图像之间留出一些空间。
* 写保护:大多数 U 盘没有写保护标签。然而,每张 SD 卡都有一个写保护标签。持有SD卡的USB SD卡读写器看起来像一个U盘,实际上它的作用就是一个U盘,而且还具有写保护的功能。
答案1
这是一个很长的问题,我不能声称已经读到最后。
对于不编辑磁盘的解决方案:
基本上,您所描述的是磁盘分区,未在磁盘分区表中列出。
当您插入磁盘时,Linux 会为其分配一个设备,/dev
例如/dev/sda
. Linux 读取分区表并为每个分区添加一个设备,例如/dev/sda1/
.
实际上可以手动添加未自动设置的分区。这不会将它们添加到磁盘的分区表中,而只是添加到内核的表中。
寻找addpart
方法https://linux.die.net/man/8/addpart
对于编辑磁盘的解决方案。您只需在磁盘上的正确位置添加一个分区(从正确大小的偏移量开始)。有许多不同的程序可以编辑表格。例如fdisk
。如果您使用除此之外的其他东西fdisk
,请非常小心,不要在创建分区时对其进行格式化。这只会写入分区表,不会编辑任何数据。
答案2
安装循环设备时,可以指定偏移量和尺寸。例如
sudo mount -r /dev/sdb /mnt/dvd2 -o loop,offset=3964551168,sizelimit=4649189376