07 打包、压缩与备份
1. 压缩⚓
分别使用gzip
、bzip2
、xz
压缩的文件,压缩性能越来越好,但是压缩时间越来越长:
[root@dev tmp]# ll -Sh services*
-rw-r--r-- 1 root root 655K Sep 29 11:29 services
-rw-r--r-- 1 root root 133K Sep 29 11:29 services.gz
-rw-r--r-- 1 root root 122K Sep 29 11:08 services.bz2
-rw-r--r-- 1 root root 98K Sep 29 11:08 services.xz
压缩包的查看/内容查找可使用对应的指令来查看:
- gzip:zcat, zmore, zless, zgrep, zegrep, zfgrep
- bzip2:bzcat, bzmore, bzless, bzgrep
- xz:xzcat, xzmore, xzless, xzgrep, xzegrep, xzfgrep
2. 打包⚓
压缩指令对目录的压缩是将目录下的文件分别压缩,而不是搞成一个压缩包的形式。
tar [OPTION...] [FILE]...
Options:
-C, --directory=DIR 切换目录
-z, --gzip 通过gzip压缩/解压缩
-j, --bzip2 通过bzip2压缩/解压缩
-J, --xz 通过xz压缩/解压缩
-p, --preserve-permissions 保留文件的权限(默认时超级用户权限)
-P, --absolute-names 保留根路径,即打包以“/”开头的文件或目录时会将根目录也包含进去,这样解压后会覆盖掉根目录的文件,非常危险!!!
--exclude=PATTERN 排除文件
--newer 只打包mtime、ctime比该时间新的文件(夹)
--newer-mtime 只打包mtime比该时间新的文件(夹)
[root@dev tmp]# ll -h compress/
total 1016K
-rw-r--r-- 1 root root 655K Sep 29 11:29 services
-rw-r--r-- 1 root root 122K Sep 29 11:08 services.bz2
-rw-r--r-- 1 root root 133K Sep 29 11:29 services.gz
-rw-r--r-- 1 root root 98K Sep 29 11:08 services.xz
[root@dev tmp]# tar -Jcp -f compress.tar.xz --exclude=services.*z compress/
[root@dev tmp]# tar -tvf compress.tar.xz
drwxr-xr-x root/root 0 2019-09-29 13:49 compress/
-rw-r--r-- root/root 670293 2019-09-29 11:29 compress/services
-rw-r--r-- root/root 123932 2019-09-29 11:08 compress/services.bz2
[root@dev tmp]# tar -jpcvf etc.tar.bz2 --newer-mtime 2019-09-28 /etc/
还可以将文件打包到特别的设备去:
# 将文件打包到磁带机中
tar -cv -f /dev/st0 /home /root /etc
3. XFS 的备份与还原⚓
备份已挂载的xfs文件系统。
3.1 xfsdump⚓
支持累积备份,类似于版本控制系统。
xfsdump [ options ] -f dest [ -f dest ... ] filesystem
xfsdump -I [ subopt=value ... ]
filesystem不能以“/”结尾!
Options:
-f 输出文件,也可以接 /dev/st0 设备
-l 备份等级,类似于git的每次提交的id,0~9,0为最低
-L session_label 设置 session label
-M label [ -M label ... ] 设置 media label
-I 从 /var/lib/xfsdump/inventory/ 列出备份信息
[root@dev tmp]# df -hT /boot
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 xfs 1014M 276M 739M 28% /boot
# 这里的挂载点不能以“/”结尾!!!
[root@dev tmp]# xfsdump -l 0 -L boot_all -M boot_all -f boot.xfsdump /boot
[root@dev tmp]# xfsdump -I
file system 0:
fs id: decc4fd4-a5a2-487d-bcdc-9125218509c4
session 0:
mount point: dev:/boot
device: dev:/dev/sda1
time: Sun Sep 29 15:21:04 2019
session label: "boot_all"
session id: 344880f4-819d-4cea-ab22-0cb1041a1e6c
level: 0
resumed: NO
subtree: NO
streams: 1
stream 0:
pathname: /tmp/boot.xfsdump
start: ino 68 offset 0
end: ino 1573036 offset 0
interrupted: NO
media files: 1
media file 0:
mfile index: 0
mfile type: data
mfile size: 254765568
mfile start: ino 68 offset 0
mfile end: ino 1573036 offset 0
media label: "boot_all"
media id: 1e1be93f-00fe-4f6c-93f1-1fbd37b550c0
# 有了原始备份之后才可进行累积备份
[root@dev tmp]# xfsdump -l 1 -L boot_1 -M boot_1 -f boot.xfsdump1 /boot
[root@dev tmp]# xfsdump -I
······
session 1:
mount point: dev:/boot
device: dev:/dev/sda1
time: Sun Sep 29 15:28:51 2019
session label: "boot_1"
session id: 6faa4cb0-3a61-4b68-b0c1-b31735cad2c1
level: 1
resumed: NO
subtree: NO
streams: 1
stream 0:
pathname: /tmp/boot.xfsdump1
start: ino 238861 offset 0
end: ino 238862 offset 0
interrupted: NO
media files: 1
media file 0:
mfile index: 0
mfile type: data
mfile size: 23176
mfile start: ino 238861 offset 0
mfile end: ino 238862 offset 0
media label: "boot_1"
media id: 8584b89d-eb90-4389-866e-167fdfdce0b5
3.2 xfsrestore⚓
xfsrestore [ options ] -f source [ -f source ... ] dest
xfsrestore -I [ subopt=value ... ]
Options:
-L 指定复原的 session_label
-s 只复原该文件或目录
-r 通过累积备份文件复原。如果是用文件存储备份数据,不需要该选项;如果一个磁带内有多个文件,需要该选项
-i 交互模式
-I 列出备份信息
复原时需要按照level0->...->level9
的顺序去复原。
[root@dev tmp]# xfsrestore -f boot.xfsdump -L boot_all /boot
[root@dev tmp]# xfsrestore -f boot.xfsdump1 -L boot_1 /boot
# 交互模式。只会列出与目的命令的差异,所以不要写真正的挂载点
[root@dev tmp]# xfsrestore -i -f boot.xfsdump boot2/
4. 光盘烧录⚓
4.1 创建镜像文件⚓
mkisofs
指向genisoimage
:
genisoimage [options] [-o filename] pathspec [pathspec ...]
Options:
-graft-points 允许对文件(夹)使用移植点。用于定义镜像文件中的目录,格式是:镜像中的文件目录=linux中的文件目录
-J 增加文件名长度到64个unicode字符。当镜像被用于Windows系统时很有用处
-r 记录较多的信息(UID、GID等)
-V volid 指定写入主block的volume id(volume name or label)
-m glob 排除文件。glob:shell 通配符表达式
-b eltorito_boot_image 制作x86启动CD时指定启动镜像
-c boot_catalog 制作El Torito启动CD时要求的启动目录
-no-emul-boot 创建非仿真(no emulation)镜像
-boot-load-size load_sectors 指定在无仿真模式下加载的"虚拟"(512 字节)扇区数。必须时4的倍数
-R 使用Rock Ridge协议生成SUS和RR记录,进一步描述ISO9660 文件系统上的文件
-T 在每个文件下生成一个 TRANS.TBL 文件,用于non-Rock Ridge-capable系统识别正确的文件名
制作文件备份镜像:
# 在不使用 -graft-points 选项时,会将目录的数据全部放到镜像文件中的最顶层
[root@dev tmp]# mkisofs -r -v -V test-mkisofs -m projects -m isos -m idea-IU* -m clion-2018.3 -m docker -m .CLion2018.3 -o test.img /home /root
# 使用 -graft-points 选项来定制数据所在目录
[root@dev tmp]# mkisofs -r -v -V test-mkisofs -m projects -m isos -m idea-IU* -m clion-2018.3 -m docker -m .CLion2018.3 -m .PyCharm2016.2 -m spice-package -o test.img -graft-points /home=/home /linux/root=/root
[root@dev tmp]# mount test.img img/
[root@dev tmp]# cd img/
[root@dev img]# tree -d -L 2
.
├── home
│ ├── amhello-1.0
│ ├── sink
│ ├── study
│ ├── tmp
│ ├── user1
│ ├── user2
│ └── wine-3.0
├── linux
│ └── root
└── rr_moved
制作系统启动盘,本次使用VMware虚拟机:
# 挂载或下载一个CentOS的iso镜像到虚拟机中
$ cd /run/media/root/CentOS\ 7\ x86_64/
# 复制到新的目录下
$ rsync -a . /tmp/img/
# 进入目录制作镜像
$ cd /tmp/img/
$ mkisofs -o /tmp/custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -V 'CentOS 7 x86_64' -boot-load-size 4 -boot-info-table -R -J -v -T .
# 查看镜像
$ cd ..; isoinfo -d -i custom.iso
4.2 烧录到光盘⚓
centos7使用wodim进行烧录,但为了向后兼容,将cdrecode链接到了wodim。
[root@dev ~]# ll /usr/bin/cdrecord
lrwxrwxrwx. 1 root root 26 Nov 8 2018 /usr/bin/cdrecord -> /etc/alternatives/cdrecord
[root@dev ~]# ll /etc/alternatives/cdrecord
lrwxrwxrwx. 1 root root 14 Nov 8 2018 /etc/alternatives/cdrecord -> /usr/bin/wodim
VMware好像没法实验,先记录一下操作:
# 扫描烧录机
$ wodim --devices dev=/dev/sr0
wodim: Overview of accessible drives (1 found) :
-------------------------------------------------------------------------
0 dev='/dev/sr0' rwrw-- : 'NECVMWar' 'VMware IDE CDR10'
-------------------------------------------------------------------------
# 擦除光盘内容。blank:fast,all
$ wodim -v dev=/dev/sr0 blank=fast
# 烧录。eject:烧录完毕后退出光盘
$ wodim -v dev=/dev/sr0 speed=4 -dummy -eject custom.iso
# 挂载测试
5. 其它备份工具⚓
5.1 dd⚓
# 备份普通文件,默认是 512Bytes 一个单位
[root@dev tmp]# dd if=/etc/passwd of=passwd.back
# 备份光盘
[root@dev tmp]# dd if=/dev/sr0 of=test.img
# 备份到USB,不需要格式化
[root@dev tmp]# dd if=test.img of=/dev/sdd
# 备份文件系统
[root@dev tmp]# dd if=/dev/sda1 of=sda1.img
# 先创建一个分区 /dev/sdd1(必须大于要备份的文件) ,用于备份 /dev/sda1
[root@dev tmp]# df -h /boot
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 1014M 276M 739M 28% /boot
[root@dev tmp]# dd if=/dev/sda1 of=/dev/sdd1
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 6.84414 s, 157 MB/s
# 一定要清理log
[root@dev tmp]# xfs_repair -L /dev/sdd1
# 改掉原来的UUID
[root@dev tmp]# uuidgen
8de09e65-741b-40d0-a66a-caa9fff7bdc5
[root@dev tmp]# xfs_admin -U 8de09e65-741b-40d0-a66a-caa9fff7bdc5 /dev/sdd1
Clearing log and setting UUID
writing all SBs
new UUID = 8de09e65-741b-40d0-a66a-caa9fff7bdc5
[root@dev tmp]# mount /dev/sdd1 sdd1/
[root@dev tmp]# xfs_growfs sdd1
# 很奇怪,备份的文件比原文件少了很多东西(三个版本的内核文件只保留了一份,还不是同一个版本的)。???
[root@dev tmp]# ll sdd1/
total 21820
-rw-r--r--. 1 root root 137696 Nov 23 2016 config-3.10.0-514.el7.x86_64
drwxr-xr-x. 3 root root 17 Nov 8 2018 efi
drwxr-xr-x. 2 root root 4096 Nov 8 2018 extlinux
drwxr-xr-x. 2 root root 27 Nov 8 2018 grub
drwx------. 5 root root 132 Sep 19 08:31 grub2
-rw------- 1 root root 13407979 Jun 12 09:26 initramfs-3.10.0-957.21.2.el7.x86_64kdump.img
-rw-r--r--. 1 root root 277953 Nov 23 2016 symvers-3.10.0-514.el7.x86_64.gz
-rw-------. 1 root root 3113253 Nov 23 2016 System.map-3.10.0-514.el7.x86_64
-rw-r--r-- 1 root root 0 Sep 29 15:27 test-xfsdump
-rwxr-xr-x. 1 root root 5392080 Nov 23 2016 vmlinuz-3.10.0-514.el7.x86_64
[root@dev tmp]# ll /boot/
total 239472
-rw-r--r--. 1 root root 137696 Nov 23 2016 config-3.10.0-514.el7.x86_64
-rw-r--r--. 1 root root 147859 Sep 26 2018 config-3.10.0-862.14.4.el7.x86_64
-rw-r--r-- 1 root root 151923 Jun 5 22:30 config-3.10.0-957.21.2.el7.x86_64
drwxr-xr-x. 3 root root 17 Nov 8 2018 efi
drwxr-xr-x. 2 root root 4096 Nov 8 2018 extlinux
drwxr-xr-x. 2 root root 27 Nov 8 2018 grub
drwx------. 5 root root 132 Sep 19 08:31 grub2
-rw-------. 1 root root 64521440 Nov 8 2018 initramfs-0-rescue-3e584bbb71104099905f8ba7873188ea.img
-rw-------. 1 root root 31516942 Nov 8 2018 initramfs-3.10.0-514.el7.x86_64.img
-rw-------. 1 root root 13729374 Nov 8 2018 initramfs-3.10.0-514.el7.x86_64kdump.img
-rw-------. 1 root root 31500158 Nov 8 2018 initramfs-3.10.0-862.14.4.el7.x86_64.img
-rw------- 1 root root 13399648 May 20 08:52 initramfs-3.10.0-862.14.4.el7.x86_64kdump.img
-rw------- 1 root root 31647417 Jun 11 17:06 initramfs-3.10.0-957.21.2.el7.x86_64.img
-rw------- 1 root root 13407979 Jun 12 09:26 initramfs-3.10.0-957.21.2.el7.x86_64kdump.img
-rw-r--r--. 1 root root 10209490 Nov 8 2018 initrd-plymouth.img
-rw-r--r--. 1 root root 277953 Nov 23 2016 symvers-3.10.0-514.el7.x86_64.gz
-rw-r--r--. 1 root root 305158 Sep 26 2018 symvers-3.10.0-862.14.4.el7.x86_64.gz
-rw-r--r-- 1 root root 314128 Jun 5 22:30 symvers-3.10.0-957.21.2.el7.x86_64.gz
-rw-------. 1 root root 3113253 Nov 23 2016 System.map-3.10.0-514.el7.x86_64
-rw-------. 1 root root 3414754 Sep 26 2018 System.map-3.10.0-862.14.4.el7.x86_64
-rw------- 1 root root 3545794 Jun 5 22:30 System.map-3.10.0-957.21.2.el7.x86_64
-rw-r--r-- 1 root root 0 Sep 29 15:27 test-xfsdump
-rwxr-xr-x. 1 root root 5392080 Nov 8 2018 vmlinuz-0-rescue-3e584bbb71104099905f8ba7873188ea
-rwxr-xr-x. 1 root root 5392080 Nov 23 2016 vmlinuz-3.10.0-514.el7.x86_64
-rwxr-xr-x. 1 root root 6398144 Sep 26 2018 vmlinuz-3.10.0-862.14.4.el7.x86_64
-rwxr-xr-x 1 root root 6643904 Jun 5 22:30 vmlinuz-3.10.0-957.21.2.el7.x86_64
5.2 cpio⚓
可以备份任何东西。
# 备份
cpio -o [options] > file/device
Options:
-a 不修改被备份文件的atime
-B 设置 I/O block size to 5120 bytes.默认是 512 bytes.
-c 使用新的 (SVR4) portable format,与“-H newc”一样. 老的 portable (ASCII) archive format 使用“-H odc”
# 还原
cpio -i < file/device
Options:
-m 不修改mtime
-c 同备份选项一样
-d 自动创建目录。因为使用cpio备份的数据内容不一定会在同一个目录中,所以必须让它可以创建目录
-u 自动使用新文件覆盖旧文件
-t 查看备份文件的内容
备份及还原都适用的选项:
--no-absolute-filenames 在当前目录下创建文件
# 输入不能含有根目录!!!所以先切换到根目录下再进行备份
[root@dev tmp]# cd /
[root@dev /]# find boot | cpio -ocBav > /tmp/boot.cpio
[root@dev tmp]# cpio -icdm < boot.cpio
496612 blocks
# 内容一致
[root@dev tmp]# ll boot