本文分两部分内容:
第一部分的内容是用dd创建一个64M的空镜像emmc.img,并用parted给emmc.img设置分区表并创建两个分区,然后用kpartx挂载分区,将自己需要写入emmc.img的内容拷贝到两个分区里。并给出详细脚本。
第二部分的内容介绍如何从步骤一操作好的emmc.img中读取已写入的内容,给出详细脚本。
第一部分,做img镜像详细步骤
步骤 1: 创建 eMMC 镜像文件
首先,我们需要创建一个空的镜像文件。假设我们要创建一个64M的镜像文件:
dd if=/dev/zero of=/path/to/your/emmc.img bs=1M count=64
步骤 2: 设置分区表
使用 parted 创建分区表和分区。parted 是一个功能强大的分区管理工具,支持非交互式操作,非常适合脚本自动化。这里选择parted而不是fdisk,因为fdisk是交互式的操作,需要手动输入各种指令选择,不适合自动化脚本。可以将以下命令放入一个脚本中执行:
# 创建一个新的 DOS 分区表
sudo parted /path/to/your/emmc.img --script mklabel msdos
# 创建第一个分区(20MB)
sudo parted /path/to/your/emmc.img --script mkpart primary ext4 1MiB 21MiB
# 创建第二个分区(剩余空间)
sudo parted /path/to/your/emmc.img --script mkpart primary ext4 21MiB 100%
步骤3:使用 losetup 将镜像文件绑定到循环设备
# 查找一个未使用的循环设备
sudo losetup -f
# 将镜像文件绑定到循环设备
# 这里的/dev/loop0假设是losetup -f查询到的未使用设备
# 可根据实际查询到的设备修改
sudo losetup /dev/loop0 /path/to/your/emmc.img
步骤 4: 使用 kpartx 挂载分区
使用 kpartx 工具将镜像文件中的分区映射到设备映射器:
# 没有安装kpartx的话先安装一下
sudo apt-get install kpartx
# 这条命令执行完之后会在/dev/maper/下增加两个设备
sudo kpartx -a /path/to/your/emmc.img
# 查看/dev/mapper下面有没有新增的设备
# 例如会有loop0p1和loop0p2,分别对应emmc.img两个分区
ls /dev/mapper/
步骤 5: 格式化分区
格式化第一个和第二个分区为 ext4 文件系统:
#这里的/dev/mapper/loop0p1和/dev/mapper/loop0p2是步骤4中查询到的
sudo mkfs.ext4 /dev/mapper/loop0p1
sudo mkfs.ext4 /dev/mapper/loop0p2
步骤 6: 挂载分区并写入文件
创建临时挂载点并挂载分区:
mkdir -p /mnt/emmc_part1
sudo mount /dev/mapper/loop0p1 /mnt/emmc_part1
mkdir -p /mnt/emmc_part2
sudo mount /dev/mapper/loop0p2 /mnt/emmc_part2
分别拷贝文件到第一个和第二分区:
sudo cp -r /path/to/your/files/* /mnt/emmc_part1/
sudo cp -r /path/to/your/files/* /mnt/emmc_part2/
步骤 7: 卸载分区并清理
sudo umount /mnt/emmc_part1
sudo umount /mnt/emmc_part2
sudo kpartx -d /dev/loop0
sudo losetup -d /dev/loop0
下面是写img镜像的详细脚本:
#!/bin/bash
# 定义变量
IMAGE_FILE="./emmc.img"
IMAGE_SIZE=64 #镜像总大小64M
PARTITION_1_SIZE="20M" #第一分区的大小
FILES_DIR="./cp_to_img/"
# 创建空的镜像文件
echo "Creating empty image file..."
rm $IMAGE_FILE
dd if=/dev/zero of="$IMAGE_FILE" bs=1M count=$IMAGE_SIZE
# 使用 parted 创建分区表和两个分区,第一份分区大小为 PARTITION_1_SIZE,剩下的空间都给第二分区
echo "Creating partition table and partitions with parted..."
sudo parted "$IMAGE_FILE" --script \
mklabel msdos \
mkpart primary ext4 1MiB $PARTITION_1_SIZE \
mkpart primary ext4 $PARTITION_1_SIZE 100%
# 使用 losetup 将镜像文件绑定到循环设备
echo "Binding image file to loop device..."
LOOP_DEVICE=$(sudo losetup -f --show "$IMAGE_FILE")
echo "LOOP_DEVICE:$LOOP_DEVICE"
# 使用 kpartx 挂载分区
echo "Mapping partitions with kpartx..."
sudo kpartx -a $IMAGE_FILE
sleep 2 # 等待系统识别分区
ls /dev/mapper/ # 查看/dev/mapper下面有没有新增的设备
# 获取分区路径
PART1="/dev/mapper/$(basename "$LOOP_DEVICE")p1"
PART2="/dev/mapper/$(basename "$LOOP_DEVICE")p2"
# 格式化分区
echo "Formatting partitions..."
sudo mkfs.ext4 "$PART1"
sudo mkfs.ext4 "$PART2"
# 创建临时挂载点
mkdir -p ./emmc_part1
mkdir -p ./emmc_part2
# 挂载分区
echo "Mounting partitions..."
sudo mount "$PART1" ./emmc_part1
sudo mount "$PART2" ./emmc_part2
# 拷贝文件到分区
echo "Copying files to partitions..."
sudo cp -r "$FILES_DIR"/* ./emmc_part1/
sudo cp -r "$FILES_DIR"/* ./emmc_part2/
# 卸载分区
echo "Unmounting partitions..."
sudo umount ./emmc_part1
sudo umount ./emmc_part2
# 删除临时挂载点
rm -r ./emmc_part1
rm -r ./emmc_part2
# 清理循环设备
echo "Cleaning up loop device..."
sudo kpartx -d "$LOOP_DEVICE"
sudo losetup -d "$LOOP_DEVICE"
echo "Done!"
将以上脚本保存到mk_img.sh中,用 chmod +x ./mk_img.sh 增加执行权限,
需要在当前目录下用mkdir cp_to_img命令创建一个文件,里面放入需要拷贝到两个emmc分区的文件。
用./mk_img.sh命令执行脚本,会在当前目录生成emmc.img文件,用ls -l 可以看到emmc.img文件大小和我们创建的64M相当。
第二部分,读取emmc.img两个分区里的内容
因为读取使用的命令都是第一部分使用过的,主要是使用kpartx和mount挂载emmc.img文件到某个文件夹,所以这里直接给出详细脚本:
#!/bin/bash
# 定义变量
IMAGE_FILE="./emmc.img"
# 使用 losetup 将镜像文件绑定到循环设备
echo "Binding image file to loop device..."
LOOP_DEVICE=$(sudo losetup -f --show "$IMAGE_FILE")
echo "LOOP_DEVICE:$LOOP_DEVICE"
# 使用 kpartx 挂载分区
echo "Mapping partitions with kpartx..."
sudo kpartx -a $IMAGE_FILE
sleep 5 # 等待系统识别分区
ls /dev/mapper/ # 查看/dev/mapper下面有没有新增的设备
# 获取分区路径
PART1="/dev/mapper/$(basename "$LOOP_DEVICE")p1"
PART2="/dev/mapper/$(basename "$LOOP_DEVICE")p2"
# 创建临时挂载点
mkdir -p ./emmc_part1
mkdir -p ./emmc_part2
# 挂载分区
echo "Mounting partitions..."
sudo mount "$PART1" ./emmc_part1
sudo mount "$PART2" ./emmc_part2
sleep 1 # 等待挂载完成
# 查看第一分区文件
echo "ls partitions..."
sudo ls ./emmc_part1/*
# 查看第二分区文件
echo "ls partitions..."
sudo ls ./emmc_part2/*
# 等待用户输入任意字符
echo "You can read $(pwd)/emmc_part1 and $(pwd)/emmc_part1 >>>>>>>>>>>>>>>>"
echo "Enter any character to end >>>>>>>>>>>>>>>>"
read -r
# 卸载分区
echo "Unmounting partitions..."
sudo umount ./emmc_part1
sudo umount ./emmc_part2
# 删除临时挂载点
rm -r ./emmc_part1
rm -r ./emmc_part2
# 清理循环设备
echo "Cleaning up loop device..."
sudo kpartx -d "$LOOP_DEVICE"
sudo losetup -d "$LOOP_DEVICE"
echo "Done!"
将以上脚本保存到read_img.sh中,用 chmod +x ./read_img.sh 增加执行权限,
用./read_img.sh执行脚本,脚本执行到把emmc.img挂载完后会暂停等待用户输入任意字符,这时可以查看./emmc_part1和./emmc_part2两个文件夹里的内容,查看完了之后让脚本继续完成清理步骤。