首页 > 其他分享 >20220816 08. 文件与文件系统的压缩,打包与备份

20220816 08. 文件与文件系统的压缩,打包与备份

时间:2022-11-08 18:11:06浏览次数:42  
标签:文件 bz2 tar 文件名 08 文件系统 etc 20220816 压缩

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 方式储存

标签:文件,bz2,tar,文件名,08,文件系统,etc,20220816,压缩
From: https://www.cnblogs.com/huangwenjie/p/16870668.html

相关文章

  • 20220802 00. 计算机概论
    0.1电脑:辅助人脑的好工具0.1.1计算机硬件的五大单元中央处理器(CentralProcessingUnit,CPU),CPU为一个具有特定功能的芯片,里头含有微指令集,如果你想要让主机进行什......
  • 【JavaScript 教程】第四章 程序流程08— JavaScript continue 语句
    英文 | https://www.javascripttutorial.net/译文|杨小爱在上节中,我们学习了JavaScript 程序流程中的break语句,错过的小伙伴可以点击文章《​​【JavaScript教程】第......
  • 20221108
    网站运维runoob好像啥都没讲一个网站开发人员必须掌握的知识是什么?HTML和CSS客户端脚本-JavaScriptandtheDOM服务端脚本-ASP,PHPXML和SQLhttps://www......
  • Linux系统编程——09-linux-day08(守护进程-线程)
    在学习Linux系统编程总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。09-linux-day08(守护进程-线程)  一、学习目标1、守护进程的特点2......
  • 2022-11-08 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • 事件10841解决oracle 9i中JDBC Thin Driver ORA-00600 [ttcgcshnd-1]的异常
    文档课题:事件10841解决oracle9i中JDBCThinDriverORA-00600ttcgcshnd-1的异常.用thindriver连接Oracle9i时,出现exception,如下所示java.sql.SQLException:ORA-00600:......
  • 【408】2019
    t11最佳归并树虚段的个数假如这个树是一个最佳归并树(K路归并)。那么假设叶子节点(初始归并段)个数为N0,则有这个式子成立:(N0-1)mod(K-1)=0现在已知叶子结点是120......
  • 008 Rust 异步编程,select 宏介绍
    select宏select宏也允许并发的执行Future,但是和join、try_join不同的是,select宏只要有一个Future返回,就会返回。示例源码usefutures::{select,future::FutureExt,pin_mut......
  • 操作系统速成——4.文件系统
    四.文件系统 4.1文件、文件系统文件是以计算机硬盘为载体的存储在计算机上的信息集合文件系统就是操作系统中负责操作和管理文件的一整套设施,它实现文件的共享和保护,......
  • 【单片机/嵌入式】【梁山派】学习日志08:串口通信USART
    串口一、串口通信原理1.1串口基础知识1.1.1串口介绍串口是指外设和处理器之间通过数据信号线、地线和控制线等,按位进行传输数据的一种通讯方式。尽管传输速度比并行传......