如何备份Raspberry Pi?


297

我已经为Raspberry Pi(运行Raspbian)编写程序了几个星期,并希望确保我保护已完成的工作。

如何备份已创建的文件?

我可以简单地将SD卡插入Windows(XP或7)PC并将其复制到硬盘驱动器或另一个SD卡吗?


6
我的PC同时运行Ubuntu和Windows(XP和7),但我希望大多数人对Windows答案感兴趣。我将编辑问题以使其清楚。
史蒂夫·罗比拉德

7
从Raspi rsync到您的PC?
亚历克斯L

41
对于代码,您可能还需要考虑使用像或那样的分布式版本控制软件,这样,您不仅可以在多个位置拥有代码副本,而且还具有有关代码更改方式的完整历史记录。githg
Mark Booth 2012年

4
@MarkBooth我不明白为什么如果我们只是考虑以后可以检索代码,为什么在VCS上需要DVCS。哎呀,因为您使用修订号而不提交哈希来标识特定状态,所以这甚至更加容易。学习像Subversion这样的CVCS并不是很多时间上的投资(我记得……虽然很久很久以前)。是的,当时切换到Git有点令人不安,但我从未回过头。
史蒂文·卢

1
对于@StevenLu这类讨论,评论不是一个好地方,我们应该将其带到Raspberry Pi Chat中
Mark Booth 2014年

Answers:


294

如果要保留所有数据,则可能必须创建一个磁盘映像。此外,Windows无法识别典型的Linux文件系统,因此,当您插入SD卡时,您甚至可能看不到您的文件。

创建磁盘映像不仅可以保留文件,还可以保留文件系统结构,并且当您决定刷新新的SD卡时,只需将其插入即可使用。

的Linux

在Linux上,您可以使用标准dd工具:

dd if=/dev/sdx of=/path/to/image bs=1M

/dev/sdx您的SD卡在哪里。

苹果电脑

在Mac上,您也可以使用标准dd工具,语法略有不同:

dd if=/dev/rdiskx of=/path/to/image bs=1m

/dev/rdiskx您的SD卡在哪里。

(最好使用rdisk作为其原始设备-更快)

要找出diskutil list在命令提示符下键入设备的磁盘-同样,您可能需要是root用户。进行此输入,sudo -s并在出现提示时输入密码。

视窗

选项1

在Windows上,可以使用与刷新SD卡时相同的过程。

您可以使用Win32 Disk Imager,这是用于刷新Foundation SD卡的首选工具。只需输入文件名(要保存的备份映像文件的位置和名称),选择设备(SD卡),然后按读取:

Win32磁盘映像器

当然,您也可以使用RawWritedd对于Windows或类似工具,过程非常相似。

选项2

如果您不想备份整个系统,而只备份特定文件,建议您通过SFTP连接到Raspberry Pi,然后将文件复制到本地计算机(可以使用WinScp客户端)。如果启用了SSH,则SFTP通常不需要在Raspberry Pi端进行任何特殊配置。

另一个选择是使用rsync将文件复制到远程系统

您还可以安装特殊的驱动程序,以便Windows可以读取ext文件系统(从而可以读取整个SD卡),例如,ext2fsd但这可能不值得。


由于图像的大小将与SD卡相同,因此您可能需要对其进行压缩。只需使用您喜欢的压缩工具,如gzip7zip,WinZip,WinRar ...


1
一般而言+1,尽管rsyncvia ssh可能会更容易。另外,对于源代码(如Mark Booth所述),您绝对应该使用DVCS
Tobias Kienzler 2012年

1
如果我的SD卡损坏了,该如何将映像安装到新的SD卡上?
鳍2013年

2
没有指向Win32 Disk Imager的链接,没有下载可用。我假设它与sourceforge.net/projects/win32diskimager相同?
Yamikuronue

2
噢,我无法分辨图片中的“读取”是指“读取图像文件”还是“读取分区并将其写入图像文件”。...与“写入”相同... GUI需要进行消毒。类似于“图片->设备”和“设备->图片”(或更好的选择)
Olivier Dulac 2013年

4
Win32DiskImager似乎只能处理Windows识别的分区。我几乎没有运气克隆Noobs / Raspbian SD卡。找到了这个免费软件程序:hddguru.com/software/HDD-Raw-Copy-Tool。不管分区方案和内容如何,​​它在Windows中按字节克隆SD卡(我将其与Win7 64位一起使用)时都像是一种魅力。
techie007

156

如果您正在运行Linux,则可以使用以下dd命令对映像进行完整备份:

dd if=/dev/sdx of=/path/to/image

或用于压缩:

dd if=/dev/sdx | gzip > /path/to/image.gz

sdx您的SD卡在哪里。

