RepackBootableISO - Debian Wiki
用于生产 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 。
它是一个字节列表,形成了一个易于格式化的只读文件系统。这些字节可能来自 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”。
文件 /.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
其中许多选项可以不加改变地重复使用。但有些需要适应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"
ISO 的设备符合固件的期望将启动它们。i386和amd64通过旧版 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.img
new_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
then
start_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/null
then
dd if="$orig_iso" bs=512 skip="$start_block" count="$block_count" \
of="$efi_img"
else
echo "Cannot read plausible start block and block count from fdisk" >&2
part_img_ready=0
fi
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
直到 Debian 9 的某个时间点发布,Debian Live CD ISO 还没有获得带有其生产 shell 命令的文件 /.disk/mkisofs。可引导的Debian 衍生产品或其他 Linux 发行版的 ISO 可能不支持这样的信息。
在这种情况下,可以让 xorriso 分析引导设备并制作提案。xorriso 版本越年轻越好:
orig_iso=debian-live-8.4.0-i386-standard.iso
xorriso -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
但是仍然需要找到这种操作的用例。
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 - 字节级别的引导扇区格式