genisoimage - Debian Wiki

RepackBootableISO - Debian Wiki

man 1 xorrisofs

用于生产 ISO 9660 文件系统的经典命令行界面images 是程序mkisofs建立的选项集。由于许可和作者的其他问题,Debian 发布mkisofs 的一个分支,称为genisoimage,于 2006 年分离然后独立开发。

同时,genisoimage 没有新功能,甚至没有错误修复。仅当需要其选项 -udf 或 -hfs 时,它才是首选。

在大多数用例中替换,特别是对于可引导的 ISO 9660 文件系统,归档和备份是xorrisofs,它启动-as mkisofs 程序xorriso的仿真模式。

创建 ISO 9660 CD-ROM 文件系统映像

genisoimage -v -J -r -V MY_DISK_LABEL -o /home/user/file.iso /home/user/for_iso
xorrisofs -v -J -r -V MY_DISK_LABEL -o /home/user/file.iso /home/user/for_iso

特别是指:

  • -v让程序详细说明小问题或值得注意的事实

  • -J可以生成第二个超级块和目录树,适合 MS-Windows 读取。Joliet 文件名以 16 位 Unicode 指定,每个路径组件最长可达 64 个 Unicode 字符。如果没有向主目录树添加 Rock Ridge 信息,Linux 将使用此树。

  • -r允许生成 Rock Ridge 信息,这些信息记录典型的 POSIX 文件属性,如所有权、权限、时间戳、文件类型、符号链接目标。与选项-R不同,它不会像在硬盘上那样保留所有权,而是将所有者 UID 设置为 0,并将每个人的权限设置为只读和仅检查。如果存在 Rock Ridge,则 Linux 将挂载主目录树并使用 Rock Ridge 显示带有原始字符的长名称。

  • -V设置 ISO 9660 文件系统的名称。当写入的光介质插入到udev 监视的读取驱动器中时,它将用作目录/dev/disk/by-label中的链接名称。使用您自己的唯一名称而不是 MY_DISK_LABEL。

  • -o设置生成的 ISO 9660 映像文件的名称。使用任何合适的路径代替 /home/user/file.iso。

  • 参数/home/user/for_iso不是任何选项的一部分。因此,它用作输入文件或目录的路径,应将其复制到 ISO 9660 文件系统中。如果它是一个目录,那么下面的所有文件和目录也会被复制。

可以给出一个以上的输入路径。在这种情况下,最好使用target = source形式的选项-graft -points和 pathspecs 。

什么是可引导的 ISO 9660 映像?

它是一个字节列表,形成了一个易于格式化的只读文件系统。这些字节可能来自 DVD 或 USB 记忆棒等介质,也可能是作为循环设备暴露给操作系统。在所有这些情况下可以挂载文件系统并将显示目录和文件树。

要通过计算机固件启动,这样的 ISO 映像必须具有特殊的固件可以了解下一步要做的入口点。这个下一步通常是启动引导加载程序系统,它为用户提供操作系统菜单,并且能够启动所选的操作系统。

i386 和 amd64 系统上的入口点是:El Torito、MBR、GPT。为其他架构定义了类似的入口点。题目是范围很广,可能会令人困惑。本文重点实现同开机原始 ISO 中的设备,对它是如何做到的没有太多好奇设备确实有效。

其中记录了这个shell命令。例如在 debian-9.3.0-amd64-netinst.iso

xorriso -as mkisofs -r -checksum_algorithm_iso md5,sha1,sha256,sha512
-V 'Debian 9.3.0 amd64 n'
-o /srv/cdbuilder.debian.org/dst/deb-cd/out/2amd64/debian-9.3.0-amd64-NETINST-1.iso
-jigdo-jigdo /srv/cdbuilder.debian.org/dst/deb-cd/out/2amd64/debian-9.3.0-amd64-NETINST-1.jigdo
-jigdo-template /srv/cdbuilder.debian.org/dst/deb-cd/out/2amd64/debian-9.3.0-amd64-NETINST-1.template
-jigdo-map Debian=/srv/cdbuilder.debian.org/src/ftp/debian/ -jigdo-exclude boot1
-md5-list /srv/cdbuilder.debian.org/src/deb-cd/tmp/2amd64/stretch/md5-check
-jigdo-min-file-size 1024 -jigdo-exclude 'README*' -jigdo-exclude /doc/
-jigdo-exclude /md5sum.txt -jigdo-exclude /.disk/ -jigdo-exclude /pics/
-jigdo-exclude 'Release*' -jigdo-exclude 'Packages*' -jigdo-exclude 'Sources*'
-J -J -joliet-long -cache-inodes
-isohybrid-mbr syslinux/usr/lib/ISOLINUX/isohdpfx.bin -b isolinux/isolinux.bin
-c isolinux/boot.cat -boot-load-size 4 -boot-info-table -no-emul-boot
-eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat
-isohybrid-apm-hfsplus boot1 CD1

“xorriso”是用来打包 ISO 的程序。其他的话是 xorriso 命令“-as”及其参数,它们是部分兼容的带有程序“mkisofs”和“genisoimage”的选项和参数。

在较旧的 Debian ISO 或架构“powerpc”中,您会发现“genisoimage”甚至“mkisofs”作为制作人。大多数这些运行可以是也由“xorriso -as mkisofs”执行,但架构“powerpc”需要xorriso 的仿真不提供选项“-hfs”。

