一、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最快。 |
- 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 .
- 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。