Linux 文件系统全面总结

分享 青牛 ⋅ 于 2016-12-05 19:20:01 ⋅ 4026 阅读

Linux文件系统概述

硬盘分区后,还要进行文件系统的格式化,才能被操作系统使用。文件系统是一种存储和组织计算机数据的方法。文件系统格式需要操作系统支持,比如 windows使用的文件系统FAT,FAT32,NTFS等,Linux常用的文件系统ext2,ext3,ext4,xfs 等。为什么这样?因为操作系统需要设置不同文件权限,属性等等,这些需要和文件系统配合实现。

Linux文件系统实现中三个比较重要的概念:

  • superblock: 记录文件系统的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等,一般位于分区第一个block。级块是很重要的,告诉linux文件系统类型,每个块的大小是多大(1024、2048 or 4096),每个块组有多少个块,inode占多少个字节等等。
  • inode: 记录文件的属性,一个文件占用一个inode,同时通过inode table 记录文件所有数据块的编号。
  • block: 记录文件的实际内容,若文件太大时,文件会分成多个block存储。block大小一般为1k、2k或4k。

可以看出文件系统的元数据和数据是单独存储的,inode和block都有唯一的编号,对于ext文件系统inode和block编号在格式化时候已经确定好。

Ext2 文件系统介绍

Ext2 (Linux second extended file system, ext2fs) 是Linux传统文件系统,是通过对Minix的文件系统进行扩展而得到的,其存取文件的性能极好。相对来说ext2比较简单,支持工具比较多,我们从通过学习ext2文件系统来深入理解linux文件系统。

我们来看看一个硬盘分区,用ext2文件系统格式化后变成一个什么样的结构?我们用一张图说明一下:

block group

可以看出ext2是将分区划分成了很多block group,而不是将所有的 inode和block放到一起管理。你可以想想分区几百G或几T的容量,那inode和block的数量惊人,很难管理。所以将分区划分成block组来管理。

Superblock

记录文件系统的整体信息,是非常重要的,如果superblock坏了,那整个文件系统也就不能用了。一般情况superblock 的大小为 1024b,记录主要信息:

  • inode/block 总量
  • inode/block 的使用情况
  • block 和 inode 的大小 (block 为 1, 2, 4K,inode 为 128bytes 或 256bytes)
  • filesystem 的挂载时间、最近一次写入时间、挂载标志等等相关信息

Block Group0 的 Superblock 是主Superblock,其它组按照策略放置它的副本,为了破损时能够恢复。

GDT(group descriptor table)

GDT 可以理解为是组描述符的一个数组,有多少组就有多少个元素。

inode bitmap

bitmap是个数据结构,标志位表的方式记录每个inode是否已经被使用。你可以简单理解为如果这个inode的表记位为1表示已经被使用,如果文件删除了,inode会被收回,那它的表记位变成0.

block bitmap

和inode bitmap是一样的道理,记录block的使用情况。

data block

数据块是实际存储数据的地方,ext2文件系统支持block大小有1K、2K和4K,每个block有一个唯一编号,在格式化的时候就这些都被确定好了。block使用上还是有些限制的:

  • 大小和数据格式化后不能在改变,除非重新格式化
  • 每个block只能放置一个文件的数据,不能多个文件共享
  • 文件数据占用block的数据等于 file size/ block size + file size % block size == 0 ? 0 : 1, 也就是说数据占不满一个block也不能被别的文件使用的了。这就造成空间浪费。

inode table

我们重点讲讲inode,这是ext2文件系统的核心。inode一般为128bytes,存储好多重要信息,我们看看这张图:

linux inode

这张图是以inode 128bytes,block 1k 大小画的,可以看出,inode存储了文件的所有相关属性:权限,时间,数据块的列表等等。

inode 要存这么多信息,一个block ID 就是4个字节,一个文件 成千上万的block ID 怎么存的下?所以 inode采用分层的方法存储 block ID列表,这样就能存储很多 block ID。

细心的朋友要问,这样存储也是有限制的?是的,ext2 存储最大文件 16G,怎么算的?