删除不需要的 Jigdo 制作选项

文件 /.disk/mkisofs 的内容看起来令人沮丧,直到我们决定我们不需要 Jigdo 文件,只需要完整的 ISO 映像。所以我们可以省略所有以-jigdo开头的选项及其后续参数。此外,我们不需要 jigdo 相关的选项-checksum_algorithm_iso 和-md5-list及其参数。

xorriso -as mkisofs \-r -V 'Debian 9.3.0 amd64 n' \-o /srv/cdbuilder.debian.org/dst/deb-cd/out/2amd64/debian-9.3.0-amd64-NETINST-1.iso \-J -J -joliet-long -cache-inodes \-isohybrid-mbr syslinux/usr/lib/ISOLINUX/isohdpfx.bin \-b isolinux/isolinux.bin \-c isolinux/boot.cat \-boot-load-size 4 -boot-info-table -no-emul-boot \-eltorito-alt-boot \-e boot/grub/efi.img \-no-emul-boot -isohybrid-gpt-basdat -isohybrid-apm-hfsplus \boot1 CD1

确定需要在 amd64 或 i386 上调整的选项

其中许多选项可以不加改变地重复使用。但有些需要适应ISO镜像与硬盘不完全相同的情况Debian 的生产计算机。此外,我们几乎不需要新的 ISO 映像文件与原始文件具有相同的名称。

为此,我们大致需要了解这些选项的作用。xorriso 的 mkisofs 仿真的选项在手册页中有描述xorrisofs(1) 的。它可以在线获得man 1 xorrisofs

在上面的例子中,我们有

  • -r sets ownership and permissions of the files in the ISO. We keep it.

  • -V 'Debian 9.3.0 amd64 n' sets the filesystem's name. We keep it for now.

  • -o /srv... sets the name of the new ISO image file. We need a new file path here. E.g. "$HOME"/"debian-9.3.0-amd64-modified.iso"

  • -J -J -joliet-long enables production of a Joliet tree for use on systems by Microsoft Inc. We keep them, although the double -J is redundant.

  • -cache-inodes is ignored by xorriso. A remnant of using genisoimage. We keep it.

  • -isohybrid-mbr .../isohdpfx.bin installs an MBR at the start of the ISO image. This enables booting from USB stick via legacy BIOS. We need to extract the first 432 bytes of the ISO into a disk file and give that file as argument to our -isohybrid-mbr option.

  • -b isolinux/isolinux.bin marks the file /isolinux/isolinux.bin in the ISO as EL Torito boot image for legacy BIOS. This enables booting from CD, DVD or BD media. We keep it.

  • -c isolinux/boot.cat publishes the El Torito boot catalog as data file in the ISO. This is purely ornamental. We keep it.

  • -boot-load-size 4 -boot-info-table -no-emul-boot are additional options for the BIOS boot image. We keep them.

  • -eltorito-alt-boot ends the definition of the BIOS boot image. We keep it.

  • -e boot/grub/efi.img marks the file /boot/grub/efi.img in the ISO as EL Torito boot image for EFI. This enables booting from CD, DVD or BD media. We keep it.

  • -no-emul-boot is a necessary addtitional option to -e. We keep it.

  • -isohybrid-gpt-basdat causes the creation of a partition of type 0xef in the MBR partition table. It also causes production of a GPT which stays invalid, nevertheless, because of the existence of the MBR partition. The MBR partition marks the -e boot image as EFI System Partition. This is needed for booting via EFI from USB stick. We keep it.

  • -isohybrid-apm-hfsplus causes production of an Apple Partition Map with a partition entry for the -e boot image. It is useless, though, because no HFS+ filesystem image is present which would be used by some Macs as boot entry point. We keep it just because we only make necessary changes here.

  • boot1 CD1 were two directories on the original production machine. The file trees which were underneath these directories are now stored in the ISO. We replace this by our mount point or extracted ISO- root directory and maybe by a few files which we want to map into the new ISO image.

