第八章 管理文件系统
1.探索Linux文件系统
使用Linux系统时,需要做出的决策之一是为存储设备选取什么文件系统。Linux的文件系统为我们在硬盘中存储的0和1和应用中使用的文件与目录之间搭建起了一座桥梁。Linux支持多种类的文件系统管理文件和目录。每种文件系统都在存储设备上实现了虚拟目录结构,仅特性略有不同。
ext文件系统
:Linux操作系统中引入的最早的文件系统,叫做扩展文件系统(extended filesystem,简记为ext)
。他为Linux提供了一个基本的类Unix文件系统:就使用虚拟目录来操作硬件设备,在物理设备上按定长的块来存储数据。ext文件系统采用索引节点
的系统来存放虚拟目录中所存储文件的信息。索引节点系统在每个物理设备中创建一个单独的表(称为索引节点表)来存储这些文件的信息。存储在虚拟目录中的每一个文件在索引节点表中都有一个条目。ext文件系统名称中的extended部分来自其跟踪的每个文件的额外数据,包括:文件名,文件大小,文件的属主,文件的属组,文件的访问权限,指向存有文件数据的每个硬盘块的指针。Linux通过唯一的数值(称为索引节点号)来引用索引节点表中的每个索引节点。这个值是由创建文件时由文件系统分配的。文件系统通过索引节点号而不是文件名及路径来标识文件。
ext2文件系统
:ext文件系统的升级版本,基本功能的拓展,保持了同样的结构。**ext2文件系统拓展了索引节点表的格式来保存系统上的每个文件的更多信息。**ext2的索引节点为文件添加了创建时间,修改时间和最后访问时间值来帮助系统管理追踪文件的访问情况。**ext2文件系统还改变了文件在数据块中存储的方式。**ext文件系统常见的问题是在文件写入到物理设备时,存储数据用的块很容易分散到整个设备中(称为碎片化,fragmentation)。数据块的碎片化会降低文件系统的性能。ext2通过按组分配磁盘块来减轻碎片化。
日志文件系统
:此文件系统为Linux系统增加了一层安全性。他不在使用之前的先将数据写入存储设备再更新索引节点表的做法,而是**先将文件的更改写到临时文件(称作日志,journal)中。在数据成功写到存储设备和索引接待您后,在删除对应的日志条目。**如果系统在数据被写入存储设备之前崩溃或断电,日志文件系统下次会读取日志文件并处理上次留下的未写入的数据。Linux中有3中日志方法。
方法 | 描述 |
---|---|
数据模式 | 索引节点和文件都会被写入日志,丢失数据风险低,性能差 |
有序模式 | 只有索引节点会被写入日志,但只有数据成功写入后才删除,在性能和安全性做了折中 |
回写模式 | 只有索引节点数据会被写入日志,但不控制文件数据何时写入,数据丢失风险高 |
数据模式日志方法是目前最单圈的数据保护方法,但同时也是最慢的。所有写到存储设备上的数据都必须写两次。第一次写入日志,第二次写入真正的存储设备。这会导致性能很差,尤其是要对大量数据写入的系统而言。介绍以下集中日志文件系统。
ext3文件系统
:2001年引入Linux内核,直到最近几乎所有的Linux发行版默认的文件系统。采用和ext2相同的索引节点表结构,但给每个存储设备增加了一个日志文件。默认情况下,ext3用有序模式的日志功能,在创建文件系统是可以用命令行选项将ext3的日志方法改成数据模式或回写模式。
ext4文件系统
:2008年Linux内核官方支持ext4文件系统,也是现在大多数Linux发行版采用的默认文件系统,如Ubuntu。除了支持数据压缩和加密,ext4还支持一个称作区段(extent)的特性。ext4还引入了块预分配技术(block preallocation)。如果想要在存储设备上给一个知道要变大的文件预留空间,ext4可以为文件分配所有需要用到的块,ext4用0填满预留的数据块,不会将他们分配给其他文件。
Reiser文件系统
:只支持回写日志模式,只把索引节点列表数据写到日志文件,也因此成为Linux最快的文件系统之一。还有两个特性,在线调整已有文件系统的大小,尾部压缩(tailpacking)。
JFS(Journaled File System)文件系统
:最老的日志文件系统之一,采用有序日志方法,只在日志中保存索引节点数据,直到真正的文件数据被写进存储设备时才删除它。
XFS文件系统
:采用回写模式的日志,支持在线调整文件系统大小。
写时复制(copy-on-write,COW)文件系统
:利用快照兼顾了安全性和性能,修改过的数据并不会直接覆盖当前数据,而是被放入文件系统中的另一个位置上,即使数据修改已经完成,之前的旧数据也不会被重写。COW文件系统最流行的有一下两种。
ZFS文件系统
:稳定的文件系统,与Resier4,Btrfs和ext4势均力敌。最大的弱点就是没有使用GPL许可。
Btrf文件系统
:也称为B树文件系统。
2.操作文件系统
创建分区
分区可以是整个硬盘,也可以是部分硬盘,以容纳虚拟目录的一部分。fdisk
工具用来管理安装在系统上的任何存储设备上的分区。他是个交互式程序,允许输入命令来逐步完成硬盘分区操作。要启动fdisk
命令,必须指定要分区的存储设备的设备名,另外还得有超级用户权限。
fdisk
交互式命令提示符使用单字母命令来告诉fdisk
做什么。p
命令将一个存储设备的详细信息显示出来。
Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x11747e88
Device Boot Start End Blocks Id System
Command (m for help):
分区可以按主分区(primary partition)
或扩展分区(extended partition)
创建。
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-652, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-652, default 652): +2G
Command (m for help):
主分区可以被文件系统直接格式化,而扩展分区则只能容纳其他主分区。扩展分区出现是因为每个存储设备上只能有4个分区,可以通过创建多个扩展分区,然后在扩展分区内创建主分区进行扩展。
Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x029aa6af
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 83 Linux
Command (m for help):
创建了想要的分区之后,用w
命令将更改保存到存储设备上。
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
创建文件系统
在将数据存储到分区之前,必须使用某种文件系统对其进行格式化,这样Linux才能使用它。每种文件系统类型都用自己的命令行程序来格式化分区。
工具 | 用途 |
---|---|
mkefs | 创建一个ext文件系统 |
mke2fs | 创建一个ext2文件系统 |
mkfs.ext3 | 创建一个ext3文件系统 |
mkfs.ext4 | 创建一个ext4文件系统 |
mkreiserfs | 创建一个ReiserFS文件系统 |
jfs_mkfs | 创建一个JFS文件系统 |
mkfs.xfs | 创建一个XFS文件系统 |
mkfs.zfs | 创建一个ZFS文件系统 |
mkfs.btrfs | 创建一个Btrfs文件系统 |
$ sudo mkfs.ext4 /dev/sdb1
[sudo] password for Christine:
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131648 inodes, 526120 blocks
26306 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
为分区创建了文件系统之后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将数据存储在新文件系统中了。可以将新文件系统挂载到虚拟目录中需要额外空间的任何位置。
$ ls /mnt
$
$ sudo mkdir /mnt/my_partition
$
$ ls -al /mnt/my_partition/
$
$ ls -dF /mnt/my_partition
/mnt/my_partition/
$
$ sudo mount -t ext4 /dev/sdb1 /mnt/my_partition
$
$ ls -al /mnt/my_partition/
total 24
drwxr-xr-x. 3 root root 4096 Jun 11 09:53 .
drwxr-xr-x. 3 root root 4096 Jun 11 09:58 ..
drwx------. 2 root root 16384 Jun 11 09:53 lost+found
-t
选项指明了要挂载的文件系统类型(ext4)。
文件系统的检查与修复
fsck
命令可以检查和修复大部分类型的Linux文件系统。
fsck options filesystem
可以在命令行上列出多个要检查的文件系统。文件系统可以通过设备名,在虚拟目录中的挂载点以及分配给文件系统的唯一UUID值来引用。
3.逻辑卷管理
为已有文件系统添加额外的空间比较麻烦,只能在同一个物理硬盘的可用空间范围内调整分区大小。如果硬盘上没有地方了,你就必须换一个更大的硬盘,然后手动将已有的文件系统移动到新的硬盘上。此时可以通过将另外一个硬盘的分区加入已有的文件系统,动态地添加存储空间,使用Linux逻辑卷管理器(logic volume manage,LVM)软件包。
逻辑卷管理布局
逻辑卷管理核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理中,硬盘被称为物理卷(physical volume,PV)
,每个物理卷都会映射到硬盘上特定的物理分区。多个物理卷集中在一起可以形成一个卷组(volume group,VG)
。逻辑卷管理系统将卷组视为一个物理硬盘,但事实上卷组可能是由分布在多个物理硬盘上的多个物理分区组成的。卷组提供了一个创建逻辑分区的平台,而这些逻辑分区则包含了文件系统。整个系统中的最后一层是逻辑卷(logic volume,LV)
。逻辑卷为Linux提供了创建文件系统的分区环境。可以使用任意一种标准的Linux文件系统来格式化逻辑卷,然后再将它加入Linux虚拟目录中的某个挂载点。
卷组横跨了三个不同的物理硬盘,覆盖了五个独立的物理分区。在卷组内部有两个独立的逻辑卷。Linux系统将每个逻辑卷视为一个物理分区。每个逻辑卷可以被格式化成ext4文件系统,然后挂载到虚拟目录中的某个特定位置。
Linux中的LVM
Linux LVM是用来管理逻辑卷的工具。有两个版本,LVM1和LVM2。
快照
:最初的Linux LVM允许你在逻辑卷在线的状态下将其复制到另一个设备。这个功能叫做快照。**传统的备份方法在将文件复制到备份媒体上时通常要将文件锁定。快照允许你在复制的同时,保证运行关键人物的服务器继续工作。**LVM2允许你创建在线逻辑卷的可读写快照。
条带化(striping)
:有了条带化,可跨多个物理硬盘创建逻辑卷。当Linux LVM将文件写入逻辑卷时,文件中的数据块被分散到多个硬盘上。条带化有助于提高硬盘的性能,因为Linux可以将一个文件的多个数据块同时写入多个硬盘,而无需等待单个硬盘移动读写磁头到多个不同位置。
镜像
:是一个实时更新的逻辑卷的完整副本。当你创建镜像逻辑卷时,LVM会将原始逻辑卷同步到镜像副本中。
使用Linux LVM
Linux LVM包只提供了命令行程序来创建和管理逻辑卷管理系统中所有的组件。
定义物理卷:fdisk
命令可以定义物理卷,定义物理卷的过程就是将硬盘上的物理分区转换成Linux LVM使用的物理卷区段。使用t
命令改变分区类型。
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa8661341
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 8e Linux LVM
用分区来创建实际的物理卷:使用pvcreate
命令,pvcreate
定义了用于物理卷的物理分区。
$ sudo pvcreate /dev/sdb1
dev_is_mpath: failed to get device for 8:17
Physical volume "/dev/sdb1" successfully created
使用pvdisplay
命令来显示已创建的物理卷列表。
$ sudo pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "2.01 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 2.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 0FIuq2-LBod-IOWt-8VeN-tglm-Q2ik-rGU2w7
创建卷组:为系统创建多少个卷组并没有既定的规则,可以将所有的可用物理卷加到一个卷组,也可以结合不同的物理卷创建多个卷组。使用命令vgcreate
创建卷组。
$ sudo vgcreate Vol1 /dev/sdb1
Volume group "Vol1" successfully created
查看更多卷组信息使用命令vgdisplay
。
$ sudo vgdisplay Vol1
--- Volume group ---
VG Name Vol1
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 2.00 GiB
PE Size 4.00 MiB
Total PE 513
Alloc PE / Size 0 / 0
Free PE / Size 513 / 2.00 GiB
VG UUID oe4I7e-5RA9-G9ti-ANoI-QKLz-qkX4-58Wj6e
创建逻辑卷:Linux系统使用逻辑卷来模拟物理分区,并在其中保存文件系统。Linux系统会像处理物理分区一样处理逻辑卷,允许你定义逻辑卷中的文件系统,然后将文件系统挂载到虚拟目录上。创建逻辑卷,使用lvcreate
命令。注意lvcreate
命令要求至少输入一个选项,选项可以通过man lvcreate
查看。使用lvdisplay
命令查看创建的逻辑卷的详细情况。
$ sudo lvdisplay Vol1
--- Logical volume ---
LV Path /dev/Vol1/lvtest
LV Name lvtest
VG Name Vol1
LV UUID 4W2369-pLXy-jWmb-lIFN-SMNX-xZnN-3KN208
LV Write Access read/write
LV Creation host, time ... -0400
LV Status
LV Size 2.00 GiB
Current LE 513
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
创建文件系统:使用mkfs.ext4
创建文件系统。
$ sudo mkfs.ext4 /dev/Vol1/lvtest
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131376 inodes, 525312 blocks
26265 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7728 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.Use tune2fs -c or -i to override.
在创建了新的文件系统之后,可以用Linux mount
命令将这个卷挂载到虚拟目录中,就跟他是物理分区一样。
$ sudo mount /dev/Vol1/lvtest /mnt/my_partition
$
$ mount
/dev/mapper/vg_server01-lv_root on / type ext4 (rw)
[...]
/dev/mapper/Vol1-lvtest on /mnt/my_partition type ext4 (rw)
$
$ cd /mnt/my_partition
$
$ ls -al
total 24
drwxr-xr-x. 3 root root 4096 Jun 12 10:22 .
drwxr-xr-x. 3 root root 4096 Jun 11 09:58 ..
drwx------. 2 root root 16384 Jun 12 10:22 lost+found
修改LVM:LVM能够动态修改文件系统,Linux提供工具修改现有的逻辑卷管理配置。
命令 | 功能 |
---|---|
vgchange | 激活和禁用卷组 |
vgremove | 删除卷组 |
vgextend | 将物理卷加到卷组中 |
vgreduce | 从卷组中删除物理卷 |
lvextend | 增加逻辑卷的大小 |
lvreduce | 减小逻辑卷的大小 |
本章小结
1.介绍了Linux文件系统。
2.创建分区及文件系统。
3.介绍了Linux中的逻辑卷管理。
参考文献:Linux命令行与shell脚本编程大全(第三版)Richard Blum Christine Bresnahan著 门佳 武海峰译