我试过了:

sudo dd bs=4k if=/dev/mmcblk0 of=/media/1BAB47551C66A42B/raspbian_migs2.gz


它创建了一个7.6 GB(卡大小,但卡上的容量为700 MB)的.img文件。

并且:

sudo dd bs=4k if=/dev/mmcblk0 | gzip > /media/1BAB47551C66A42B/raspbian_migs2.gz


用2.7 GB创建一个.gz文件。

来自http的原始Raspbian(Debian 7(Wheezy)): //www.raspberrypi.org/downloads具有494.44 MiB。

如何从SD卡上的图像中复制大小相似的图像?

(我是在Ubuntu上。)

评论

raspberrypi.stackexchange.com/questions/311/…这没有帮助

#1 楼

您在对RooTer的评论中提到A)您已经使用gparted减小了初始分区大小,但是dd仍然复制了整个卡,并且B)您想在图像中包括两个分区。

问题“ A”很容易解释:由于/dev/mmcblk0所指的是,您仍在复制整个卡。各个分区当然是/dev/mmcblk0p1/dev/mmcblk0p2。这是问题“ B”中的复杂问题,但是由于dd开头的分区表索引了每个分区的开始和长度,因此不能简单地对每个分区进行/dev/mmcblk0并将两个文件连接在一起。否则,该映像将无法使用。

但是,您可以从fdisk -l获取每个分区的长度,并使用它来确定dd的某些参数。例如:

> fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 16.1 GB, 16138633216 bytes
4 heads, 16 sectors/track, 492512 cylinders, total 31520768 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1    8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2  122880    26746879    13312000   83  Linux


“开始”和“结束”单位是扇区,请注意已给出了512字节的扇区大小。对于/dev/mmcblk0p2,26746879(最后一个扇区)-122880(第一个扇区)= 26623999/2(每kB 2个扇区)/ 1024(kB每MB)/ 1024(MB每GB)= 12.69,我使用gparted为12 GB,所以这看起来是正确的(确实,我应该使用1000而不是1024作为除数的除数,这可以达到13.31 GB,但是我怀疑gparted和其他一些工具也使用1024)。

因此,您要检查的第一件事是第二个分区实际上是您将其设置为较小的大小。接下来,只需将这些数字与dd一起使用;对我来说应该是:

dd if=/dev/mmcblk0 of=rpi.img bs=512 count=26746880


我在那里有一个额外的扇区,以免因对dd的工作原理的误解而引起任何错位。有一种简单的方法可以检查此方法是否有效:

> fdisk -l rpi.img

Disk rpi.img: 102 MB, 102400000 bytes
255 heads, 63 sectors/track, 12 cylinders, total 200000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00017b69

Device Boot      Start         End      Blocks   Id  System
rpi.img1          8192      122879       57344    c  W95 FAT32 (LBA)
rpi.img2        122880    26746879    13312000   83  Linux


请注意,此处存在一些差异:“开始”和“结束”扇区与原始分区表匹配,但是顶部统计信息的总大小仅为102 MB!这是因为我实际上使用count=200000作为dd的参数,因为我真的不想打扰12 GB的副本(注意“总计200000个扇区”)。底部表格没有反映出这一点的原因是因为fdisk从SD卡开头的映像开头逐字复制的分区数据中获取其信息,正如我在第二段中提到的,至关重要保持。如果我(正确地)复制了其余的内容,那么这些数字将是正确的,并且图像将是可行的。

尝试一下。 :)

评论


在OSX上,fdisk不能清楚地以字节为单位打印出扇区大小。而是提供“几何:966/255/63 [15523840个扇区]”,代表圆柱体/磁头/扇区。在这种情况下应使用bs和count的什么值?

– Arthur Hebert
2015年1月21日在5:06



@ArthurHebert:总字节数/总扇区数。例如。在上面的第一种情况下为16138633216/31520768 = 512,在第二种情况下为102400000/200000 = 512。

–金锁♦
2015年1月21日,14:22



您可以使用fdisk -l <​​device>,它应该在不进入交互模式的情况下打印表。

– Berto
2015年10月31日,下午2:06

#2 楼

我猜问题在于曾经使用过的扇区中仍然有灰尘。删除文件后,只会从文件系统中删除元数据,而不会删除数据本身,因此会留下一些随机的零,而不是易于压缩仅零的块。

简单的解决方案,但需要重写所有可用空间卡上的空间。请记住,SD卡的生命周期受到重写次数的限制,因此这不是首选方法。

dd bs=4M if=/dev/zero of=/root/junk
sync
rm junk


更多涉及的解决方案,因为您需要在另一台计算机上安装zerofree

zerofree /dev/mmcblk0p2


