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
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
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
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)
编辑 (opens new window)