一、说明:
打算从B站学习一下shell编程,从很多的课程视频中,挑选了一个:
B站视频地址:
打算开始学习着做着笔记:
这个需要一些Linux基础,还有vim的,如果不太熟练,可以看下我之前的整理的俩个博客:
1、整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)
整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)
2、Linux下vim/vi 编辑器 命令总结
3、学习课件:
这个地址我直接把B站中评论下方分享的弄出来了,如果失效,可以下方评论,我把我下载的分享给你。
下载地址
4、之前的shell学习笔记:
shell编程学习笔记之–学习第一天
shell编程学习笔记之–学习第二天
shell编程学习笔记之–学习第三天
shell编程学习笔记之一–学习第四天
shell编程学习笔记之一–学习第五天
二、实战演练(全备份和增量备份)
这个地方我跟着视频看完了,但是有些地方没有懂,后来自己测试之后才懂,就是使用tar进行全备份和增量备份时候,-g后面跟的参数(可以理解备份文件的指纹信息)不一定放在tmp下,因为tmp和window的temp的目录差不多,就是临时文件,所以我猜想视频的讲解者也是习惯性的放在那个位置,注意后面跟的文件是这种:
第二行的一串数字是时间戳和一些其他的内容,应该用来对比的。而且后面跟的文件也可以随意命名,不过一个目录备份要命名一样,主要就是根据命名文件中的时间戳进行增量备份和全备份的。
1 | GNU tar-1.26-2 |
2 | 1574926024^@94209664^@0^@1574925940^@517187692^@64769^@2515024^@test1^@N1^@N2^@N3^@N4^@N5^@Ya^@Yb^@Yc^@Yd^@Ye^@^@^@ |
3 | ~ |
1、全局备份:
第一步:生成一个测试文件
创建一个目录和一些文件:
创建目录:
1 | $mkdir test1 |
创建5个文件
1 | $touch test1/{1,2,3,4,5} |
查看创建的文件:
1 | $ll test1/ |
2 | total 0 |
3 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 15:03 1 |
4 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 15:03 2 |
5 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 15:03 3 |
6 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 15:03 4 |
7 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 15:03 5 |
查看目前的文件:(可以看出目前只有一个test1目录)
1 | $ls |
2 | test1 |
第二步:tar备份压缩
1 | $tar -g abcdefg -czvf backup_full.tar.gz test1/ |
2 | tar: test1: Directory is new |
3 | test1/ |
4 | test1/1 |
5 | test1/2 |
6 | test1/3 |
7 | test1/4 |
8 | test1/5 |
这个时候当前目录生成了俩个文件:
一个是备份的压缩文件,一个就是我前面说的-g后面的参数文件,用来储存一个时间戳和其他信息的。
1 | $ls |
2 | abcdefg backup_full.tar.gz test1 |
第三步:查看压缩包里面的内容:
1 | $tar ztf backup_full.tar.gz |
2 | test1/ |
3 | test1/1 |
4 | test1/2 |
5 | test1/3 |
6 | test1/4 |
7 | test1/5 |
第四步:删除test1目录(模拟数据丢失)并恢复备份:
删除,查看:
1 | $rm -rf test1 |
2 | $ls |
3 | 11backup.sh abcdefg backup_full.tar.gz |
解压备份文件:
1 | $tar -zxvf backup_full.tar.gz |
2 | test1/ |
3 | test1/1 |
4 | test1/2 |
5 | test1/3 |
6 | test1/4 |
7 | test1/5 |
查看恢复文件:
1 | $ls |
2 | 11backup.sh abcdefg backup_full.tar.gz test1 |
3 | $ll test1/ |
4 | total 0 |
5 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 1 |
6 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 2 |
7 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 3 |
8 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 4 |
9 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 5 |
2、增量备份(不是接着删除后恢复的步骤):
这个就是在第一个基础上对新增加或者修改的文件进行增量备份(也可以理解为对修改的文件或者新增的文件单独备份),不是接着删除恢复的步骤。
记得增量备份的压缩包要和全局备份不能一样,后面的每个全局备份也不能一样。
第一步:新增文件+修改之前的文件,模拟正常工作情况下的数据情况:
新增文件:
1 | $touch test1/{a,b,c,d,e} |
查看新增成功:
1 | $ll test1/ |
2 | total 0 |
3 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 1 |
4 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 2 |
5 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 3 |
6 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 4 |
7 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:19 5 |
8 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:31 a |
9 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:31 b |
10 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:31 c |
11 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:31 d |
12 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:31 e |
修改文件:
1 | $echo zhaojiafu > test1/1 |
查看已经修改成功:
1 | $cat test1/1 |
2 | zhaojiafu |
第二步:增量备份(数据不丢失情况下):
这个有一点需要注意:(如果之前备份的删掉,然后进行重新解压出来的,再次进行备份,会当成全局备份,tar命令会认为没有之前备份,估计和备份目录的文件修改时间戳有关,这个只是我的猜想那个指纹快照和这个需要备份创建的所有目录和文件的最后修改时间有关,感兴趣的可以在多了解了解,如果有人知道增量备份原理,欢迎下方赐教哈)
这个结果模拟数据不丢失情况下的增量备份。
1 | $tar -g abcdefg -zcvf backup_add1.tar.gz test1/ |
2 | test1/ |
3 | test1/1 |
4 | test1/a |
5 | test1/b |
6 | test1/c |
7 | test1/d |
8 | test1/e |
从结果来看,新增的备份中只有修改的1文件和新增的a-e几个文件,原来的文件没有再次备份,达到了增量备份的效果。
3、如果结果第一步删除然后恢复的操作:
如果结果第一步删除然后恢复的操作:会把所有文件再次备份(也就是全部备份,和第一个的全局备份没有什么区别,为什么会这样?我的猜想写道刚刚增量备份里面的第二步里面了,所有我后来又重新创建新的目录和文件,测试数据不丢失的情况下的增量备份。)
4、数据丢失的恢复:(接着第2增量备份)
查看当前数据:
1 | $ls |
2 | abcdefg backup_add1.tar.gz backup_full.tar.gz test1 |
删除test1目录,模拟数据丢失:
1 | $rm -rf test1/ |
2 | $ls |
3 | abcdefg backup_add1.tar.gz backup_full.tar.gz |
准备数据恢复:
数据恢复一定要按时间顺序从早到后进行恢复(具体指先恢复第一次的全部备份,然后增量备份从先到后加压恢复,因为后面的修改文件可以覆盖前面的修改文件)
比如我的解压恢复顺序:
解压恢复最初的全部备份
1 | $tar -zxvf backup_full.tar.gz |
2 | test1/ |
3 | test1/1 |
4 | test1/2 |
5 | test1/3 |
6 | test1/4 |
7 | test1/5 |
解压后面更多的增量备份
1 | $tar -zxvf backup_add1.tar.gz |
2 | test1/ |
3 | test1/1 |
4 | test1/a |
5 | test1/b |
6 | test1/c |
7 | test1/d |
8 | test1/e |
当然实际工作中,肯定是还有更多的backup_add
压缩文件,需要更多的tar -zxvf backup_add
解压恢复命令。
到这里我也就理解了,为什么要用日期来进行增量备份的文件压缩名称了,这样更能方便根据顺序进行恢复,后续还需要每周或者每月的全局备份。
5、总结下我的理解全部备份和增量备份:
第一个难点:(根据指纹信息来进行增量备份还是全部备份)
单个周期的全部备份和增量备份,需要的指纹快照,也就是我例子中的-g
后面跟的abcdefg
文件,是否能够增量也是根据这个进行的。
比如:我把abcdefg
删除进行测试我的猜想。
先查看数据:
1 | $ll |
2 | total 16 |
3 | -rw-r--r-- 1 wb-zjf497303 users 111 Nov 28 16:58 abcdefg |
4 | -rw-r--r-- 1 wb-zjf497303 users 280 Nov 28 16:58 backup_add1.tar.gz |
5 | -rw-r--r-- 1 wb-zjf497303 users 231 Nov 28 16:54 backup_full.tar.gz |
6 | drwxr-xr-x 2 wb-zjf497303 users 4096 Nov 28 16:55 test1 |
1 | $ll test1/ |
2 | total 4 |
3 | -rw-r--r-- 1 wb-zjf497303 users 10 Nov 28 16:55 1 |
4 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:54 2 |
5 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:54 3 |
6 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:54 4 |
7 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:54 5 |
8 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:55 a |
9 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:55 b |
10 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:55 c |
11 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:55 d |
12 | -rw-r--r-- 1 wb-zjf497303 users 0 Nov 28 16:55 e |
1 | $rm -rf abcdefg |
1 | $tar -g abcdefg -zcvf backup_full2.tar.gz test1/ |
2 | tar: test1: Directory is new |
3 | test1/ |
4 | test1/1 |
5 | test1/2 |
6 | test1/3 |
7 | test1/4 |
8 | test1/5 |
9 | test1/a |
10 | test1/b |
11 | test1/c |
12 | test1/d |
13 | test1/e |
可以看出,因为之前的指纹
(应该其他称呼,我这里就称之为指纹
)被删除,所以这里再次进行压缩备份,就是全局备份,而不是之前的增量备份。这也就是我刚开始看到课件和视频,俩个代码不是一样么?为什么后面的命令就是变成增量备份了呐?直到我的一点点的摸索,发现就是和这个指纹
信息有关。
第二个难点:(文件丢失后,解压恢复后的文件,再次进行备份肯定是全局备份)
模仿文件丢失,进行删除test1目录时,虽然可以恢复文件都是和原来的一样,但是这时候指纹信息已经更改,所以再次按照增量备份命令,其实这时候已经变成全局备份了,(我的猜想是和每个文件和目录创建的时间还有关,因为恢复解压的文件可是和之前的文件创建时间戳肯定不一样,所以就认为指纹信息不符合所以进行的是全部备份。)
6、每周日进行一个备份,每日进行一个全局备份
1、tar: Removing leading `/‘ from member names错误问题:
跟着视频会改好代码之后会出现这个错误,然后需要修改参数,主要是tar主要使用相对路径,如果使用绝对路径,需要加个参数P
,这个地方很重要。
这个主要问题视频中没有讲解,最终我找到了解决方法:
2、最终我修改可以的代码:
记得自己新建一个存放指纹的目录,然后修改。后续的备份也是这个目录,比如我的代码中的设置目录为:
1 | TARGET_DIR=/home/temp/backup |
sh文件代码:我把我看懂的都讲解放到代码中了,如果有问题欢迎沟通一起讨论哈。
1 |
|
2 | #Automatic Backup Linux System Files |
3 | #by Author zhaojiafu 2019-11-28 |
4 | #Define Variable |
5 | |
6 | |
7 | #1、需要备份的目录 |
8 | SOURCE_DIR=( |
9 | $* |
10 | ) |
11 | #2、备份到目标地址 |
12 | TARGET_DIR=/home/temp/backup |
13 | #3、年 |
14 | YEAR=`date +%Y` |
15 | #4、月 |
16 | MONTH=`date +%m` |
17 | #5、日 |
18 | DAY=`date +%d` |
19 | #6、周几 |
20 | WEEK=`date +%u` |
21 | #7、时分 字符串 用来创建备份名称 |
22 | A_NAME=`date +%H%M` |
23 | FILES=system_backup.tgz |
24 | CODE=$? |
25 | |
26 | #判断是否输入需要备份的目录地址参数 |
27 | if [ -z "$*" ];then |
28 | echo -e "\033[32mUsage:\nPlease Enter Your Backup Files or Directories\n--------------------------------------------\n |
29 | \nUsage: { $0 /boot /etc}\033[0m" |
30 | exit |
31 | fi |
32 | |
33 | #判断是否含有备份 年/月/日的文件夹,没有会创建 |
34 | #Determine Whether the Target Directory Exists |
35 | if [ ! -d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then |
36 | mkdir -p $TARGET_DIR/$YEAR/$MONTH/$DAY |
37 | echo -e "\033[32mThe $TARGET_DIR Created Successfully !\033[0m" |
38 | fi |
39 | |
40 | |
41 | #全部备份(每周日) |
42 | #EXEC Full_Backup Function Command |
43 | Full_Backup(){ |
44 | # 判断是否是周日,如果是周日,进行一个将之前的指纹信息删除,然后进入今天的目录下,创建新的全部备份 |
45 | if [ "$WEEK" -eq "7" ];then |
46 | rm -rf $TARGET_DIR/snapshot |
47 | cd $TARGET_DIR/$YEAR/$MONTH/$DAY ; |
48 | tar -g $TARGET_DIR/snapshot -czvPf $FILES ${SOURCE_DIR[@]} |
49 | [ "$CODE" == "0" ]&&echo -e "--------------------------------------------\n\033[32mThese Full_Backup System Files Backup Successfully !\033[0m" |
50 | |
51 | fi |
52 | } |
53 | |
54 | |
55 | #每天的增量备份 |
56 | #Perform incremental BACKUP Function Command |
57 | Add_Backup(){ |
58 | #判断是否是周日,如果不是周日就直接进入今天(系统tr日期的今天)的目录,进行一个增量备份(这个没有删除指纹操作) |
59 | echo $WEEK |
60 | if [ $WEEK -ne "7" ];then |
61 | cd $TARGET_DIR/$YEAR/$MONTH/$DAY |
62 | tar -g $TARGET_DIR/snapshot -czvPf $A_NAME$FILES ${SOURCE_DIR[@]} |
63 | [ "$CODE" == "0" ] && echo -e "-----------------------------------------\n\033[32mThese Add_Backup System Files $TARGET_DIR/$YEAR/$MONTH/$DAY/${YEAR}_$A_NAME$FILES Backup Successfully !\033[0m" |
64 | fi |
65 | } |
66 | sleep 3 |
67 | Full_Backup;Add_Backup |
最终运行来个简单示例:
比如第一次备份,全局备份
1 | $sh 11backup.sh /home/zjf/shell_study/day01/ |
2 | 4 |
3 | tar: /home/zjf/shell_study/day01: Directory is new |
4 | /home/zjf/shell_study/day01/ |
5 | /home/zjf/shell_study/day01/first_shell.sh |
6 | /home/zjf/shell_study/day01/first_shell2.sh |
7 | /home/zjf/shell_study/day01/if_is_dir.sh |
8 | /home/zjf/shell_study/day01/if_text.sh |
9 | /home/zjf/shell_study/day01/is_file.sh |
10 | /home/zjf/shell_study/day01/score.sh |
11 | /home/zjf/shell_study/day01/test.txt |
12 | /home/zjf/shell_study/day01/var.sh |
13 | /home/zjf/shell_study/day01/var2.sh |
14 | ----------------------------------------- |
15 | These Add_Backup System Files /home/zjf/temp/backup/2019/11/28/2019_1853system_backup.tgz Backup Successfully ! |
新增加入几个文件
1 | $touch ../day01/{1,2,3} |
再次备份效果
1 | $sh 11backup.sh /home/zjf/shell_study/day01/ |
2 | 4 |
3 | /home/zjf/shell_study/day01/ |
4 | /home/zjf/shell_study/day01/1 |
5 | /home/zjf/shell_study/day01/2 |
6 | /home/zjf/shell_study/day01/3 |
7 | ----------------------------------------- |
8 | These Add_Backup System Files /home/zjf/temp/backup/2019/11/28/2019_1854system_backup.tgz Backup Successfully ! |
好了,完美结束,虽然今天就学习了这一个知识点,虽说学的不多,但是我觉得学会才是第一位,不聪明就多努力吧,加油!!!