我正在测试一个用于 Raspberry Pi 系统的 Python 脚本,用于重新格式化和复制分区信息和分区数据。为了从第一个设备(通常是 USB 记忆棒)获取信息,我使用:
sfdisk -d /dev/sda >sda_data.txt
然后,要将同一个表复制到目标驱动器,我使用:
sfdisk /dev/sdb <sda_data.txt
总体而言,它按预期工作,但是如果我在较小的磁盘上使用它怎么办?例如,假设 sda1 是 msdos 格式的引导分区,而 sda2 是填充驱动器其余部分的 extfs 分区。假设 /dev/sda2 上的总数据(启动命令和数据除外)约为 10GB,而 /dev/sda 为 64GB。
我的数据足够小,当我将文件从 64GB 设备复制到较小的 32GB 设备时,较小的设备上的 /dev/sdb 将有足够的空间来将所有数据存储在较小的设备上。因此,如果 sda 是 64GB,sdb 是 32GB,我仍然可以将 sda 上的所有数据复制到 sdb。
问题或问题出在较小的sdb的分区上。
当我从 sda 读取分区信息时,它包括分区大小,并且第二个分区 sda2 将比新分区 sdb2 大很多。当我在 sdb 上使用 sda_data.txt 中的信息转储时,我的经验是 sfdisk 允许 sdb 上较小的设备大小,并且不会尝试创建太大的分区 - 它会在 sdb2 上创建一个自动转到末尾的分区较小的设备。
这是我的经验。这是标准行为吗?sfdisk 是否总是将最后一个分区的大小调整为较小的设备?换句话说,我可以依靠 sfdisk 在较小的设备上创建较小的分区吗?(这是假设在 sdb 结束后没有分区启动,并且完全超出该设备上的空间。出于本次讨论的目的,我们可以假设最后一个分区可能需要减少,但它仍然会能够适合 sdb - 它只是不是全尺寸的。)
dump 选项更适合精确复制给定的分区。
我无法告诉您在分区与设备大小不匹配的情况下使用 sfdisk 的可靠性如何。
但是您可以轻松地从头开始或基于转储创建更宽松的 sfdisk 脚本。
例如,如果我从 sfdisk 获得以下转储
您可以通过删除设备路径、起始扇区和大小参数之一来创建更灵活的分区。
这将创建四个分区,其中 sfdisk 将自动计算首选起始位置,扩展最后一个分区以填充剩余空间(因为它没有所需的大小)并为分区创建新的 UUID。如果您希望分区具有与以前相同的 UUID,只需保留
uuid
转储中的参数即可。手册页中的相关部分:
一般来说,手工编写 sfdisk 脚本是可行的。对于您的 boot + root 设置(注意:分区将获得什么文件系统对于 sfdisk 来说并不重要),您应该使用简单的东西,例如: