(七)压缩与备份
这世界没有压缩怎么行
一、压缩简介
日常的文件都是由01这两个数字组成的,1B=8bit,记录整数1时,其他位会补零,压缩就是使文件的空余的位放出来,把容量节省出来
我们常见的压缩包后缀有
*.Z
*.zip
*.gz
*.bz2
*.xz
*.tar
*.tar.gz
*.tar.bz2
*.tar.xz
二、压缩指令
gzip
- 可以解压
compress、zip、gzip
等软件的压缩包 - 建立的压缩包后缀是
*.gz
语法
1 | gzip [-] file |
- 要想查看
gzip
压缩的内容要使用zcat
/zmore
/zless
,查找某数据则使用egrep
- 因为
gzip
主要是想替换compress
这个压缩软件,所以gzip
同样可以解压compress
压缩的文件,zcat
也可以查看compress
压缩的内容 - 压缩文件名自定义使用指令
gzip -c filename > 自定义文件名.gz
- 更多高级用法man
bzip2
语法
1 | bzip2 [-] file |
后缀
*.bzip2
查看压缩内容有bzcat/bzmore/bzless/bzgrep
xz
1 | xz [-] file |
- 后缀
*.xz
- xzcat/xzmore/xzless/xzgrep
总结
- 三个软件的压缩比从小到大是
xz>bzip2>gzip
,压缩比越小压缩效率越好 - 压缩效率越好花费时间越长
三、打包指令tar
使用tar时要自己命名
语法
1 | tar [-z|j|J] [cv|tv|xv] [-f filename] [sourcefile] |
尝试压缩/etc这个目录的文件,42M的源文件
- 纯tar后37M
- gz形式的tar12M
- xz形式的tar8.2M
1.不过值得一提的是gz花的时间几乎1s,xz花了几乎有半分钟
2.解压过程中把路径中的/
自动去掉了是防止解压时将文件放到/etc中去,要备份/
就要加-P
3.使用time 指令
会把这个指令花费的时间显示出来
1 | [root@study ~]# du -sh /etc;ls -lh etc.tar.gz /tmp/etc.tar /tmp/etc.tar.xz |
特殊用法
- 比如只想解压出包里的一个文件时
- 先用
tv
查询包得到file
- 先用
1 | tar -xv -f .tar file |
不想打包包里的某文件时
- –exclude=file
打包比某时刻还新的文件
- 先确定时间种类和某个时间
- 参考指令
tar -cv -f filename --newer-mtime="YYYY/mm/DD" souredir/file
四、xfs文件系统备份和还原
xfsdump&xfsrestore这两个工具对CentOS来说挺重要的,专门针对xfs文件系统
(一)xfsdump备份xfs文件系统
主要两个功能
- 完整的备份整个文件系统
- 和以前的备份对比进行增量备份
限制
- 只能备份挂载的文件系统
- 需要神的旨意(root)
- 只能搞xfs系统
- 恢复只能让xfsrestore解析
- 不能备份两个相同UUID的文件系统,因为xfsdump使用UUID来识别每个文件
语法
1 | xfs [-L label] [-M label] [-l #] [-f file] dumpfile |
例子
- 整个备份/boot(注意/boot是一个单独的文件系统)到/srv/boot.dump
1 | xfsdump -l 0 -L boot -M boot -f /srv/boot.dump /boot |
- 增量备份/boot
1 | xfsdump -l 1 -L boot_1 -M boot_1 -f /srv/boot.dump1 /boot |
(二)系统还原xfsrestore
- 简单语法
1 | 1.xfsrestore - Is |
例子
- 恢复完整的文件系统
1 | xfsrestore -f /srv/boot.dump -L boot /tmp/boot |
- 恢复增量备份
1 | xfsrestore -f /srv/boot.dump1 -L boot_1 /tmp/boot |
使用diff -r dir1 dir2
可以比较连个目录的不同支持
- 恢复部分文件
1 | [root@study ~]# xfsrestore -f /srv/boot.dump -i /tmp/boot |
add
添加恢复文件、目录,extract
开始恢复
另外使用-s file/dir
也可以恢复指定文件目录
五、其他压缩备份指令
dd(disk dump)
常用来备份文件系统,会将文件系统完整的备份,包括UUID
语法
1 | dd if= of= bs= count= |
例子
我想把/boot备份一下,步骤如下
- 备份的地方:U盘,其他分区等,没多余的U盘,这里我选择分区
gdisk分出2GB的分区/dev/sda4(容量的要求要比挂载/boot的设备大)
1 | Number Start (sector) End (sector) Size Code Name |
- 使用
df /boot
查出挂载在/boot的设备
1 | [root@study /]# df /boot |
- 使用
dd if=/dev/sda2 of=dev/sda4
备份
1 | [root@study /]# dd if=/dev/sda2 of=/dev/sda4 |
因为Linux通过识别UUID来识别设备,而dd将UUID复制过来了,不能直接挂载,需要做准备工作
xfs_repair -L /dev/sda4
清除log(日志记录了UUID)uuidgen
产生新UUID
xfs_admin -U UUID /dev/sda4
自定义UUID
此时就算备份完成了,将设备挂载即可
1 | [root@study /]# mount /dev/sda4 /mnt |
可以发现备份的sda4与sda2一模一样,但是有个小问题,我原本的sda4是有2G的,怎么变成1G了?
那是因为dd将sda2的所有信息都拷过来了,分区,格式,元数据,导致两个硬盘一模一样,这时候需要执行xfs_growfs /mnt
即可(具体原因在未来的章节)
1.Linux服务器架设总结
2.进程
3.(十四)LVM
4.(十三)磁盘阵列
5.(十二)磁盘配额
6.(六)管理磁盘
7.(五)Linux文件系统管理
8.(四)Linux文件和目录