鸟哥的Linux私房菜_基础版_学习笔记5:第九章 文件与文件系统的压缩与打包

9.2 Linux 系统常见的压缩命令:
*.Z         compress 程序压缩的文件;
*.gz        gzip 程序压缩的文件;
*.bz2       bzip2 程序压缩的文件;
*.tar       tar 程序打包的数据,并没有压缩过;
*.tar.gz    tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2   tar 程序打包的文件,其中并且经过 bzip2 的压缩
9.2.1 compress 
[root@www ~]# apt-get install ncompress
[root@www ~]# compress [-rcv] 文件或目录<==这里是压缩
[root@www ~]# uncompress 文件.Z         <==这里是解压缩选项与参数:
-r  :可以连同目录下的文件也同时给予压缩呢!
-c  :将压缩数据输出成为 standard output (输出到萤幕)
-v  :可以秀出压缩后的文件资讯以及压缩过程中的一些档名变化。
9.2.2 gzip, zcat (只能用于单文件,不能用于文件夹)
gzip用于压缩和解压,  zcat 如果源文件是文字档,可以用zcat查看。
注意:解压时不要用gunzip命令,不好背。使用gzip -d 来进行解压缩。
gzip 可以说是应用度最广的压缩命令了!目前 gzip 可以解开 compress, zip 与 gzip 等软件所压缩的文件。 至於 gzip 所创建的压缩档为 *.gz 的档名喔!

[root@www ~]# gzip [-cdtv#] 档名
[root@www ~]# zcat 档名.gz选项与参数:
-c  :将压缩的数据输出到萤幕上,可透过数据流重导向来处理;
-d  :解压缩的参数;
-t  :可以用来检验一个压缩档的一致性~看看文件有无错误;
-v  :可以显示出原文件/压缩文件的压缩比等资讯;
-#  :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
[root@www tmp]# gzip -v man.config
man.config:      56.1% -- replaced with man.config.gz
范例三:将范例一的文件解压缩
[root@www tmp]# gzip -d man.config.gz# 不要使用 gunzip 这个命令,不好背!使用 gzip -d 来进行解压缩!
# 与 gzip 相反, gzip -d 会将原本的 .gz 删除,产生原本的 man.config 文件。范例四:将范例三解开的 man.config 用最佳的压缩比压缩,并保留原本的文件
[root@www tmp]# gzip -9 -c man.config > man.config.gz
技术分享

其实 gzip 的压缩已经最佳化过了,所以虽然 gzip 提供 1~9 的压缩等级,不过使用默认的 6 就非常好用了! 因此上述的范例四可以不要加入那个 -9 的选项。范例四的重点在那个 -c 与 > 的使用罗!

9.2.3bzip2, bzcat 

若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的。 bzip2 真是很不错用的东西~这玩意的压缩比竟然比 gzip 还要好~至於 bzip2 的用法几乎与 gzip 相同! 看看底下的用法吧!

[root@www ~]# bzip2 [-cdkzv#] 档名
[root@www ~]# bzcat 档名.bz2选项与参数:
-c  :将压缩的过程产生的数据输出到萤幕上!
-d  :解压缩的参数
-k  :保留原始文件,而不会删除原始的文件喔!
-z  :压缩的参数
-v  :可以显示出原文件/压缩文件的压缩比等资讯;
-#  :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!范例一:将刚刚的 /tmp/man.config 以 bzip2 压缩
[root@www tmp]# bzip2 -z man.config # 此时 man.config 会变成 man.config.bz2 !范例二:将范例一的文件内容读出来!
[root@www tmp]# bzcat man.config.bz2# 此时萤幕上会显示 man.config.bz2 解压缩之后的文件内容!!范例三:将范例一的文件解压缩
[root@www tmp]# bzip2 -d man.config.bz2范例四:将范例三解开的 man.config 用最佳的压缩比压缩,并保留原本的文件
[root@www tmp]# bzip2 -9 -c man.config > man.config.bz2

9.3 打包命令: tar
9.3.1 tar

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

