CentOS 7 系统备份与还原

# 系统备份

# 方法一:

  • 限本地备份
  • 每次全量备份
  • 磁盘占用只有备份文件

cd 到备份目录 执行 (按自己系统的实际情况修改排除的目录)

cd /data/backup && tar -zcvpf server_backup_`date '+%Y%m%d_%H%M%S'`.tar.gz --exclude=/proc --exclude=/tmp --exclude=/boot  --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/sys --exclude=/run --exclude=/data /
1

# 方法二:

  • 可本地和远程
  • 可增量备份且可输出增量日志
  • 总磁盘占用偏大一点(多一个数据同步目录)

先把需要备份的文件同步到一个固定目录 我用的是/data/backup 目录,需按自己的需求去修改

远程备份时将/data/backup 替换为对应的 username@remote_host:destination ,日志输出按需修改&> /data/backup/logs/rsync_date '+%Y%m%d_%H%M%S'.log

rsync -aAXv --filter='-x security.selinux' --delete-after --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/data/*"} /* /data/backups &> /data/backup/logs/rsync_`date '+%Y%m%d_%H%M%S'`.log
1

然后再打包

cd /data/backup &&  tar -zcvpf /data/backup/server_backup_`date '+%Y%m%d_%H%M%S'`.tar.gz ./* &> /data/backup/logs/tar_`date '+%Y%m%d_%H%M%S'`.log
1
rsync 参数说明:
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-v, --verbose 详细模式输出
-p, --perms 保持文件权限
-g, --group 保持文件属组信息
-o, --owner 保持文件属主信息
-r, --recursive 对子目录以递归模式处理。同步目录的时候要加上这个参数
-l, --links 保留软链结,加上这个参数,同步过来的文件会保持之前的软链接属性不变
-H, --hard-links 保留硬链结
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
-z, --compress 对备份的文件在传输时进行压缩处理
--stats 给出某些文件的传输状态
--progress 打印同步的过程
--timeout=TIME 同步过程中,IP超时时间,单位为秒
--delete 删除那些目标目录中有而源目录中没有的多余文件。这个是rsync做增量方式的全备份的最佳选择方案!!!!!!
--delete-before 接受者在输出之前进行删除操作。即先将目标目录中文件全部删除,再将源目录文件拷贝过去。这是rsync保持目标目录跟源目录一致的方案!!!
--delete-after 在同步操作之后做比较,删除那些目标目录中有而源目录中没有的多余文件
--delete-excluded 删除目标目录中那些被该选项指定排除的文件
--ignore-errors 即使出现IO错误也进行删除,忽略错误
--exclude 指定同步时需要过滤掉的文件或子目录(即不需要同步过去的),后面直接跟不需要同步的单个文件名或子目录(不需要跟路径) ,过滤多个文件或子目录,就使用多个--exclude
--exclude-from 指定同步时需要过滤掉的文件或子目录,后面跟文件(比如/root/exclue.txt),然后将不需要同步的文件和子目录放到/root/exclue.txt下。
--version 打印版本信息
--port=PORT 指定其他的rsync服务端口
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 踩坑

rsync: rsync_xal_clear: lremovexattr("export","security.selinux") failed: Permission denied
1

增加 --filter='-x security.selinux'
https://unix.stackexchange.com/questions/648118/rsync-xal-set-lremovexattr-my-path-file-zpxuj1-security-selinux-failed-p (opens new window)

# 创建本地备份脚本

vi /root/bin/system_backup.sh

#!/usr/bin/env bash

NOW_TIME=`date '+%Y%m%d_%H%M%S'`
BACKUP_PATH="/data/backup"

# 要保留的备份数据量
NUM=5

# create directory 
mkdir -p $BACKUP_PATH/data-sync $BACKUP_PATH/logs

# sync file
rsync -aAXv --filter='-x security.selinux' --delete-after --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/data/*"} /* $BACKUP_PATH/data-sync &> $BACKUP_PATH/logs/rsync_${NOW_TIME}.log

# compress and pack files 
cd $BACKUP_PATH/data-sync &&  tar -zcvpf $BACKUP_PATH/server_backup_${NOW_TIME}.tar.gz ./* &> $BACKUP_PATH/logs/tar_${NOW_TIME}.log

gz_list=()
controller_tar(){
 for file in `ls  $BACKUP_PATH`
 do
 # 贪婪匹配文件后缀名是否为gz
    if [ "${file#*.}"x = "tar.gz"x ]
    then
    # 如果符合条件将文件放入集合中
        gz_list[${#gz_list[*]}]=${file}
    fi
 done
 }

# 调用方法
controller_tar

# 输出所有符合要求的文件名称
#echo ${gz_list[*]}
# 输出所有符合要求的文件总数量
#echo ${#gz_list[@]}

# 清理超出备份数的备份文件和备份日志
if [ ${#gz_list[@]} -gt $NUM ]
then ((RESTAR=${#gz_list[@]}-$NUM)) && cd $BACKUP_PATH && ls -rt|grep tar.gz|head -$RESTAR|xargs rm -rf  &&((RESLOG=$RESTAR*2)) && cd $BACKUP_PATH/logs && ls -rt|grep log|head -$RESLOG|xargs rm -rf
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

# 定时执行(每月执行)

chmod 775 system_backup.sh vi /etc/crontab

0 0 1 * * root /root/bin/system_backup.sh
1

重启crontab服务

systemctl restart crond.service

# 在新系统还原备份(未测试 仅供参考)

# 挂载 /mnt
mount /dev/mapper/centos-root /mnt

# 把之前的压缩文件传到/mnt 下,也可以用U盘拉
scp user@ipaddress:/data/backup/server_backup.tar.gz /mnt

# 解压压缩包
/mnt tar zxvpf /mnt/server_backup.tar.gz

# 还原/boot
mkdir /boot 
mount /dev/sda1 /boot 
mv /mnt/boot/* /boot/
ls /boot/ 
# 输出: config-3.10.0-123.20.1.el7.x86_64 initrd-plymouth.img config-3.10.0-123.el7.x86_64 symvers-3.10.0-123.20.1.el7.x86_64.gz grub symvers-3.10.0-123.el7.x86_64.gz grub2 System.map-3.10.0-123.20.1.el7.x86_64 initramfs-0-rescue-134c80aa11b8447fa6186e8c09337698.img System.map-3.10.0-123.el7.x86_64 initramfs-3.10.0-123.20.1.el7.x86_64.img vmlinuz-0-rescue-134c80aa11b8447fa6186e8c09337698 initramfs-3.10.0-123.20.1.el7.x86_64kdump.img vmlinuz-3.10.0-123.20.1.el7.x86_64 initramfs-3.10.0-123.el7.x86_64.img vmlinuz-3.10.0-123.el7.x86_64 initramfs-3.10.0-123.el7.x86_64kdump.img

# 卸载 boot
umount /boot/

# 将所需的文件夹和 chroot 挂载到 /mnt
mount /dev/sda1 /mnt/boot/ 
mount --bind /dev /mnt/dev 
mount --bind /sys /mnt/sys 
mount --bind /proc/ /mnt/proc chroot /mnt/
# 安装grub
grub2-install /dev/sda

# 更新 fstab,因为引导分区的 UUID 现在不正确
cat /etc/fstab 
# 输出: Created by anaconda on Wed Mar 4 11:14:13 2015 
#Accessible filesystems, by reference, are maintained under '/dev/disk' 
#See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#/dev/mapper/centos-root / xfs defaults 1 1 
#UUID=49eb6416-2512-4129-a4be-f043c45561d5 /boot xfs defaults 1 2 
#/dev/mapper/centos-swap swap swap defaults 0 0

# 获取现在新的UUID
blkid /dev/sda1

# 获取到新的UUID后修改 /etc/fstab
vim /etc/fstab

# 重新生成 grub 配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg

# 退出 chroot 并卸载文件夹
exit umount /mnt/dev/ umount /mnt/sys/ umount /mnt/proc/ umount /mnt/boot/

# 由于 MAC 地址不同,您的网络接口可能会被重命名
dmesg | grep eth0
# 输出: systemd-udevd[111]: renamed network interface eth0 to ens293 ...

# 如果您想重新使用 eth0,请修改 /etc/default/grub 文件并在 GRUB_CMDLINE_LINUX= 的末尾包含 net.ifnames=0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

参考:https://community.spiceworks.com/how_to/114945-centos-7-backup-and-restore (opens new window)

最近更新
01
与java交个朋友
10-28
02
Spring IOC
08-31
03
MySQL底层索引性能优化
08-20
更多文章>