2 Linux学习笔记:第八章:压缩与解压缩

压缩可以使压缩过的文件变小:

1、两种典型压缩技术:

2、Linux系统常见的压缩命令:gzip/bzip2/xz

2.1 gzip 命令

[root@localhost ~]# gzip [选项] 文件名

参数:

  • -a或--ascii  使用ASCII文字模式。
  • -c或--stdout或--to-stdout  把压缩后的文件输出到标准输出设备,不去更动原始文件。
  • -d或--decompress或----uncompress  解开压缩文件。
  • -f或--force  强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接。
  • -h或--help  在线帮助。
  • -l或--list  列出压缩文件的相关信息。
  • -L或--license  显示版本与版权信息。
  • -n或--no-name  压缩文件时,不保存原来的文件名称及时间戳记。
  • -N或--name  压缩文件时,保存原来的文件名称及时间戳记。
  • -q或--quiet  不显示警告信息。
  • -r或--recursive  递归处理,将指定目录下的所有文件及子目录一并处理。
  • -S<压缩字尾字符串>或----suffix<压缩字尾字符串>  更改压缩字尾字符串。
  • -t或--test  测试压缩文件是否正确无误。
  • -v或--verbose  显示指令执行过程。
  • -V或--version  显示版本信息。
  • -##为数字的意思,代表压缩等级,-1最快,但是压缩比差;-9最慢,但是压缩比最好。默认为-6。

 例一:将services文件用最佳的压缩比压缩,并保留原本的文件

