Linux mkisofs 命令
注意:mkisofs(make ISO file system)是创建ISO9660光盘映像文件的工具。在许多现代Linux发行版中,mkisofs是genisoimage的符号链接,而xorrisofs是功能更强大的替代品。
命令简介
mkisofs用于创建ISO9660文件系统的映像文件,可以将目录内容打包成ISO格式的光盘映像。它支持多种扩展规范,包括Rock Ridge(Unix文件属性)、Joliet(Windows长文件名)和UDF(通用磁盘格式)。
命令语法
mkisofs [选项] -o 输出文件 源目录
常用选项
| 选项 |
说明 |
-o 文件 |
指定输出ISO文件路径 |
-J |
生成Joliet目录记录(Windows长文件名) |
-R |
生成Rock Ridge目录记录(Unix文件属性) |
-r |
与-R类似,但设置所有文件为公开读取 |
-V 卷标 |
设置光盘卷标 |
-v |
详细模式,显示处理过程 |
-graft-points |
允许重映射文件名和目录结构 |
-b 引导映像 |
指定可引导光盘的引导映像 |
-c 引导目录 |
指定引导目录 |
-no-emul-boot |
非模拟模式引导 |
-boot-load-size 大小 |
设置引导加载大小 |
-boot-info-table |
在引导映像中嵌入引导信息表 |
-A 应用程序ID |
设置应用程序ID |
-p 准备者 |
设置准备者信息 |
-publisher 发布者 |
设置发布者信息 |
-sysid 系统ID |
设置系统ID |
-volset 卷集 |
设置卷集名称 |
-max-iso9660-filenames |
允许ISO9660标准的长文件名 |
-iso-level 级别 |
设置ISO9660兼容级别(1-4) |
-udf |
包含UDF文件系统支持 |
ISO文件系统标准
| 标准 |
说明 |
mkisofs选项 |
主要用途 |
| ISO9660 Level 1 |
基本标准:8.3文件名,目录深度8级 |
默认 |
最大兼容性 |
| ISO9660 Level 2/3 |
支持长文件名,更大文件 |
-iso-level 2/3 |
现代系统 |
| Rock Ridge |
Unix文件属性(权限、所有者等) |
-R或-r |
Linux/Unix系统 |
| Joliet |
Windows长文件名(Unicode) |
-J |
Windows系统 |
| UDF |
通用磁盘格式,支持更大文件 |
-udf |
DVD和大容量存储 |
使用示例
1. 创建基本ISO映像
# 将目录内容创建为ISO映像
mkisofs -o output.iso /path/to/source_directory
# 添加卷标
mkisofs -V "MY_DISK" -o output.iso /path/to/source
2. 创建跨平台兼容的ISO
# 同时支持Rock Ridge和Joliet
mkisofs -R -J -V "CROSS_PLATFORM" -o output.iso /path/to/source
# 或使用-r(自动设置权限为公开读取)
mkisofs -r -J -V "SHARED_DISK" -o output.iso /path/to/source
3. 创建可引导光盘映像
# 创建可引导ISO(需要引导映像文件)
mkisofs -b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-V "BOOTABLE_CD" \
-o bootable.iso /path/to/source
4. 高级文件名处理
# 使用graft-points重映射文件路径
mkisofs -graft-points \
-V "CUSTOM_PATHS" \
-o custom.iso \
/custom/path=/original/path/file.txt \
/another/path=/other/source/
# 实际示例:将不同目录的文件放入ISO的特定位置
mkisofs -graft-points \
-o combined.iso \
/documents=/home/user/docs/ \
/photos=/var/www/images/ \
/readme.txt=/tmp/notice.txt
5. 设置元数据信息
# 设置完整的ISO元数据
mkisofs -A "My Application" \
-publisher "My Company" \
-p "Preparer Name" \
-sysid "LINUX" \
-volset "VOLUME_SET_1" \
-V "DATA_DISK_1" \
-o metadata.iso /path/to/source
6. 创建带UDF支持的ISO
# 创建支持UDF的ISO(适合DVD和大文件)
mkisofs -udf -V "UDF_DISK" -o udf_disk.iso /path/to/source
# 同时支持多种标准
mkisofs -R -J -udf -V "HYBRID_DISK" -o hybrid.iso /path/to/source
7. 从文件列表创建ISO
# 创建文件列表
find /path/to/source -type f > filelist.txt
# 使用文件列表创建ISO(排除某些文件)
mkisofs -V "FROM_LIST" \
-o from_list.iso \
-graft-points \
-path-list filelist.txt \
-exclude "*.tmp" \
-exclude "*.bak"
8. 完整ISO创建脚本
#!/bin/bash
# 完整的ISO创建脚本
SOURCE_DIR="/data/files"
OUTPUT_FILE="/data/backup_$(date +%Y%m%d).iso"
VOLUME_LABEL="BACKUP_$(date +%Y%m%d)"
LOG_FILE="/var/log/iso_creation.log"
echo "=== ISO创建脚本 ==="
echo "源目录: $SOURCE_DIR"
echo "输出文件: $OUTPUT_FILE"
echo "卷标: $VOLUME_LABEL"
echo "开始时间: $(date)"
# 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
echo "错误: 源目录不存在!"
exit 1
fi
# 计算源目录大小
SOURCE_SIZE=$(du -sh "$SOURCE_DIR" | cut -f1)
echo "源目录大小: $SOURCE_SIZE"
# 创建ISO映像
mkisofs -R -J \
-V "$VOLUME_LABEL" \
-A "System Backup" \
-publisher "$(hostname)" \
-sysid "LINUX" \
-volset "BACKUP_SET" \
-v \
-o "$OUTPUT_FILE" \
"$SOURCE_DIR" 2>&1 | tee "$LOG_FILE"
# 检查创建结果
if [ $? -eq 0 ]; then
ISO_SIZE=$(du -h "$OUTPUT_FILE" | cut -f1)
echo "=== 创建成功 ==="
echo "ISO文件: $OUTPUT_FILE"
echo "ISO大小: $ISO_SIZE"
echo "完成时间: $(date)"
# 验证ISO文件
echo "验证ISO文件..."
file "$OUTPUT_FILE"
isoinfo -d -i "$OUTPUT_FILE"
else
echo "=== 创建失败 ==="
echo "请查看日志文件: $LOG_FILE"
exit 1
fi
创建可引导ISO
典型可引导ISO目录结构:
source_directory/
├── isolinux/
│ ├── isolinux.bin # 引导加载程序
│ ├── boot.cat # 引导目录文件
│ ├── isolinux.cfg # 引导配置文件
│ └── splash.png # 引导画面
├── kernel/ # Linux内核
├── initrd.img # 初始内存磁盘
└── ...其他文件
创建可引导Linux安装盘:
# 准备引导文件(假设已存在)
# isolinux/isolinux.bin - SYSLINUX引导加载程序
# isolinux/isolinux.cfg - 引导配置
mkisofs -b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-R -J \
-V "LINUX_INSTALL" \
-o linux_install.iso \
/path/to/install_source
ISO级别说明
| ISO级别 |
文件名限制 |
目录深度 |
文件大小 |
建议用途 |
| Level 1 |
8.3格式,仅大写A-Z、0-9、_ |
8级 |
2GB |
最大兼容性,旧系统 |
| Level 2 |
最多31字符,同上限制 |
8级 |
2GB |
基本长文件名支持 |
| Level 3 |
同Level 2 |
8级 |
4GB+ |
大文件支持 |
| Level 4 |
放宽限制 |
更深 |
更大 |
现代系统,非标准 |
高级技巧
1. 创建混合ISO(ISO+硬盘映像)
# 使用isohybrid工具创建可从CD/USB引导的ISO
# 首先创建普通ISO
mkisofs -R -J -o output.iso /path/to/source
# 使用isohybrid处理(需要syslinux包)
isohybrid output.iso
# 现在可以将ISO直接写入USB设备
dd if=output.iso of=/dev/sdb bs=4M
2. 优化ISO文件大小
# 使用文件排序优化,减少光盘寻道时间
mkisofs -sort sort_file.txt -o optimized.iso /path/to/source
# 创建sort_file.txt包含文件访问频率信息
# 格式:权重 文件名
# 权重高的文件放在光盘开始位置
3. 创建多卷光盘集
# 创建分卷ISO(当内容超过单张光盘容量时)
# 使用-split-output选项(某些版本支持)
# 或使用管道和split命令
mkisofs -R -J -V "VOLUME1" /path/to/source | \
split -b 650m - volume1.iso.
# 会生成volume1.iso.aa, volume1.iso.ab等文件
常见问题解决
1. "文件名太长"错误
# 错误:File name too long for ISO9660 level 1
# 解决方案:使用更高级别或Rock Ridge/Joliet
mkisofs -iso-level 3 -R -J -o output.iso /path/to/source
# 或使用允许长文件名的选项
mkisofs -max-iso9660-filenames -o output.iso /path/to/source
2. "权限被拒绝"错误
# 错误:Permission denied when reading files
# 解决方案:以root运行或使用-r选项
sudo mkisofs -o output.iso /path/to/source
# 或使用-r(自动设置可读权限)
mkisofs -r -o output.iso /path/to/source
3. ISO文件过大
# ISO9660 Level 1限制单个文件最大2GB
# 解决方案:使用更高级别或UDF
mkisofs -iso-level 3 -o output.iso /path/to/source
# 或使用UDF支持大文件
mkisofs -udf -o output.iso /path/to/source
4. Windows不识别ISO中的长文件名
# 确保包含Joliet扩展
mkisofs -J -o output.iso /path/to/source
# 同时使用Rock Ridge和Joliet
mkisofs -R -J -o output.iso /path/to/source
重要注意事项
- 文件权限:确保对源文件有读取权限
- 文件名限制:ISO9660 Level 1有严格的8.3文件名限制
- 文件大小:ISO9660 Level 1/2限制单个文件最大2GB
- 跨平台:使用
-R(Unix)和-J(Windows)确保最佳兼容性
- 可引导ISO:需要正确的引导文件和选项
- 现代替代:考虑使用
xorrisofs(cdrtools的一部分)获得更好功能
- 测试:创建ISO后应在虚拟机或实际设备上测试
安装mkisofs
# Debian/Ubuntu系统(通常安装genisoimage)
sudo apt-get install genisoimage
# CentOS/RHEL系统
sudo yum install genisoimage
# Fedora
sudo dnf install genisoimage
# Arch Linux
sudo pacman -S cdrkit # 包含genisoimage
# 安装完整的cdrtools(包含mkisofs)
wget https://sourceforge.net/projects/cdrtools/files/cdrtools-3.02a07.tar.gz
tar -xzf cdrtools-3.02a07.tar.gz
cd cdrtools-3.02a07
make
sudo make install
# 检查安装
which mkisofs
mkisofs --version
相关命令
genisoimage - mkisofs的GPL替代品
xorrisofs - 来自libburnia的更强大的ISO创建工具
isoinfo - 查看ISO文件信息
mount -o loop - 挂载ISO文件
dd - 将ISO写入物理介质
wodim/cdrecord - 刻录ISO到光盘
isohybrid - 创建可从USB引导的混合ISO
growisofs - 直接刻录到DVD(增量写入)