[root@www ~]# tar [-j|-z] [cv] [-f 创建的档名] filename...<==打包与压缩
[root@www ~]# tar [-j|-z] [tv] [-f 创建的档名]            <==察看档名
[root@www ~]# tar [-j|-z] [xv] [-f 创建的档名] [-C 目录]  <==解压缩选项与参数:
-c  :创建打包文件,可搭配 -v 来察看过程中被打包的档名(filename)
-t  :察看打包文件的内容含有哪些档名,重点在察看『档名』就是了;
-x  :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
      特别留意的是, -c, -t, -x 不可同时出现在一串命令列中。
-j  :透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2
-z  :透过 gzip  的支持进行压缩/解压缩:此时档名最好为 *.tar.gz
-v  :在压缩/解压缩的过程中,将正在处理的档名显示出来!
-f filename:-f 后面要立刻接要被处理的档名!建议 -f 单独写一个选项罗!
-C 目录    :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

其他后续练习会使用到的选项介绍:
-p  :保留备份数据的原本权限与属性,常用於备份(-c)重要的配置档
-P  :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包! 

其实最简单的使用 tar 就只要记忆底下的方式即可:


  • 压 缩:tar -jcv -f filename.tar.bz2 filename要被压缩的文件或目录名称
  • 查 询:tar -jtv -f filename.tar.bz2
  • 解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

  • 压 缩:tar -zcv -f filename.tar.gz filename要被压缩的文件或目录名称
  • 查 询:tar -ztv -f filename.tar.gz
  • 解压缩:tar -zxv -f filename.tar.gz -C 欲解压缩的目录
    -C 目录    :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。

    • 将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)

    那如果想要解打包呢?很简单的动作就是直接进行解打包嘛!

    [root@www ~]# tar -jxv -f /root/etc.tar.bz2
    [root@www ~]# ll....(前面省略)....
    drwxr-xr-x 105 root root    12288 Nov 11 04:02 etc
    ....(后面省略)....

    此时该打包文件会在『本目录下进行解压缩』的动作! 所以,你等一下就会在家目录底下发现一个名为 etc 的目录罗!所以罗,如果你想要将该文件在 /tmp 底下解开, 可以 cd /tmp 后,再下达上述的命令即可。不过,这样好像很麻烦呢~有没有更简单的方法可以『指定欲解开的目录』呢? 有的,可以使用 -C 这个选项喔!举例来说:

    [root@www ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
    [root@www ~]# ll /tmp....(前面省略)....
    drwxr-xr-x 105 root root    12288 Nov 11 04:02 etc
    ....(后面省略)....

    9.4 完整备份工具:dump
    9.4.1 dump

    其实 dump 的功能颇强,他除了可以备份整个文件系统之外,还可以制定等级喔!什么意思啊! 假设你的 /home 是独立的一个文件系统,那你第一次进行过 dump 后,再进行第二次 dump 时, 你可以指定不同的备份等级,假如指定等级为 1 时,此时新备份的数据只会记录与第一次备份所有差异的文件而已。 

    技术分享技术分享
    图 4.1.1、dump 运行的等级 (level)

    [root@www ~]# dump [-Suvj] [-level] [-f 备份档] 待备份数据
    [root@www ~]# dump -W选项与参数:
    -S    :仅列出后面的待备份数据需要多少磁碟空间才能够备份完毕;
    -u    :将这次 dump 的时间记录到 /etc/dumpdates 文件中;
    -v    :将 dump 的文件过程显示出来;
    -j    :加入 bzip2 的支持!将数据进行压缩,默认 bzip2 压缩等级为 2
    -level:就是我们谈到的等级,从 -0 ~ -9 共十个等级;
    -f    :有点类似 tar 啦!后面接产生的文件,亦可接例如 /dev/st0 装置档名等
    -W    :列出在 /etc/fstab 里面的具有 dump 配置的 partition 是否有备份过?
    详情看原书

    9.4.2 restore

    备份档就是在急用时可以回复系统的重要数据,所以有备份当然就得要学学如何复原了! dump 的复原使用的是 restore 这个命令!这个命令的选项也非常的多~您可以自行 man restore 瞧瞧! 鸟哥在这里仅作个简单的介绍罗!

    [root@www ~]# restore -t [-f dumpfile] [-h]       <==用来察看 dump 档
    [root@www ~]# restore -C [-f dumpfile] [-D 挂载点]<==比较dump与实际文件
    [root@www ~]# restore -i [-f dumpfile]            <==进入互动模式
    [root@www ~]# restore -r [-f dumpfile]            <==还原整个文件系统选项与参数:
    相关的各种模式,各种模式无法混用喔!例如不可以写 -tC 啦!
    -t  :此模式用在察看 dump 起来的备份档中含有什么重要数据!类似 tar -t 功能;
    -C  :此模式可以将 dump 内的数据拿出来跟实际的文件系统做比较,
          最终会列出『在 dump 文件内有记录的,且目前文件系统不一样』的文件;
    -i  :进入互动模式,可以仅还原部分文件,用在 dump 目录时的还原!
    -r  :将整个 filesystem 还原的一种模式,用在还原针对文件系统的 dump 备份;
    其他较常用到的选项功能:
    -h  :察看完整备份数据中的 inode 与文件系统 label 等资讯
    -f  :后面就接你要处理的那个 dump 文件罗!
    -D  :与 -C 进行搭配,可以查出后面接的挂载点与 dump 内有不同的文件!

    9.5 光盘写入工具

    虽然 Linux 图形介面已经有不少的烧录软件可用, 但有时如果你希望系统自动在某些时刻帮你主动的进行烧录时,那么文字介面的烧录行为就有帮助啦!

    那么文字模式的烧录行为要怎么处理呢?通常的作法是这样的:

    • 先将所需要备份的数据建置成为一个映像档(iso),利用 mkisofs 命令来处理;
    • 将该映像档烧录至光盘或 DVD 当中,利用 cdrecord 命令来处理。
    9.5.1 mkisofs:创建映像档
    [root@www ~]# mkisofs [-o 映像档] [-rv] [-m file] 待备份文件.. [-V vol] \
    >  -graft-point isodir=systemdir ...选项与参数:
    -o :后面接你想要产生的那个映像档档名。
    -r :透过 Rock Ridge 产生支持 Unix/Linux 的文件数据,可记录较多的资讯;
    -v :显示建置 ISO 文件的过程
    -m file :-m 为排除文件 (exclude) 的意思,后面的文件不备份到映像档中
    -V vol  :创建 Volume,有点像 Windows 在文件总管内看到的 CD title 的东西
    -graft-point:graft有转嫁或移植的意思,相关数据在底下文章内说明。

    9.5.2 cdrecord:光盘烧录工具

    9.6其他常见的压缩与备份工具
    9.6.1 dd
    [root@www ~]# dd if="input_file" of="output_file" bs="block_size" \
    > count="number"选项与参数:
    if   :就是 input file 罗~也可以是装置喔!
    of   :就是 output file 喔~也可以是装置;
    bs   :规划的一个 block 的大小,若未指定则默认是 512 bytes(一个 sector 的大小)
    count:多少个 bs 的意思。范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中
    [root@www ~]# dd if=/etc/passwd of=/tmp/passwd.back
    3+1 records in
    3+1 records out
    1945 bytes (1.9 kB) copied, 0.000332893 seconds, 5.8 MB/s
    [root@www ~]# ll /etc/passwd /tmp/passwd.back
    -rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd
    -rw-r--r-- 1 root root 1945 Dec 17 18:09 /tmp/passwd.back
    # 仔细的看一下,我的 /etc/passwd 文件大小为 1945 bytes,因为我没有配置 bs ,
    # 所以默认是 512 bytes 为一个单位,因此,上面那个 3+1 表示有 3 个完整的 
    # 512 bytes,以及未满 512 bytes 的另一个 block 的意思啦!
    # 事实上,感觉好像是 cp 这个命令啦~范例二:将自己的磁碟之第一个磁区备份下来
    [root@www ~]# dd if=/dev/hdc of=/tmp/mbr.back bs=512 count=1
    1+0 records in
    1+0 records out
    512 bytes (512 B) copied, 0.0104586 seconds, 49.0 kB/s
    # 第一个磁区内含有 MBR 与 partition table ,透过这个动作,
    # 我们可以一口气将这个磁碟的 MBR 与 partition table 进行备份哩!范例三:找出你系统最小的那个分割槽,并且将他备份下来:
    [root@www ~]# df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/hdc2             9.5G  3.9G  5.1G  44% /
    /dev/hdc3             4.8G  651M  3.9G  15% /home
    /dev/hdc1              99M   21M   73M  23% /boot  <==就捉他好了!
    [root@www ~]# dd if=/dev/hdc1 of=/tmp/boot.whole.disk
    208782+0 records in
    208782+0 records out
    106896384 bytes (107 MB) copied, 6.24721 seconds, 17.1 MB/s
    [root@www ~]# ll -h /tmp/boot.whole.disk
    -rw-r--r-- 1 root root 102M Dec 17 18:14 /tmp/boot.whole.disk
    # 等於是将整个 /dev/hdc1 通通捉下来的意思~如果要还原呢?就反向回去!
    # dd if=/tmp/boot.whole.disk of=/dev/hdc1 即可!非常简单吧!
    # 简单的说,如果想要整个硬盘备份的话,就类似 Norton 的 ghost 软件一般,
    # 由 disk 到 disk ,嘿嘿~利用 dd 就可以啦~厉害厉害!
    你可以说, tar 可以用来备份关键数据,而 dd 则可以用来备份整颗 partition 或 整颗 disk ,很不错啊~不过,如果要将数据填回到 filesystem 当中, 可能需要考虑到原本的 filesystem 才能成功啊!让我们来完成底下的例题试看看:

    例题:
    你想要将你的 /dev/hdc1 进行完整的复制到另一个 partition 上,请使用你的系统上面未分割完毕的容量再创建一个与 /dev/hdc1 差不多大小的分割槽 (只能比 /dev/hdc1 大,不能比他小!),然后将之进行完整的复制 (包括需要复制 boot sector 的区块)。
    答:
    由於需要复制 boot sector 的区块,所以使用 cp 或者是 tar 这种命令是无法达成需求的! 此时那个 dd 就派的上用场了。你可以这样做:
    # 1. 先进行分割的动作
    [root@www ~]# fdisk -l /dev/hdc
       Device Boot   Start    End    Blocks   Id  System
    /dev/hdc1   *        1     13    104391   83  Linux
    # 上面鸟哥仅撷取重要的数据而已!我们可以看到 /dev/hdc1 仅有 13 个磁柱
    
    [root@www ~]# fdisk /dev/hdc
    Command (m for help): n
    First cylinder (2354-5005, default 2354): 这里按 enter
    Using default value 2354
    Last cylinder or +size or +sizeM or +sizeK (2354-5005, default 5005): 2366
    
    Command (m for help): p
       Device Boot   Start    End    Blocks   Id  System
    /dev/hdc9         2354   2366    104391   83  Linux
    
    Command (m for help): w# 为什么要使用 2366 呢?因为 /dev/hdc1 使用 13 个磁柱,因此新的 partition
    # 我们也给她 13 个磁柱,因此 2354 + 13 -1 = 2366 罗!
    
    [root@www ~]# partprobe# 2. 不需要格式化,直接进行 sector 表面的复制!
    [root@www ~]# dd if=/dev/hdc1 of=/dev/hdc9
    208782+0 records in
    208782+0 records out
    106896384 bytes (107 MB) copied, 16.8797 seconds, 6.3 MB/s
    
    [root@www ~]# mount /dev/hdc9 /mnt
    [root@www ~]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/hdc1               101086     21408     74459  23% /boot
    /dev/hdc9               101086     21408     74459  23% /mnt
    # 这两个玩意儿会『一模一样』喔!
    [root@www ~]# umount /mnt

    9.6.2 cpio
    这个命令挺有趣的,因为 cpio 可以备份任何东西,包括装置设备文件。不过 cpio 有个大问题, 那就是 cpio 不会主动的去找文件来备份!啊!那怎办?所以罗,一般来说, cpio 得要配合类似 find 等可以找到档名的命令来告知 cpio 该被备份的数据在哪里啊! 有点小麻烦啦~

    郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。