做一个img镜像,先把这个镜像设置分区表,然后把这个镜像挂载之后写入自己的文件,再读取img镜像中的文件

本文分两部分内容:

第一部分的内容是用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两个文件夹里的内容,查看完了之后让脚本继续完成清理步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值