================中文

  • -r设置 ISO 中文件的所有权和权限。我们保留它。

  • -V 'Debian 9.3.0 amd64 n'设置文件系统的名称。我们暂时保留它

  • -o /srv...设置新 ISO 映像文件的名称。我们在这里需要一个新的文件路径。例如“$HOME”/“debian-9.3.0-amd64-modified.iso”

  • -J -J -joliet-long可以生成 Joliet 树以供使用在 Microsoft Inc. 的系统上。我们保留它们,尽管双 J是多余的。

  • -cache-inodes被 xorriso 忽略。使用 genisoimage 的残余。我们保留它。

  • -isohybrid-mbr .../isohdpfx.bin在ISO 映像。这可以通过旧版 BIOS 从 U 盘启动。我们需要将 ISO 的前 432 字节提取到磁盘文件中并将该文件作为我们的 -isohybrid-mbr 选项的参数。

  • -b isolinux/isolinux.bin将文件 /isolinux/isolinux.bin 标记在ISO 作为旧版 BIOS 的 EL Torito 启动映像。这使得从CD、DVD 或 BD 媒体。我们保留它。

  • -c isolinux/boot.cat将 El Torito 引导目录发布为数据文件在 ISO 中。这纯粹是装饰性的。我们保留它

  • -boot-load-size 4 -boot-info-table -no-emul-boot是额外的BIOS 引导映像的选项。我们保留它们。

  • -eltorito-alt-boot结束 BIOS 引导映像的定义。我们保留它。

  • -e boot/grub/efi.img将 ISO 中的文件 /boot/grub/efi.img 标记为EFI 的 EL Torito 启动映像。这可以从 CD、DVD 或 BD 媒体启动。我们保留它。

  • -no-emul-boot是 -e 的必要附加选项。我们保留它。

  • -isohybrid-gpt-basdat导致创建 0xef 类型的分区在 MBR 分区表中。它还会导致生成 GPT但是,由于存在 MBR 分区,因此无效。MBR 分区将 -e 引导映像标记为 EFI 系统分区。这是从 U 盘通过 EFI 启动需要。我们保留它

  • -isohybrid-apm-hfsplus导致生成 Apple 分区图带有 -e 引导映像的分区条目。不过没用,因为不存在某些 Mac 将使用的 HFS+ 文件系统映像作为引导入口点。我们保留它只是因为我们只做必要的这里的变化。

  • boot1 CD1是原始生产机器上的两个目录。这些目录下的文件树现在存储在国际标准化组织。我们将其替换为挂载点或提取的 ISO 根目录也许是我们想要映射到新 ISO 映像中的一些文件。

此评估产生以下脚本,用于从本地重新打包 ISO目录“$HOME/iso_unpacked_and_modified”:

# The example names get mapped to their roles here
orig_iso="$HOME"/debian-9.3.0-amd64-netinst.iso
new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-9.3.0-amd64-modified.iso
mbr_template=isohdpfx.bin# Extract MBR template file to disk
dd if="$orig_iso" bs=1 count=432 of="$mbr_template"# Create the new ISO image
xorriso -as mkisofs \-r -V 'Debian 9.3.0 amd64 n' \-o "$new_iso" \-J -J -joliet-long -cache-inodes \-isohybrid-mbr "$mbr_template" \-b isolinux/isolinux.bin \-c isolinux/boot.cat \-boot-load-size 4 -boot-info-table -no-emul-boot \-eltorito-alt-boot \-e boot/grub/efi.img \-no-emul-boot -isohybrid-gpt-basdat -isohybrid-apm-hfsplus \"$new_files"

除 i386 和 amd64 以外的 CPU 架构、较旧的 ISO、Debian Live

ISO 的设备符合固件的期望将启动它们。i386amd64通过旧版 BIOS 或 EFI 引导。如今,他们的 ISO 已像上面的示例一样配备。但年纪大的可能缺少 EFI 或从 U 盘启动 BIOS 的设备。

其他架构有不同的需求。但是他们所有的 ISO 都是应该的有一个 /.disk/mkisofs 文件。

arm64 发布 9.4.0

去掉jigdo相关的选项后,还有

xorriso -as mkisofs \-r -V 'Debian 9.4.0 arm64 n' \-o /srv/.../debian-9.4.0-arm64-NETINST-1.iso \-J -joliet-long -cache-inodes \-e boot/grub/efi.img \-no-emul-boot \-append_partition 2 0xef /srv/.../efi.img \-partition_cyl_align all \CD1

我们从上面的“amd64”示例中知道其中的大多数。我们需要发明一个名字对于新的 ISO。无需提取 MBR 模板,因为没有。并且不需要传统的 BIOS 准备,因为 ARM64 上没有 PC-BIOS。

尚未解释的选项是:

  • -append_partition 2 0xef /srv/.../efi.img附加文件“efi.img”从硬盘到最后出现的 ISO 映像。会出现在类型为 0xef 的 MBR 分区 2。我们需要从 ISO 中提取分区 2。

  • -partition_cyl_align all导致分区末端对齐到完整的传统圆柱体尺寸。这种规模和与之对齐的好处有点晦涩难懂。我们保留它。

  • CD1是原始生产机器上的目录。我们将用我们的挂载点或提取的 ISO 根目录替换它也许是我们想要映射到新 ISO 映像中的一些文件。

可以通过查找起始块和数量来完成分区提取原ISO分区表中的blocks,通过dd创建本地磁盘上的文件。在我们的示例中,fdisk 报告 ISO 中的分区:

