genisoimage(也称为mkisofs)是一个功能强大的ISO 9660文件系统创建工具,能够从目录树生成符合ISO 9660标准的镜像文件。它广泛用于制作可启动光盘、系统安装盘、软件分发盘等。
genisoimage 和 mkisofs 是同一个程序的不同名称
# 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
genisoimage 和 mkisofs 通常是同一个程序
# 基本语法
genisoimage [选项] -o 输出文件.iso 源目录
# 完整语法
genisoimage [通用选项] [文件系统选项] [El Torito选项] [Rock Ridge选项] [Joliet选项] -o 输出文件 输入文件/目录
# 使用mkisofs别名(完全相同)
mkisofs [选项] -o 输出文件.iso 源目录
| 选项 | 说明 | 类别 |
|---|---|---|
-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 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创建
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级别(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(使用引导镜像文件)
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
# 创建同时支持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(需要引导扇区文件)
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混合光盘(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格式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制作
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视频光盘
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信息
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
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
# 使用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
A: 两者功能几乎完全相同。在历史上,genisoimage是cdrkit项目的一部分,而mkisofs是cdrtools项目的一部分。现在大多数发行版中两者都可用,且通常是同一个二进制文件的不同名称。
A:
-R: 保留所有原始Unix权限和所有权-r: 设置"合理"权限(所有人可读,所有者可写),并将所有权设置为root-r;对于系统备份,使用-R# 创建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 "卷标名称"-b 引导文件 -c 目录文件 -no-emul-boot-m "模式" 或 -exclude 文件-l(长文件名)、-allow-lowercase(小写)-iso-level 1/2/3 控制兼容性级别-A(应用ID)、-p(准备者)、-P(出版者)-R -J -l -allow-multidot -allow-lowercase -V "卷标"