Skip to content

28 备份

1. 备份要点

1.1 备份资料的考虑

  • 造成系统损毁的问题-硬件问题
  • 造成系统损毁的问题-软件与人的问题
  • 主机角色不同,备份任务也不同
  • 备份因素考虑
  • 备份哪些文件:对系统或用户来说是重要的数据
  • 备份的载体
  • 考虑备份的方式:完整备份、累积备份、差异备份
  • 备份的频率
  • 备份使用的工具:tar 、 cpio 、 dd 、 dump 等等

1.2 哪些 Linux 数据具有备份的意义

具有备份意义的文件通常可以粗分为两大类:

  • 系统基本设置信息;
  • 类似网络服务的内容数据。

1.2.1 操作系统本身需要备份的文件

这方面的文件主要是账号与系统配置文件

  • /etc/ 整个目录
  • /home/ 整个目录
  • /var/spool/mail/
  • /var/spoll/{at|cron}/

  • /boot/

  • /root/
  • 如果你自行安装过其他的软件,那么 /usr/local/ 或 /opt 也最好备份一下!

1.2.2 网络服务的数据库方面

  • 软件本身的配置文件案。例如:/etc/ 整个目录,/usr/local/ 整个目录(若你的套件大多来自于自行的安装,那么 /usr/local 这个目录可就相当的重要了)
  • 软件服务提供的数据。以 WWW 及 Mariadb 为例: WWW 文件:/var/www 整个目录或 /srv/www 整个目录,及系统的用户家目录 Mariadb : /var/lib/mysql 整个目录
  • 其他在 Linux 主机上面提供的服务的数据库文件。

1.2.3 鸟哥推荐需要备份的目录

如果不能全部备份,那么鸟哥建议至少需要备份这些目录:

  • /etc
  • /home
  • /root
  • /var/spool/mail/, /var/spool/cron/, /var/spool/at/
  • /var/lib/

1.2.4 不需要备份的目录

  • /dev:这个随便你要不要备份
  • /proc, /sys, /run:这个真的不需要备份啦!
  • /mnt, /media:如果你没有在这个目录内放置你自己系统的东西,也不需要备份
  • /tmp:干嘛存暂存档!不需要备份!

1.3 备份用储存载体的选择

1.3.1 异地备份系统

将系统数据通过网络备份到其他的地方去,缺点就是带宽严重的不足

1.3.2 储存载体的考虑

经费充足的情况下,鸟哥建议使用外接式的 NAS 设备,NAS 储存设备就等于是一部小型 Linux 或 unix-like server, 里面还能够提供客制化的服务,包括不同的连接界面与传输协议,提供硬件或软件的磁盘阵列,让你可以架设 RAID10 或 RAID5,6 等的等级。因此,你只要记得,就是买还能够自我容错的 NAS 设备来备份就对了。

若经费不足,使用多个磁盘互相轮流备份。

如果你想要有比较长时间的备份储存,同时也比较担心碰撞的问题,目前企业界还是很多人会喜欢使用 Tape 来储存就是了。

2. 备份的种类、频率与工具的选择

2.1 完整备份之累积备份 (Incremental backup)

如果仅备份关键数据时, 那么你得要在系统出错后,再去找新的 Linux distribution 来安装,安装完毕后还得要考虑到数据新旧版本的差异问题, 还得要进行数据的移植与系统服务的重新建立等等,等到建立妥当后,还得要进行相关测试!所以,仅有关键数据是不够的

完整备份就是将根目录 (/) 整个系统通通备份下来的意思!不过,在某些场合底下,完整备份也可以是备份一个文件系统 (filesystem)!例如 /dev/sda1 或 /dev/md0 或 /dev/myvg/mylv 之类的文件系统就是了。

2.2 累积备份的原则

累积备份:在系统在进行完第一次完整备份后,经过一段时间的运作, 比较系统与备份文件之间的差异,仅备份有差异的文件而已。而第二次累积备份则与第一次累积备份的数据比较,也是仅备份有差异的数据而已。

还原时需要依序还原。

2.2.1 累积备份使用的备份软件

完整备份常用的工具有 tar, dd, cpio, xfsdump/xfsrestore 等等。

dd 可以直接读取磁盘的扇区 (sector) 而不理会文件系统,是相当良好的备份工具!不过缺点就是慢很多! cpio 是能够备份所有档名,不过,得要配合 find 或其他找文件名的指令才能够处理妥当。 以上两个都能够进行完整备份, 但累积备份就得要额外使用脚本程序来处理。

可以直接进行累积备份的就是 xfsdump 指令。

2.3 完整备份之差异备份 (Differential backup)

差异备份:每次的备份都是与原始的完整备份比较的结果。

因为都需要完整备份,所以差异备份常用的工具与累积备份差不多。如果使用 xfsdump 来备份的话,那么每次备份的等级 (level) 就都会是 level 1

还可以透过 tar-N 选项来备份:

# 只打包比 2019-12-10 要新的文件
[root@dev ~]# tar -N '2019-12-10' -jcpv -f /tmp/etc_20191218.tar.bz2 /etc

还可以透过 rsync 来对两个目录进行镜像备份。