假设沾满所有的block ID空间: 121k + 2561k + 2562561k + 256256256*1k = 16GB

如果想存的文件更大,格式化的时候可以增加block块大小,如果block 块大小为 4k,则最大文件可以存储 2TB,但是小文件比较多时会浪费一定空间。

这些都不是问题,随着数据需求增长,文件系统也会越来越先进。

目录是特殊的文件

每个文件都会占用一个 inode,且可依据文件内容的大小来分配多个 block 给该文件使用。目录是特殊的文件,当我们在Linux下的文件系统建立一个目录时,文件系统会分配一个 inode 与至少一块 block给该目录。inode记录相关元数据信息,block记录目录下面的文件名或目录名及相应的inode。

读取目录数一个递归过程,从根节点开始,读到根节点的inode内容,并依据该 inode 读取根目录的 block 内的文件名数据,再一层一层的往下读,直到读取到相应的文件或目录数据。

Ext2动手实战

创建一个 ext2文件系统分区

方便我们学习,我们需要一个ext2的文件系统来演示一些命令,如果你的linux有 ext2、ext3或ext4 文件系统都可以。如果没有的话我们通过虚拟机再增加一块硬盘,我这里增加了一块 1G的硬盘(/dev/sdb)。

[root@localhost ~]# fdisk  -l

Disk /dev/sda: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes  
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a8fc8

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048     7415807     3194880   83  Linux
/dev/sda3         7415808    10997759     1790976   83  Linux
/dev/sda4        10997760    16777215     2889728    5  Extended
/dev/sda5        10999808    12679167      839680   82  Linux swap / Solaris

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes  <=====扇区大小
I/O size (minimum/optimal): 512 bytes / 512 bytes

/dev/sdb 可以看出是第二块硬盘,还没有分区,所以首先要创建分区,然后在用ext2文件系统工具格式化。

#使用 fdisk创建分区
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xbca8289b.

Command (m for help): n  <=====创建新分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p       <=====创建的主分区,也可以用扩展分区
Partition number (1-4, default 1):
First sector (2048-2097151, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151):
Using default value 2097151
Partition 1 of type Linux and of size 1023 MiB is set

Command (m for help): w  <=====保持设置,退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@localhost ~]# fdisk  -l

Disk /dev/sda: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a8fc8

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048     7415807     3194880   83  Linux
/dev/sda3         7415808    10997759     1790976   83  Linux
/dev/sda4        10997760    16777215     2889728    5  Extended
/dev/sda5        10999808    12679167      839680   82  Linux swap / Solaris

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xbca8289b

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2097151     1047552   83  Linux    <=====多了一个分区

使用 ext2 文件系统格式化:

[root@localhost ~]# blkid
/dev/block/8:3: UUID="bc14ff35-55fe-4570-9a93-d43f97655556" TYPE="xfs"
/dev/block/8:2: UUID="d25f96ca-cb21-4315-b470-7313a391f431" TYPE="xfs"
/dev/block/8:1: UUID="a24184c0-472c-494d-b169-ebcaa390f092" TYPE="xfs"
/dev/block/8:5: UUID="8b5f116f-701b-41a1-84ad-bb730cabd1a8" TYPE="swap"

#使用ext2格式化
[root@localhost ~]# mkfs.ext2 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 261888 blocks  <======可用的inode和block总数
13094 blocks (5.00%) reserved for the super user <===预留空间
First data block=0
Maximum filesystem blocks=268435456
8 block groups  <======1G 的盘,分了8个block组
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
  32768, 98304, 163840, 229376   <===== superblock备份

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

#打印所有块设备属性,多了一个 ext2分区
[root@localhost ~]# blkid
/dev/block/8:3: UUID="bc14ff35-55fe-4570-9a93-d43f97655556" TYPE="xfs"
/dev/block/8:2: UUID="d25f96ca-cb21-4315-b470-7313a391f431" TYPE="xfs"
/dev/block/8:1: UUID="a24184c0-472c-494d-b169-ebcaa390f092" TYPE="xfs"
/dev/block/8:5: UUID="8b5f116f-701b-41a1-84ad-bb730cabd1a8" TYPE="swap"
/dev/sdb1: UUID="b430687f-45f9-4332-bba7-56eaeabd7480" TYPE="ext2"

