用电脑多了,难免会出现系统故障的情况,如果不想经常重装系统,特别是开发人员,每次重装系统都是噩梦,因为要安装很多很多软件,配置各种参数、环境变量,这时候备份恢复系统的工作尤为重要。

Win系统的备份用Ghost,各种一键Ghost很成熟,那么Linux系统备份用什么呢?

有人说,也用Ghost,有人说,我直接dd整个硬盘镜像,再或者用CloneZilla再生龙,其实最好用的就是一个Linux的启动镜像,简单,可靠。

用Ghost备份Linux速度慢稳定性差,因为文件系统和Win差异很大,哪怕用分区备份的方式都不可靠,试过几次后我就彻底放弃了

dd命令看似可靠,但速度太慢了,而且局限性很大,如果分区大小不同,如果用来迁移Linux系统或者换了一个大硬盘或者系统换一个分区,都不行。

再生龙CloneZilla功能很强大,本身也是一个U盘或者光盘启动的Linux系统,但配置太复杂了,各种配置选择一堆一堆。

其实,只是备份恢复系统的话,tar命令就可以了,在系统里面如果要备份整个系统是不可能的,自己打包自己听着就不靠谱,这时候就需要一个能从光盘或者U盘启动的Linux,这个Linux的版本最好和需要备份的Linux一致,比如我是32位的Ubuntu 14.04,那最好用32位的Ubuntu 14.04的iso启动镜像启动,选择试用就行了。

系统启动以后,打开Terminal终端

sudo passwd root

su -

却换到root用户

fdisk -l /dev/sda

检查硬盘分区情况,看看要备份的系统状况,这里要备份的是sda1分区

mkdir /mnt/sda1

mount /dev/sda1 /mnt/sda1

cd /mnt/sda1

ls

确认挂载的目录是要备份的系统根目录,如果有其他的分区需要挂载到该系统根目录,记得挂载

之后用tar命令打包备份,如果有多个分区最好备份到另一个分区,如果只有一个分区怎么办呢?OK

tar -czvf backup.tar ./ –exclude backup.tar

打包备份当前目录到backup.tar,但要排除backup.tar文件,不然回把这个备份文件一起打包进去,打包的备份文件为当时的文件。总之,又是自己打包自己,所以需要用--exclude排除。

du -sh backup.tar

df -h

打包后可以看大小,打包前最好也用df -h看下/mnt/sda1的大小,差不多不太离谱就好。

这时候就可以将备份的backup.tar拷贝走,保存好,可以重启进入硬盘的系统拷贝,也能在这个系统用scp命令拷到别的linux机器,或者插一个U盘拷进去都可以。

备份的这个backup.tar可以用来恢复系统,也可以给其他机器部署这个配置好的Linux系统,这就是Linux的优点,不依赖硬件。

如果要部署到另一台机器,先用启动光盘或者U盘启动系统,如果没有事先分好分区,就用fdisk给目标机器分区,之后用mkfs.ext4命令或者其他格式文件系统的mkfs命令格式化分区,记得mkswap分区,除非你不想用swap分区。

格式化好之后,创建文件夹,然后挂载,比如挂载到/mnt/sda1,如果是恢复系统也可以直接先格式化要恢复的系统分区,因为用rm -rf删除所有目录速度太慢,即使用rsync的方法也不如直接mkfs格式化快。

backup.tar拷到/mnt/sda1,然后进入这个目录

tar -zxvf backup.tar

解包,解包完成后看下,有没有少什么目录

这样就完了么?当然没有,还需要修改fstabgrub,不然挂载会有问题

vi etc/fstab

将fstab分区挂载改成自己所选的分区,如果是用UUID做区分,用blkid看当前硬盘分区的UUID

修改完fstab之后,还要修改grub配置文件并重装grub,不然可能会导致系统卡在grub命令界面无法启动。

vi /boot/grub/grub.cfg

注意root后面跟的UUID是不是和刚才blkid看到的启动分区一致,如不一致,用sed替换或者直接将blkid看到UUID复制替换grub.cfg中的UUID

sed -i “s/blkid看到的/grub.cfg中的/g” boot/grub/grub.cfg

vi /boot/grub/grub.cfg

再检查一次,另外如果启动分区不是sda1,还需要调整前面的setmenuentry中的启动选项,hd0,hd1,hd2,hd3对应sda,sdb,sdc,sdd依此类推,msdos1,msdos2,msdos3对应sdx1,sdx2,sdx3依此类推

grub配置修改完成后,安装grub到硬盘mbr

grub-install –root-directory=/mnt/sda1 /dev/sda

指定boot根目录路径,安装到/dev/sda表面安装到硬盘sdambrsdx后面不带数字就表明安装到mbr,否则就是安装到分区

注意,如果是用32位系统去安装64位系统的grub会报错,或者grub版本差异太大,安装也会报错,尽量保证系统版本和grub版本的一致性。

如果不一致怎么办?也可以,用chroot进到目标系统,再安装grub

chmod 1777 /mnt/sda1/tmp/

mount -t proc proc /mnt/sda1/proc

mount -o bind /dev /mnt/sda1/dev/

chroot /mnt/sda1 /bin/bash

grub-install /dev/sda

之后退出然后重启即可

如果系统无法启动,卡在grub界面比较常见,或者启动后文件系统无法挂载,请用光盘或者U盘启动linux,挂载分区检查fstabgrub.cfg,再重新装grub,问题基本都出在这里。

最后,还是建议最好在机器里面安装双系统,这样可以很方便的互相备份恢复。

这种做法还可以将物理机迁移到虚拟机,也可以将虚拟机迁移到物理机,不过需要注意的是虚拟机增强工具,比如vmware-tools,物理机是不需要的,记得卸载。