我知道如何挂载在 /dev 中具有相应设备文件的驱动器,但我不知道如何为不代表物理设备且在 /dev 中没有类似物的磁盘映像执行此操作(例如ISO 文件或软盘映像)。我知道我可以在 Mac OS X 中通过双击 Finder 中的磁盘映像图标来执行此操作,这将自动安装驱动器,但我希望能够从终端执行此操作。我不确定是否有通用的 Unix 方式来执行此操作,或者这是否是特定于平台的。
我正在将一些数据 CD/DVD 复制到 ISO 文件中,以便以后在驱动器中不需要它们的情况下使用它们。
我在网上寻找程序,我发现了很多:
使用的cat复制介质:http://www.yolinux.com/TUTORIALS/LinuxTutorialCDBurn.html
cat /dev/sr0 > image.iso
Run Code Online (Sandbox Code Playgroud)dd这样做的用途(显然是最广泛使用的):http : //www.linuxjournal.com/content/archiving-cds-iso-commandline
dd if=/dev/cdrom bs=blocksize count=count of=/path/to/isoimage.iso
Run Code Online (Sandbox Code Playgroud)使用 justpv来完成此操作:有关man pv更多信息,请参阅此处,但这里有一个摘录:
Taking an image of a disk, skipping errors:
pv -EE /dev/sda > disk-image.img
Writing an image back to a disk:
pv disk-image.img > /dev/sda
Zeroing a disk:
pv < /dev/zero > /dev/sda
Run Code Online (Sandbox Code Playgroud)我不知道是不是所有的人都应该是等价的,虽然我测试了其中的一些(使用md5sum工具)和,至少,dd并且pv是不等价的。以下是md5sum使用每个过程的驱动器和生成的文件:
dd程序的md5: 71b676875b0194495060b38f35237c3c
光伏程序的md5: f3524d81fdeeef962b01e1d86e6acc04
编辑: …
我有一个来自这里的磁盘映像文件;该页面说我可以使用 QEMU 和以下命令启动此映像:
$ qemu-system-x86_64 -m 4096 -ctrl-grab -no-reboot x86-64.img
Run Code Online (Sandbox Code Playgroud)
这给出了一个信息:
WARNING: Image format was not specified for 'x86-64.img' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
Run Code Online (Sandbox Code Playgroud)
模拟器加载,但 PilOS 崩溃,这意味着我做错了什么:
(可能是因为 PilOS 想写入块 0 但不能)
该raw命令行参数,据我所知,这意味着这样传递:
$ qemu-system-x86_64 -drive format=raw file=x86-64.img
qemu-system-x86_64: -drive format=raw: drive with bus=0, unit=0 (index=0) exists
Run Code Online (Sandbox Code Playgroud)
这失败了(我认为),因为我的引导设备在/dev/sda总线 0 …
我刚刚使用这个命令制作了一个新安装的双启动(Ubuntu 和 Windows)的图像(我已经使用了一段时间来制作较小的图像):
dd if=/dev/sda | gzip > /mnt/drive.img.gz
Run Code Online (Sandbox Code Playgroud)
在这个驱动器上,使用了 500G 中少于 60G 的数据。不过那个图像文件现在是 409G 大。
那个怎么样?gzip 不应该设法压缩所有这些零吗?正如我所说,这是一个全新安装的系统。不能这么乱。
现在我没想到文件是 60G,但 400G 对我来说似乎非常大。
我有一个单个磁盘映像的 tar 存档。此 tar 文件中的图像大小约为 4GB。我通过管道输入tar xfinto的输出dd将磁盘映像写入 SD 卡。在卡已满之前,diskdump 永远不会停止。这是我的 shell 会话:
$ ls -l disk.img.tgz
-rw-r--r-- 1 confus confus 192M Okt 5 00:53
$ tar -tvf disk.img.tgz
-rw-r--r-- root/root 4294968320 2018-10-05 00:52 disk.img
$ lsblk -lb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc 8:32 1 16022241280 0 disk
$ tar zxf disk.img.tgz -O | sudo dd status=progress conv=sync bs=1M of=/dev/sdc
[sudo] password for user:
15992881152 bytes (16 GB, 15 GiB) copied, 212 s, …Run Code Online (Sandbox Code Playgroud) 我有一个使用创建的非常大的硬盘的压缩原始图像cat /dev/sdx | xz > image.xz。但是,在此操作之前,驱动器中的可用空间已清零,并且图像大部分由零字节组成。将此图像提取为稀疏文件的最简单方法是什么,以使零块不占用任何空间?
我img通过以下命令创建了一个文件:
dd if=/dev/zero bs=2M count=200 > binary.img
Run Code Online (Sandbox Code Playgroud)
它只是一个带零的文件,但我可以使用它fdisk并创建一个分区表:
# fdisk binary.img
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x51707f21.
Command (m for help): p
Disk binary.img: 400 MiB, 419430400 bytes, 819200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x51707f21
Run Code Online (Sandbox Code Playgroud)
并且,让我们说,一个分区:
Command (m for …Run Code Online (Sandbox Code Playgroud) 我已经构建了一个本土的 Linux 发行版,我可以以非 root 用户的身份制作完整的磁盘映像文件,但有一个例外——安装引导加载程序。我正在使用 syslinux(实际上是 extlinux),要安装它,我必须环回挂载引导分区,这需要 root/sudo 权限。这些命令是从一个 makefile 运行的,变量名应该清楚地表明用什么来替换它们。
sudo losetup -o $(BOOT_FS_PARTITION_OFFSET) $(LOOP_DEVICE) $(IMAGE_FILE_NAME)
sudo mount $(LOOP_DEVICE) $(LOOP_MOUNT_POINT)
sudo $(EXTLINUX) -S $(DISK_SECTORS) -H $(DISK_HEADS) -i $(LOOP_MOUNT_POINT)
sudo umount $(LOOP_MOUNT_POINT)
sudo losetup -d $(LOOP_DEVICE)
Run Code Online (Sandbox Code Playgroud)
有没有办法在不需要root权限的情况下将syslinux或extlinux写入磁盘映像文件?
我有六个 Linux 逻辑卷,它们一起支持一个虚拟机。VM 当前已关闭,因此很容易为它们拍摄一致的图像。
我想将所有六个图像打包到一个存档中。简单地说,我可以做这样的事情:
cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever
Run Code Online (Sandbox Code Playgroud)
但这当然会创建一个额外的副本。我想避免额外的副本。
显而易见的方法:
tar c /dev/Zia/vm_lvraid_* | whatever
Run Code Online (Sandbox Code Playgroud)
不起作用,因为 tar 将文件识别为特殊文件(在这种情况下为符号链接),并且基本上将其存储ln -s在存档中。或者,使用--dereference或 直接指向/dev/dm-X,它会将它们识别为特殊(设备文件)并基本上存储mknod在存档中。
我搜索了 tar 的命令行选项来覆盖此行为,但找不到任何选项。我也试过cpio,同样的问题,也找不到任何覆盖它的选项。我也试过7z(同上)。与pax. 我什至尝试过zip,这只是让自己感到困惑。
编辑:查看 GNU tar 和 GNU cpio 的源代码,它们似乎都无法做到这一点。至少,并非没有严重的技巧(无法禁用对设备文件的特殊处理)。因此,将不胜感激或替代实用程序的严重诡计的建议。
TLDR:是否有一些存档器可以将多个磁盘映像打包在一起(从原始设备获取)并流式传输输出,而无需制作额外的磁盘副本?我的偏好是以通用格式输出,例如 POSIX 或 GNU tar。
我经常使用映像驱动器,这意味着对有问题的驱动器进行 dd 复制,然后处理映像而不是驱动器本身。
对于大多数工作,我使用 kpartx 将驱动器的分区映射到 /dev/mapper/ 下的设备。我在这里想知道是否有办法找到哪个映射属于哪个图像。
考虑一下:
root@vyvyan:/tmp# kpartx -a -v Image1
add map loop1p1 (254:4): 0 10240 linear /dev/loop1 2048
add map loop1p2 (254:5): 0 10240 linear /dev/loop1 12288
add map loop1p3 (254:6): 0 52848 linear /dev/loop1 22528
root@vyvyan:/tmp# kpartx -a -v Image2
add map loop2p1 (254:7): 0 33508 linear /dev/loop2 2048
add map loop2p2 (254:8): 0 39820 linear /dev/loop2 35556
Run Code Online (Sandbox Code Playgroud)
现在,假设我忘记了哪个图像去了哪个映射。有没有办法让 kpartx - 或内核,或其他任何东西 - 告诉我哪个图像去哪里?
编辑另外,如果我在 kpartx 添加映射时不小心 rm 图像文件,你如何删除映射?kpartx 希望显示实际图像。
disk-image ×10
compression ×2
dd ×2
tar ×2
cat ×1
cpio ×1
files ×1
filesystems ×1
linux ×1
loop-device ×1
mount ×1
partition ×1
pipe ×1
pv ×1
qemu ×1
sparse-files ×1
syslinux ×1