有关更多信息,请访问http://intgat.tigress.co.uk/rmy/uml/ index.html

您要记住的是/ dd / mmcblk0的dd操作会复制整个设备,即使分区较小。如果您在执行上述方法之一之前使用raspi-config扩展主分区,就可以了。

PS。如果您不介意更改格式的图像文件,则可以使用partimage,对于已知的文件系统,partimage会忽略已释放的块,即使它们中仍有一些污垢。同样,未挂载文件系统时最好使用partimage以避免备份损坏。您可能可以以只读方式重新安装它,但我将由您自行决定。

评论


作为我尝试完成此任务的一部分,我使用gparted减少了sdcard分区,以仅容纳我拥有的数据,然后尝试进行填充,结果是相同的7.6GB文件,partimage无法保存2个分区(/ boot + /)成1张图片

–mf_
13年7月6日在21:56

也许我做得不够清楚-压缩它时应该有所作为,就像您之前使用gzip尝试过的那样。

–RooTer
13年7月7日在21:10

以这种方式填充卡会导致整个写入周期,并会缩短卡的使用寿命。尝试dd bs = 4M if = / dev / zero of = / root / junk

–nc4pk
13年7月8日在2:35

@轻拍thx,编辑;)

–RooTer
13年7月11日在16:41



#3 楼

简短的答案-使用2GB SD卡。

较长的答案,dd不知道“好”数据的结尾,您必须以某种方式告诉它。

有两个最简单的方法是使用2GB SD卡,它会自动停止复制超过2GB的数据,并会按您的意愿生成500MB的压缩文件。

另一种方法(涉及的方法更复杂)是计算请从分区表中更正数据大小,然后将此正确大小指定为dd命令的参数。为此,您可以使用bs=XXX(块大小)和count=XXX(块计数)参数。例如,您可以将bs=10M指定为10MB块大小(与您在命令中使用的4k块大小相比,这无疑会使复制更快),并为count=200指定10MB * 200 = 2000MB(2GB)。您可能需要根据SD卡分区方案调整块大小和块数。

评论


给dd一个特定的大小永远都行不通。假定文件系统中的所有实际数据都整齐地排列在设备的开头,因此,如果在8 GB分区上有2GB,则只需复制前2GB。这是假的。那2 GB的数据将散布在整个空间上,特别是在现代SD卡上,直到所有可用块都至少使用了一次,才重新使用块两次(这称为损耗平衡​​,这会延长卡的寿命)。

–金锁♦
13年7月7日在12:14

@goldilocks如果我要调整sdcard的大小以将所有分区缩小到最大可能的大小(仅数据),该怎么办?

–mf_
13年7月7日在21:07

@goldilocks,请更仔细地阅读问题和答案,我在说的是8GB SD卡上的2GB分区,而不是8GB分区上的2GB数据,这是您凭空想象得出的。

– lenik
13年7月7日在23:50



lenik:是的,我有点惊讶,我以这种方式向您解释,所有的道歉-除非您编辑该帖子,否则我不能撤消我的反对票:/尽管我仍然不认为这个答案特别有用(没有冒犯- -因为这不是简单地添加分区,有关如何执行此操作的说明同样没有用),但是我会这样做。 @mf_是的,这是可行的(您读了我的答案吗?它将起作用...)

–金锁♦
2013年7月9日15:49



@goldilocks我已经编辑了答案。不知道为什么它没有用,特别是当您给出完全相同的答案时,只是带有更多详细信息。

– lenik
13年7月10日在1:14

#4 楼

dd - copy and convert不是执行所需工作的正确工具。这是一个低级别的逐扇区复制(和转换)工具,非常适合复制引导扇区,格式化设备以及各种低级任务。当您使用dd时,即使是文件系统结构中未包含的图像,也要逐个扇区地复制到图像。

Raspberry Pi基金会提供的图像是经过特殊编译的图像,具有安装脚本,解压缩二进制文件和进行初始设置,然后无论如何都必须从Internet获得更新-这都是故意的,但要使它像这样工作是一项艰巨的任务。

一种流行的解决方案,避免复制空扇区将使用文件级复制系统-CloneZilla是独立的,可从CD启动,类似于ye olde Norton Ghost,但clonezilla支持Linux(及更多)文件系统。因此,它将仅复制正在使用的文件,并仅从这些文件创建容器。大大减小尺寸!


这里的指南演示了如何从可启动CD上从SD备份Pi


#5 楼

我也有同样的问题,并且想要一个易于使用的工具。搜索并找不到后,我写了mkimg.sh。我在以下网址概述了我使用的过程:https://raspberrypi.stackexchange.com/a/37899/32585