Skip to content

07 打包、压缩与备份

1. 压缩

分别使用gzipbzip2xz压缩的文件,压缩性能越来越好,但是压缩时间越来越长:

[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