Linux genisoimage命令详解

genisoimage命令 - 用于创建ISO 9660格式光盘镜像的工具,是mkisofs的增强版,支持Joliet、Rock Ridge扩展和El Torito引导

命令简介

genisoimage(也称为mkisofs)是一个功能强大的ISO 9660文件系统创建工具,能够从目录树生成符合ISO 9660标准的镜像文件。它广泛用于制作可启动光盘、系统安装盘、软件分发盘等。

注意: 在许多Linux发行版中,genisoimagemkisofs 是同一个程序的不同名称
  • 文件格式: .iso, .img(ISO 9660格式)
  • 标准支持: ISO 9660 Level 1/2/3, Joliet, Rock Ridge
  • 引导支持: El Torito(可启动CD/DVD)
  • 文件系统: 支持长文件名、Unicode、符号链接、设备文件
  • 主要应用: 系统安装盘、软件光盘、数据备份光盘、Live CD制作
  • 关联命令: mkisofs, xorriso, isoinfo, growisofs

安装方法

# Ubuntu/Debian (包含在cdrtools或cdrkit中)
sudo apt install genisoimage
# 或安装完整套件
sudo apt install cdrkit

# CentOS/RHEL 7
sudo yum install genisoimage
# 或
sudo yum install mkisofs

# CentOS/RHEL 8+/Fedora
sudo dnf install genisoimage

# Arch Linux
sudo pacman -S cdrkit

# openSUSE
sudo zypper install mkisofs

# macOS (使用Homebrew)
brew install cdrtools

# 从源码编译
wget https://downloads.sourceforge.net/project/cdrtools/cdrtools-3.02a07.tar.gz
tar -xzf cdrtools-3.02a07.tar.gz
cd cdrtools-3.02a07
make
sudo make install

# 验证安装
genisoimage --version
# 或
mkisofs --version
注意: 不同发行版可能使用不同的软件包名称,genisoimagemkisofs 通常是同一个程序

基本语法

# 基本语法
genisoimage [选项] -o 输出文件.iso 源目录

# 完整语法
genisoimage [通用选项] [文件系统选项] [El Torito选项] [Rock Ridge选项] [Joliet选项] -o 输出文件 输入文件/目录

# 使用mkisofs别名(完全相同)
mkisofs [选项] -o 输出文件.iso 源目录
参数说明:
  • 输出文件.iso: 生成的ISO镜像文件路径,通常以.iso为扩展名
  • 源目录: 要包含到ISO中的目录,可以是多个目录
  • 选项: 各种ISO创建选项,控制文件系统、引导、兼容性等
  • 输入文件/目录: 可以指定多个文件或目录,也可以使用-f选项从文件列表读取

常用选项

选项 说明 类别
-o FILE 指定输出ISO文件名(必须) 通用
-J, -joliet 使用Joliet扩展(支持长文件名) Joliet
-R, -rock 使用Rock Ridge扩展(Unix权限) Rock Ridge
-r, -rational-rock 使用Rock Ridge并设置合理权限 Rock Ridge
-V "卷标" 设置卷标(最多32字符) 通用
-b FILE 设置El Torito引导镜像文件 El Torito
-c FILE 设置El Torito引导目录文件 El Torito
-no-emul-boot 非模拟模式引导(现代系统) El Torito
-boot-load-size N 设置引导扇区加载大小 El Torito
-boot-info-table 在引导镜像中插入信息表 El Torito
-A "应用ID" 设置应用ID字符串 通用
-p "准备者" 设置准备者信息 通用
-P "出版者" 设置出版者信息 通用
-graft-points 启用移植点语法重命名文件 文件选择
-m PATTERN 排除匹配模式的文件 文件选择
-exclude FILE 从文件中读取排除列表 文件选择
-f 从标准输入读取文件列表 文件选择
-l, -full-iso9660-filenames 允许完整的ISO 9660文件名 ISO 9660
-d, -omit-period 省略文件名尾部的句点 ISO 9660
-N, -omit-version-number 省略文件版本号 ISO 9660
-allow-lowercase 允许小写文件名 ISO 9660
-allow-multidot 允许多个句点 ISO 9660
-max-iso9660-filenames 允许最多37字符的文件名 ISO 9660
-iso-level LEVEL 设置ISO 9660级别(1-4) ISO 9660
-udf 包含UDF文件系统支持 UDF
-hfs 创建HFS混合光盘 HFS
-apple 创建Apple ISO/HFS混合光盘 Apple
-volset "卷集" 设置卷集名称 通用
-print-size 仅显示预计大小,不创建ISO 调试
-quiet 静默模式,减少输出 输出控制
-v, -verbose 详细输出模式 输出控制
-version 显示版本信息 通用
-help 显示帮助信息 通用