$ /sbin/fdisk -l debian-9.4.0-arm64-netinst.iso
...
Device                          Boot  Start    End Sectors  Size Id Type
debian-9.4.0-arm64-netinst.iso1           0 411647  411648  201M 83 Linux
debian-9.4.0-arm64-netinst.iso2      411648 413695    2048    1M ef EFI (FAT-12/

所以起始块是 411648,大小是 2048。因此 dd 运行将是:

dd if=debian-9.4.0-arm64-netinst.iso bs=512 skip=411648 count=2048 \of="$HOME"/efi.img

生成的文件 "$HOME"/efi.img 应该可以识别为FAT 文件系统映像。

以下脚本用于从本地目录重新打包 ISO"$HOME/iso_unpacked_and_modified" 如果 orig_iso 可以提取分区是一个词。

orig_iso="$HOME"/debian-9.4.0-arm64-netinst.iso
# If orig_iso is not a single word, you must set auto_extract_efi to 0
# and extract efi_img manually before running this script.
auto_extract_efi=1
efi_img="$HOME"/efi.imgnew_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-9.4.0-arm64-modified.iso# If enabled: extract EFI partition image
part_img_ready=1
if test "$auto_extract_efi" = 1
thenstart_block=$(/sbin/fdisk -l "$orig_iso" | fgrep "$orig_iso"2 | \awk '{print $2}')block_count=$(/sbin/fdisk -l "$orig_iso" | fgrep "$orig_iso"2 | \awk '{print $4}')if test "$start_block" -gt 0 -a "$block_count" -gt 0 2>/dev/nullthendd if="$orig_iso" bs=512 skip="$start_block" count="$block_count" \of="$efi_img"elseecho "Cannot read plausible start block and block count from fdisk" >&2part_img_ready=0fi
fi# Create the new ISO image if not partition extraction failed
test "$part_img_ready" = 1 && \
xorriso -as mkisofs \-r -V 'Debian 9.4.0 arm64 n' \-o "$new_iso" \-J -joliet-long -cache-inodes \-e boot/grub/efi.img \-no-emul-boot \-append_partition 2 0xef "$efi_img" \-partition_cyl_align all \"$new_files"

ppc64el 发布 9.4.0

删除 jigdo 相关选项后:

xorriso -as mkisofs \-r -V 'Debian 9.4.0 ppc64el n' \-o /srv/.../debian-9.4.0-ppc64el-NETINST-1.iso \-J -joliet-long -cache-inodes \-chrp-boot-part \CD1

仅使用了一个特定于引导的选项:

  • -chrp-boot-part导致类型为 0x96 的 MBR 分区标记ISO的块范围。我们保留它。

再加上对新 ISO 名称和修改后的输入树的一般需求,重新打包脚本是:

new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-9.4.0-ppc64el-modified.iso# Create the new ISO image
xorriso -as mkisofs \-r -V 'Debian 9.4.0 ppc64el n' \-o "$new_iso" \-J -joliet-long -cache-inodes \-chrp-boot-part \"$new_files"

mips64el release 9.4.0

删除 jigdo 相关选项后:

xorriso -as mkisofs \-r -V 'Debian 9.4.0 m64el n' \-o /srv/.../debian-9.4.0-mips64el-NETINST-1.iso \-J -joliet-long -cache-inodes \CD1

根本没有特定于引导的选项。所以:

new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-9.4.0-mips64el-modified.iso# Create the new ISO image
xorriso -as mkisofs \-r -V 'Debian 9.4.0 m64el n' \-o "$new_iso" \-J -joliet-long -cache-inodes \"$new_files"

powerpc 发布 6.0.5

删除 jigdo 相关选项后:

/home/debian-cd/build/debian-cd.squeeze/../genisoimage \-joliet-long -r \-V 'Debian 6.0.5 ppc 1' \-o /org/.../debian-6.0.5-powerpc-BC-1.iso \--iso-level 4 \--netatalk -hfs -probe \-map /home/debian-cd/build/debian-cd.squeeze/data/hfs.map \-hfs-parms MAX_XTCSIZE=2656248 \--chrp-boot \-part -no-desktop \-hfs-bless CD1/install \-hfs-volid Debian/PowerPC_squeeze \CD1

抱歉,我无法真正解释所有这些 Apple/HFS 的含义。我们保留我们不理解的东西。

  • --iso-level 4导致产生很少使用的 ISO-9660:1999文件系统树。我们保留它。

  • --chrp-boot与 HFS 没有直接关系,而是导致0x96 类型的 MBR 分区,标记 ISO 的块范围。我们保留它。

  • -map /home/debian-cd/build/debian-cd.squeeze/data/hfs.map给出genisoimage 定义 HFS 创建者和类型信息的映射文件硬盘文件“hfs.map”中列出的文件类。这个文件不是存储在 ISO 中。我们必须从 debian-cd 软件包中获取一个。

  • -hfs-bless CD1/install在 ISO 中标记目录“/install”祝福。根据 man genisoimage 它必须由用于将其父目录引入 ISO 的路径。我们必须预先准备一条新路径。

orig_iso="$HOME"/debian-6.0.5-powerpc-businesscard.iso
new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-6.0.5-powerpc-modified.iso
hfs_map_url=https://sources.debian.org/data/main/d/debian-cd/3.1.21/data/hfs.map
hfs_map_file=hfs.map# Download HFS type/creator map file of debian-cd package
wget "$hfs_map_url"# Create the new ISO image
genisoimage \-joliet-long -r \-V 'Debian 6.0.5 ppc 1' \-o "$new_iso" \--iso-level 4 \--netatalk -hfs -probe \-map "$hfs_map_file" \-hfs-parms MAX_XTCSIZE=2656248 \--chrp-boot \-part -no-desktop \-hfs-bless "$new_files"/install \-hfs-volid Debian/PowerPC_squeeze \"$new_files"

sparc64 9.0 版

没有使用 Jigdo 选项。但是我们有多余的“-checksum_algorithm_iso”我们删除。

xorriso -as mkisofs \-r \-V 'Debian 9.0 sparc64 1' \-o /srv/debian-cd-test/debian-9.0-sparc64-NETINST-1.iso \-G boot1/boot/isofs.b \-B ... \boot1 CD1
  • - boot1/boot/isofs.b提交硬盘文件“isofs.b”作为内容ISO 9660 系统区域。我们需要从 ISO 中提取它。

  • -B ...让所有 8 个 SUN Disk Label 分区标记新兴的 ISO 映像。我们保留它。

orig_iso="$HOME"/debian-9.0-sparc64-NETINST-1.iso
new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-9.0-sparc64-modified.iso
sys_area_file=isofs.b# Extract System Area content to a disk file
dd if="$orig_iso" bs=2048 count=16 of="$sys_area_file"# Create the new ISO image
xorriso -as mkisofs \-r \-V 'Debian 9.0 sparc64 1' \-o "$new_iso" \-G "$sys_area_file" \-B ... \"$new_files"

kfreebsd amd64 版本 7.9.0

/home/93sam/xorriso -as mkisofs \-r -V 'Debian 7.9.0 f-amd64 1' \-o /org/.../debian-7.9.0-kfreebsd-amd64-NETINST-1.iso \-J -joliet-long \-b boot/grub/grub_eltorito \-c boot/boot.cat \-no-emul-boot -boot-load-size 4 -boot-info-table \-cache-inodes \boot1 CD1

所有选项都已经解释过了。不需要太多改变。

new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-7.9.0-kfreebsd-amd64-modified.iso# Create the new ISO image
xorriso -as mkisofs \-r -V 'Debian 7.9.0 f-amd64 1' \-o "$new_iso" \-J -joliet-long \-b boot/grub/grub_eltorito \-c boot/boot.cat \-no-emul-boot -boot-load-size 4 -boot-info-table \-cache-inodes \"$new_files"

hppa 7.0 版

xorriso -as mkisofs \-r \-V 'Debian 7.0 hppa 1' \-o /srv/.../debian-7.0-hppa-NETINST-1.iso \-hppa-cmdline '0/vmlinux initrd=0/ramdisk panic_timeout=60 panic=-1 mirror/protocol=http preseed/url=http://parisc.osuosl.org/debian/preseed.cfg mirror/http/proxy__=http://proxy:8080' \-hppa-kernel-32 install/vmlinux-3.14-1-parisc \-hppa-kernel-64 install/vmlinux-3.14-1-parisc64-smp \-hppa-bootloader install/iplboot \-hppa-ramdisk install/initrd.gz \CD1

幸运的是,选项-hppa-cmdline的参数是完全对 ISO 生产和其他-hppa-*的论点不透明 options 是 ISO 映像中的文件路径。所以只有一般的变化需要:

new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-7.0-hppa-modified-1.iso# Create the new ISO image
xorriso -as mkisofs \-r \-V 'Debian 7.0 hppa 1' \-o "$new_iso" \-hppa-cmdline '0/vmlinux initrd=0/ramdisk panic_timeout=60 panic=-1 mirror/protocol=http preseed/url=http://parisc.osuosl.org/debian/preseed.cfg mirror/http/proxy__=http://proxy:8080' \-hppa-kernel-32 install/vmlinux-3.14-1-parisc \-hppa-kernel-64 install/vmlinux-3.14-1-parisc64-smp \-hppa-bootloader install/iplboot \-hppa-ramdisk install/initrd.gz \"$new_files"

amd64 release 5.0.4

/home/.../genisoimage \-r -V 'Debian 5.0.4 amd64 Bin-1' \-o /org/.../debian-504-amd64-NETINST-1.iso \-J -J -joliet-long -cache-inodes \-b isolinux/isolinux.bin \-c isolinux/boot.cat \-no-emul-boot -boot-load-size 4 -boot-info-table \boot1 CD1

无需从 U 盘启动,无需 EFI,无需太多更改。

new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-504-amd64-modified.iso# Create the new ISO image
xorriso -as mkisofs \-r -V 'Debian 5.0.4 amd64 Bin-1' \-o "$new_iso" \-J -J -joliet-long -cache-inodes \-b isolinux/isolinux.bin \-c isolinux/boot.cat \-no-emul-boot -boot-load-size 4 -boot-info-table \"$new_files"

amd64 Live DVD release 9.4.0

在这里,我们有一些可引导 ISO 世界中罕见的东西:Native xorriso命令而不是 xorriso 的 mkisofs 仿真。(没有 jigdo 相关的命令。)

xorriso \-outdev debian-live-9.4.0-amd64-gnome.iso \-volid d-live 9.4.0 gn amd64 \-padding 0 \-map /w/work/free/gnome/tmp/tmp8HCL24 / \-chmod 0755 / -- \-boot_image isolinux dir=/isolinux \-boot_image isolinux system_area=/usr/lib/ISOLINUX/isohdpfx.bin \-boot_image any next \-boot_image any efi_path=boot/grub/efi.img \-boot_image isolinux partition_entry=gpt_basdat

xorriso 自己的命令集在 man 1 xorriso 中进行了描述。在线的:man 1 xorriso

  • -outdev debian-live-9.4.0-amd64-gnome.iso为新兴的 ISO 映像文件。我们在这里需要一个新的文件路径。

  • -volid d-live 9.4.0 gn amd64设置文件系统名称。由一个live-wrapper的缺点,引号中缺少文件 /.disk/mkisofs。我们需要在 "d-live 9.4.0 gn amd64" 周围加上 '-marks

  • -padding 0省略对 Linux TAO CD 的传统填充预读错误。实际上,应该由烧录程序添加填充,而不是而不是由 ISO 映像制作者提供。我们保留它。

  • -map /w/work/free/gnome/tmp/tmp8HCL24 /映射目录树“tmp8HCL24”到新兴ISO的根目录。(这就是像“boot”和“CD1”这样的路径规范在 mkisofs 仿真中执行。)我们通过映射我们的挂载点或提取的 ISO-root 来替换它目录到新的 ISO 根目录,也许还有一些“-map”命令它将特定文件带入新的 ISO 映像。

  • -chmod 0755 / --为新的 ISO-root 授予“rwxr-xr-x”权限。我们保留它。

  • -boot_image isolinux dir=/isolinux宣布 ISOLINUX 旧版 BIOSISO 目录 /isolinux 中的设备。(如 mkisofs 选项 -b 及其少数附加选项。但是顺序在这里很重要。首先 - 地图,然后-boot_image isolinux 目录=。其他方式会产生错误。)我们保留它。

  • -boot_image isolinux system_area=/usr/lib/ISOLINUX/isohdpfx.bin 在 ISO 映像的开头安装 MBR。这使得从通过旧版 BIOS 的 USB 记忆棒。我们需要将 ISO 的前 432 字节提取到磁盘文件中并将该文件作为我们命令的参数。

  • -boot_image any next结束 BIOS 引导映像的定义。我们保留它。

  • -boot_image any efi_path=boot/grub/efi.img标记文件ISO 中的 /boot/grub/efi.img 作为 EFI 的 EL Torito 启动映像。这使从 CD、DVD 或 BD 媒体启动。我们保留它。

  • -boot_image isolinux partition_entry=gpt_basdat导致创建MBR 分区表中类型为 0xef 的分区。也会导致然而,生成的 GPT 仍然无效,因为MBR 分区的存在。MBR 分区将“efi_path=”引导映像标记为 EFI 系统分区。这是从 USB 记忆棒通过 EFI 引导所必需的。我们保留它

-outdev-as mkisofs -o之间的一个重要区别是“-outdev”不会截断文件“$new_iso”,而是宁愿由于多次会议准备不足而提出抗议:

xorriso : FAILURE : -indev differs from -outdev and -outdev media holds non-zero data

所以我们必须在让 xorriso 将其用作输出文件之前删除“$new_iso”。

另一个区别是 xorriso 默认在输出上调用 fsync(2)每写入 16 MiB 后的文件。这使得它在具有轻量级的系统上内存少,但也让它看起来比“-as mkisofs”模式慢得多。因此,如果内存充足且 -outdev 存储介质不应被移除xorriso 结束后,我们可以通过命令禁用此同步-stdio_sync 关闭

预计 Debian Live 9.5.0 会发生变化,我们添加了命令 -compliance no_emul_toc以节省 64 KiB 的结果大小为代价 不记录多会话历史。这段历史主要是 增量备份。默认情况下,它在 -as mkisofs 仿真中被禁用。

orig_iso="$HOME"/debian-live-9.4.0-amd64-gnome.iso
new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-live-9.4.0-amd64-modified.iso
mbr_template=isohdpfx.bin# Extract MBR template file to disk
dd if="$orig_iso" bs=1 count=432 of="$mbr_template"# Delete file "$new_iso" if it exists
test -e "$new_iso" && rm "$new_iso"# Create the new ISO image
xorriso \-outdev "$new_iso" \-volid 'd-live 9.4.0 gn amd64' \-padding 0 \-compliance no_emul_toc \-map "$new_files" / \-chmod 0755 / -- \-boot_image isolinux dir=/isolinux \-boot_image isolinux system_area="$mbr_template" \-boot_image any next \-boot_image any efi_path=boot/grub/efi.img \-boot_image isolinux partition_entry=gpt_basdat \-stdio_sync off

如果没有文件 /.disk/mkisofs 存在怎么办

直到 Debian 9 的某个时间点发布,Debian Live CD ISO 还没有获得带有其生产 shell 命令的文件 /.disk/mkisofs。可引导的Debian 衍生产品或其他 Linux 发行版的 ISO 可能不支持这样的信息。

在这种情况下,可以让 xorriso 分析引导设备并制作提案。xorriso 版本越年轻越好:

orig_iso=debian-live-8.4.0-i386-standard.isoxorriso -report_about warning -indev "$orig_iso" -report_system_area as_mkisofs

标准输出报告

-V 'Debian jessie 20160402-22:24'
--modification-date='2016040221250200'
-isohybrid-mbr --interval:local_fs:0s-15s:zero_mbrpt:'debian-live-8.4.0-i386-standard.iso'
-partition_cyl_align on
-partition_offset 16
-partition_hd_cyl 64
-partition_sec_hd 32
-iso_mbr_part_type 0x17
-c '/isolinux/boot.cat'
-b '/isolinux/isolinux.bin'
-no-emul-boot
-boot-load-size 4
-boot-info-table
  • 伪文件路径--interval:local_fs:...iso告诉 xorriso删除原始 ISO 的前 32 KiB,以擦除其 MBR 分区表,并将其用作选项-isohybrid-mbr的 MBR 模板。使用 ISOLINUX for legacy BIOS 它实际上只需要前 432 个字节,正如我们为 9.3.0 “amd64” ISO 所做的那样。我们剪下 MBR 模板并将其与 -isohybrid-mbr 一起使用。

  • -partition_offset使 ISO 更容易被分区接受当分区 1 从块 0 开始时讨厌它的编辑器。我们保留它。

  • 某些 ISO 可能需要--modification-date=程序 grub-mkrescue。但是afaik,Debian的启动软件没有搜索此信息是为了找到启动它的文件系统。我们省略它

  • 其他几个显示的选项是默认的,通常不需要给定:

    -partition_cyl_align , -partition_hd_cyl , -partition_sec_hd ,-iso_mbr_part_type我们省略了它们。

  • 其他选项-c-boot-info-table使 ISO 可引导通过 DVD 中的旧版 BIOS。与 -isohybrid-mbr 一起,他们也可以做到可从 U 盘启动。我们保留它们

  • -J -joliet-long -r等一些选项与引导无关,但而不是在安装 ISO 后呈现文件。索里索对这些方面没有特别的建议。不过,它们是传统。我们添加它们。

orig_iso=debian-live-8.4.0-i386-standard.iso
new_files="$HOME"/iso_unpacked_and_modified
new_iso="$HOME"/debian-live-8.4.0-i386-modified.iso
mbr_template=isohdpfx.bin# Extract MBR template file to disk
dd if="$orig_iso" bs=1 count=432 of="$mbr_template"# Create the new ISO image
xorriso -as mkisofs \-r -J --joliet-long \-V 'Debian jessie 20160402-22:24' \-o "$new_iso" \-isohybrid-mbr "$mbr_template" \-partition_offset 16 \-c isolinux/boot.cat \-b isolinux/isolinux.bin \-no-emul-boot -boot-load-size 4 -boot-info-table \"$new_files"

覆盖、删除或添加文件的方法

Debian wiki 展示了如何准备更改以编写它们的各种方法到新的 ISO。xorriso 也提供了自己的方式。

将完整的 ISO 目录树复制到可写硬盘树

以上示例假设目录和数据文件的 ISO 内容被提取到目录“$HOME”/iso_unpacked_and_modified并且对此目录树的副本进行了任何所需的更改。

orig_iso="$HOME"/debian-9.3.0-amd64-netinst.iso
new_files="$HOME"/iso_unpacked_and_modified# Unpack the ISO directory tree
xorriso -osirrox on -indev "$orig_iso" -extract / "$new_files"# (Later delete the unpacked tree which has deletion-unfriendly permissions:)
# find "$new_files" -type d -exec chmod u+w '{}' ';'
# rm -rf "$new_files"

更多这样的解包方法显示在操作 ISOs#Extraction_of_Files_from_an_ISO。

添加覆盖文件系统以进行更改

该方法如图所示DebianInstaller/Modify/CD#Helper_scripts:_diunpk.2C_dipk:

...
sudo mount ${i_iso} $timestamp/${di_ro} -t iso9660 -o loop,uid=${uid},gid=${gid}
sudo mount -t aufs -o br: $ timestamp / $ {di_rw}: $ timestamp / $ {di_ro} none $ timestamp / $ {di_rw}

aufs 挂载点 "${di_rw}" 然后可以完成 "$new_files" 的角色在 ISO 重新打包示例中。

在 xorriso 中,通过特定更改的文件覆盖挂载的 ISO 树

在 xorriso 中,作为 ISO 一部分的调度文件的操作称为“映射”。每次给出输入文件或目录时,映射相应调整。很可能覆盖所有或通过进一步的后续输入规范的先前映射的部分。(在这种情况下,genisoimage 有时会崩溃。)

orig_iso="$HOME"/debian-9.3.0-amd64-netinst.iso
orig_mount=/mnt/iso
changed_isolinux="$HOME"/isolinux_dir_from_iso# Mount original ISO read-only
sudo mount "$orig_iso" "$orig_mount"# Copy out a few files which you want to change
cp -r /mnt/iso/isolinux "$changed_isolinux"# Change or add files in "$changed_isolinux"# Create the new ISO image from original read-only tree and changed files
xorriso -as mkisofs \... specific options ... \"$orig_mount" \-graft-points \/isolinux="$changed_isolinux"

选项-嫁接点启用 pathspec 语法目标=原点 我们可以通过它在 ISO 中为文件或树选择特定路径被映射进去。路径规范/isolinux="$changed_isolinux"覆盖冲突之前从“$orig_mount”/isolinux 到 /isolinux 的映射的一部分。

映射不会完全相互替换,而是合并目录级别。即文件不会从映射中删除,如果他们后续路径规范的来源中缺少。他们只能得到被另一个同名文件覆盖。但是 xorriso 自己的命令集也可能会删除文件。为此,我们最终将不得不离开 mkisofs 仿真并应用“-rm”或“-rm_r”等命令。

如果我们假设“/isolinux/f10.txt”已经过时并且确实不再存在于“$changed_isolinux”中,那么它仍然被映射“$orig_mount”。然后需要在 ISO 之前删除此映射生产开始:

xorriso -as mkisofs \... specific options ... \"$orig_mount" \-graft-points \/isolinux="$changed_isolinux"-- \-rm /isolinux/f10.txt --

首先,我们将仿真命令“-as”留给“--”。然后我们执行具有可变长度参数列表的命令“-rm”。因此它需要由另一个“--”参数终止。关于 xorriso 自己的命令集参见:man 1 xorriso

但是仍然需要找到这种操作的用例。

也可以看看:

  • Debian安装程序/修改/CD

  • 操作 ISO

  • 刻录CD

外部链接

  • Frequently Asked Questions about Debian CD/DVD/USB images - debian-cd 常见问题

  • Index of /debian-cd/current - debian-cd ISO 镜像

  • Index of /mirror/cdimage/archive - 许多较旧的 ISO 映像

  • https://dev.lovelyhq.com/libburnia/libisofs/raw/master/doc/boot_sectors.txt - 字节级别的引导扇区格式

iso:genisoimage 和 xorrisofs相关推荐

  1. linux命令行引导iso,如何在Linux上使用命令行从可启动ISO创建可启动USB?

    isohybrid可能并不总是有效.例如,我有一个带FreeDOS的.iso,isohybrid无法在其中找到一些重要文件(我不知道它们是否应该由syslinux(我也使用过)或其他东西放置在该文件中 ...

  2. 编包----rpm和deb和ISO目录制作出ISO

    净室环境编包 1.deb:pbuilder 第一.创建净室环境(/etc/pbuilderrc)===git-pbuilder是对pbuilder的一层包装 默认获取系统的架构来构架净室环境 git- ...

  3. Linux ISO镜像自定义制作

    1.挂载镜像 [root@dream ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.6 (Maipo)[r ...

  4. 云主机装黑果实践(5):重得到镜像和继续强化前置启动过程

    本文关键字:,hackintosh Cirrus Logic GD5446,OS X,GD5446 kext,黑苹果 vga兼容 花屏,黑苹果 虚拟机 显卡驱动 现在是4.4全国哀悼日,没有从天而降的 ...

  5. genisoimage命令用法

    功能说明:建立ISO 9660映像文件.  常用命令:genisoimage -o imagename.iso file 语 法:mkisofs [-adDfhJlLNrRTvz][-print-si ...

  6. iso linux 内核版本号_Linux查看 iso 版本信息

    一条命令搞定 # isoinfo -d -i  /mnt/custom-CentOS-6.iso CD-ROM is in ISO 9660 format System id: LINUX Volum ...

  7. 制作centos6的启动光盘boot.iso

    思路:参考ISO光盘文件,制作boot6.iso 1.将光盘isoliunx目录复制到data/myiso目录下,ks6-mini.cfg文件复制到/data/myiso/ksdir下,结构如下: [ ...

  8. mkisofs(genisoimage) 命令说明

    Usage: genisoimage [options] file... Options:-nobak 不要包含备份文件-no-bak 不要包含备份文件-abstract FILE 设置抽象文件名-A ...

  9. CentOS/Ubuntu制作自动安装arm iso镜像

    一.目的 减少操作系统安装过程中人机交互过程,实现选择光盘安装后,无需其他人机交互过程即可自动完成操作系统的安装. 二.环境和软件工具 环境:Linux Ubuntu/CentOS操作系统(其他发行版 ...

最新文章

  1. 为什么AI的翻译水平还远不能和人类相比?
  2. 高频面试题:Spring 如何解决循环依赖?
  3. 列表嵌套字典,根据字典某一key排序
  4. 博途plc连接电脑_PLC报错,电脑连接不了PLC
  5. 【数据库系统】元数据
  6. Linux进程睡眠状态disk sleep
  7. 软件工程网络15个人阅读作业2(201521123010徐璐琳)
  8. oracle存储过程执行中输出日志文件 (转载学习)
  9. elementUi——table表格中字段内容超过2行后,省略号...展示,不超过两行不处理。超过两行再显示全部。
  10. MT4外汇结余净值可用预付款
  11. 路由器设备选型参照天梯
  12. 阿里云APP备案操作流程 新手必看
  13. C语言的 字符串 和 字节串 互转
  14. 对于配置JAVA_HOME
  15. Python人脸图像特征提取方法
  16. matlab-线性代数 矩阵转置(共轭、非共轭)
  17. 添加Typora主题皮肤
  18. 材料力学Ⅰ(第六版)第五章课后习题答案
  19. 赛车游戏开发总结PHYSX OGRE
  20. android百度地图与正北方向夹角,指南针对准正北方向是多少角度

热门文章

  1. 如何使用计算机创电子表格,Numbers怎么创建电子表格 Numbers创建表格教程
  2. Kubesphere部署nacos
  3. Python 基础学习Chapter2
  4. 阿里、腾讯、百度大厂的程序员编程指南规范
  5. matlab——1、二维曲线绘图
  6. [应用方案]ML51单片机通过ADC驱动NTC传感器测量温度
  7. Xray爬虫如何联动到Goby
  8. 数据可视化设计规范与应用
  9. android 邮箱 知乎,仿知乎登陆邮箱自动补全,邮箱补全
  10. python电子版笔记_python学习笔记-电子书