要还原备份,请反转命令:

dd if=/path/to/image of=/dev/sdx

或压缩后:

gzip -dc /path/to/image.gz | dd of=/dev/sdx

3
我强烈建议使用gzip-今天我已经备份了一些桌面分区,并且在8.9Gb中保存了20Gb分区。
亚历克斯·张伯伦

2
bzip2应该可以更好地压缩,并且在所有Linux系统上都可用。在较新的Linux系统上,xz的压缩效果更好,它们的解压缩器分别为bunzip2和unxz。
阿恩(Arne)

4
@Arne我不希望有如此大的不同!尽管如此,这似乎仍远远低于我的担忧。(顺便说一句,当您回复将近1年的评论时,这很酷,并且您会在2分钟内得到答复:)
2014年

5
不要犯错(就像我刚才所做的那样),不要理会bs=1M或类似的参数。默认的块大小为512字节会破坏复制性能。
史蒂文·卢

1
@Arne我现在尝试使用bzip2,如果我从Class 4 SD卡进行备份,也许会比较合适,但是在Class 10 UHS 1 SanDisk 8GB卡(上周为12美元)上,它使Ivy Bridge变得最大了CPU线程,并将卡的读取速度限制为6MB / s(使用Ctrl + T的dd报告为4.2MB / s)。这并不理想,因为我可以将此gzip卡与该卡一起使用,并以更快的速度读取它(dd报告速度为18MB / s)。当然,如果磁盘的大部分空间都是可用空间,那么在这些空段中的读取将加快速度。但是,我必须查看生成的文件大小有何不同。
史蒂文·卢

31

除了这些块级备份之外,还有两种常见的方法来处理源:将其连续存档(1)或使用修订控制系统(2)。

我们将使用命令行(到Raspberry Pi计算机的任何本地终端或SSH连接),对吗?

1.存档

cd ~/projects
tar czvf your-raspberry-project-top-level-dir-v1.0.tgz \
         ./your-raspberry-project-top-level-dir 
scp your-raspberry-project-top-level-dir-v1.0.tgz \
         user@backup-host:/home/user/backups/

2. RCS(例如,Git)

cd ~/projects/your-raspberry-project-top-level-dir
make clean                          # Or clean it manually using rm (rm ./*.o ./*.pyc)
git init                            # Create new repo here
git add .                           # Add source files to the staging index
git status                          # Verify if it's OK
git commit -a -m "Initial import"   # Fix application's source changes
git add remote https://github.com/user/your-raspberry-project.git
git push -u origin master           # Sends the sources to your github repo
git pull && git push && git status  # Now origin/master is your tracking branch

2
可能还值得注意的是,人们可以在网络上的其他计算机上设置裸仓库,并将其从Raspberry Pi推送到那里,而不必设置github帐户,ssh密钥等然后推送到那里。
Mark Booth

2
这是真正答案的一个好的开始。如果要维护代码,则需要在版本控制下对其进行管理。版本控制允许跟踪更改,了解更改的历史记录,管理不同的分支(例如稳定版与开发版)并在它们之间合并。但这本身不是备份。但是,只需要备份存储库(例如Git的.git文件夹)。检查Linux / Unix论坛,Wiki,stackexchanges等,以了解在Linux下备份文件夹的方法。注意:我不认为github是备份。而且您不想将所有内容发布到github!
惠更斯

29

在Mac上,您不想使用/dev/diskn。您应该/dev/rdiskn改用,其中n是操作系统用来标识SD卡的数字。这大大减少了复印所需的时间。

因此,对于Mac上的最佳备份过程,我建议执行以下操作:

运行diskutil list,找到与Raspberry Pi的SD卡相对应的磁盘:

$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            499.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *7.9 GB     disk1
   1:             Windows_FAT_32                         58.7 MB    disk1s1
   2:                      Linux                         7.9 GB     disk1s2

显然/dev/disk1是我的8GB SD卡,Linux分区名称也有点线索。

但是,/dev/disk1与其使用dd,不应该使用/dev/rdisk1,就像这样:

sudo dd if=/dev/rdisk1 of=/path/to/backup.img bs=1m

要恢复它,只需交换if(输入文件)和of(输出文件)参数:

sudo dd if=/path/to/backup.img of=/dev/rdisk1 bs=1m

或者,使用gzip,以节省大量空间:

sudo dd if=/dev/rdisk1 bs=1m | gzip > /path/to/backup.gz

并且,要将映像复制回SD:

gzip -dc /path/to/backup.gz | sudo dd of=/dev/rdisk1 bs=1m

有关更多信息,请参见此Wiki页面。


1
我发现这是最有效的答案,并对此表示投票,谢谢@Alex Coplan。
博世