ISO标准扩展对比

标准/扩展 选项 主要特性 兼容性 适用场景
ISO 9660 Level 1 -iso-level 1 8.3文件名,仅大写字母 最高(所有系统) 最大兼容性需求
ISO 9660 Level 2/3 -iso-level 2/3 长文件名,文件大小>2GB 较好(现代系统) 通用场景
Rock Ridge -R-r Unix权限、符号链接、设备文件 Unix/Linux系统 Linux系统光盘
Joliet -J Unicode长文件名(UTF-16) Windows系统 Windows系统光盘
El Torito -b FILE 可启动CD/DVD 支持引导的PC 可启动光盘
UDF -udf 现代文件系统,支持大文件 DVD/蓝光播放器 视频DVD、蓝光
HFS -hfs Apple Hierarchical File System Macintosh系统 macOS光盘
推荐组合: 对于现代光盘制作,通常使用 -R -J -l -allow-multidot -allow-lowercase 组合以获得最佳兼容性

基础使用示例

创建基本ISO镜像
# 基本ISO创建
genisoimage -o output.iso /path/to/source

# 设置卷标
genisoimage -V "MY_DATA" -o data.iso /home/user/documents

# 使用Rock Ridge扩展(保留Unix权限)
genisoimage -R -o unix.iso /etc/

# 使用Joliet扩展(Windows长文件名支持)
genisoimage -J -o windows.iso /path/to/windows_data

# 组合使用(推荐)
genisoimage -R -J -o hybrid.iso /path/to/data

# 设置合理权限(r选项自动设置合理权限)
genisoimage -r -o rational.iso /path/to/source
文件排除和选择
# 排除特定文件类型
genisoimage -o output.iso -m "*.tmp" -m "*.log" /source

# 排除目录
genisoimage -o output.iso -m "node_modules/" -m ".git/" /source

# 从文件读取排除列表
genisoimage -o output.iso -exclude exclude.list /source

# exclude.list内容示例:
# *.tmp
# *.log
# .git/
# node_modules/
# __pycache__/

# 使用移植点语法重命名文件
genisoimage -o output.iso -graft-points \
  /new/path/=old/path/ \
  /new/file.txt=old/file.txt

# 从标准输入读取文件列表
find /source -type f -name "*.txt" | genisoimage -o textfiles.iso -f -
ISO级别和文件名控制
# 设置ISO级别(1-4)
genisoimage -iso-level 1 -o level1.iso /source   # Level 1:8.3文件名
genisoimage -iso-level 2 -o level2.iso /source   # Level 2:长文件名
genisoimage -iso-level 3 -o level3.iso /source   # Level 3:不限制文件位置

# 允许完整文件名
genisoimage -l -o fullname.iso /source

# 省略文件版本号(Windows兼容)
genisoimage -N -o noversion.iso /source

# 允许小写文件名
genisoimage -allow-lowercase -o lowercase.iso /source

# 允许多个句点
genisoimage -allow-multidot -o multidot.iso /source

