Linux mkisofs 命令

注意:mkisofs(make ISO file system)是创建ISO9660光盘映像文件的工具。在许多现代Linux发行版中,mkisofsgenisoimage的符号链接,而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(增量写入)