但是,我一直在寻找适用于MacOS的万无一失的GUI工具(就像Windows用户一样),并且没有dd风险,所以我从“两个独木舟”中找到了“ SD Clone”(我是WinClone的用户,因此可以信任它)。它是非常新的-2016-,价格昂贵(100美元,为期2周的试用期),但似乎是针对RasPi的,所以我现在就尝试一下,并在新评论中告知您。
博世

3
应对时,如果收到以下消息,请卸载SD卡:“资源繁忙”
Spipau

26

您可以从Linux PC上运行具有大量空间的命令:

ssh root@raspberrypi gzip -c /dev/mmcblk0 > img.gz

前提条件是您需要生成.ssh密钥并将其复制id_XXX.pub/root/.ssh/authorized_keys

由于它是实时备份,因此文件系统可能会出现问题,但是如果您的Raspberry Pi不很忙,通常就可以了。

像这样在PC上进行压缩可能更快:

ssh root@raspberrypi dd if=/dev/mmcblk0 | gzip -c > img.gz

1
或使用sudo'ssh pi @ raspberry sudo dd if = / dev / mmcblk0 | gzip的-c> raspberry.img.gz”
cupakob

并作为无密码登录的参考
Paolo

2
我还发现增加块大小很有用,并且可以使用pv检查进度。ssh root@raspberry dd if=/dev/mmcblk0 bs=1M | pv | gzip -c > img.gz
Paolo 2015年

如果您不想卸载SD卡,那么这是一个很好的答案,它也适用于macOS。这是我使用的命令行:ssh pi @ raspberrypi sudo dd if = / dev / mmcblk0 | xz -9 -e --threads = 4>sd.img.xz。不需要以这种方式生成SSH密钥。可以按Ctrl-T查看进度。
学习OpenGL ES

为什么gzipdd命令更可取?
IgorGanapolsky

18

如果您使用的是Windows:

  1. 下载Win32 Disk Imager。

  2. 创建您要用于保存图像的文件路径。(我使用C:\ RasPi_Bkp)

  3. 运行Win32 Disk Imager

  4. 浏览到备份文件路径位置,然后输入文件名。

  5. 点击保存

  6. 确保文件路径右侧下拉列表中显示的设备是您要备份的设备。

Win32磁盘映像器的实际应用

  1. 点击“阅读”

  2. 等待。


1
谢谢-只是工作。(奇怪的是,当我将SD卡插入主PC时,Windows 7进入了BSOD!幸运的是,它在另一台计算机上正常运行。)
Jon Egerton

对于像我一样在Win32 Disk Imager上遇到问题的任何人,请尝试Rufus。
DavidB '16

9

如果您的程序全部在pi用户ID中,则实际上没有理由像建议的那样备份整个文件系统。我要做的就是备份单个ID。我运行命令:

tar -czf pi.tgz *

从pi的主目录创建文件pi.tgz,其中包含其中的所有文件和目录(不包括隐藏文件)。然后,我将此文件scp到另一台linux计算机上,但是您可以将其ftp或通过电子邮件发送到某处以进行安全保存...将其保存到另一台计算机上的任何内容。

这将为您的备份创建一个更小的文件。

担心您在安装过程中安装的所有其他软件包吗?创建一个脚本,该脚本将在您需要重新创建SD卡并将其保存在pi的主目录中的某个位置时,再次为您执行这些安装。(我有一个〜/ bin目录用于此类操作)。具有安装所需的所有命令,以使您回到想要的位置。它记录您的更改,并允许您快速构建新的SD卡。它包含以下形式的命令:

apt-get --assume-yes install apache2 mysqld mysql php5 php-pear

从开始

apt-get update
apt-get --assume-yes upgrade

这样,在您开始添加软件包之前,您的系统也将恢复到当前级别。

由于这将在您的pi.tgz文件中,因此您将在需要时使用它。


请注意,对于Raspbmc分拆,显然apt-get 升级会引起问题。它对我有用,显然这是一个已知问题
Cristi Diaconescu

这也可以远程完成,即:ssh pi@raspberrypi.local“ sudo tar -cvp〜/ *” | xz -9 -e --threads = 4> raspbian.home.tar.xz
学习OpenGL ES,

8

我运行Raspbian,并使用dd和cron将SD卡自动备份到外部USB驱动器。

这是一个非常简单的解决方案。它每周一次在星期一早上2点运行一次,并制作SD卡的映像。

我编写了一个脚本,该脚本关闭了lighttpd和cron之类的服务,以最大程度地减少在备份过程中将SD卡写入SD卡的风险,然后该脚本将调用dd,然后在备份完成后再次启动服务。

