我有 2 个 .img 文件(嵌入式 Linux 映像,每个都有 2 个分区 - 一个启动分区和一个 rootfs)。我需要将其中一个分区的 rootfs 分区替换为另一个分区。
我怎样才能做到这一点
- 直接在.imgs中
- 将 .imgs 写入 SD 卡。
如果答案包含命令,我将不胜感激。
答案1
首先确保您需要替换的分区至少与您要复制的分区大小相同。如果您的图像文件是不是压缩后,它们可以使用kpartx
.
跨磁盘映像复制文件系统
您需要 LVM2 才能正常工作。让disk1.img
和disk2.img
,假设在以下示例中两个图像的大小完全相同:
# Let device mapper detect partitions on disk images
kpartx -a disk1.img
kpartx -a disk2.img
# Unmount source and destination file systems
umount /dev/mapper/loop?p?
# Copy source file system to destination
dd if=/dev/loop1p2 of=/dev/loop0p2 bs=512
# or:
# cat dev/loop1p2 > /dev/loop0p2
# Remove device nodes
kpartx -d disk1.img
kpartx -d disk2.img
如果源文件系统较小,则必须/dev/mapper/loop0p2
使用resize2fs
.如果目的地文件系统较小,那么您必须将源文件系统缩小到尺寸完全相同因为目标正在使用您选择的分区工具。我会推荐fdisk
。
编辑:当 SD 卡检测为/dev/mmcblk0
(例如,假设目标是 SD 卡的第二个分区)时,您所需要做的就是将文件系统从 复制/dev/mapper/loop0p2
到 SD 卡的第二个分区(例如)/dev/mmcblk0p2
。
编辑:如果目标文件系统较小,则应缩小源文件系统以适合目标分区。
缩小源文件系统
假设循环设备已添加kpartx -a
和没有安装:
# Check file systems block count and size
tune2fs -l /dev/mapper/loop0p2 | grep -E 'Block (count|size)'
tune2fs -l /dev/mapper/loop1p2 | grep -E 'Block (count|size)'
# Shrink source file system to fit the destination
# (FS check is mandatory before shrinking)
fsck -f /dev/mapper/loop1p2
resize2fs /dev/mapper/loop1p2 <loop0p2 block count>
# Proceed with file system copy...
resize2fs
如果没有足够的块来满足请求的大小,则会失败(尽管我从未遇到过这种情况)。如果块大小不同,您可以在传递新文件系统大小时乘以并附<block count>
加到<block size>
结果B
:
# Example: 123456 blocks, 4096 bytes per block
resize2fs /dev/mapper/loop1p2 $((123456*4096))B
您可以选择将源文件系统缩小到最小大小,然后扩展目标文件系统以适合其分区,无需进行任何计算:
resize2fs -M /dev/mapper/loop1p2
# Do the copy ...
resize2fs /dev/mapper/loop0p2
仅当操作不可能时才会失败。
您很可能会在复制操作结束时收到错误,因为源分区的大小尚未调整。它通常不会造成任何损害,因为内核不允许写入超过分配的目标分区的末尾。
您可能需要非常小心,并使用dd
限制复制到目标分区大小的数据量(注意块大小bs
和“计数”)。我将把命令和参数留给你,因为你已经拥有了进行有根据的猜测所需的一切;-)。