一、Linux系统常见的压缩命令

在Linux的环境中,压缩文件的扩展名大多是“*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2, *.xz”。但是在linux中扩展名不是没什么作用吗?这是因为,Linux支持的压缩命令非常多,人们要想解压该文档,就必须知道该文档是用什么命令来进行压缩的,所以拓展名就是为了告诉用户它是使用什么方式压缩的,那么我们就可以用对应的命令进行解压缩。

tar是一种将很多文件(目录)打包成一个文件的命令,单纯的tar命令只是打包,并不提供压缩,但后来的GNU计划中,将整个tar与压缩功能结合在一起了。

1.gzip,zcat/zmore/zless/zgrep

gzip所建立的压缩文件后缀名为.gz。该命令也可以解压缩compress、zip和gzip等软件所压缩的文件。其使用格式如下:

[dmtsai@study ~]$ gzip [-cdtv#] 文件名

[dmtsai@study ~]$ zcat 文件名.gz

选项与参数:

-c:将压缩的数据输出到屏幕上,可通过数据流重导向来处理;

-d:解压缩的参数;

-t:可以用来检验一个压缩文件的一致性~看看文件有无错误;

-v:可以显示出原文件/压缩文件案的压缩比等信息;

-#:#为数字的意思,代表压缩等级,-1最快,但是压缩比最差、-9最慢,但是压缩比最好!预设是-6。

注意:在预设状态下,使用gzip命令会压缩文件为.gz的文件,但是源文件就会被删除

zcat用于不真正解压缩文件,就能显示压缩包中文件的内容的场合。

zcat [选项] 文件名

-S:指定gzip格式的压缩包的后缀。当后缀不是标准压缩包后缀时使用此选项;

-c:将文件内容写到标注输出;

-d:执行解压缩操作;

-l:显示压缩包中文件的列表;

-L:显示软件许可信息;

-q:禁用警告信息;

-r:在目录上执行递归操作;

-t:测试压缩文件的完整性;

-V:显示命令的版本信息;

-l:更快的压缩速度;

-9:更高的压缩比。

zcat/zmore/zless则可以对应于cat/more/less的方式来读取纯文本档被压缩后的压缩文件。由于gzip这个压缩命令主要想要用来取代compress的,所以不但compress的压缩文件案可以使用gzip来解压缩,同时zcat这个命令可以同时读取compress与gzip的压缩文件。

另外,如果想从压缩文本文档中查找数据,可以使用zgrep来搜索关键词,而无需将压缩文本解压缩。如果使用compress建立的.z文件,可以使用znew将文件更新成gzip的格式。

2.bzip2,bzcat/bzmore/bzless/bzgrep

bzip2则是为了取代gzip并提供更佳的压缩比。其使用方法如下:

[dmtsai@study ~]$ bzip2 [-cdkzv#] 文件名

[dmtsai@study ~]$ bzcat 文件名.bz2

选项与参数:

-c:将压缩的过程产生的数据输出到屏幕上;

-d:解压缩的参数;

-k:保留源文件,而不会删除原始的文件喔;

-z:压缩的参数(默认值,可以不加);

-v:可以显示出原文件/压缩文件案的压缩比等信息;

-#:与gzip同样的,都是在计算压缩比的参数,-9最佳,-1最快。

  1. xz, xzcat/xzmore/xzless/xzgrep

xz压缩比相比bzip2来说更高,用法也基本上跟gzip/bzip2一致。

[dmtsai@study ~]$ xz [-dtlkc#] 文件名

[dmtsai@study ~]$ xcat 文件名.xz

选项与参数:

-d:解压缩;

-t:测试压缩文件的完整性;

-l:列出压缩文件的相关信息;

-k:保留原本的文件不删除;

-c:将数据由屏幕上输出;

-#:同上,压缩比参数。

综上所述,可以对这三个命令的性能和时间性能进行总结如下。

类型压缩比压缩所需时间
gzip最低最少
bzip2中等中等
xz最高最长

 

二、打包命令:tar、解压缩后的SELinux问题

虽然gzip、bzip2、xz也能够针对目录来进行压缩,不过它们对目录的压缩指的是“将目录内的所有文件分别进行压缩”,而不像在Windows的系统,可以使用类似WinRAR这一类的压缩软件来将好多数据打包为一个文件。

在Linux下,可以使用tar指令。它可以将多个目录或文件打包成一个大文件,并通过gzip/bzip2/xz的支持,将该文件进行压缩。

tar的参数非常多,这里仅列举几个常用的。

[dmtsai@study ~]$ tar [-z|-j|-J] [cv] [-f 待建立的新檔名] filename... <==打包与压缩

[dmtsai@study ~]$ tar [-z|-j|-J] [tv] [-f 既有的 tar檔名]             <==查看文件名

[dmtsai@study ~]$ tar [-z|-j|-J] [xv] [-f 既有的 tar檔名] [-C 目录]   <==解压缩

选项与参数:

-c:新建打包文件,可搭配-v来查看过程中被打包的文件名(filename);

-t:查看打包文件的内容含有哪些文件名;

-x:解打包或解压缩的功能,可以搭配-C(大写)在特定目录解压缩/解开;

注意:-c,-t,-x不可同时出现在一串指令列中。

-z:通过gzip的支持进行压缩/解压缩:此时文件名最好为*.tar.gz;

-j:通过bzip2的支持进行压缩/解压缩:此时文件名最好为*.tar.bz2;

-J:通过xz的支持进行压缩/解压缩:此时文件名最好为*.tar.xz;

注意:-z,-j,-J不可以同时出现在一串命令列中。

-v:在压缩/解压缩的过程中,将正在处理的文件名显示出来;

-f filename:-f后面要立刻接要被处理的文件名;

-C目录:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项;

-p(小写):保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文本;

-P(大写):保留绝对路径,亦即允许备份数据中含有根目录存在之意;

--exclude=FILE:在压缩的过程中,不要将FILE打包。

最简单只需要记住以下三个指令:

①压缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称;

②查询:tar -jtv -f filename.tar.bz2;

③解压缩:tar -jxv -f filename.tar.bz2 -C 解压缩的目录。

1.使用tar加入-z,-j或-J的参数备份/etc/目录

使用格式如下:

tar -zpcv -f /root/etc.tar.gz /etc

tar -jpcv -f /root/etc.tar.bz2 /etc

tar -Jpcv -f /root/etc.tar.xz /etc

加入p的原因是为了保存原本文件的权限和属性。备份的时候一定要把原本文件的权限都备份好。

2.查阅tar文件的数据内容,与备份文件名是否有根目录的意义

tar -jtv -f /root/etc.tar.bz2

如果加上-v,那么详细的文件权限/属性都会被列出来,如果只想知道文件名,那么就不需要加-v。我们还可以发现,每个文件名都没有了根目录。这是为了安全,我们使用tar备份可能会需要解压缩,在tar所记录的文件名就是解压缩后的实际文件名,如果没有拿掉根目录,解压缩后的文件名就是绝对路径,就会在解压缩后覆盖原来/etc/xxx的目录中去

如果确认使用绝对路径,那么就将选项里面的-p修改为-P即可。

3.将备份的数据解压缩,被考虑特定目录的解压缩(-C的应用)

默认情况下,解压缩目录是解压缩到当前目录。如果需要修改解压缩的目录,可以使用-C选项。例如

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

即将etc.tar.bz2解压到/tmp目录中。

4.仅解开单一文件的方法

我们假设以解压缩shadow文件为例。

步骤:

STEP 1:先找到我们要的文件名。

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

STEP 2:将该文件解开。用法如下:

tar -jxv -f 打包文件.tar.bz2 待解开文件名

实际运行命令为:

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

5.打包某目录,但不包含该目录下某些文件

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

6.仅备份比某个时刻新的文件(其实就是增量备份)

某些情况下,我们需要备份新文件而不是旧文件。此时--newer-mtime这个选项就极其重要。当我们仅使用--newer的时候,表示后续日期包括mtime和ctime,如果是--newer-mtime,显然只是mtime。

7.其它知识:tarfile和tarball

如果仅是打包而已,就是『tar -cv -f file.tar』而已,这个档案我们称呼为tarfile。如果还有进行压缩的支持,例如『tar -jcv -f file.tar.bz2』时,我们就称呼为tarball。

8.特殊应用:利用管道命令与数据流

在tar的使用中,有一种方式最特殊,那就是通过标准输入输出的数据流重定向(standard input/standard output)以及管道命令(pipe)的方式,将待处理的文件一边打包一边解压缩到目标目录去。

例如将/etc整个目录一边打包一遍在/tmp解压缩的命令如下:

[root@study ~]# cd /tmp

[root@study tmp]# tar -cvf - /etc | tar -xvf -

这个命令有点像cp -r /etc /tmp,但是要注意,输出文件和输入文件都变成了-,并且有一个|存在,者分别代表着standard output、standard input和管道命令。你可以把-想象为内存中的一个缓冲区,这就好理解了。

9.拓展:SELinux问题

SELinux的权限问题可能会让系统无法存取某些配置文件内容,导致影响系统的政策使用权。解决方法如下:

①通过各种可行的救援方式登入系统,然后修改/etc/selinux/config档案,将SELinux改成permissive模式,重新启动后系统就正常了;

②在第一次恢复系统后,不要立即重新启动,先使用restorecon-Rv/etc自动修复一下SELinux的类型即可;

③通过各种可行的方式登入系统,建立/.autorelabel档案,重新启动后系统会自动修复SELinux的类型,并且又会再次重新启动,之后就正常了。

三、XFS文件系统的备份与还原

使用tar是针对目录树系统进行备份,如果想要针对整个文件系统进行备份和还原,就要使用xfsdump和xfsrestore两个命令。注意xfsdump不支持目录备份

1.XFS文件系统备份:xfsdump

xfsdump除了可以进行文件系统的完整备份(full backup),还可以进行增量备份(Incremental backup)。

使用xfsdump时,请注意以下限制:

①xfsdump不支持没有挂载的文件系统备份!所以只能备份已挂载的;

②xfsdump必须使用root的权限才能操作(涉及文件系统的关系);

③xfsdump只能备份XFS文件系统;

④xfsdump备份下来的数据只能让xfsrestore解析;

⑤xfsdump是透过文件系统的UUID来分辨各个备份文件的,因此不能备份两个具有相同UUID的文件系统。

[root@study ~]# xfsdump [-L S_label] [-M M_label] [-l #] [-f 备份文件名] 待备份数据

[root@study ~]# xfsdump -I

选项与参数:

-L:xfsdump会记录每次备份的session标头,这里可以填写针对此文件系统的简易说明;

-M:xfsdump可以纪录储存媒体的标头,这里可以填写此媒体的简易说明;

-l:是L的小写,就是指定等级~有0~9共10个等级(默认为0,即完整备份);

-f:后面接产生的文件,亦可接例如/dev/st0装置文件名或其他一般文件的文件名等;

-I:从/var/lib/xfsdump/inventory列出目前备份的信息状态。

(1)用xfsdump备份完整文件系统。

#1.先确定/boot是独立的文件系统喔!

[root@study ~]# df -h /boot

Filesystem      Size  Used Avail Use% Mounted on

/dev/vda2      1014M  131M  884M  13% /boot      #挂载/boot的是/dev/vda装置!

# 看!确实是独立的文件系统喔! /boot 是挂载点!

 

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

[root@study ~]# xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot

(2)用xfsdump进行增量备份

注意:一定要进行过完整备份之后,才能进行增量备份。

# 0.看一下有没有任何文件系统被xfsdump过的资料

[root@study ~]# xfsdump -I

#1.开始建立增量备份文件,此时我们使用level1吧:

[root@study~]#xfsdump -l 1 -Lboot_2 -Mboot_2 -f /srv/boot.dump1 /boot

#2.最后再看一下是否有记录level1备份的时间点呢

[root@study~]#xfsdump -I

 

2.XFS文件系统还原:xfsrestore

[root@study ~]# xfsrestore -I        <==用来察看备份文件资料

[root@study ~]# xfsrestore [-f 备份文件] [-L S_label] [-s] 复原目录<==单一文件系统复原

[root@study ~]# xfsrestore [-f 备份文件] -r 待复原目录   <==透过增量备份文件复原系统

[root@study ~]# xfsrestore [-f 备份文件] -i 待复原目录    <==进入交互模式

选项与参数:

-I:跟xfsdump相同的输出,可查询备份数据,包括Label名称与备份时间等;

-f:后面接的就是备份文件;

-L:就是Session的Labelname,可用-I查询到的数据;

-s:需要接某特定目录,亦即仅复原某一个文件或目录之意;

-r:如果是用文件来储存备份数据,那这个就不需要使用,如果是一个磁带内有多个文件,需要这东西来达成增量恢复;

-i:进入交互模式,管理员使用的。

(1)用xfsrestore观察xfsdump后的备份数据内容

xfsrestore -I

(2)简单恢复level0的文件系统(完全备份文件)

xfsrestore -f /srv/boot.dump -L boot_all /boot

若仅复原备份文件内的grub2到/tmp/boot2/里面去的话,则为

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

(3)仅恢复增量备份资料

恢复增量备份文件与恢复单一文件系统类似,备份数据是由level0->level1->level2…进行,所以恢复也是类似。

xfsrestore -f /srv/boot.dump1 /tmp/boot

(4)仅恢复部分文件的xfsrestore交互模式

如果我们想要部分数据还原,但是我们又不知道备份文件里面有什么,就需要交互界面来做尝试。

#1.先进入备份文件内,准备找出需要备份的文件名数据,同时恢复到/tmp/boot3中

mkdir /tmp/boot3

xfsrestore -f /srv/boot.dump -i /tmp/boot3

========================= subtree selection dialog ==========================

 

the following commands are available:

pwd

ls [ <path> ]

cd [ <path> ]

add [ <path> ]       # 可以加入復原檔案列表中

delete [ <path> ]    # 從復原列表拿掉檔名!並非刪除喔!

extract              # 開始復原動作!

quit

help

ls

#此处全部省略

-> add grub

-> add grub2

-> add config-3.10.0-229.el7.x86_64

-> extract

 

四、光盘写入工具

1.mkisofs:建立镜像文件

[root@study ~]# mkisofs [-o 镜像文件] [-Jrv] [-V vol] [-m file] 待备份文件... \

>  -graft-point isodir=systemdir ...

选项与参数:

-o:后面接你想要产生的那个镜像文件的文件名;

-J:产生较兼容于windows机器的文件名结构,可增加文件名长度到64个unicode字符;

-r:透过RockRidge产生支持Unix/Linux的文件数据,可记录较多的信息(如UID/GID等);

-v:显示构建ISO文件的过程;

-Vvol:建立Volume;

-mfile:-m为排除文件(exclude)的意思,后面的文件不备份到镜像文件中;

-graft-point:graft有转嫁或移植或移植的意思。

光盘的格式一般称为iso9660,这种格式一般仅支持旧版的DOS文件名,亦即文件名只能以8.3(文件名8个字符,扩展名3个字符)的方式存在。所以要加上-r这个选项。

一般情况下,所有被添加到镜像文件中的文件都会被放置到镜像文件的根目录。为了解决这个问题,可以使用-graft-point选项,利用如下方法来定义位于镜像文件中的目录:

镜像文件中的目录所在=实际Linux文件系统的目录所在

例如:/movies/=/stv/movies/(在Linux的/srv/movies内的文件,加至镜像文件中的/movies/目录)。

(1)制作/修改开机启动光盘映像

mkisofs -o /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 .

  1. cdrecord:光盘烧录工具
[root@study ~]# wodim --devices dev=/dev/sr0...            <==查询刻录机的BUS位置

[root@study ~]# wodim -v dev=/dev/sr0 blank=[fast|all]        <==擦除重复读写光盘

[root@study ~]# wodim -v dev=/dev/sr0 -format                 <==格式化DVD+RW

[root@study ~]# wodim -v dev=/dev/sr0 [可用选项功能] file.iso

选项与参数:

--devices:用在扫瞄磁盘总线并找出可用的刻录机,后续的装置为ATA接口;

-v:在cdrecord运作的过程中,显示过程;

dev=/dev/sr0:可以找出此光驱的bus地址,非常重要;

blank=[fast|all]:blank为擦除可重复写入的CD/DVD-RW,使用fast较快,all较完整;

-format:对光盘片进行格式化,但是仅针对DVD+RW这种格式的DVD;

[可用选项功能]主要是写入CD/DVD时可使用的选项,常见的选项包括有:

-data:指定后面的档案以数据格式写入,不是以CD音轨(-audio)方式写入;

speed=X:指定刻录速度,例如CD可用speed=40为40倍数,DVD则可用speed=4之类;

-eject:指定刻录完毕后自动退出光盘;

fs=Ym:指定多少缓冲存储器,可用在将映像档先暂存至缓冲存储器。预设为4m,一般建议可增加到8m,不过,还是得视你的刻录机而定。

针对DVD的选项功能:

driveropts=burnfree:打开BufferUnderrunFree模式的写入功能

-sao:支持DVD-RW的格式

(1)检测你的刻录机位置

文本模式的刻录确实比较麻烦,需要首先找到刻录机才可以。查询刻录机的方式为:

[root@study ~]# ll /dev/sr0

brw-rw----+ 1 root cdrom 11, 0 Jun 26 22:14 /dev/sr0 # 一般 Linux 光驱文件名

[root@demo ~]# wodim --devices dev=/dev/sr0

wodim: Overview of accessible drives (1 found) :

-------------------------------------------------------------------------

0  dev='/dev/sr0'      rwrw-- : 'ASUS' 'DRW-24D1ST'

-------------------------------------------------------------------------

注意:一定要有dev=/dev/xxx,否则系统会通知找不到光盘。

(2)进行CD/DVD的刻录工作

①先擦除光盘原始内容(只读光盘无需此操作)

[root@demo ~]# wodim -v dev=/dev/sr0 blank=fast

中间会跑出一堆信息告诉你擦除的进度,而且会有10秒钟的时间等待你的取消。

②开始刻录

[root@demo ~]# wodim -v dev=/dev/sr0 speed=4 -dummy -eject /tmp/system.img

③刻录完成,测试挂载一下,检查内容。

 

五、其它常见的压缩与备份工具

1.dd

在上一章,我们使用dd来创建了一个大文件。但是实际上,dd的关键作用在于备份,其可以读取硬盘设备的内容(几乎是直接读取扇区“sector”),然后将这个设备备份成一个文件。dd有很多用途,下面选取比较重要的几个讲述如下:

[root@study ~]# dd if="input_file" of="output_file" bs="block_size" count="number"

選項與參數:

if:输入文件(input file),也可以是设备;

of:输出文件(output file),也可以是设备;

bs:计划的一个block的大小,若未指定则预设为512bytes(一个sector的大小);

count:多少个bs的意思。

dd是一个一个扇区去读写,即使没有用到的扇区也被写入到备份当,所以产生的文件会跟原本硬盘一样大。不过dd就是因为不理会文件系统,单纯有啥记录啥,因此无论磁盘内的文件系统是否认识,它都可以备份和还原。

2.cpio

cpio可以备份任何东西,包括硬件设备文件。不过cpio有个大问题,那就是cpio不会主动的去找文件来备份。一般来说,cpio要配合类似find等可以找到文件名的命令来高速cpio应该被备份的数据在哪里。

[root@study ~]# cpio -ovcB  > [file|device] <==备份

[root@study ~]# cpio -ivcdu < [file|device] <==还原

[root@study ~]# cpio -ivct  < [file|device] <==查看

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

-o:将数据copy输出到文件或设备上;

-B:让预设的Blocks可以增加至5120bytes,预设是512bytes这样的好处是可以让大文件的储存速度加快(请参考i-nodes的概念)。

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

-i:将数据自文件或设备copy出来到系统当中;

-d:自动建立目录,使用cpio所备份的数据内容不见得会在同一层目录中,因此我们

必须要让cpio在还原时可以建立新目录;

-u:自动的将较新的文件覆盖较旧的文件;

-t:需配合-i选项,可用在查看以cpio建立的文件或设备的内容。

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

-v:让储存的过程中文件名称可以在屏幕上显示;

-c:一种较新的portable format方式储存。

我们发现,上述的选项与指令中怎么会没有指定需要备份的数据呢?还有那个大于(>)与小于(<)是怎么回事呢?

因为cpio会将数据整个显示到屏幕上,因此我们可以通过将这些屏幕的数据重新导向(>)一个新的档案!至于还原呢?就是将备份文件读进来cpio(<)进行处理之意。

例如:找出/boot下所有的文件,并将其备份到/tmp/boot.cpio中去。命令如下:

[root@study ~]# cd /

[root@study /]# find boot -print

[root@study /]# find boot | cpio -ocvB > /tmp/boot.cpio

[root@study /]# ll -h /tmp/boot.cpio

-rw-r--r--. 1 root root 108M Jul  3 00:05 /tmp/boot.cpio

[root@study ~]# file /tmp/boot.cpio

/tmp/boot.cpio: ASCII cpio archive (SVR4 with no CRC)

我们使用find root来找到文件名,然后通过管道,就能讲文件名传送给cpio进行处理,最终得到/tmp/boot.cpio文件。为何要先转换到根目录再寻找boot呢,为何不直接寻找/boot呢?这是因为cpio很笨,它不会理会你给出的是绝对路径还是相对路径的文件名,所以即便你加上绝对路径的/开头,那么未来解开的时候,它也一定会覆盖掉原本的/boot