8.1 压缩文件的用途与技术
目前我们使用的计算机系统中都 是使用所谓的 Bytes 单位来计量的!不过,事实上,计算机最小的计量单位应该是 bits 才对
1 Byte = 8 bits
-
压缩
-
解压缩
-
压缩比
8.2 Linux 系统常见的压缩指令
Linux 文件的属性基本上是与文件名没有绝对关系的
为了帮助我们人类小小的脑袋瓜子,所 以适当的扩展名还是必要的
常见的压缩文件扩展名
扩展名 | 描述 |
---|---|
*.Z | compress 程序压缩的文件; |
*.zip | zip 程序压缩的文件; |
*.gz | gzip 程序压缩的文件; |
*.bz2 | bzip2 程序压缩的文件; |
*.xz | xz 程序压缩的文件; |
*.tar | tar 程序打包的数据,并没有压缩过; |
*.tar.gz | tar 程序打包的文件,其中并且经过 gzip 的压缩 |
*.tar.bz2 | tar 程序打包的文件,其中并且经过 bzip2 的压缩 |
*.tar.xz | tar 程序打包的文件,其中并且经过 xz 的压缩 |
Linux上常见的压缩指令就是 gzip, bzip2 以及最新的 xz ,至于 compress 已经退流行了。为 了支持 windows 常见的 zip,其实 Linux 也早就有 zip 指令了! gzip 是由 GNU 计划所开发出 来的压缩指令,该指令已经取代了 compress 。 后来 GNU 又开发出 bzip2 及 xz 这几个压缩 比更好的压缩指令!不过,这些指令通常仅能针对一个文件来压缩与解压缩,此时“打包软件, tar”就显的很重要
tar 可以将很多文件“打包”成为一个文件!甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是“打包”而已,亦即是将很多文件集结成为一个文件, 事实上,他并没有提供压缩的 功能,后来,GNU 计划中,将整个 tar 与压缩的功能结合在一起,如此一来提供使用者更方 便并且更强大的压缩与打包功能
8.2.1 gzip, zcat/zmore/zless/zgrep
gzip 可以说是应用度最广的压缩指令了
gzip 可以解开 compress, zip 与 gzip 等软件所 压缩的文件
gzip 所创建的压缩文件为 *.gz 的文件名
gzip [-cdtv#] 文件名
zcat 文件名.gz
选项与参数:
-c :将压缩的数据输出到屏幕上,可通过数据流重导向来处理;
-d :解压缩的参数;
-t :可以用来检验一个压缩文件的一致性~看看文件有无错误;
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :# 为数字的意思,代表压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
# 范例一:找出 /etc 下面 (不含子目录) 容量最大的文件,并将它复制到 /tmp ,然后以 gzip 压缩
ls -ldSr /etc/*
cd /tmp
cp /etc/services .
gzip -v services
ll /etc/services /tmp/services*
使用 gzip 进行压缩时,在默认的状态下原本的文件会被压缩成为 .gz 的文件名,原始文 件就不再存在了。
使用 gzip 压缩的文件在 Windows 系统中,竟然可以被 WinRAR/7zip 这 个软件解压缩
# 范例二:由于 services 是文本文件,请将范例一的压缩文件的内容读出来
zcat services.gz
# 由于 services 这个原本的文件是是文本文件,因此我们可以尝试使用 zcat/zmore/zless 去读取
# 直接用 less 也可以读取
# 范例三:将范例一的文件解压缩
gzip -d services.gz
# gzip -d 会将原本的 .gz 删除,回复到原本的 services 文件
# 范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
gzip -9 -c services > services.gz
# 范例五:由范例四再次创建的 services.gz 中,找出 http 这个关键字在哪几行?
zgrep -n 'http' services.gz
通过大于 (>) 这个符号,将原本应该由屏幕输出的数据,转成输出到文件而不 是屏幕
如果你还想要从文字压缩文件当中找数据的话,可以通过 egrep 来搜寻关键字
8.2.2 bzip2, bzcat/bzmore/bzless/bzgrep
若说 gzip 是为了取代 compress 并提供更好的压缩比而成立的,那么 bzip2 则是为了取代 gzip 并提供更佳的压缩比而来的
bzip2 的用法几乎与 gzip 相同
bzip2 [-cdkzv#] 文件名
bzcat 文件名.bz2
选项与参数:
-c :将压缩的过程产生的数据输出到屏幕上!
-d :解压缩的参数
-k :保留原始文件,而不会删除原始的文件喔!
-z :压缩的参数 (默认值,可以不加)
-v :可以显示出原文件/压缩文件的压缩比等信息;
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
# 范例一:将刚刚 gzip 范例留下来的 /tmp/services 以 bzip2 压缩
bzip2 -v services
ls -l services*
# 此时 services 会变成 services.bz2 之外,你也可以发现 bzip2 的压缩比要较 gzip 好喔!! # 压缩率由 gzip 的 79% 提升到 bzip2 的 81% 哩!
# 范例二:将范例一的文件内容读出来!
bzcat services.bz2
# 范例三:将范例一的文件解压缩
bzip2 -d services.bz2
# 范例四:将范例三解开的 services 用最佳的压缩比压缩,并保留原本的文件
bzip2 -9 -c services > services.bz2
8.2.3 xz, xzcat/xzmore/xzless/xzgrep
虽然 bzip2 已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推 出了 xz 这个压缩比更高的软件!这个软件的用法也跟 gzip/bzip2 几乎一模一样
xz [-dtlkc#] 文件名
xcat 文件名.xz
选项与参数:
-d :就是解压缩啊!
-t :测试压缩文件的完整性,看有没有错误
-l :列出压缩文件的相关信息
-k :保留原本的文件不删除~
-c :同样的,就是将数据由屏幕上输出的意思!
-# :同样的,也有较佳的压缩比的意思!
通过“ time [gzip|bzip2|xz] -c services > services.[gz|bz2|xz] ”去执行运算 结果,结果发现这三个指令的执行时间依序是: 0.019s, 0.042s, 0.261s
8.3 打包指令: tar
gzip, bzip2, xz 也能够针对目录 来进行压缩,不过, 这两个指令对目录的压缩指的是“将目录内的所有文件 “分别” 进行压 缩”的动作
这种将多个文件或目录包成一个大文件的指令功能,我们可以称呼他是一种“打包指令”啦! 那 Linux 有没有这种打包指令呢?是有的!那就是鼎鼎大名的 tar 这个玩意儿了! tar 可以将 多个目录或文件打包成一个大文件,同时还可以通过 gzip/bzip2/xz 的支持,将该文件同时进 行压缩! 更有趣的是,由于 tar 的使用太广泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 文件名的解压缩呢
8.3.1 tar
tar [-z|-j|-J] [cv] [-f 待创建的新文件名] filename... # 打包与压缩
tar [-z|-j|-J] [tv] [-f 既有的 tar文件名] # 察看文件名
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 后面要立刻接要被处理的文件名!建议 -f 单独写一个选项啰!(比较不会忘记)
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
其他后续练习会使用到的选项介绍:
-p(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
-P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意;
--exclude=FILE:在压缩的过程中,不要将 FILE 打包!
其实最简单的使用 tar 就只要记忆下面的方式即可:
-
压 缩:
tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
-
查 询:
tar -jtv -f filename.tar.bz2
-
解压缩:
tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
filename.tar.bz2 是我们自己取的文件名,tar 并不会主动的产生创建的文件名
不加 [-z|-j|-J] 的话,文件名最好取为 .tar
如果是 -j 选项,代表有 bzip2 的支持,因此文件名最好就取为 .tar.bz2
如果是加上了 -z 的 gzip 的支持,那文件名最好取为 *.tar.gz
由于“ -f filename ”是紧接在一起的,过去很多文章常会写成“-jcvf filename”,这样是对 的, 但由于选项的顺序理论上是可以变换的,所以很多读者会误认为“-jvfc filename”也可以~ 事实上这样会导致产生的文件名变成 c ! 因为 -fc 嘛!所以啰,建议您在学习 tar 时,将“ -f filename ”与其他选项独立出来,会比较不容易发生问题
使用 tar 加入 -z, -j 或 -J 的参数备份 /etc/ 目录
su -
time tar -zpcv -f /root/etc.tar.gz /etc
time tar -jpcv -f /root/etc.tar.bz2 /etc
time tar -Jpcv -f /root/etc.tar.xz /etc
ll -h /root/etc*
du -sh /etc
压缩比越好当然要花费的运算时间越多
查阅 tar 文件的数据内容 (可察看文件名),与备份文件名有否根目录的意义
tar -jtv -f /root/etc.tar.bz2
从上面的数据我们可以发现一件很有趣的事情,那就是每个文件 名都没了根目录了!这也是上一个练习中出现的那个警告讯息“tar: Removing leading /’ from member names(移除了文件名开头的 /’ )”所告知的情况
那为什么要拿掉根目录呢?主要是为了安全!我们使用 tar 备份的数据可能会需要解压缩回来 使用, 在 tar 所记录的文件名 (就是我们刚刚使用 tar -jtvf 所察看到的文件名) 那就是解压 缩后的实际文件名。
如果没有拿掉根目录,解压缩后的文件名就会是绝对 路径, 亦即解压缩后的数据一定会被放置到 /etc/xxx 去!如此一来,你的原本的 /etc/ 下面的数据, 就会被备份数据所覆盖过去了!
# 范例:将文件名中的(根)目录也备份下来,并察看一下备份文件的内容文件名
tar -jpPcv -f /root/etc.and.root.tar.bz2 /etc
# 查看压缩包内容
tar -jtf /root/etc.and.root.tar.bz2
如果加上 -P 选项,那么文件名内的根目录就会存在
将备份的数据解压缩,并考虑特定目录的解压缩动作 (-C 选项的应用)
# 本目录下进行解压缩
tar -jxv -f /root/etc.tar.bz2
# 在指定目录下进行解压缩
tar -jxv -f /root/etc.tar.bz2 -C /tmp
仅解开单一文件的方法
# 1\. 先找到我们要的文件名,假设解开 shadow 文件好了:
tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
# 2\. 将该文件解开
tar -jxv -f 打包档.tar.bz2 待解开文件名
tar -jxv -f /root/etc.tar.bz2 etc/shadow
打包某目录,但不含该目录下的某些文件之作法
# 打包 /etc/ /root 这几个重要的目录,但却不想要打包 /root/etc* 开头的文件
tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root
仅备份比某个时刻还要新的文件
使用 –newer 时,表示后续的日期包含“ mtime 与 ctime ”,而 –newer-mtime 则仅是 mtime
# 1\. 先由 [find](../Text/index.html#find) 找出比 /etc/passwd 还要新的文件
find /etc -newer /etc/passwd
# 2\. 使用 tar 来进行打包!日期为上面看到的 2015/06/17
tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 --newer-mtime="2015/06/17" /etc/*
# 最后行显示的是“没有被备份的”,亦即 not dumped
# 3\. 显示出文件即可
tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$'
# 通过这个指令可以调用出 tar.bz2 内的结尾非 / 的文件名
基本名称: tarfile, tarball ?
tar 打包出来的文件有没有进行压缩所得到文件称呼不同喔! 如果仅是打 包而已,就是“ tar -cv -f file.tar ”而已,这个文件我们称呼为 tarfile 。 如果还有进行压缩的支 持,例如“ tar -jcv -f file.tar.bz2 ”时,我们就称呼为 tarball (tar 球?)
特殊应用:利用管线命令与数据流
# 1\. 将 /etc 整个目录一边打包一边在 /tmp 解开
tar -cvf - /etc | tar -xvf -
# 可以将 - 想成是在内存中的一个设备(缓冲区)
例题:系统备份范例
假设目前你已经知道重要的目录有下面这几个:
-
/etc/ (配置文件)
-
/home/ (使用者的主文件夹)
-
/var/spool/mail/ (系统中,所有帐号的邮件信箱)
-
/var/spool/cron/ (所有帐号的工作排成配置文件)
-
/root (系统管理员的主文件夹)
/home/loop* 不需要备份,而且 /root 下面的压缩文件也不需要备份,另外假设你要将备份的数据放置到 /backups ,并且该目录仅 有 root 有权限进入! 此外,每次备份的文件名都希望不相同,例如使用:backup-system- 20150701.tar.bz2 之类的文件名来处理
# 1\. 先处理要放置备份数据的目录与权限:
mkdir /backups
chmod 700 /backups
# 2\. 假设今天是 2015/07/01 ,则创建备份的方式如下:
tar -jcv -f /backups/backup-system-20150701.tar.bz2 --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* /etc /home /var/spool/mail /var/spool/cron /root
解压缩后的 SELinux 课题
如果因为某些缘故,所以你的系统必须要以备份的数据来回填到原本 的系统中,那么得要特别注意复原后的系统的 SELinux 问题! 尤其是在系统文件上面
8.4 XFS 文件系统的备份与还原
使用 tar 通常是针对目录树系统来进行备份的工作,那么如果想要针对整个文件系统来进行备 份与还原呢?由于 CentOS 7 已经使用 XFS 文件系统作为默认值,所以那个好用的 xfsdump 与 xfsrestore 两个工具对 CentOS 7 来说,就是挺重要的工具软件了。
8.5 光盘写入工具
略
8.6 其他常见的压缩与备份工具
8.6.1 dd
dd 可以读取磁盘设备的内容(几乎是直接读取扇区”sector”),然后将整个设备备份成一个文 件
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 当中
dd if=/etc/passwd of=/tmp/passwd.back
# 范例二:将刚刚烧录的光驱的内容,再次的备份下来成为图像挡
dd if=/dev/sr0 of=/tmp/system.iso
# 范例三:假设你的 USB 是 /dev/sda 好了,请将刚刚范例二的 image 烧录到 USB 磁盘中
dd if=/tmp/system.iso of=/dev/sda
# 范例四:将你的 /boot 整个文件系统通过 dd 备份下来
df -h /boot
dd if=/dev/vda2 of=/tmp/vda2.img
默认 dd 是一个一个扇区去读/写的,而 且即使没有用到的扇区也会被写入备份文件中! 因此这个文件会变得跟原本的磁盘一模一样 大
8.6.2 cpio
cpio 可以备份任何东西,包括设备文件
cpio -ovcB > [file|device] # 备份
cpio -ivcdu < [file|device] # 还原
cpio -ivct < [file|device] # 察看
备份会使用到的选项与参数:
-o :将数据 copy 输出到文件或设备上
-B :让默认的 Blocks 可以增加至 5120 Bytes ,默认是 512 Bytes ! 这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)
还原会使用到的选项与参数:
-i :将数据自文件或设备 copy 出来系统当中
-d :自动创建目录!使用 cpio 所备份的数据内容不见得会在同一层目录中,因此我们 必须要让 cpio 在还原时可以创建新目录,此时就得要 -d 选项的帮助!
-u :自动的将较新的文件覆盖较旧的文件!
-t :需配合 -i 选项,可用在"察看"以 cpio 创建的文件或设备的内容
一些可共享的选项与参数:
-v :让储存的过程中文件名称可以在屏幕上显示
-c :一种较新的 portable format 方式储存
原文地址:http://www.cnblogs.com/huangwenjie/p/16870668.html