压缩备份主要文件
cd/home/
tar czf pi_home.tar.gz pi
This creates a tar archive calledpi_home.tar.gzin/home/. You should copy this file to a USB stick or transfer it to another machine on your network.
MySQL
If you have MySQL databases running on your Raspberry Pi, it would be wise to keep them backed up too. To back up a single database, use themysqldumpcommand:
mysqldump recipes>recipes.sql
This command will back up therecipesdatabase to the filerecipes.sql. Note that in this case no username and password have been supplied to themysqldumpcommand. If you do not have your MySQL credentials in a.my.cnfconfiguration file in your home folder, then supply the username and password with flags:
mysqldump-uroot-ppass recipes>recipes.sql
To restore a MySQL database from a dumpfile, pipe the dumpfile into themysqlcommand; provide credentials if necessary and the database name. Note that the database must exist, so create it first:
mysql-Bse"create database recipes"cat recipes.sql|mysql recipes
Alternatively, you can use thepvcommand (not installed by default, so install withsudo apt-get install pv) to see a progress meter as the dumpfile is processed by MySQL. This is useful for large files:
pv recipes.sql|mysql recipes
SD card image
It may be sensible for you to keep a copy of the entire SD card
image, so you can restore the whole SD card if you lose it or it becomes
corrupt. You can do this using the same method you'd use to write an
image to a new card, but in reverse.
In Linux or Mac, for example:
sudo dd bs=4Mif=/dev/sdb of=raspbian.img
This will create an image file on your PC which you can use to write to another SD card, and keep exactly the same contents and settings. To restore or clone to another card, useddin reverse:
sudo dd bs=4Mif=raspbian.img of=/dev/sdb
These files can be very large, and compress well. To compress, you can pipe the output ofddtogzipas well to get a compressed file that is significantly smaller than the original size:
sudo dd bs=4Mif=/dev/sdb|gzip>rasbian.img.gz
To restore, pipe the output ofgunziptodd:
gunzip--stdout rasbian.img.gz|sudo dd bs=4M of=/dev/sdb
See more aboutinstalling SD card images.
Automation
You could write a Bash script to perform each of these processes automatically, and even have it performed periodically usingcron.
如果您的sd卡不是标准的 你将发现dd备份会出现错误导致无法启动,或者说您备份16GB 的sd卡 恢复到8Gb的SD卡将会无法完全写入,还会破坏磁盘结构
所以我建议您使用最简单的方式tar
1. 备份系统
首先成为root用户:
$ sudo su
然后进入文件系统的根目录(当然,如果你不想备份整个文件系统,你也可以进入你想要备份的目录,包括远程目录或者移动硬盘上的目录):
# cd /
下面是我用来备份系统的完整命令:
# tar cvpzf backup.tgz –exclude=/proc –exclude=/lost+found–exclude=/backup.tgz –exclude=/mnt –exclude=/sys /
让我们来简单看一下这个命令:
“tar”当然就是我们备份系统所使用的程序了。
“cvpfz”是tar的选项,意思是“创建档案文件”、“保持权限”(保留所有东西原来的权限)、“使用gzip来减小文件尺寸”。
“backup.gz”是我们将要得到的档案文件的文件名。
“/”是我们要备份的目录,在这里是整个文件系统。
在档案文件名“backup.gz”和要备份的目录名“/”之间给出了备份时必须排除在外的目录。有些目录是无用的,例如“/proc”、“/lost+found”、“/sys”。当然,“backup.gz”这个档案文件本身必须排除在外,否则你可能会得到一些超出常理的结果。如果不把“/mnt”排除在外,那么挂载在“/mnt”上的其它分区也会被备份。另外需要确认一下“/media”上没有挂载任何东西(例如光盘、移动硬盘),如果有挂载东西,必须把“/media”也排除在外。
有人可能会建议你把“/dev”目录排除在外,但是我认为这样做很不妥,具体原因这里就不讨论了。
执行备份命令之前请再确认一下你所键入的命令是不是你想要的。执行备份命令可能需要一段不短的时间。
备份完成后,在文件系统的根目录将生成一个名为“backup.tgz”的文件,它的尺寸有可能非常大。现在你可以把它烧录到DVD上或者放到你认为安全的地方去。
在备份命令结束时你可能会看到这样一个提示:’tar: Error exit delayed from previouserrors’,多数情况下你可以忽略它。
你还可以用Bzip2来压缩文件,Bzip2比gzip的压缩率高,但是速度慢一些。如果压缩率对你来说很重要,那么你应该使用Bzip2,用“j”代替命令中的“z”,并且给档案文件一个正确的扩展名“bz2”。完整的命令如下:
# tar cvpjf backup.tar.bz2 –exclude=/proc –exclude=/lost+found–exclude=/backup.tar.bz2 –exclude=/mnt –exclude=/sys /
2. 恢复系统
在进行恢复系统的操作时一定要小心!如果你不清楚自己在做什么,那么你有可能把重要的数据弄丢,请务必小心!
接着上面的例子。切换到root用户,并把文件“backup.tgz”拷贝到分区的根目录下。
在Linux中有一件很美妙的事情,就是你可以在一个运行的系统中恢复系统,而不需要用boot-cd来专门引导。当然,如果你的系统已经挂掉不能启动了,你可以用LiveCD来启动,效果是一样的。你还可以用一个命令把Linux系统中的所有文件干掉,当然在这里我不打算给出这个命令!
使用下面的命令来恢复系统:
# tar xvpfz backup.tgz -C /
如果你的档案文件是使用Bzip2压缩的,应该用:
# tar xvpfj backup.tar.bz2 -C /
注意:上面的命令会用档案文件中的文件覆盖分区上的所有文件。
执行恢复命令之前请再确认一下你所键入的命令是不是你想要的,执行恢复命令可能需要一段不短的时间。
恢复命令结束时,你的工作还没完成,别忘了重新创建那些在备份时被排除在外的目录:
# mkdir proc
# mkdir lost+found
# mkdir mnt
# mkdir sys
等等
当你重启电脑,你会发现一切东西恢复到你创建备份时的样子了!
可能还会设计到分区表的备份还原
现在的分区如下:
Device Boot Start End Blocks Id System
/dev/sda1 * 1 2612 20980858+ 7 HPFS/NTFS
/dev/sda2 2613 19458 135309127+ 5 Extended
/dev/sda5 2613 6529 31463271 7 HPFS/NTFS
/dev/sda6 6530 9141 20980858+ 83 Linux
/dev/sda7 9142 11753 20980858+ 83 Linux
/dev/sda8 11754 19048 58593280 83 Linux
/dev/sda9 19048 19458 3289088 82 Linux swap / Solaris
备份方法:
1、备份分区表信息
sudo fdisk -l >hda.txt #分区表信息重定向输出到文件中
2、备份MBR
linux@linux-desktop:~/ex$ sudo dd if=/dev/sda of=mbr bs=512 count=1
#输入文件/dev/sda,
输出文件mbr(自己定义),输入(出)块大小512字节,复制一次,由于mbr是512个字节,所以读取写到mbr文件中了
1+0 records in
1+0 records out
512 bytes (512 B) copied,4.0728e-05 秒,12.6 MB/秒
linux@linux-desktop:~/ex$ ls #查看备份成功
hda.txt mbr
主引导记录512字节,前446是程序代码,后64字节包含分区表信息,最后2字节标识是MBR
3、恢复分区表
dd if=mbr of=/dev/sda bs=1 skip=446 count=66 #输入文件mbr,输出 /dev/sda ,块大小1个字节,输入跳过446字节,恢复66个字节,看来恢复的只有66个字节
如果逻辑分区都没有了,则用fdisk 照着hda.txt的信息重分一下就行了。
顺便说一下dd命令的用法
以下来自网络,我没有测试
dd是linux下的一个非常有用的命令,作用是用指定大小的块复制一个文件,并在复制的同时进行指定的转换。
if=输入文件(input file), 如: if=/dev/sda,缺省为标准输入
of=输出文件(output file), 如: of=mbr, 缺省为标准输出
ibs=Bytes,一次读入Bytes个字节,即一个块大小为Bytes个字节
obs=Bytes, 一次写Bytes个字节,即一个块大小为Bytes个字节
bs=Bytes ,同时设置读写块的大小为Bytes字节,可代替ibs,obs
cbs=Bytes,一次转换Bytes个字节,即转换缓冲区大小
skip=blocks, 从输入文件开头跳过blocks个块后再开始复制
seek=blocks,从输出文件开头路过blocks个块后再开始复制(通常只有当输出文件是磁盘或磁带时才有效)
count=blocks, 仅复制blocks个块,块大小是ibs指定的字节数
conv=conversion[,conversion...]
用指定的参数转换文件。
转换参数:
ascii 转换 EBCDIC 为 ASCII。
ebcdic 转换 ASCII 为 EBCDIC。
ibm 转换 ASCII 为 alternate EBCDIC.
block 把每一行转换为长度为 cbs 的记录,不足部分用空格填充。
unblock 使每一行的长度都为 cbs ,不足部分用空格填充。
lcase 把大写字符转换为小写字符。
ucase 把小写字符转换为大写字符。
swab 交换输入的每对字节。
noerror 出错时不停止。
notrunc 不截短输出文件。
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。