Linux系统通用备份恢复方法
条评论用电脑多了,难免会出现系统故障的情况,如果不想经常重装系统,特别是开发人员,每次重装系统都是噩梦,因为要安装很多很多软件,配置各种参数、环境变量,这时候备份恢复系统的工作尤为重要。
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
解包,解包完成后看下,有没有少什么目录
这样就完了么?当然没有,还需要修改fstab
和grub
,不然挂载会有问题
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
,还需要调整前面的set
和menuentry
中的启动选项,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
表面安装到硬盘sda
的mbr
,sdx
后面不带数字就表明安装到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,挂载分区检查fstab
和grub.cfg
,再重新装grub
,问题基本都出在这里。
最后,还是建议最好在机器里面安装双系统,这样可以很方便的互相备份恢复。
这种做法还可以将物理机迁移到虚拟机,也可以将虚拟机迁移到物理机,不过需要注意的是虚拟机增强工具,比如vmware-tools
,物理机是不需要的,记得卸载。