dd 克隆到较小的 SD 卡

dd 克隆到较小的 SD 卡

我的 Raspberry Pi 之一使用 4GB SD 卡作为根/启动文件系统。

安装在另一个系统上时可以看到:

Disk /dev/sdc: 3904 MB, 3904897024 bytes
121 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 7502 * 512 = 3841024 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000714e9

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               2          17       57344    c  W95 FAT32 (LBA)
/dev/sdc2              17         800     2938880   83  Linux

这表明我只(并且故意)使用了可用 4GB 中的 3GB,并且使用中的 cyclinder 与开头对齐(如果闪存甚至以这种方式工作)。

过去,我曾使用该cp命令将现有文件系统迁移到较小(已格式化)的目标文件系统,但我更喜欢该dd命令的简单性。

Q1:我可以安全地dd将此磁盘克隆到另一个稍小(准确地说小 44MB)的 4GB SD 卡吗?

如果源磁盘有第二个分区,它填满了整个剩余的磁盘空间,但有一个仅部分使用的文件系统,我非常有信心,随着时间的推移,即使在分区末尾附近,我也可能会得到分散的文件位(可能会覆盖物理目标磁盘的边界)。

Q2a:是否可以运行 move-files-to-beginning-kinda-defrag 命令来确保分区末尾未被使用?

Q2b:如果我知道分区的末尾未被使用,我可以安全地将分区截断到dd较小的目标磁盘,然后用一个简单的方法纠正未对齐的情况fsck吗?

答案1

如果您绝对确定最后一个分区的末尾适合目标驱动器,则可以批量复制该驱动器。不要使用dd,速度较慢(除非与其他选项一起使用,但即使如此也并非总是如此)并且更容易出错;只需使用cat.

cat /dev/sdc >/dev/sdz

替换/dev/sdz为要覆盖的驱动器的正确路径。确保您输入正确,因为单个字母的拼写错误可能会毁掉您的系统!您通常可以通过条目/dev/disk/by-id/或访问磁盘/dev/disk/by-path/,其名称包含磁盘型号以及驱动器连接方式的指示 - 这大大降低了出错的风险。

fdisk在新磁盘上创建分区表(使用您选择的其他工具),确保目标分区的大小与源分区相同(或更大),然后复制每个分区,这样会更不容易出错。,例如(如果保留相同的分区号)

cat /dev/sdc1 >/dev/sdz1
cat /dev/sdc2 >/dev/sdz2

只是因为一个分区(更准确地说,一个文件系统 - 典型的 Linux 系统上存在哪些挂载点?提供了一些背景)不完整并不意味着您可以复制它的开头并省略结尾。您无法预测文件最终会在哪里,并且文件系统包含控制数据;复制截断的文件系统会给你一个损坏的文件系统(并且不要指望fsck修复它 - 它可能会给你一些可用的东西,但它无法恢复内容超出复制部分的文件)。

如果要将分区复制或移动到较小的空间,或者只是缩小分区,请首先缩小其包含的文件系统。例如,对于 ext2/ext3/ext4 文件系统,运行resize2fs以收缩文件系统。缩小文件系统是您想要的“将文件移动到开头的碎片整理”操作。然后您可以使用fdisk缩小分区之类的工具,或将文件系统复制到较小的分区。只需确保分区的大小大于文件系统的大小即可。 GNU Parted 有时可以一次性收缩文件系统和包含的分区(这取决于文件系统和分区类型)。

答案2

您可以用来dd创建分区的副本,而不是所有设备的副本。

dd if=/dev/sad1 of=/tmp/boot.img
dd if=/dev/sad2 of=/tmp/root.img

至于Q2b:

我这样做了好几次,从来没有遇到过问题,但仍然不建议这样做。

相关内容