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文件系统格式化后变成一个什么样的结构?我们用一张图说明一下:
可以看出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,存储好多重要信息,我们看看这张图:
这张图是以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,而文件内容指向原文件名。
日志式文件系统
我们前面只是讨论了文件系统的存储结构和读取方法,真正运行起来要复杂的多。比如怎么保证数据写入的一致性?怎样做文件系统容错?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