Linux笔记008| 文件系统与文件压缩
Posted BioInfoNotes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux笔记008| 文件系统与文件压缩相关的知识,希望对你有一定的参考价值。
一.Linux的文件系统
文件系统就是操作系统(比如windows)管理和存储文件的软件机构。文件系统指文件存在的物理空间。通俗地说,没有文件系统,系统就不知道该怎么读取硬盘。文件系统的种类有很多,每一种文件系统的结构,逻辑,存取速度,灵活性,安全性,大小,等等都不一样。文件系统可以被使用在磁带,移动硬盘,闪存等地方。在Linux系统中,每个分区都是一个文件系统,都有自己的目录层次结构。Linux的最重要特征之一就是支持多种文件系统,这样它更加灵活,并可以和许多其它种操作系统共存。Virtual File System(虚拟文件系统)使得Linux可以支持多个不同的文件系统。由于系统已将Linux文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。Linux的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。虚拟文件系统是为Linux用户提供快速且高效的文件访问服务而设计的。总之,文件系统的类别有很多,也很复杂,又想弄明白文件系统的原理,需要学习的东西有很多,这里我只介绍Linux中几种文件系统格式。
随着Linux的不断发展,它所支持的文件格式系统也在迅速扩充。特别是Linux 2.4内核正式推出后,出现了大量新的文件系统,其中包括日志文件系统ext3、ReiserFS、XFSJFS和其它文件系统。Linux系统核心可以支持十多种文件系统类型:JFS、 ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、 SMB、SysV、PROC等。
文件系统指文件存在的物理空间。在Linux系统中,每个分区都是一个文件系统,都有自己的目录层次结构。Linux的最重要特征之一就是支持多种文件系统,这样它更加灵活,并可以和许多其它种操作系统共存。Virtual File System(虚拟文件系统)使得Linux可以支持多个不同的文件系统。由于系统已将Linux文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。Linux的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。虚拟文件系统是为Linux用户提供快速且高效的文件访问服务而设计的。
随着Linux的不断发展,它所支持的文件格式系统也在迅速扩充。特别是Linux 2.4内核正式推出后,出现了大量新的文件系统,其中包括日志文件系统ext3、ReiserFS、XFSJFS和其它文件系统。Linux系统核心可以支持十多种文件系统类型:JFS、 ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、 SMB、SysV、PROC等。
下面介绍Linux下几个最常用的文件系统,其中包括ext、ext2、ext3、JFS、XFS、ReiserFS等。
1.ext
ext是第一个专门为开发的Linux的文件系统类型,叫做扩展文件系统。它是1992年4月完成的,对Linux早期的发展产生了重要作用。但是,由于其在稳定性、速度和兼容性上存在许多缺陷,现在已经很少使用了。
2.ext2
ext2是为解决ext文件系统的缺陷而设计的可扩展的、高性能的文件系统,它又被称为二级扩展文件系统。ext2是1993年发布的,设计者是Rey Card。它是Linux文件系统类型中使用最多的格式,并且在速度和CPU利用率上较为突出,是GNU/Linux系统中标准的文件系统。它存取文件的性能极好,对于中、小型的文件更显示出优势,这主要得益于其簇快取层的优良设计。ext2可以支持256字节的长文件名,其单一文件大小和文件系统本身的容量上限与文件系统本身的簇大小有关。在常见的Intel x86兼容处理器的系统中,簇最大为4KB,单一文件大小上限为2048GB, 而文件系统的容量上限为6384GB。尽管Linux可以支持种类繁多的文件系统,但是2000年以前几乎所有的Linux发行版都使用ext2作为默认的文件系统。
ext2也有一些问题。由于它的设计者主要考虑的是文件系统性能方面的问题,而在写入文件内容的同时,并没有写入文件的meta- data(和文件有关的信息,例如权限、所有者及创建和访问时间)。换句话说,Linux先写入文件的内容,然后等到有空的时候才写入文件的meta- data。如果出现写入文件内容之后,但在写入文件的meta-data之前系统突然断电,就可能造成文件系统就会处于不一致的状态。在一个有大量文件操作的系统中,出现这种情况会导致很严重的后果。另外,由于目前Linux的 2.4内核所能使用的单一分割区最大只有2048GB,尽管文件系统的容量上限为6384G,但是实际上能使用的文件系统容量最多也只有2048GB。
3.ext3
在讲解ext3、JFS、XFS、ReiserFS日志格式文件系统之前,先介绍一些日志式文件系统基础。
日志式文件系统起源于Oracle、Sybase等大型数据库。由于数据库操作往往是由多个相关的、相互依赖的子操作组成,任何一个子操作的失败都意味着整个操作的无效性,对数据库数据的任何修改都要恢复到操作以前的状态。Linux日志式文件系统就是由此发展而来的。日志文件系统通过增加一个叫做日志的、新的数据结构来解决这个“fsck”问题。这个日志是位于磁盘上的结构。在对元数据做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些什么,所以日志文件具有可伸缩性和健壮性。在分区中保存日志记录文件好处是:文件系统写操作首先是对记录文件进行操作,若整个写操作由于某种原因(如系统掉电)而中断,则在下次系统启动时就会读日志记录文件的内容,恢复到没有完成的写操作,这个过程一般只需要两三分钟时间。
ext3是由开放资源社区开发的日志文件系统,早期主要开发人员是Stephen Tweedie。ext3被设计成是ext2的升级版本,尽可能方便用户从ext2向ext3迁移。ext3在ext2的基础上加入了记录元数据的日志功能,努力保持向前和向后的兼容性,也就是在保有目前ext2的格式之下再加上日志功能。和ext2相比,ext3提供了更佳的安全性,这就是数据日志和元数据日志之间的不同。ext3是一种日志式文件系统,日志式文件系统的优越性在于由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此,每当系统要关机时,必须将其所有的文件系统全部卸下后才能进行关机。如果在文件系统尚未卸下前就关机 (如停电),那么重开机后就会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,这个过程是相当耗时的,特别是容量大的文件系统不能百分之百保证所有的资料都不会流失,特别在大型的服务器上可能会出现问题。除了与ext2兼容之外,ext3还通过共享ext2的元数据格式继承了ext2的其它优点。比如,ext3用户可以使用一个稳固的fsck工具。由于ext3基于ext2的代码,所以它的磁盘格式和ext2 的相同,这意味着一个干净卸装的ext3文件系统可以作为ext2文件系统毫无问题地重新挂装。如果现在使用的是ext2文件系统,并且对数据安全性要求很高,这里建议考虑升级使用ext3。
ext3最大的缺点是,它没有现代文件系统所具有的、能提高文件数据处理速度和解压的高性能。此外,使用ext3文件系统要注意硬盘限额问题,在这个问题解决之前,不推荐在重要的企业应用上采用ext3+Disk Quota(磁盘配额)。
4.JFS
JFS是一种提供日志的字节级文件系统。该文件系统主要是为满足服务器(从单处理器系统到高级多处理器和群集系统)的高吞吐量和可靠性需求而设计、开发的。JFS文件系统是为面向事务的高性能系统而开发的。在IBM的AIX系统上,JFS已经过较长时间的测试,结果表明它是可靠、快速和容易使用的。2000年2月,IBM宣布在一个开放资源许可证下移植Linux版本的JFS文件系统。JFS也是一个有大量用户安装使用的企业级文件系统,具有可伸缩性和健壮性。与非日志文件系统相比,它的突出优点是快速重启能力,JFS能够在几秒或几分钟内就把文件系统恢复到一致状态。虽然JFS主要是为满足服务器(从单处理器系统到高级多处理器和群集系统)的高吞吐量和可靠性需求而设计的,但还可以用于想得到高性能和可靠性的客户机配置,因为在系统崩溃时JFS能提供快速文件系统重启时间,所以它是因特网文件服务器的关键技术。使用数据库日志处理技术,JFS能在几秒或几分钟之内把文件系统恢复到一致状态。而在非日志文件系统中,文件恢复可能花费几小时或几天。
JFS的缺点是,使用JFS日志文件系统性能上会有一定损失,系统资源占用的比率也偏高,因为当它保存一个日志时,系统需要写许多数据。
5.ReiserFS
ReiserFS的第一次公开亮相是在1997年7月23日,Hans Reiser把他的基于平衡树结构的ReiserFS文件系统在网上公布。ReiserFS 3.6.x(作为Linux 2.4一部分的版本)是由Hans Reiser和他的Namesys开发组共同开发设计的。SuSE Linux也对它的发展起了重大的帮助。Hans和他的组员们相信最好的文件系统是能够有助于创建独立的共享环境或命名空间的文件系统,应用程序可以在其中更直接、有效和有力地相互作用。为了实现这一目标,文件系统就应该满足使用者对性能和功能方面的需要。那样使用者就能够继续直接地使用文件系统,而不必建造运行在文件系统之上(如数据库之类)的特殊目的层。ReiserFS 使用了特殊的、优化的平衡树(每个文件系统一个)来组织所有的文件系统数据,这为其自身提供了非常不错的性能改进,也能够减轻文件系统设计上的人为约束。另一个使用平衡树的好处就是,ReiserFS 能够像其它大多数的下一代文件系统一样,根据需要动态地分配索引节,而不必在文件系统创建时建立固定的索引节。这有助于文件系统更灵活地适应面临的各种存储需要,同时提供附加的空间有效率。
ReiserFS被看作是一个更加激进和现代的文件系统。传统的Unix文件系统是按磁盘块来进行空间分配的,对于目录和文件等的查找使用了简单的线性查找。这些设计在当时是合适的,但随着磁盘容量的增大和应用需求的增加,传统文件系统在存储效率、速度和功能上已显得落后。在 ReiserFS的下一个版本-Reiser 4,将提供了对事务的支持。ReiserFS突出的地方还在于其设计上着眼于实现一些未来的插件程序,这些插件程序可以提供访问控制列表、超级链接,以及一些其它非常不错的功能。在http://www.namesys.com/v4/v4.html中,有Reiser 4的介绍和性能测试。
ReiserFS一个最受批评的缺点是,每升级一个版本都将要将磁盘重新格式化一次,而且它的安全性能和稳定性与ext3相比有一定的差距。因为 ReiserFS文件系统还不能正确处理超长的文件目录,如果创建一个超过768字符的文件目录,并使用ls或其它echo命令,将有可能导致系统挂起。在http://www.namesys.com/ ;网站可以了解关于ReiserFS的更多信息。
6.XFS
XFS是一种非常优秀的日志文件系统,它是由SGI于20世纪90年代初开发的。XFS推出后被业界称为先进的、最具可升级性的文件系统技术。它是一个全 64位、快速、稳固的日志文件系统,多年用于SGI的IRIX操作系统。当SGI决定支持Linux社区时,它将关键的基本架构技术授权于Linux,以开放资源形式发布了他们自己拥有的XFS的源代码,并开始进行移植。此项工作进展得很快,目前已进入beta版阶段。作为一个64位文件系统,XFS可以支持超大数量的文件(9000×1GB),可在大型2D和3D数据方面提供显著的性能。XFS有能力预测其它文件系统薄弱环节,同时提供了在不妨碍性能的情况下增强可靠性和快速的事故恢复。
XFS可为Linux和开放资源社区带来如下新特性:
◆可升级性 XFS被设计成可升级,以面对大多数的存储容量和I/O存储需求;可处理大型文件和包含巨大数量文件的大型目录,以满足21世纪快速增长的磁盘需求。XFS有能力动态地为文件分配索引空间,使系统形成高效支持大数量文件的能力。在它的支持下,用户可使用的文件远远大于现在最大的文件系统。
◆优秀的I/O 性能典型的现代服务器使用大型的条带式磁盘阵列,以提供达数GB/秒的总带宽。XFS可以很好地满足I/O请求的大小和并发I/O请求的数量。XFS可作为 root文件系统,并被LILO支持,也可以在NFS服务器上使用,并支持软件磁盘阵列(RAID)和逻辑卷管理器(Logical Volume Manager,LVM)。SGI最新发布的XFS为1.0.1版,在http://oss.sgi.com/projects/XFS/ ;可以下载它。
由于XFS比较复杂,实施起来有一些难度(包括人员培训等),所以目前XFS主要应用于Linux企业应用的高端。
7.ext4
第4个扩展文件系统,是下一代的日志文件系统,它与上一代文件系统ext3是向后兼容的。ext4 在性能、伸缩性和可靠性方面进行了大量改,支持 1 EB 的文件系统。ext4 是由 Theodore Tso(ext3 的维护者)领导的开发团队实现的,并引入到 2.6.19 内核中。Ubuntu9.04开始支持Ext4文件系统。
参考:https://www.cnblogs.com/luoahong/p/6242058.html
二.文件解压缩相关命令
1.概述
在Linux下面有相当多的压缩命令可以运行,这些压缩命令可以让我们更方便地从网络上面下载容量较大的文件。此外,我们知道在Linux下面,扩展名没有什么特殊的意义。不过,针对这些压缩命令所产生的压缩文件,为了方便记忆,还是会有一些特殊的命名方式,就让我们来看看吧!
什么是文件压缩呢?我们稍微谈一谈它的原理,目前我们使用的计算机系统中都是使用所谓的字节单位来计量。不过,事实上,计算机最小的计量单位应该是bit才对,此外,我们也知道 1字节=8比特(1Byte=8bit),但是如果今天我们只是记录一个数字,即1这个数字,它会如何记录?假设一个字节可以看成下面的模样:
由于 1Byte=8bit,所以每个字节当中会有8个空格,而每个空格只可以是0、1。由于我们记录的数字是1,考虑计算机所谓的二进制,如此一来,1会在最右边占据1个位,而其他的7个位将会自动地被填上0。如下图所示:
你看看,其实在这样的例子中,那7个位应该是空的才对。不过,为了要满足目前我们的操作系统数据的读写,所以就会将该数据转为字节的形式来记录。而一些聪明的计算机工程师就利用一些复杂的计算方式,将这些没有使用到的空间【丢】出来,以让文件占用的空间变小,这就是压缩的技术。
另一种压缩技术也很有趣,它是将重复的数据进行统计记录。举例来说,如果你的数据为【111······】共有100个1时,那么压缩技术会记录为【100个1】而不是真的有100个1的位存在。这样也能够精简文件记录的容量,非常有趣吧!
简单地说,你可以将它想成,其实文件里面有相当多的空间存在,并不是完全填满的,而压缩技术就是将这些空间填满,以让整个文件占用的容量下降。不过,这些压缩过的文件并无法直接被我们的操作系统所使用,因此,若要使用这些被压缩过的文件数据,则必须将它还原回未压缩前的模样,那就是所谓的解压缩。而至于压缩后与压缩的文件所占用的磁盘空间大小,就可以被称为是压缩比。
这个压缩与解压缩的操作有什么好处呢?最大的好处就是压缩过的文件容量变小了,所以你的硬盘无形之中就可以容纳更多的数据。此外,在一些网络数据的传输中,也会由于数据量的降低,好让网络带宽可以用来做更多的工作,而不是老卡在一些大型文件传输上面。
参考:https://my.oschina.net/u/4401279/blog/3302133
2.Linux系统常见压缩命令
在Linux的环境中,压缩文件的扩展名大多是: *.tar、*.tar.gz、*.gz、*.Z、*.bz2、*.xz。为什么会有这样的扩展名?不是说Linux的扩展名没有什么作用吗?
这是因为Linux支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,当然彼此之间可能就无法互通/解压缩文件。所以,当你下载到某个文件时,自然就需要知道该文件是由哪种压缩命令所制作出来的,好用来对照对照着解压缩,也就是说,虽然Linux文件的属性基本上是与文件名没有绝对关系的,但是为了帮助我们人类小小的脑袋,所以适当的扩展名还是必要的,下面我们就列出几个常见的压缩文件扩展名:
*.gz gzip程序压缩的文件
*.bz2 bzip2程序压缩的文件
*.xz xz程序压缩的文件
*.zip zip程序压缩的文件
*.Z compress程序压缩的文件
*.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】就显得很重要。
下载后利用FileZilla软件上传到服务器,我这里上传到/root/BioInfoData 目录中,下载后可以直接上传,我是为了本教程,先解压后再上传的文件。
(1)gzip
gzip可以说是应用最广的压缩命令了,目前gzip可以解开compress、zip和gzip等软件所压缩的文件,至于gzip所建立的压缩文件为*.gz,让我们来看看这个命令的语法:
gzip [-cdtvn] 文件名
选项与参数:
-c: 将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
-d: 解压缩的参数;
-t: 可以用来检验一个压缩文件的一致性,看看文件有无错误;
-v: 可以显示出原文件/压缩文件的压缩比等信息;
-n: n为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但是压缩比最好,默认是-6。
在/root/BioInfoData/gencode.v35lift37.annotation.gtf/目录下有一个快1.6G的gtf文件。就是前面上传的文件.
然后我们利用gzip来压缩这个文件,命令如下:
gzip -v /root/BioInfoData/gencode.v35lift37.annotation.gtf/gencode.v35lift37.annotation.gtf
我们可以看见压缩比为96.2%,我们查看一下目录下的文件。
压缩前是1.6G,压缩后的文件是59M,可见压缩文件是多么的节省存储空间,此外,压缩后原始文件将不存在,压缩后的文件名是原来文件名加上.gz。
相反,我们可以通过-d参数解压压缩文件。
gzip -d /root/BioInfoData/gencode.v35lift37.annotation.gtf/gencode.v35lift37.annotation.gtf.gz
同样,解压后原始的压缩文件也将被删除。如果想保留原始文件,我们可以通过-c参数与>的使用解决这个问题。-c参数是将压缩的数据输出到屏幕上,>将原本输出到屏幕上的数据转成输出到文件。
gzip -c /root/BioInfoData/gencode.v35lift37.annotation.gtf/gencode.v35lift37.annotation.gtf.gz > /root/BioInfoData/human.v33.annotation.gtf.gz/gencode.v35lift37.annotation.gtf
(2)bzip2
若说gzip是为了替换compress并提供更好的压缩比而成立的,那么bzip2则是为了替换gzip并提供更加的压缩比而来。bzip2真是很不错的东西,这玩意的压缩比竟然比gzip还要好,至于bzip2的用法几乎与gzip相同,看看下面的用法吧!
bzip2 [-cdkzvn] 文件名
选项与参数:
-c: 将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
-d: 解压缩的参数;
-k: 保留原始文件,而不是删除原始文件;
-z: 压缩的参数(默认值,可以不加);
-v: 可以显示出原文件/压缩文件的压缩比等信息;
-n: n为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但是压缩比最好,默认是-6
bzip2压缩于gzip差不多,就是文件后缀名不一样,bzip2压缩比比gzip好,但时间更长。
(3)xz
虽然bzip2已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了xz这个压缩比更高的软件。这个软件的用法也跟gzip/bzip2几乎一模一样,那我们就来看一看。
xz [-cdtlkn] 文件名
选项与参数:
-c: 将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
-d: 解压缩的参数;
-k: 保留原始文件,而不是删除原始文件;
-l: 列出压缩文件的相关信息;
-t: 测试压缩文件的完整性,看看有没有错误;
-z: 压缩的参数(默认值,可以不加);
-n: n为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但是压缩比最好,默认是-6
我们继续压缩文件。
xz -k /root/BioInfoData/gencode.v35lift37.annotation.gtf/gencode.v35lift37.annotation.gtf
可以看见,xz压缩比又比bzip2好,但时间同样长。
这三个压缩命令,参数都差不多,所以会一个就会3个。我们可以查看压缩前后的信息。
xz -l /root/BioInfoData/gencode.v35lift37.annotation.gtf/gencode.v35lift37.annotation.gtf.xz
3.打包命令——tar
前面谈到的命令大多仅能针对单一文件来进行压缩,虽然gzip、bzip2、xz也能够针对目录来进行压缩,不过,这几个命令对目录的压缩指的是将目录内的所有文件【分别】进行压缩的操作。而不像在Windows的系统,可以使用类似WinRAR这一类的压缩软件来将好多数据包成一个文件的样式。
这种将多个文件或目录包成一个大文件的命令功能,我们可以称它是一种打包命令,那Linux有没有这种打包命令?有,那就是大名鼎鼎的tar,tar可以将多个目录或文件打包成一个大文件,同时还可以通过gzip、bzip2、xz的支持,将该文件同时进行压缩。更有趣的是,由于tar的使用太广泛了,目前Windows的WinRAR也支持.tar.gz文件名的解压缩。
tar的选项与参数特别多,我们只讲几个常用的选项,更多选项您可以自行man tar查询。
tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename... <== 打包与压缩。
tar [-z|-j|-J] [cv] [-f 既有的tar文件名] <== 查看文件名
tar [-z|-j|-J] [xv] [-f 既有的tar文件名] <== 解压缩
选项与参数:
-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(大写): 保留绝对路径,亦即允许备份数据中含有根目录存在之意。
将/root/BioInfoData/gencode.v35lift37.annotation.gtf文件夹下的所以文件复制到新创建的temp目录中。
mkdir temp
cp /root/BioInfoData/gencode.v35lift37.annotation.gtf/* ./temp
如果文件大可以考虑删除一些大文件。
time tar -zpcv -f ./temp.tar.gz ./temp
参考资料:
https://www.cnblogs.com/luoahong/p/6242058.html
https://my.oschina.net/u/4401279/blog/3302133
以上是关于Linux笔记008| 文件系统与文件压缩的主要内容,如果未能解决你的问题,请参考以下文章