# 设置最大文件名长度(1-37)
genisoimage -max-iso9660-filenames -o maxlen.iso /source
元数据设置
# 设置应用ID
genisoimage -A "My Application v1.0" -o app.iso /source

# 设置准备者信息
genisoimage -p "John Doe " -o prepared.iso /source

# 设置出版者信息
genisoimage -P "Example Publishing" -o published.iso /source

# 设置卷集名称
genisoimage -volset "MY_DATA_VOLUME_01" -o volset.iso /source

# 完整元数据设置
genisoimage \
  -A "My Distribution 2023" \
  -P "My Company Inc." \
  -p "Build Team " \
  -V "MYDISTRO_2023" \
  -volset "MYDISTRO_SET_01" \
  -o distro.iso \
  /source

创建可启动ISO(El Torito)

基础可启动ISO
# 创建可启动ISO(使用引导镜像文件)
genisoimage -b boot/grub/stage2_eltorito -c boot.catalog -o bootable.iso /source

# 非模拟模式引导(现代系统)
genisoimage -b isolinux/isolinux.bin -c isolinux/boot.cat \
  -no-emul-boot -boot-load-size 4 -boot-info-table \
  -o bootable.iso /source

# 典型Linux发行版引导配置
genisoimage \
  -b isolinux/isolinux.bin \
  -c isolinux/boot.cat \
  -no-emul-boot \
  -boot-load-size 4 \
  -boot-info-table \
  -R -J -l -allow-multidot -allow-lowercase \
  -V "UBUNTU_22_04" \
  -o ubuntu-live.iso \
  /source
多引导ISO(支持BIOS和UEFI)
# 创建同时支持BIOS和UEFI的ISO
genisoimage \
  # BIOS引导
  -b isolinux/isolinux.bin \
  -c isolinux/boot.cat \
  -no-emul-boot \
  -boot-load-size 4 \
  -boot-info-table \
  # UEFI引导
  -eltorito-alt-boot \
  -e efi.img \
  -no-emul-boot \
  # 通用选项
  -R -J -l -allow-multidot -allow-lowercase \
  -V "MULTIBOOT_ISO" \
  -o multiboot.iso \
  /source
注意: -eltorito-alt-boot 添加替代引导项,通常用于UEFI引导
Windows可启动ISO
# Windows安装ISO(需要引导扇区文件)
genisoimage \
  -b boot/etfsboot.com \
  -no-emul-boot \
  -boot-load-size 8 \
  -iso-level 4 \
  -J -l -D -N \
  -relaxed-filenames \
  -allow-leading-dots \
  -V "WINDOWS_10" \
  -o windows10.iso \
  /source

高级特性

创建混合ISO/HFS光盘
# 创建ISO/HFS混合光盘(Mac兼容)
genisoimage \
  -R -J -l -allow-multidot -allow-lowercase \
  -hfs \
  -apple \
  -o hybrid-mac.iso \
  /source

# 包含资源分支(Mac特有)
genisoimage \
  -R -J \
  -hfs \
  -map /path/to/hfs.map \
  -magic /path/to/hfs.magic \
  -o mac.iso \
  /source
创建UDF光盘(DVD/蓝光)
# 创建UDF格式ISO(适合DVD视频)
genisoimage \
  -udf \
  -dvd-video \
  -V "MY_MOVIE" \
  -o dvd-video.iso \
  /source/video_ts/

# 高级UDF选项
genisoimage \
  -udf \
  -uid 0 \
  -gid 0 \
  -mode 0555 \
  -V "DATA_DVD" \
  -o udf-data.iso \
  /source
移植点高级用法
# 复杂的文件重定位
genisoimage -o custom.iso -graft-points \
  /boot/vmlinuz=/mnt/boot/vmlinuz-5.15.0 \
  /boot/initrd.img=/mnt/boot/initrd.img-5.15.0 \
  /documents/=/home/user/docs/ \
  /photos/vacation=/home/user/pics/vacation2023/