将 /dev/sdb1 mount到一个目录后,才能够被操作系统使用:

#将分区挂载到 /data 目录
[root@localhost ~]# mount -t ext2 /dev/sdb1 /data
[root@localhost /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       3.1G  872M  2.2G  29% /
devtmpfs        362M     0  362M   0% /dev
tmpfs           371M     0  371M   0% /dev/shm
tmpfs           371M  5.0M  366M   2% /run
tmpfs           371M     0  371M   0% /sys/fs/cgroup
/dev/sda1       497M  116M  382M  24% /boot
/dev/sda3       1.7G  144M  1.6G   9% /var
tmpfs            75M     0   75M   0% /run/user/0
/dev/sdb1      1007M  1.3M  955M   1% /data

深入观察ext2文件系统

使用dumpe2fs 查看/dev/sdb1 文件系统的详细信息。

[root@localhost /]# dumpe2fs /dev/sdb1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          b430687f-45f9-4332-bba7-56eaeabd7480
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65536 <======inode总数
Block count:              261888 <======block总数
Reserved block count:     13094
Free blocks:              257445
Free inodes:              65525
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      63
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Sat Sep 17 15:22:31 2016
Last mount time:          Sat Sep 17 15:23:59 2016
Last write time:          Sat Sep 17 15:23:59 2016
Mount count:              1
Maximum mount count:      -1
Last checked:             Sat Sep 17 15:22:31 2016
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256   <======= inode大小
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      476f302c-e859-445d-814c-721cf34c269b

Group 0: (Blocks 0-32767)
  Primary superblock at 0, Group descriptors at 1-1
  Reserved GDT blocks at 2-64
  Block bitmap at 65 (+65), Inode bitmap at 66 (+66)
  Inode table at 67-578 (+67)
  32187 free blocks, 8182 free inodes, 1 directories
  Free blocks: 580-583, 585-32767
  Free inodes: 11-8192
Group 1: (Blocks 32768-65535)
  Backup superblock at 32768, Group descriptors at 32769-32769
  Reserved GDT blocks at 32770-32832
  Block bitmap at 32833 (+65), Inode bitmap at 32834 (+66)
  Inode table at 32835-33346 (+67)
  32189 free blocks, 8192 free inodes, 0 directories
  Free blocks: 33347-65535
  Free inodes: 8193-16384
Group 2: (Blocks 65536-98303)
  Block bitmap at 65536 (+0), Inode bitmap at 65537 (+1)
  Inode table at 65538-66049 (+2)
  32254 free blocks, 8192 free inodes, 0 directories
  Free blocks: 66050-98303
  Free inodes: 16385-24576
Group 3: (Blocks 98304-131071)

深入理解inode

#按照inode方式显示分区可用情况
[root@localhost data]# df -i
Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/sda2      3194880 26157 3168723    1% /
devtmpfs         92599   354   92245    1% /dev
tmpfs            94851     1   94850    1% /dev/shm
tmpfs            94851   391   94460    1% /run
tmpfs            94851    13   94838    1% /sys/fs/cgroup
/dev/sda1       512000   330  511670    1% /boot
/dev/sda3      1790976  1404 1789572    1% /var
tmpfs            94851     1   94850    1% /run/user/0
/dev/sdb1        65536    10   65526    1% /data

寻找文件系统中inode:

[root@localhost /]# cd /data/
#创建几个测试目录
[root@localhost data]# mkdir -p d0/d1/d2  d3 d4
#创建一个空文件
[root@localhost data]# touch test_file
#创建一个52k的文件
[root@localhost data]# dd if=/dev/zero of=new_file bs=1k count=52

#-i 查看 文件或目录的 inode编号
[root@localhost data]# ls -il
total 68
49153 drwxr-xr-x. 3 root root  4096 Sep 17 15:46 d0
 8193 drwxr-xr-x. 2 root root  4096 Sep 17 15:46 d3
16385 drwxr-xr-x. 2 root root  4096 Sep 17 15:46 d4
   12 -rw-r--r--. 1 root root 53248 Sep 17 15:48 new_file
   11 -rw-r--r--. 1 root root     0 Sep 17 15:55 test_file

为什么目录的大小都是4096?为什么d3/d4的链接数是2?d0的链接数是3?

创建目录的时候就会分配一个inode和block,所有目录大小一般就是个block的大小(这个文件系统的block大小是4k)。如果目录特别复杂那就会占用更多的block,你找个文件多个目录看看。

Linux允许多个文件共用一个inode,链接数就是有几个文件或目录和它共用这个inode。目录默认下面会有一个 "." 目录,他和此目录本身共用一个inode,还有一个 ".." 目录,它和目录的父目录共用一个inode。 d3/d4 下面没有子目录,只有“.” 和他们共享这个inode,所以链接数是2. d0 有子目录,子目录的 ".." 和他共用这个inode,所以它的inode是3.

"total 68" 是什么意思?

For each directory that is listed, preface the files with a line

'total BLOCKS', where BLOCKS is the total disk allocation for all
files in that directory. The block size currently defaults to 1024
bytes, but this can be overridden (note Block size::). The BLOCKS
computed counts each hard link separately; this is arguably a
deficiency.

目录下所有文件占用磁盘空间大小,这个大小不是实际大小是,文件占用block数量 * 块大小/1024

68=(1 + 1 + 1 + 14) * 4

你能算出 52k 的new_file,文件占用了几个block块吗?14(占满12个直接块,又用另一个间接块,间接块本身占一个).

我们用stat命令查看一下文件更详细的信息:

[root@localhost data]# stat new_file
  File: ‘new_file’
  Size: 53248       Blocks: 112        IO Block: 4096   regular file
Device: 811h/2065d  Inode: 12          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:unlabeled_t:s0
Access: 2016-09-17 15:50:42.121000000 +0800
Modify: 2016-09-17 15:48:54.171000000 +0800
Change: 2016-09-17 15:48:54.171000000 +0800
 Birth: -

 # 空文件没有分配 block
[root@localhost data]# stat test_file
  File: ‘test_file’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 11          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:unlabeled_t:s0
Access: 2016-09-17 15:55:01.843000000 +0800
Modify: 2016-09-17 15:55:01.843000000 +0800
Change: 2016-09-17 15:55:01.843000000 +0800
 Birth: -

 #空目录分配一个block,其实不是严格意义空目录,因为下面有.和..目录
 [root@localhost data]# stat d3
   File: ‘d3’
   Size: 4096       Blocks: 8          IO Block: 4096   directory
 Device: 811h/2065d Inode: 8193        Links: 2
 Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
 Context: unconfined_u:object_r:unlabeled_t:s0
 Access: 2016-09-17 15:46:32.341000000 +0800
 Modify: 2016-09-17 15:46:32.341000000 +0800
 Change: 2016-09-17 15:46:32.341000000 +0800
  Birth: -

我们来看看软链接和硬链接:

[root@localhost data]# ln new_file  hard_link
[root@localhost data]# ln -s new_file soft_link

12 -rw-r--r--. 2 root root 53248 Sep 17 15:48 hard_link
12 -rw-r--r--. 2 root root 53248 Sep 17 15:48 new_file
13 lrwxrwxrwx. 1 root root     8 Sep 17 16:13 soft_link -> new_file

可用看出硬链接和原文件共用一个inode,所以new_file的inode变成了2,而软链接新建了一inode,而文件内容指向原文件名。
hard link soft link

日志式文件系统

我们前面只是讨论了文件系统的存储结构和读取方法,真正运行起来要复杂的多。比如怎么保证数据写入的一致性?怎样做文件系统容错?ext2文件系统中有好多的bitmap和标志位和统计量,这些都能一致的更新吗?像一种场景文件正在写入,突然断电,那会不会造成成功文件系统损害,怎样校验?

文件系统的设计者想出一个办法就是记录文件写入日志,在文件系统中专门用一个block记录文件的操作步骤。简单可用分三步,准备,写入,结束。这样异常的时候就检查这些日志记录就可以了。ext3/ext4 支持这些功能,ext3/ext4是ext2的升级版,可用使用ext4 文件系统,然后使用 dumpe2fs 看一下是否有变化。会多出一个journal 块。

XFS文件系统介绍

CentOS 7 已经将默认文件系统变成了 xfs,xfs也是一个日志文件系统,之所以这样也是为了解决ext文件系统的一些问题。ext3/ext4文件系统已经相当的成熟,而且兼容性比较好,但是格式化大存储时比较慢。前面讲了格式化的时候要提前分配好inode,block等等信息。现在存储空间越来越大,这个问题也越来越突出。XFS也已经发展了好几年,也很成熟, xfs就是被开发来用于高容量磁盘以及高性能文件系统之用,ext4的功能它基本都有。xfs格式化时不需要提前分配inode和block,这些都是运行时确定的。

XFS文件系统在数据组织分布上主要规划为三个部份,一个数据区 (data section)、一个日志区 (log section)以及一个实时运行区 (realtime section)。

数据区 和ext文件系统类似,存储inode/data block/superblock等等数据。 日志区记录文件系统的变化用于校验和恢复。实时运行区在文件写入时会先预写到这里,然后在写入数据区。

dumpe2fs 命令对 xfs文件系统不起作用,可用使用 xfs_info。

[root@localhost data]# xfs_info /dev/sda2
meta-data=/dev/sda2              isize=256    agcount=4, agsize=199680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=798720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

文件系统相关命令

df

列出文件系统的整体磁盘使用量

[root@localhost data]# df --help
Usage: df [OPTION]... [FILE]...
Show information about the file system on which each FILE resides,
or all file systems by default.

Mandatory arguments to long options are mandatory for short options too.
  -h, --human-readable  print sizes in human readable format (e.g., 1K 234M 2G)
  -i, --inodes          list inode information instead of block usage
  -T, --print-type      print file system type

#以用户可读的格式大小分区使用情况
[root@localhost data]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       3.1G  872M  2.2G  29% /
devtmpfs        362M     0  362M   0% /dev
tmpfs           371M     0  371M   0% /dev/shm
tmpfs           371M  5.0M  366M   2% /run
tmpfs           371M     0  371M   0% /sys/fs/cgroup
/dev/sda1       497M  116M  382M  24% /boot
/dev/sda3       1.7G  144M  1.6G   9% /var
tmpfs            75M     0   75M   0% /run/user/0
/dev/sdb1      1007M  1.4M  955M   1% /data  

#打印文件系统类型
[root@localhost data]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda2      xfs       3.1G  872M  2.2G  29% /
devtmpfs       devtmpfs  362M     0  362M   0% /dev
tmpfs          tmpfs     371M     0  371M   0% /dev/shm
tmpfs          tmpfs     371M  5.0M  366M   2% /run
tmpfs          tmpfs     371M     0  371M   0% /sys/fs/cgroup
/dev/sda1      xfs       497M  116M  382M  24% /boot
/dev/sda3      xfs       1.7G  144M  1.6G   9% /var
tmpfs          tmpfs      75M     0   75M   0% /run/user/0
/dev/sdb1      ext2     1007M  1.4M  955M   1% /data

du

计算目录占用空间情况

#不加参数默认统计所有目录的占用空间
[root@localhost /]# du /data
4 /data/d0/d1/d2
8 /data/d0/d1
12  /data/d0
4 /data/d3
4 /data/d4
80  /data

#-s 表示汇总所以目录空间
[root@localhost /]# du -sh /data/
80K /data/

文件压缩

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 的压缩

gzip,zcat/zmore/zless/zgrep

使用gzip进行压缩时,默认情况下原本的文件会被压缩成为.gz 的档名,源文件就被删除掉了。gzip 只能压缩单个文件。gzip支持指定压缩级别 1 ~ 9,数字越大,压缩比越高,但是占用资源越多,耗时会变长。

[root@localhost data]# ll
total 180
drwxr-xr-x. 3 root root  4096 Sep 17 15:46 d0
drwxr-xr-x. 2 root root  4096 Sep 17 15:46 d3
drwxr-xr-x. 2 root root  4096 Sep 17 15:46 d4
-rw-r--r--. 2 root root 53248 Sep 17 15:48 hard_link
-rw-r--r--. 2 root root 53248 Sep 17 15:48 new_file
lrwxrwxrwx. 1 root root     8 Sep 17 16:13 soft_link -> new_file
-rw-r--r--. 1 root root 53248 Sep 17 17:31 test_file
#压缩
[root@localhost data]# gzip test_file
[root@localhost data]# ll
total 128
drwxr-xr-x. 3 root root  4096 Sep 17 15:46 d0
drwxr-xr-x. 2 root root  4096 Sep 17 15:46 d3
drwxr-xr-x. 2 root root  4096 Sep 17 15:46 d4
-rw-r--r--. 2 root root 53248 Sep 17 15:48 hard_link
-rw-r--r--. 2 root root 53248 Sep 17 15:48 new_file
lrwxrwxrwx. 1 root root     8 Sep 17 16:13 soft_link -> new_file
-rw-r--r--. 1 root root    96 Sep 17 17:31 test_file.gz
#解压
[root@localhost data]# gzip -d test_file.gz
#最高压缩比
[root@localhost data]# gzip -9 test_file.gz

#查看压缩文件内容,和cat,more,less,grep命令类似
[root@localhost data]# zcat test_file.gz
hello gzip

bzip2, bzcat/bzmore/bzless/bzgrep

bzip2 用来取代 gzip,提供更佳的压缩比。用法和gzip一致。

xz, xzcat/xzmore/xzless/xzgrep

xz 提供更好的压缩比,用法一样

tar

上面介绍的都是针对单个文件的压缩,如果把多个文件或一个目录压缩就要使用tar来打包。tar命令只有打包功能,没有压缩功能一般结合压缩选项一起使用。

[root@localhost data]# tar --help
Usage: tar [OPTION...] [FILE]...
GNU `tar' saves many files together into a single tape or disk archive, and can
restore individual files from the archive.

Examples:
  tar -cf archive.tar foo bar  # Create archive.tar from files foo and bar.
  tar -tvf archive.tar         # List all files in archive.tar verbosely.
  tar -xf archive.tar          # Extract all files from archive.tar.
  Main operation mode:

    -A, --catenate, --concatenate   append tar files to an archive
    -c, --create               create a new archive
    -d, --diff, --compare      find differences between archive and file system
        --delete               delete from the archive (not on mag tapes!)
    -r, --append               append files to the end of an archive
    -t, --list                 list the contents of an archive
        --test-label           test the archive volume label and exit
    -u, --update               only append files newer than copy in archive
    -x, --extract, --get       extract files from an archive
  Compression options:

    -a, --auto-compress        use archive suffix to determine the compression
                               program
    -I, --use-compress-program=PROG
                               filter through PROG (must accept -d)
    -j, --bzip2                filter the archive through bzip2
    -J, --xz                   filter the archive through xz
        --lzip                 filter the archive through lzip
        --lzma                 filter the archive through lzma
        --lzop
        --no-auto-compress     do not use archive suffix to determine the
                               compression program
    -z, --gzip, --gunzip, --ungzip   filter the archive through gzip
    -Z, --compress, --uncompress   filter the archive through compress

常用的参数组合

# 压缩 d0 整个目录,使用 gzip压缩算法
[root@localhost data]#tar czvf d0.tar.gz d0

# 解压 d0.tar.gz
[root@localhost data]#tar xzvf d0.tar.gz

# 压缩 d0 整个目录,使用 bzip2压缩算法
[root@localhost data]#tar cjvf d0.tar.bz2 d0

# 解压 d0.tar.bz2
[root@localhost data]#tar xjvf d0.tar.bz2

# 压缩 d0 整个目录,使用 xz压缩算法
[root@localhost data]#tar cJvf d0.tar.xz d0

# 解压 d0.tar.xz
[root@localhost data]#tar xJvf d0.tar.xz
版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-青牛,http://hainiubl.com/topics/9
本帖由 青牛 于 6年前 解除加精
点赞
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter