如何从一个相同的磁盘复制和写入分区表到另一个磁盘?


3

我有几十个Raspberry Pis作为家庭实验室实验的一部分。我在一个Pi上创建了Rasbian(Pi特定版本的Debian)的安装,我想将它传播到Pis的其余部分。

Pis使用MicroSD卡(我购买的所有卡都是相同的8GB容量和相同的型号)。以前,我使用dd来创建“黄金大师”MicroSD卡的图像,但这需要很长很长时间,因为它会生成8GB SD卡的逐字节图像并且必须全部写入(即使卡上的总使用空间可能是300兆或更少)。

有3个分区; 启动分区(带内核),根文件系统分区(带有大量操作系统)和第三个特殊分区。

我想知道是否有一种方法可以将分区表复制到文件,将分区表写回新的SD卡,然后使用我可信赖的rsync命令将数据本身复制回每个文件,而不是使用dd。划分。

这可能吗?或者我最好只使用parted和try和脚本来复制分区表?

谢谢!

Answers:


5

甚至很难你明确地问过“ ......复制并写一个分区表...... ”我想你真的想要:

  • 将您的金主图像克隆到其他全新的,相同的SD卡:
  • 避免“dd-ing”整个8GB源SD卡,因为它只包含300 MB的数据。

在这种情况下,有“dd”的替代品,可以完全满足您的需求:磁盘克隆,但考虑文件系统属性/结构/边界。

其中一个替代方案是partimage [1]:“ ...它将以扇区为基础的支持文件系统的分区保存到图像文件中[...] Partimage将只复制分区的已使用部分的数据 ...

请注意,partimage也可用于客户端 - 服务器网络环境,并且它包含在几个live-linux-CD中,如SystemRescueCD [2](这样可以更轻松地克隆系统磁盘)。

您可能想要检查的另一个工具是FSArchiver


[1] http://www.partimage.org/Main_Page

[2] http://www.sysresccd.org/SystemRescueCd_Homepage


PS:很抱歉没有发布其他相关网址但是......这是我的第一个答案,我不能包含2个以上的网址


3

当然 - 你可以使用dd。MSDOS aka MBR分区表位于前512个字节中:

head -c 512 /dev/sdb > mbr.bin
cp mbr.bin /dev/sdc
partprobe

dd if=/dev/sde bs=512 count=1 of=mbr.bin
dd if=mbr.bin of=/dev/sdf
partprobe

但是,这不会复制实际的文件系统结构; mkfs无论如何你必须在空白分区上运行。

您可能更喜欢使用脚本sfdiskparted工具来创建特定大小的分区。


3

您可以dd通过使用bs标志增加块大小来加速。我通常使用以下内容:dd if=/dev/source of=/dev/destination bs=8M。老实说,dd或者parted是你最好的选择,dd是质量的最佳选择(在我看来)。 


不是问题的答案,但它应该解决问题
user60561 2014年

请注意,对于某些分区表类型,最终可能会有两个具有相同UUID的设备,这不是灾难,但也不理想。我总是手工复制它。
2014年

正确@rrauenza,但是改变UUID通常是简单的使用blkiduuidgentune2fs这里的例子。我确信有些情况不会起作用,但我还没有遇到过。

1

https://unix.stackexchange.com/questions/12986/how-to-copy-the-partition-layout-of-a-whole-disk-using-standard-tools的副本)

我个人不想使用dd来避免重复UUID。

使用sfdisk:

   -d, --dump
          Dump the partitions of a device in a format that is usable as input to sfdisk.  For example,
              % sfdisk -d /dev/hda > hda.out
              % sfdisk /dev/hda < hda.out
          will correct the bad last extended partition that the OS/2 fdisk creates.

请注意,这不适用于GPT - 但是......您可以使用sgdisk代替:

sgdisk -R=/dev/sdb /dev/sda  # copy the table
sgdisk -G /dev/sdb           # randomize the GUIDs

0

(如果我有足够的代表,我会评论@ ray的答案)

如果您对数据位于SD卡的开头感到高兴,那么只需使用count选项dd

要添加到@ ray的示例:

dd if=/dev/source of=/dev/destination bs=8M count=38

38个8MB的块每个是304MB。如果您使用的是中间文件,则其大小为304MB,写回时您可以省略该count选项。

dd if=/dev/source of=~/intermediate_file bs=8M count=38
dd if=~/intermediate_file of=/dev/destination bs=8M

中间文件将具有更快的优势(假设您将中间文件保存在HDD或SSD上),因为每次克隆时SD卡都不会慢速读取。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.