# 使用映射文件
genisoimage -o mapped.iso -graft-points -path-list mapfile.txt

# mapfile.txt内容:
# /usr/bin/=/opt/myapp/bin/
# /usr/lib/=/opt/myapp/lib/
# /etc/config=./local.config
# /readme.txt=/home/user/README.md

实际应用场景

制作Linux Live CD
# 典型的Linux Live CD制作
genisoimage \
  -b isolinux/isolinux.bin \
  -c isolinux/boot.cat \
  -no-emul-boot \
  -boot-load-size 4 \
  -boot-info-table \
  -eltorito-alt-boot \
  -e boot/grub/efi.img \
  -no-emul-boot \
  -R -J -l -allow-multidot -allow-lowercase \
  -V "UBUNTU_LIVE" \
  -A "Ubuntu 22.04 LTS" \
  -o ubuntu-22.04-live.iso \
  /mnt/livecd/
创建软件安装光盘
# 软件分发光盘
genisoimage \
  -R -J -l -allow-multidot \
  -V "MYSOFTWARE_V2.0" \
  -A "MySoftware Inc." \
  -P "Customer Support: support@example.com" \
  -p "Packaging Team" \
  -exclude exclude.list \
  -o mysoftware-2.0.iso \
  /build/software/
制作系统备份光盘
# 系统备份ISO
genisoimage \
  -r -J -l \
  -V "SYSTEM_BACKUP_$(date +%Y%m%d)" \
  -A "System Backup Tool" \
  -m "*.tmp" -m "*.log" -m "cache/" \
  -o backup-$(date +%Y%m%d).iso \
  /home/ /etc/ /var/www/
制作多媒体DVD
# DVD视频光盘
genisoimage \
  -udf \
  -dvd-video \
  -V "WEDDING_VIDEO" \
  -A "Family Video Collection" \
  -o wedding-dvd.iso \
  /video/ts/

# 音频CD镜像(需要特殊处理)
genisoimage \
  -V "MY_MUSIC_CD" \
  -A "Personal Music Collection" \
  -input-charset utf-8 \
  -o audio-cd.iso \
  /music/wav_files/

验证和测试ISO

验证ISO文件
# 显示ISO信息
isoinfo -d -i file.iso

# 列出ISO内容
isoinfo -l -i file.iso
isoinfo -f -i file.iso  # 类似find输出

# 提取ISO中的文件
isoinfo -i file.iso -x /FILE > extracted_file

# 检查ISO完整性
checkisomd5 file.iso  # 如果ISO包含MD5校验

# 挂载测试
sudo mount -o loop file.iso /mnt/iso
ls -la /mnt/iso
sudo umount /mnt/iso
预估ISO大小
# 仅显示预估大小,不创建ISO
genisoimage -print-size -R -J /path/to/source

# 计算目录大小(对比)
du -sh /path/to/source

# 创建前检查是否会超过限制
# CD-R: 700MB
# DVD-R: 4.7GB
# DVD-DL: 8.5GB
# BD-R: 25GB

# 预估并检查
size=$(genisoimage -print-size -R -J /source 2>/dev/null | tail -1)
if [ $size -gt 4700000000 ]; then
    echo "警告:ISO将超过DVD单层容量(4.7GB)"
fi
测试可启动ISO
# 使用QEMU测试可启动ISO
qemu-system-x86_64 -cdrom bootable.iso -m 1024

# 使用VirtualBox测试(无GUI)
VBoxManage startvm "TestVM" --type headless

# 检查引导信息
isoinfo -i bootable.iso -d | grep -i boot

# 提取引导镜像查看
dd if=bootable.iso bs=1 skip=32768 count=2048 of=boot.img
file boot.img

故障排除