我已经将脚本和一些说明放到了我的博客http://www.stuffaboutcode.com/2012/08/raspberry-pi-auto-backups.html上


1
如果您不能拔下卡,这可能是一个合理的解决方案。但是,使用已安装分区ddsd?设备听起来不太安全。
2014年

您可能是对的,但我没有遇到任何问题。
Martin O'Hanlon 2014年

4

对于Debian,您可以使用dd和tar。这将完整复制SD卡,并需要外部(至SD卡)存储,可能是已安装的USB或网络驱动器。

dd if=/dev/sdd of=yourbackupfilenamehere.dd
tar zcvf yourbackupfilenamehere.dd.tar.gz

/ dev / sdd是SD卡的位置,of是输出文件名。


这样做的局限性是需要在某个地方写入图像(它也足够大以拍摄图像。想必这也意味着通过usb集线器的大数据io-需要一段时间吗?
Jon Egerton

是的,但在以下问题中是必需的:“我想要SD卡的完整图像。”
Forkrul Assail 2012年

1
为什么要创建.tar.gzdd文件的文件?直接运行gzipbzip2直接在dd文件上运行会更好吗?
安德斯

什么是的/ dev / SDD是什么意思?我已经/dev/mmcblk0p1/dev/mmcblk0p2上市...
IgorGanapolsky

4

幸运的是,Raspberry Pi可以创建自己的备份,该备份独立于用于访问Raspberry的主要操作系统(Windows,Linux,Mac)。dd,tar和rsync是在Linux上创建备份的不同工具。所有这些类型的备份都可以由运行中的Pi创建,前提是它在创建备份之前停止了所有繁忙的任务,例如mysql,smb,dlna,owncloud,seafile,apache等。还有一个不同的问题,在这里详细解释该方法,并在此处解释一种可能的解决方案


3

如果您的Raspberry Pi已连接到网络,并且需要自动即时备份,则最简单的方法可能是Bittorent Sync-非常容易安装,并且可以在Pi和许多其他平台上平稳稳定地运行。


我只想广告说同步和备份是两件事
Pitto

3

不再需要可怕的dd,sync,tar,...,初学者友好的SD卡复印机

Raspbian的新版本称为Stretch,具有一个非常适合初学者的应用程序,称为SD Card Copier。您不需要使用dd等Linux工具。它甚至可以将大卡复制到小卡上。

怎么做

首先从左上角的GUI RPi应用程序菜单图标开始,转到“附件”,然后单击“ SD卡复印机”。

您只需要在GUI中单击几下即可!

制作备份SD卡后,可以使用Windows磁盘管理器将卡的映像读取到Windows文件,并将其存储在任何Windows目录中。这样,您只需要一个物理SD卡,即可在Windows PC中存储许多版本的图像。

当然,您可以仅将备份卡用作工作副本,以替换原来的卡(现在已成为您的主卡)并将其锁定在安全的地方。


1

在搜索创建自定义SD卡的图像时,我发现了此信息。最好的答案是讨论SD卡的成像,但是我一直在寻找缩小文件系统以缩小图像的方法。我最终创建了自己的工具来执行此操作,并在以下位置概述了该过程:https : //raspberrypi.stackexchange.com/a/37899/32585


1

这是3个选项:

  1. 在最新版本的Raspbian中,有一个工具可以将您的操作系统和文件转换为.img文件,然后可以将其放置到USB或PC上。

  2. 将SD卡插入Windows PC,然后启动Win32 Disk Imager(如果尚未安装,请在此处安装。)

    在(1)中,键入图像文件的文件名和位置。在(2)中,选择SD卡的驱动器号。然后按3。这与选项1相同。

  3. 将USB随身碟插入Pi,然后复制所有重要文件。



0

我创建了一个实用程序来备份树莓派(如果您是Linux)。这也会缩小树莓派的图像,因此您可以将.iso放在较小的SD卡上: RaspberryPiShrink

这将运行一个python脚本,它将引导您完成该过程。只需将microSD卡插入Ubuntu,Linux Mint或Debain计算机,然后按照终端中的说明进行操作即可。


-2

我一直在Windows上使用usbit。这是我发现的唯一工具,可让您从较大的SD卡交换到较小的SD卡。我所做的就是在选项页面上打勾。忽略大小检查截断超大图像

这使我可以将OpenELEC和Xbian映像从16 GB的4级SD卡交换为8 GB的10级卡。

这比调整分区表的大小等要容易得多。


2
您是否曾经验证过文件?我的意思是find -type f -exec md5sum {} \; > filelist.txt
Avio 2012年

2
由于磁盘后半部分上存储的数据被删除,因此不能保证此功能有效。此外,分区表已损坏。
亚历克斯·张伯伦
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.