假设映像的位置和大小已知,如何挂载隐藏在磁盘上未分配的可用空间中的 iso 磁盘映像?

假设映像的位置和大小已知,如何挂载隐藏在磁盘上未分配的可用空间中的 iso 磁盘映像?

假设 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,磁盘上现有的数据将被破坏。因此,新手应远离该脚本,以免意外删除重要数据。

准备:

curldd并且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 listDisk Utility > Info > Disk Identifier

此脚本dd 4K作为块大小传递,其中后缀K(kilo) 表示 1024 字节。 Mac OS X 上的dd需要小写k而不是大写K。因此,要在 Mac OS X 上运行此脚本,您需要替换Kk.

此脚本从 下载 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,请非常小心,不要在创建分区时对其进行格式化。这只会写入分区表,不会编辑任何数据。

https://linux.die.net/man/8/fdisk

答案2

安装循环设备时,可以指定偏移量和尺寸。例如

sudo mount -r /dev/sdb /mnt/dvd2 -o loop,offset=3964551168,sizelimit=4649189376

相关内容