linux 存储结构与磁盘划分
1. 一切从“/”开始
Linux 系统中一切都是文件,文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存放文件,在 Linux 系统中,最常见的目录如下所示:
2. 物理设备的命名规则
在 Linux 系统中一切都是文件,硬件设备也不例外,Linux 系统中常见的硬件设备的文件名称如下所示。
现在的 IDE 设备很少见了,一般硬盘设备都会是以“/dev/sd”开头的。而一台主机上可以有多块硬盘,因此系统采用 a~p 来代表 16 块不同的硬盘(默认从 a 开始分配),而且硬盘的分区编号也很有讲究:
主分区或扩展分区的编号从 1 开始,到 4 结束;逻辑分区从编号 5 开始。
分析一下/dev/sda5 这个设备文件名称包含哪些信息,如图所示。
首先,/dev/目录中的是硬件设备文件;其次,sd 表示是存储设备;然后,a 表示系统中第一个被识别到的设备,最后,5 表示这个设备是一个逻辑分区。一言以蔽之,“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为 5 的逻辑分区的设备文件”。前面所说的主分区、扩展分区和逻辑分区的概念不太容易理解,接下来简单科普一下硬盘相关的知识。
硬盘是由大量的扇区组成的,每个扇区的容量为 512 字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用 446 字节,分区表为 64 字节,结束符占用 2 字节;其中分区表中每记录一个分区信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,这 4 个分区就是 4 个主分区。第一个扇区中的数据信息如图所示。
第一个扇区最多只能创建出 4 个分区?于是为了解决分区个数不够的问题,可以将第一个扇区的分区表中 16 字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用 16 字节分区表空间的指针—一个指向另外一个分区的指针。这样一来,用户一般会选择使用 3 个主分区加 1 个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于 4 个)的需求。当然,就目前来讲大家只要明白为什么主分区不能超过 4 个就足够了。主分区、扩展分区、逻辑分区可以像下图那样来规划。
所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。
3. 文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux 系统支持数十种的文件系统,而最常见的文件系统如下所示。
Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
Ext4:Ext3 的改进版本,作为 RHEL 6 系统中的默认文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4 文件系统能够批量分配 block 块,从而极大地提高了读写效率。
XFS:是一种高性能的日志文件系统,而且是 RHEL 7 中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为 18EB,这几乎满足了所有需求。
在拿到了一块新的硬盘存储设备后,要先分区,然后再格式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于您的需求和硬盘大小;您也可以选择不进行分区,但是必须对硬盘进行格式化处理。
4. 挂载硬件设备
前面讲到,在拿到一块全新的硬盘后要先分区,然后格式化,最后才能挂载并正常使用。“挂载”是什么呢?一个最简单、最贴切的解释:用户需要使用硬盘设备时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。
mount 命令用于挂载文件系统,格式为“mount 文件系统 挂载目录。只需使用 mount 命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设备中的数据了。对于比较新的 Linux 系统来讲,一般不需要使用-t 参数来指定文件系统的类型,Linux 系统会自动进行判断。而 mount 中的-a 参数则厉害了,它会在执行后自动检查/etc/fstab 文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。
mount 命令中的参数以及作用
例如,要把设备/dev/sdb2 挂载到/backup 目录,只需要在 mount 命令中填写设备与挂载目录参数就行,系统会自动去判断要挂载文件的类型,因此只需要执行下述命令即可:
上面挂载的方法在系统重启后会失效,如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”写入到/etc/fstab 文件中。
用于挂载信息的指定填写格式中,各字段所表示的意义
如果想将文件系统为 ext4 的硬件设备/dev/sdb2 在开机后自动挂载到/backup 目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab 文件中写入下面的信息,这样在系统重启后也会成功挂载。
umount 命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”。我们来尝试手动卸载掉/dev/sdb2 设备文件:
5. 添加硬盘设备
在虚拟机 vmware 上添加几个虚拟硬盘。添加的过程就不细说了。这里我添加了两块硬盘 sdb 和 sdc。
5.1 fdisk 命令
fdisk
命令用于管理磁盘分区,提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。不过与前面讲解的直接写到命令后面的参数不同,这条命令是交互式的。fdisk 命令中的参数以及作用:
第 1 步:使用fdisk
命令来尝试管理/dev/sdb 硬盘设备。在看到提示信息后输入参数 p 来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:
第 2 步:输入参数 n 尝试添加新的分区。系统会要求您是选择继续输入参数 p 来创建主分区,还是输入参数 e 来创建扩展分区。这里输入参数 p 来创建一个主分区:
第 3 步:系统要求您先输入主分区的编号。在前文得知,主分区的编号范围是 1~4,因此这里输入默认的 1 就可以了。接下来系统会提示定义起始的扇区位置,这不需要改动,我们敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入+2G 即可创建出一个容量为 2GB 的硬盘分区。
第 4 步:再次使用参数 p 来查看硬盘设备中的分区信息。果然就能看到一个名称为/dev/sdb1、起始扇区位置为 2048、结束扇区位置为 4196351 的主分区了。这时候千万不要直接关闭窗口,而应该敲击参数 w 后回车,这样分区信息才是真正的写入成功啦。
第 5 步:在上述步骤执行完毕之后,Linux 系统会自动把这个硬盘主分区抽象成/dev/sdb1 设备文件。我们可以使用 file 命令查看该文件的属性。但有些时候系统并没有自动把分区信息同步给 Linux 内核。我们可以输入 partprobe 命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧。
如果硬件存储设备没有进行格式化,则 Linux 系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在 Linux 系统中用于格式化操作的命令是 mkfs。这条命令很有意思,因为在 Shell 终端中输入 mkfs 名后再敲击两下用于补齐命令的 Tab 键,会有如下所示的效果:
对!这个 mkfs 命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。例如要格式分区为 XFS 的文件系统,则命令应为 mkfs.xfs /dev/sdb1。
终于完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用 mount 命令将存储设备与挂载点进行关联;最后使用 df -h 命令来查看挂载状态和硬盘使用量信息。
5.2 du 命令
接下来就可以尝试通过挂载点目录向存储设备中写入文件了。在写入文件之前,先介绍一个用于查看文件数据占用量的 du 命令。我们还可以使用 du -sh /*命令来查看在 Linux 系统根目录下所有一级目录分别占用的空间大小。下面,我们先从某些目录中复制过来一批文件,然后查看这些文件总共占用了多大的容量:
细心的读者一定还记得,前面在讲解 mount 命令时提到,使用 mount 命令挂载的设备文件会在系统下一次重启的时候失效。如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件中:
6. 添加交换分区
SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。
交换分区的创建过程与前文讲到的挂载并使用存储设备的过程非常相似。在对/dev/sdb 存储设备进行分区操作前,有必要先说一下交换分区的划分建议:在生产环境中,交换分区的大小一般为真实物理内存的 1.5~2 倍,为了让大家更明显地感受交换分区空间的变化,这里取出一个大小为 5GB 的主分区作为交换分区资源。在分区创建完毕后保存并退出即可:
使用 SWAP 分区专用的格式化命令 mkswap,对新建的主分区进行格式化操作:
使用 swapon 命令把准备好的 SWAP 分区设备正式挂载到系统中。我们可以使用 free -m 命令查看交换分区的大小变化(由 2047MB 增加到 7167MB):
为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入到配置文件中,并记得保存:
7. 磁盘容量配额
本书在前面曾经讲到,Linux 系统的设计初衷就是让许多人一起使用并执行各自的任务,从而成为多用户、多任务的操作系统。但是,硬件资源是固定且有限的,如果某些用户不断地在 Linux 系统上创建文件或者存放电影,硬盘空间总有一天会被占满。针对这种情况,root 管理员就需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用 quota 命令进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota 命令还有软限制和硬限制的功能。
软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
RHEL 7 系统中已经安装了 quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对 quota 的支持,此时需要手动编辑配置文件,让 RHEL 7 系统中的/boot 目录能够支持 quota 磁盘配额技术。另外,对于学习过早期的 Linux 系统,或者具有 RHEL 6 系统使用经验的读者来说,这里需要特别注意。早期的 Linux 系统要想让硬盘设备支持 quota 磁盘容量配额服务,使用的是 usrquota 参数,而 RHEL 7 系统使用的则是 uquota 参数。在重启系统后使用 mount 命令查看,即可发现/boot 目录已经支持 quota 磁盘配额技术了:
接下来创建一个用于检查 quota 磁盘容量配额效果的用户 tom,并针对/boot 目录增加其他人的写权限,保证用户能够正常写入数据:
7.1 xfs_quota 命令
xfs_quota 命令是一个专门针对 XFS 文件系统来管理 quota 磁盘容量配额服务而设计的命令,格式为“xfs_quota [参数] 配额 文件系统”。其中,-c 参数用于以参数的形式设置要执行的命令;-x 参数是专家模式,让运维人员能够对 quota 服务进行更多复杂的配置。接下来我们使用 xfs_quota 命令来设置用户 tom 对/boot 目录的 quota 磁盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为 3MB 和 6MB;创建文件数量的软限制和硬限制分别为 3 个和 6 个。
当配置好上述的各种软硬限制后,尝试切换到这个普通用户,然后分别尝试创建一个体积为 5MB 和 8MB 的文件。可以发现,在创建 8MB 的文件时受到了系统限制:
7.2 edquota 命令
edquota 命令用于编辑用户的 quota 配额限制,格式为“edquota [参数] [用户] ”。在为用户设置了 quota 磁盘容量配额限制后,可以使用 edquota 命令按需修改限额的数值。其中,-u 参数表示要针对哪个用户进行设置;-g 参数表示要针对哪个用户组进行设置。edquota 命令会调用 Vi 或 Vim 编辑器来让 root 管理员修改要限制的具体细节。下面把用户 tom 的硬盘使用量的硬限额从 5MB 提升到 8MB:
8. 软硬方式链接
当引领大家学习完本章所有的硬盘管理知识之后,刘遄老师终于可以放心大胆地讲解 Linux 系统中的“快捷方式”了。在 Windows 系统中,快捷方式就是指向原始文件的一个链接文件,可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方后,会导致链接文件失效。但是,这个看似简单的东西在 Linux 系统中可不太一样。
在 Linux 系统中存在硬链接和软连接两种文件。
硬链接(hard link):可以将它理解为一个“指向原始文件 inode 的指针”,系统不为它分配独立的 inode 和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的 inode 连接数就会增加 1;而且只有当该文件的 inode 连接数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件 inode 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。
软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与 Windows 系统中的“快捷方式”具有一样的性质。
ln 命令
ln 命令用于创建链接文件,格式为“ln [选项] 目标”,其可用的参数以及作用如表 6-6 所示。在使用 ln 命令时,是否添加-s 参数,将创建出性质不同的两种“快捷方式”。因此如果没有扎实的理论知识和实践经验做铺垫,尽管能够成功完成实验,但永远不会明白为什么会成功。ln 命令中可用的参数以及作用:
为了更好地理解软链接、硬链接的不同性质,接下来创建一个类似于 Windows 系统中快捷方式的软链接。这样,当原始文件被删除后,就无法读取新建的链接文件了。
接下来针对一个原始文件创建一个硬链接,即相当于针对原始文件的硬盘存储位置创建了一个指针,这样一来,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会因为原始文件的删除而导致无法读取。同时可以看到创建硬链接后,原始文件的硬盘链接数量增加到了 2。
版权声明: 本文为 InfoQ 作者【乌龟哥哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/17ef0a81e494042b3e4125dda】。文章转载请联系作者。
评论