2.4 关键数据备份

由于完整备份可能是在系统运作期间进行,不但会花费非常多时间,而且如果备份当时系统已经被攻破, 那你备份的数据是有问题的,那还原回去也是有问题的系统。

若因为软件问题而导致系统被攻破或损毁时,直接获取最新的 Linux distribution ,然后重新安装, 然后再将系统数据 (如账号/密码与家目录等等) 与服务数据 (如www/email/crontab/ftp 等等) 一个一个的填回去。

备份关键数据最麻烦的地方其实就是在还原啦!上述的还原方式是你必须要很熟悉系统运作,否则还原得要花费很多时间的。

3. 鸟哥的备份策略

  1. 主机硬件:使用一个独立的 filesystem 来储存备份数据,此 filesystem 挂载到 /backup 当中;
  2. 每日进行:目前仅备份 MySQL 数据库;
  3. 每周进行:包括 /home, /var, /etc, /boot, /usr/local 等目录与特殊服务的目录;
  4. 自动处理:这方面利用 /etc/crontab 来自动提供备份的进行;
  5. 异地备援:每月定期的将数据分别 :(a)刻录到光盘上面 ;(b)使用网络传输到另一部机器上面。

3.1 每周系统备份的 script

backupwk.sh

#!/bin/bash
# ====================================================================
# 用户参数输入位置:
# basedir=你用来储存此脚本所预计备份的数据之目录(请独立文件系统)
basedir=/backup/weekly # 您只要改这里就好了!

# ====================================================================
# 底下请不要修改了!用默认值即可!
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C
# 设定要备份的服务的配置文件,以及备份的目录
named=$basedir/named
postfixd=$basedir/postfix
vsftpd=$basedir/vsftp
sshd=$basedir/ssh
sambad=$basedir/samba
wwwd=$basedir/www
others=$basedir/others
userinfod=$basedir/userinfo
# 判断目录是否存在,若不存在则予以建立。
for dirs in $named $postfixd $vsftpd $sshd $sambad $wwwd $others $userinfod
do
        [ ! -d "$dirs" ] && mkdir -p $dirs
done

# 1. 将系统主要的服务之配置文件分别备份下来,同时也备份 /etc 全部。
cp -a /var/named/chroot/{etc,var} $named
cp -a /etc/postfix /etc/dovecot.conf $postfixd
cp -a /etc/vsftpd/* $vsftpd
cp -a /etc/ssh/* $sshd
cp -a /etc/samba/* $sambad
cp -a /etc/{my.cnf,php.ini,httpd} $wwwd
cd /var/lib
tar -jpc -f $wwwd/mysql.tar.bz2 mysql
cd /var/www
tar -jpc -f $wwwd/html.tar.bz2 html cgi-bin
cd /
tar -jpc -f $others/etc.tar.bz2 etc
cd /usr/
tar -jpc -f $others/local.tar.bz2 local

# 2. 关于使用者参数方面
cp -a /etc/{passwd,shadow,group} $userinfod
cd /var/spool
tar -jpc -f $userinfod/mail.tar.bz2 mail
cd /
tar -jpc -f $userinfod/home.tar.bz2 home
cd /var/spool
tar -jpc -f $userinfod/cron.tar.bz2 cron at

3.2 每日备份资料的 script

backupday.sh

#!/bin/bash
# =========================================================
# 请输入,你想让备份数据放置到那个独立的目录去
basedir=/backup/daily/ # 你只要改这里就可以了!

# =========================================================
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C
basefile1=$basedir/mysql.$(date +%Y-%m-%d).tar.bz2
basefile2=$basedir/cgi-bin.$(date +%Y-%m-%d).tar.bz2
[ ! -d "$basedir" ] && mkdir $basedir

# 1. MysQL (数据库目录在 /var/lib/mysql)
cd /var/lib
tar -jpc -f $basefile1 mysql

# 2. WWW 的 CGI 程序 (如果有使用 CGI 程序的话)
cd /var/www
tar -jpc -f $basefile2 cgi-bin

最好先把服务关掉再进行备份!!!

然后通过crontab来执行备份。

3.3 远程备份的 script

使用 rsync 上传备份数据

[root@study ~]# vi /backup/rsync.sh
#!/bin/bash
remotedir=/home/backup/
basedir=/backup/weekly
host=127.0.0.1
id=dmtsai

# 底下为程序阶段!不需要修改喔!
rsync -av -e ssh $basedir ${id}@${host}:${remotedir}

4. 灾难复原的考虑

4.1 硬件损毁,且具有完整备份的数据时

要先处理好你的硬件,然后依据你的备份状态来复原。

4.2 由于软件的问题产生的被攻破的安全事件

  1. 先拔除网络线,最好将系统进行完整备份到其他媒体上,以备未来查验
  2. 开始查阅日志文件
  3. 开始安装新系统 (最好找最新的 distribution)
  4. 进行系统的升级,与防火墙相关机制的制订
  5. 根据 2 的错误,在安装完成新系统后,将那些 bug 修复
  6. 进行各项服务与相关数据的恢复
  7. 正式上线提供服务,并且开始测试