Linux制作img镜像是一项常见操作,广泛应用于系统备份、嵌入式设备开发、虚拟磁盘创建等场景,img镜像本质上是块设备或分位的完整副本,包含分区表、文件系统和数据,可用于恢复系统或部署到其他设备,以下是几种主流的制作方法,涵盖不同需求场景。
使用dd命令制作img镜像
dd命令是Linux内置的强大工具,通过直接读取块设备的原始数据并写入文件,可实现全盘或分区的镜像制作,无需额外安装,适合快速备份和简单镜像创建。
基础操作流程
(1)确认源设备
首先通过lsblk
或fdisk -l
查看目标设备名称(如SD卡、U盘或硬盘),例如/dev/sdb
(注意:不是/dev/sdb1
等分区,除非仅备份分区)。
(2)执行镜像制作
-
全盘镜像:将整个设备(含分区表)制作成img文件
sudo dd if=/dev/sdb of=backup.img bs=4M status=progress
参数说明:
if
:输入文件,即源设备路径;of
:输出文件,即生成的img镜像;bs
:块大小,4MB可提升读写效率;status=progress
:实时显示复制进度。
-
仅备份分区:若仅需某个分区(如
/dev/sdb1
),修改if
为分区路径即可。 -
制作空镜像:若需创建指定大小的空白镜像(如用于虚拟机),可使用
/dev/zero
作为输入源:dd if=/dev/zero of=empty.img bs=1G count=2 # 创建2GB空白镜像
注意事项
- 设备确认:务必确保
if
参数的设备名正确,误操作可能导致数据覆盖; - 权限问题:dd操作需要root权限,普通用户需通过
sudo
执行; - 数据完整性:制作过程中避免中断操作,建议在稳定电源环境下进行;
- 压缩优化:若镜像较大,可通过管道结合gzip压缩:
sudo dd if=/dev/sdb bs=4M status=progress | gzip > backup.img.gz
使用genimage工具制作分区镜像
genimage是专为嵌入式设备设计的镜像制作工具,支持自动处理分区表、文件系统创建和文件填充,适合需要多分区(如boot、root等)的复杂场景,需提前安装。
安装与配置
(1)安装genimage
- Debian/Ubuntu:
sudo apt install genimage
- CentOS/RHEL:
sudo yum install genimage
(需启用EPEL源)
(2)编写配置文件
创建image.cfg
文件,定义镜像名称、分区结构和源文件路径,示例:
image system.img { hdimage { gpt # 使用GPT分区表(默认MBR) } partition boot { partition-type = 0xC # FAT32分区类型 image = "boot.uimg" # 引导分区镜像文件 size = 64M # 分区大小 } partition root { partition-type = 0x83 # Linux ext4分区类型 image = "root.ext4" # 根分区镜像文件 size = 512M # 分区大小 } }
执行镜像制作
(1)准备源文件
将引导文件(如boot.uimg
)和根文件系统(如root.ext4
)放在genimage默认搜索路径(如./output/
)。
(2)生成镜像
genimage -c image.cfg
genimage会根据配置自动创建分区表、格式化分区并填充数据,最终生成system.img
。
优势与适用场景
- 自动化处理:无需手动分区和格式化,简化多分区镜像制作;
- 灵活性:支持自定义分区类型、大小和源文件;
- 嵌入式适配:常用于ARM开发板(如树莓派、香蕉派)的系统镜像制作。
手动创建分区并制作img镜像
若需完全控制分区表类型(如MBR/GPT)或文件系统类型,可通过parted、mkfs等工具手动分区,再结合dd或ddrescue制作镜像。
操作步骤
(1)创建空镜像文件
dd if=/dev/zero of=custom.img bs=1G count=4 # 创建4GB空白镜像
(2)分区并格式化
使用parted创建分区表和分区,再通过mkfs格式化:
sudo parted custom.img mklabel gpt # 创建GPT分区表 sudo parted custom.img mkpart primary fat32 1MiB 100MiB # 创建boot分区 sudo parted custom.img mkpart primary ext4 100MiB 100% # 创建root分区
关联镜像文件到loop设备并格式化:
sudo losetup -fP custom.img # 关联loop设备 sudo mkfs.vfat /dev/loop0p1 # 格式化boot分区为FAT32 sudo mkfs.ext4 /dev/loop0p2 # 格式化root分区为ext4
(3)挂载并写入数据
sudo mkdir /mnt/boot /mnt/root sudo mount /dev/loop0p1 /mnt/boot # 挂载boot分区 sudo mount /dev/loop0p2 /mnt/root # 挂载root分区 # 复制文件到挂载点(如将boot文件夹和rootfs目录复制进去) sudo cp -r boot/* /mnt/boot/ sudo cp -r rootfs/* /mnt/root/ sudo umount /mnt/boot /mnt/root # 卸载分区 sudo losetup -d /dev/loop0 # 解除loop设备关联
适用场景
- 需自定义分区表类型(如旧版MBR或GPT);
- 文件系统类型特殊(如btrfs、xfs等非标准类型);
- 嵌入式设备需手动调整分区布局(如预留空间给特定数据)。
工具对比与选择
以下为三种方法的对比,便于根据需求选择:
方法 | 适用场景 | 优点 | 缺点 | 是否需额外工具 |
---|---|---|---|---|
dd | 简单备份、全盘复制 | 无需安装、操作简单 | 无分区处理能力、易误操作 | 否(Linux内置) |
genimage | 多分区嵌入式系统 | 自动化分区、支持复杂配置 | 需编写配置文件、学习成本 | 是(需安装) |
手动分区 | 自定义分区表/文件系统 | 完全控制分区细节 | 步骤繁琐、易出错 | 是(parted、mkfs等) |
相关问答FAQs
问题1:制作img镜像时如何避免数据丢失?
解答:避免数据丢失需注意三点:① 确认源设备名(通过lsblk
查看,避免误写/dev/sda
为/dev/sdb
);② 备份重要数据,尤其是目标设备原有内容;③ 使用dd时添加count
参数(如count=1024
限制复制块数),避免全盘误写;④ 操作前检查if
(输入)和of
(输出)参数是否正确,建议先用dd if=/dev/zero of=test.img bs=1M count=1
测试命令逻辑。
问题2:如何将img镜像烧录到SD卡?
解答:烧录img到SD卡可通过dd或图形工具实现:
- dd命令:确保SD卡设备名(如
/dev/mmcblk0
),执行:sudo dd if=system.img of=/dev/mmcblk0 bs=4M status=progress
- 图形工具:推荐使用BalenaEtcher(跨平台),自动识别SD卡并校验镜像,避免设备名误写。
注意事项:烧录前需卸载SD卡所有分区,确保无数据写入中断。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/16161.html