mcb@mcb:-$ ls -ldSr /etc/*

mcb@mcb:-$ cd /tmp

mcb@mcb:/tmp$ gzip -9 -c services > services.gz

#">",通过该符号,将原本应该由屏幕输出的数据,转成输入到文件而不是屏幕,所以能够建立出压缩文件。只是文件名需要自己去写

2.2 bzip2 命令 

 bzip2为了替换gzip并提供更加的压缩比而来

[root@localhost ~]# bzip2 [选项] 文件名

参数:

  • -c或--stdout或--to-stdout  把压缩后的文件输出到标准输出设备,不去更动原始文件。
  • -d或--decompress或----uncompress  解开压缩文件。
  • -k: 保留原始文件,而不会删除原始的文件
  • -z: 压缩的参数(默认值,可不加)
  • -v: 显示出压缩比信息
  • -#: 与gzip相同

 2.3 xz, xzcat/xzmore/xzless/xzgrep

  优点:xz压缩比相比于gzip/bzip2而言更高,软件用法与二者几乎相同;

  缺点:运算时间比gzip久的多;

[root@localhost ~]# xz [选项] 文件名

[root@localhost ~]# xcat 文件名.xz   //查看被压缩后的文本文件

参数:其余参数与gzip相同,此处仅列出部分重要参数;

  •         -l :   列出压缩文件的相关信息
  •         -k:保留原本的文件不删除
  •         -c:将数据在屏幕上输出

3 打包命令:tar

tar 的选项与参数非常多,我们只讲几个常用的选项,更多选项可以自行 man tar 查询。
 

3.1 将数据解压至特定目录下

tar -jxv -f /root/etc.tar.bz2 -C /tmp

3.2 仅解开单一文件

之前的解压是将整个打包文件解压,而现在只需要解压打包文件中的某一个文件;

① 先找到我们需要的文件名,假设解开shadow文件

        tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'

        其中:  grep是【截取】关键词的功能

② 将该文件解开,语法与实际做法如下:

        语法:tar -jxv -f 打包文件.tar.bz2 待解开文件

        tar -jxv -f /root/etc.tar.bz2 etc/shadow

3.3 打包某目录,但不不好该目录下的某文件之做法

tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root


4 XFS文件系统的备份与还原

  • xfsdump:xfs文件系统的备份。
  • xfsstore:xfs文件系统的还原。

4.1 XFS文件系统的备份 xfsdump

       xfsdump除了可以进行文件系统的完整备份之外,还可以进行增量备份;

       xfs文件系统的备份,第一次备份为level 0完整备份以后的备份是增量备份,增量备份是:例如备份第二次level 1会和level 0比较后,将与level 0不同的文件备份过来。(各个level记录在/var/lib/xfsdump/inventory中,并且只有备份过才能用ls查看inventory里面有文件)

用法:1、xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件] 待备份数据
           2、xfsdump 【-I(大写的i)】

选项与参数:
        -l(这里是小写L):指定等级0-9,0为完整备份
        -L:对文件系统进行简易的说明。
        -M:对存储媒介进行简易的说明。
        -I(大写的i):从/var/lib/xfsdump/inventory中列出目前备份的信息状态。

4.1.1 用xfsdump备份完整地文件系统 

将/boot划分出自己的文件系统,要将整个文件系统备份可以这样做 (切换到root模式):

        步骤1:先确定/boot是独立的文件系统    df -h /boot

        步骤2:将完整备份的文件名记录成为/srv/boot.dump

 4.1.2 用xfsdump进行增量备份

4.2 XFS文件系统还原 xfsrestore

语法:xfsrestore -I(大写的i)                                                      //用来查看备份文件

           xfsrestore [-f 备份文件] [-L S_label] [-s] 待恢复目录      //单一文件全系统恢复

           xfsrestore [-f 备份文件] -r 待恢复目录                         //通过增量备份文件来恢复系统

           xfsrestore [-f 备份文件] -i 待恢复目录                           //进入交互模式

参数: -I:跟”xfsdump -I”输出相同,可查询备份数据,包括Label名称与备份时间等
            -f:接备份文件
           -L:Session label name
           -s:接特定的文件或目录,只恢复特定的文件或目录。
           -r:如果用文件来存储备份数据,则不需要使用,如果是一个磁带内有多个文件,需要此选                    项来完成增量恢复。
            -i:进入交互模式,高级管理员使用。

4.2.1 用xfsrestore观察xfsdump后的备份数据内容

[mcb@localhost ~]$ xfsrestore -I
file system 0:
        fs id:          8338105f-f263-4e05-8317-df51473f7653
        session 0:
                mount point:    localhost.localdomain:/boot
                device:         localhost.localdomain:/dev/sda1
                time:           Sat May 27 07:28:32 2023
                session label:  "boot_all"
                session id:     e414c13e-9dcf-4f92-9b8f-43e4f89fedde
                level:          0
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                        .................

        session 1:
                mount point:    localhost.localdomain:/boot
                device:         localhost.localdomain:/dev/sda1
                time:           Sat May 27 07:44:11 2023
                session label:  "boot_2"
                session id:     7a77e2f8-cb9a-4eb1-9dd8-54e609fb0eb4
                level:          1
                resumed:        NO
                subtree:        NO
                streams:        1
                stream 0:
                       .....................
xfsrestore: Restore Status: SUCCESS

4.2.2 将/boot整个恢复到最原本状态

//1、直接将数据给他覆盖回去
[root@localhost ~]# xfsrestore -f /srv/boot.dump -L boot_all /boot
xfsrestore: using file dump (drive_simple) strategy
xfsrestore: version 3.1.7 (dump format 3.0) - type ^C for status and control
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: examining media file 0
xfsrestore: reading directories
xfsrestore: 11 directories and 337 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Summary:
xfsrestore:   stream 0 /srv/boot.dump OK (success)
xfsrestore: Restore Status: SUCCESS
//2、将备份数据在/tmp/boot下面解开
[root@localhost ~]# mkdir /tmp/root
[root@localhost ~]# xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot
[root@localhost ~]# du -sm /boot /tmp/boot

4.2.3 仅恢复grub2到/tmp/boot2中

 mkdir /tmp/root2
 xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/root2

4.2.4 增量备份还原

在进行增量还原之前应先将完全备份恢复,根据执行备份的步骤进行还原。
如,备份的步骤是Level 0 –> level 1 –> Level2 …,那么执行还原的步骤也应如此。

[root@localhost ~]# mkdir /tmp/boot
[root@localhost ~]# xfsrestore -f /srv/boot.dump1 /tmp/boot

4.2.5 仅还原部分文件的xfsrestore交互模式

[root@localhost ~]# mkdir /tmp/boot2
[root@localhost ~]# xfsrestore -f /srv/boot.dump -i /tmp/boot2    //加入-i即进入了交互模式
 ========================== subtree selection dialog ==========================

the following commands are available:
        pwd
        ls [ <path> ]
        cd [ <path> ]
        add [ <path> ]
        delete [ <path> ]
        extract
        quit
        help

 -> ls
              75 initramfs-3.10.0-1160.el7.x86_64.img
              77 vmlinuz-0-rescue-822587ff2c7b4e36801d672107e07136
              76 initramfs-0-rescue-822587ff2c7b4e36801d672107e07136.img
              74 vmlinuz-3.10.0-1160.el7.x86_64
              73 symvers-3.10.0-1160.el7.x86_64.gz
              72 config-3.10.0-1160.el7.x86_64
              71 System.map-3.10.0-1160.el7.x86_64
              70 .vmlinuz-3.10.0-1160.el7.x86_64.hmac
              68 grub/
          786496 grub2/
              67 efi/

 -> add grub
 -> add grub2
 -> extract
[root@localhost ~]# ls -l /tmp/boot2
总用量 0
drwxr-xr-x. 2 root root 27 4月  24 01:18 grub
drwx------. 5 root root 97 4月  24 01:28 grub2
#可以看到就只有2个文件被恢复,当然,如果文件是目录,那么下面的子文件也会被还原回来;

5 光盘写入工具  p277

步骤:

  •         利用mkisofs命令,将所需备份数据创建成一个镜像文件
  •         利用cdrecord命令将镜像文件可到CD/DVD中

5.1 mkiosfs:建立镜像文件

5.1.1 制作一般数据光盘镜像文件

mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份文件... -graft-point isodir=systemdir...

选项与参数:

  •         -o:后面接你想要产生的那个镜像文件
  •         -J:产生较兼容windows的文件名结构,可增加文件名长度到64个unicode字符
  •         -r:通过Rock Ridge产生支持UNIX/Linux的文件数据,可记录较多信息(如UID/GID等)
  •         -v:显示创建iso文件的过程
  •         -V vol:建立Volume,有点像Windows在文件资源管理器内看到的CD卷标
  •         -m file:-m 为排除文件的意思,后面的文件不被分到镜像文件中;即指定的目录或者文                        件不会放入镜像中
  •         -graft-point: graft有转嫁或移植的意思。

例1:将/root /etc /home等目录内的数据统统刻录到/tmp目录下面,然后将刻录好的镜像文件挂载到/mnt目录下进行测试,测试完毕后,从/mnt目录中卸载

[root@localhost ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc
I: -input-charset not specified, using utf-8 (detected in locale settings)
genisoimage 1.1.11 (Linux)
Scanning /root
Scanning /root/.cache
.....(中间省略).........
Scanning /etc/exports.d
Using SYSTE000.;1 for  /system-release-cpe (system-release)
Using CENTO000.;1 for  /centos-release-upstream (centos-release)
Using CRONT000.;1 for  /crontab (crontab)
Using BASHR000.;1 for  /bashrc (bashrc)
genisoimage: Error: '/etc/bashrc' and '/root/bashrc' have the same Rock Ridge name 'bashrc'.
genisoimage: Error: '/etc/crontab' and '/root/crontab' have the same Rock Ridge name 'crontab'.
Unable to sort directory            #文件名不可以一样
NOTE: multiple source directories have been specified and merged into the root
of the filesystem. Check your program arguments. genisoimage is not tar.
#因为文件名一摸一样,所以就不给建立ISO文件了
#此时,需要删除/root/bashrc和/root/crontab这两个文件,然后重新执行一次mkisofs
[root@localhost ~]# rm /root/bashrc
rm:是否删除普通空文件 "/root/bashrc"?y
[root@localhost ~]# rm /root/crontab
rm:是否删除普通文件 "/root/crontab"?y
[root@localhost ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc
.....(中间省略).........
Writing:   The File(s)                             Start Block 1038
 20.99% done, estimate finish Sun May 28 00:34:08 2023
 41.94% done, estimate finish Sun May 28 00:34:08 2023
 62.86% done, estimate finish Sun May 28 00:34:08 2023
 83.79% done, estimate finish Sun May 28 00:34:09 2023
Total translation table size: 0
Total rockridge attributes bytes: 449867
Total directory bytes: 1988608
Path table size(bytes): 13050
Done with: The File(s)                             Block(s)    22682
Writing:   Ending Padblock                         Start Block 23720
Done with: Ending Padblock                         Block(s)    150
Max brk space used 420000
23870 extents written (46 MB)
[root@localhost ~]# ll -h /tmp/system.img
-rw-r--r--. 1 root root 47M 5月  28 00:34 /tmp/system.img
[root@localhost ~]# mount -o loop /tmp/system.img /mnt        #将镜像文件挂载到/mnt目录下
mount: /dev/loop0 写保护,将以只读方式挂载
[root@localhost ~]# df -h /mnt
文件系统        容量  已用  可用 已用% 挂载点
/dev/loop0       47M   47M     0  100% /mnt
[root@localhost ~]# ls /mnt
[root@localhost ~]# umount /mnt        #测试完进行卸载
[root@localhost ~]# df -h /mnt
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        18G  5.4G   13G   31% /

上面建立镜像文件的方式会将三个目录(/root /etc /home) 的数据全部放置到镜像文件的最顶层目录。尤其由于/root/etc的存在,导致/etc的数据似乎没有被包含进来的样子,这样很不合理。此时可以使用-graft-point来处理;

[root@localhost ~]# mkisofs -r -V 'linux file' -o /tmp/system.img -m /root/etc -graft-point /root=/root /home=/home /etc=/etc
[root@localhost ~]# ll -h /tmp/system.img
-rw-r--r--. 1 root root 47M 5月  28 00:58 /tmp/system.img
[root@localhost ~]# mount -o loop /tmp/system.img /mnt
mount: /dev/loop0 写保护,将以只读方式挂载
[root@localhost ~]# ll /mnt
总用量 46
dr-xr-xr-x. 147 root root 38912 5月  27 19:25 etc
dr-xr-xr-x.   3 root root  2048 4月  24 01:27 home
dr-xr-xr-x.   5 root root  4096 5月  28 00:33 root
dr-xr-xr-x.   8 root root  2048 5月  28 00:58 rr_moved
[root@localhost ~]# umount /mnt
#此时可以看到,数据是分门别类地存储在各个目录中

5.1.2 制作/修改可启动光盘镜像文件

rsync:可以完整复制所有的权限与属性,也能够进行镜像处理,相当好用的命令

例如:rsync -a /mnt/ /srv/newcd        #将所有的数据复制到/srv/newcd中

5.2 wodim:光盘刻录工具

wodim --devices dev=/dev/sr0...              #查询刻录机的bus位置
wodim -v dev=/dev/sr0 blank=[fast | all]     #抹除重复读写盘
wodim -v dev=/dev/sr0 -format                #格式化DVD+RW
wodim -v dev=/dev/sro [选项] file.iso

参数

  • –devices:用在扫描磁盘总线并找出可用的刻录机,后续的设备为ATA接口;
  • -v:在cdrecord运行的过程中显示过程;
  • dev=/dev/sr0:可以找出此光驱的bus地址,重要;
  • blank=[fast|all]:blank为抺除可重复写入的CD/DVD-RW,使用fask较快,all较完整;

[选项]

  • -data:指定后面的文件以数据格式写入,不是以CD音轨(-audio)方式写入;
  • speed=X:指定记录速度
  • -eject:指定记录完毕后自动推出光盘
  • fs=Ym:指定缓冲区大小

针对DVD的选项功能

  • driveropts=burnfree:打开Buffer Underrun Free模式的写入功能;
  • -sao:支持DVD-RW的格式

5.2.1 检测刻录机所在位置

[root@localhost ~]# ll /dev/sr0
brw-rw----+ 1 root cdrom 11, 0 5月  27 06:55 /dev/sr0
[root@localhost ~]# wodim --devices dev=/dev/sr0
wodim: Overview of accessible drives (1 found) :
-------------------------------------------------------------------------
 0  dev='/dev/sr0'      rwrw-- : 'NECVMWar' 'VMware IDE CDR10'
-------------------------------------------------------------------------

5.2.2 进行CD/DVD的刻录操作

#1. 首先抹除光盘的原始内容
wodim -v dev=/dev/sr0 blank=fast
#2. 开始刻录,将/tmp/system.img刻录到光盘/dev/sr0中
wodim -v dev=/dev/sr0 speed=4 -eject /tmp/system.img
#3. 测试完毕后,检验一下挂载,检验内容
mount /dev/sr0 /mnt
df -h /mnt
#4. 卸载
umount /mnt

6 dd命令和cpio命令:都用于备份

6.1 dd命令

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

用途一:创建指定大小的文件

[root@mcb ~]# dd if=/dev/zero of=/tmp/1G.txt bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 31.19 s, 34.4 MB/s

用途二:给磁盘的分区做备份

1. 磁盘分区的备份

dd if=/etc/passwd of=/tmp/passwd.back

2. 磁盘分区的还原

dd if=/root/sda1.bak of=/dev/sda1 

3. 给磁盘备份

[root@localhost ~]# dd if=/dev/vda2 of=/dev/sda1        //此时会创建两个一摸一样的磁盘

6.2 cpio命令

cpio -oBvc > [文件或者装置名] 备份
cpio -ivcdu < [文件或者装置名] 恢复
cpio -ivct < [文件或者装置名] 查看

备份会使用到的选项与参数: 

  • -o: 将文件拷贝打包成文件或者将文件输出到设备上。
  • -B: 让默认的Blocks可以增大到 5120 bytes ,默认Blocks为 512 bytes ,这样做的好处是可以加快存取速度。

还原会使用到的选项与参数:

  • -i: 将打包文件解压或者将设备上的备份还原到系统。
  • -t: 查看 cpio 打包的文件内容或者输出到设备上的文件内容。
  • -d: 在 cpio 还原文件的过程中,自动的建立相应的目录。
  • -u:自动将较新的问价覆盖较旧的文件

一些可共用的选项与参数:

  • -c: 一种较新的存储方式。
  • -v: 显示打包过程中的文件名称。

例1. 找出/boot下面的所有文件,并将其备份到/tmp/boot.cpio中

[root@localhost ~]# cd /
[root@localhost /]# find boot -print
boot
boot/efi
boot/efi/EFI
.......(以下省略).......
#通过find我们可以找到boot下面应该要存在的文件名,包括文件与目录,但是不要是绝对路径
[root@localhost /]# find boot | cpio -ocvB > /tmp/boot.cpio  
#通过find boot找到文件名,然后将文件名给cpio来进行处理。最终得到/tmp/boot.cpio这个文件;
[root@localhost /]# ll -h /tmp/boot.cpio
-rw-r--r--. 1 root root 146M 5月  28 19:06 /tmp/boot.cpio

cpio可以将系统的数据完全备份到磁带中,若有磁带设备

备份:find / | cpio -ocvB > /dev/st0

还原:cpio -idvc < /dev/st0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值