问题 可能原因 解决方案
"文件名太长"错误 ISO 9660 Level 1限制8.3格式 使用-l-J选项,或缩短文件名
"深度超过8级"错误 目录嵌套太深 重组目录结构,减少嵌套
Windows无法读取长文件名 未启用Joliet扩展 添加-J选项
Linux权限丢失 未使用Rock Ridge扩展 添加-R-r选项
ISO无法引导 1. 引导镜像路径错误
2. 引导参数不正确
1. 检查-b路径
2. 添加-no-emul-boot
创建过程被中断 1. 磁盘空间不足
2. 文件权限问题
1. 检查磁盘空间
2. 使用root权限或检查文件权限
字符集问题 文件名包含特殊字符 使用-input-charset指定编码
大文件问题(>2GB) ISO 9660 Level 1/2限制 使用-iso-level 3-udf
常见错误及解决方法
# 错误:genisoimage: command not found
# 解决:安装genisoimage或mkisofs
sudo apt install genisoimage

# 错误:genisoimage: Missing pathspec.
# 解决:没有指定源目录
genisoimage -o output.iso /source/directory

# 错误:genisoimage: No such file or directory.
# 解决:检查源目录是否存在
ls -ld /source/directory

# 错误:genisoimage: unable to open boot image file
# 解决:检查引导镜像路径是否正确
ls -la /source/isolinux/isolinux.bin

# 错误:File too big for chosen iso9660 level
# 解决:使用更高ISO级别或UDF
genisoimage -iso-level 3 -o output.iso /source
# 或
genisoimage -udf -o output.iso /source

常见问题解答

Q: genisoimage和mkisofs有什么区别?

A: 两者功能几乎完全相同。在历史上,genisoimagecdrkit项目的一部分,而mkisofscdrtools项目的一部分。现在大多数发行版中两者都可用,且通常是同一个二进制文件的不同名称。

Q: 如何选择Rock Ridge (-R) 和 rational-rock (-r) 选项?

A:

  • -R: 保留所有原始Unix权限和所有权
  • -r: 设置"合理"权限(所有人可读,所有者可写),并将所有权设置为root
  • 推荐: 对于软件分发,使用-r;对于系统备份,使用-R
Q: ISO 9660的级别1、2、3、4有什么区别?
  • Level 1: 8.3文件名,仅大写字母,目录深度≤8
  • Level 2: 支持长文件名(≤31字符),文件大小≤2GB
  • Level 3: 支持大文件(>2GB),不限制文件位置
  • Level 4: 与Level 3相同,但使用ISO 9660:1999标准
Q: 如何创建带MD5校验的ISO?
# 创建ISO后添加MD5校验
implantisomd5 file.iso

# 验证带MD5的ISO
checkisomd5 file.iso

# 在创建过程中嵌入MD5(需要相应工具支持)
# 通常的做法是先创建ISO,再添加MD5

相关命令

  • mkisofs - genisoimage的别名,功能相同
  • xorriso - 更现代的ISO创建工具(libburnia项目)
  • isoinfo - 查看和提取ISO文件内容
  • growisofs - 直接刻录到DVD/BD的工具
  • cdrecord - CD/DVD刻录工具
  • wodim - CD/DVD刻录工具(cdrkit版本)
  • dd - 可用于直接写入ISO到设备
  • mount - 挂载ISO文件进行测试
命令总结
  • 基本创建: genisoimage -o 输出.iso 源目录
  • 兼容性扩展: -R(Unix权限)、-J(Windows长文件名)
  • 卷标设置: -V "卷标名称"
  • 可启动ISO: -b 引导文件 -c 目录文件 -no-emul-boot
  • 文件排除: -m "模式"-exclude 文件
  • 文件名控制: -l(长文件名)、-allow-lowercase(小写)
  • ISO级别: -iso-level 1/2/3 控制兼容性级别
  • 元数据: -A(应用ID)、-p(准备者)、-P(出版者)
  • 推荐组合: -R -J -l -allow-multidot -allow-lowercase -V "卷标"