整理自刘遄老师的《Linux就该这么学》,网站链接
文章目录
6、存储结构与磁盘划分
6.1 “/”
Linux系统中一切都是文件。与Win系统中依次进入磁盘、具体目录,最终找到文件的方式不同,Linux系统中并不存在C/D/E/F等盘符。Linux 系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS)采用树形结构来存放文件,以及定义了常见目录的用途
。另外,Linux系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、rooT 均代表不同的目录,并且文件名称中不得包含斜杠(/)
。
FHS 是根据以往无数Linux 系统用户和开发者的经验而总结出来的,是用户在Linux 系统中存储文件时需要遵守的规则,用于指导我们应该把文件保存到什么位置,以及告诉用户应该在何处找到所需的文件。它是一种道德上的约束。
在 Linux 系统中另外还有一个重要的概念—路径
。路径指的是如何定位到某个文件,分为绝对路径
与相对路径
。绝对路径指的是从根目录(/)开始写起的文件或目录名称,而相对路径则指的是相对于当前路径的写法。
6.2 物理设备的命名规则
系统内核中的udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev 目录下的设备文件。
由于现在的 IDE 设备已经很少见了,所以一般的硬盘设备都会是以“/dev/sd”开头的。而一台主机上可以有多块硬盘,因此系统采用a~p 来代表16 块不同的硬盘(默认从a 开始分配),而且硬盘的分区编号也很有讲究:
主分区或扩展分区的编号从 1 开始,到4 结束;
逻辑分区从编号 5 开始。
说明:
1、/dev/sda中的a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的,很多主板的插槽顺序就是系统内核的识别顺序,但不完全是。所以“/dev/sda 表示主板上第一个插槽上的存储设备”说法是错误的。
2、分区的数字编码不一定是强制顺延下来的,也有可能是手工指定的。因此sda3 只能表示是编号为3 的分区,而不能判断sda 设备上已经存在了3 个分区。
“/dev/sda5”表示系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件。
关于主分区、扩展分区和逻辑分区的概念,可详见 Linux就该这么学-06 图6-3部分讲解。
6.3 文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux系统支持数十种的文件系统,而最常见的文件系统包括:
Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。
Ext4:Ext3 的改进版本,作为RHEL 6 系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB)。
XFS:是一种高性能的日志文件系统,而且是RHEL 7 中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。
硬盘存储设备的分区、格式化
虚拟文件系统VFS
详见 Linux就该这么学-06 6.3节
6.4 挂载硬件设备
当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载
”。
1、mount命令
mount 命令用于挂载文件系统
,格式为“mount 文件系统挂载目录”。挂载是在使用硬件设备前所执行的最后一步操作。只需使用mount 命令把硬盘设备或分区与一个目录文件进行关联,然后就能在这个目录中看到硬件设备中的数据了
。对于比较新的Linux 系统来讲,一般不需要使用-t 参数来指定文件系统的类型,Linux 系统会自动进行判断。而mount 中的-a 参数则厉害了,它会在执行后自动检查/etc/fstab文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。
示例:
把设备/dev/sdb2 挂载到/backup 目录:mount /dev/sdb2 /backup
按照该方法执行mount命令后就能立即使用文件系统了,但系统重启后挂载就会失效,也就是说我们需要每次开机后都手动挂载一下。如果想让硬件设备和目录永久自动关联,需按照指定的信息格式 “设备文件挂载目录 格式类型权限选项自检 优先级” 写入到/etc/fstab 文件中。
2、umount命令
umount 命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”。当不再使用硬件的设备资源时,只需说明想要取消关联的设备文件或挂载目录的其中一项即可,一般不需要加其他额外的参数。
6.5 添加硬盘设备
添加硬件设备的操作过程:分区、格式化、挂载
1、fdisk(分区)与mkfs(格式化)
fdisk 命令用于管理磁盘分区
,格式为“fdisk [磁盘名称]”,它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。该命令的参数是交互式的,因此在管理硬盘设备使很方便,可动态调整。
在Linux 系统中用于格式化操作的命令是mkfs。
分区与格式化的详细过程见Linux就该这么学-06 6.5.1节
2、du命令
存储设备经分区、格式化和挂载后,接下来就可以通过挂载点目录向存储设备中写入文件了。
du命令用于查看文件数据占用量,其格式为“du [选项] [文件]”。简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。我们还可以使用du -sh /*命令来查看在Linux 系统根目录下所有一级目录分别占用的空间大小。
6.6 添加交换分区
SWAP(交换)分区
是一种通过在硬盘中预先划分一定的空间
,然后将把内存中暂时不常用
的数据临时
存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。
交换分区的创建过程与前文讲到的挂载并使用存储设备的过程非常相似。在对/dev/sdb存储设备进行分区操作前,有必要先说一下交换分区的划分建议:在生产环境中,交换分区的大小一般为真实物理内存的1.5~2 倍
,为了让大家更明显地感受交换分区空间的变化,这里取出一个大小为5GB 的主分区作为交换分区资源。
使用 SWAP 分区专用的格式化命令mkswap,对新建的主分区进行格式化操作
:
使用 swapon 命令把准备好的SWAP 分区设备正式挂载到系统中
。我们可以使用free -m 命令查看交换分区的大小变化(由2047MB 增加到7167MB):
为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入到配置文件中,并记得保存。
6.7 磁盘容量配额
Linux是一个多用户、多任务的操作系统,为了保证固定且有限的硬件资源得到合理使用,root管理员需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数
,一旦达到这个最大值就不再允许继续使用。
可以使用quota
命令进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota命令还有软限制和硬限制的功能:
- 软限制:当达到软限制时会
提示用户
,但仍允许用户在限定的额度内继续使用。 - 硬限制:当达到硬限制时会提示用户,且
强制终止用户的操作
。
RHEL 7 系统中已经安装了quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对quota 的支持,此时需要手动编辑配置文件,让RHEL 7 系统中的/boot 目录能够支持quota磁盘配额技术。RHEL 7 系统使用uquota
参数来支持quota 磁盘容量配额服务。
接下来创建一个用于检查quota 磁盘容量配额效果的用户tom,并针对/boot 目录增加其他人的写权限,保证用户能够正常写入数据:
[root@linuxprobe ~]# useradd tom
[root@linuxprobe ~]# chmod -Rf o+w /boot
1、xfs_quota命令
xfs_quota 命令是一个专门针对XFS 文件系统来管理quota 磁盘容量配额服务而设计的命令,格式为“quota [参数] 配额文件系统”。其中,-c 参数用于以参数的形式设置要执行的命令;-x参数是专家模式,让运维人员能够对quota 服务进行更多复杂的配置。
使用xfs_quota命令来设置用户tom 对/boot 目录的quota 磁盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为3MB 和6MB;创建文件数量的软限制和硬限制分别为3 个和6 个。
[root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot
[root@linuxprobe ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1) Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 95084 0 0 00 [--------]
tom 0 3072 6144 00 [--------]
当配置好上述的各种软硬限制后,尝试切换到这个普通用户,然后分别尝试创建一个体积为5MB 和8MB 的文件。可以发现,在创建8MB 的文件时受到了系统限制:
[root@linuxprobe ~]# su - tom
[tom@linuxprobe ~]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
1+0 records in
1+0 records out
5242880 bytes (5.2 MB) copied, 0.123966 s, 42.3 MB/s
[tom@linuxprobe ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
dd: error writing ‘/boot/tom’: Disk quota exceeded
1+0 records in
0+0 records out
6291456 bytes (6.3 MB) copied, 0.0201593 s, 312 MB/s
2、edquota命令
edquota 命令用于编辑用户的quota 配额限制,格式为“edquota [参数] [用户] ”。在为用户设置了quota 磁盘容量配额限制后,可以使用edquota 命令按需修改限额的数值。其中,-u参数表示要针对哪个用户进行设置;-g 参数表示要针对哪个用户组进行设置。edquota 命令会调用Vi 或Vim 编辑器来让root 管理员修改要限制的具体细节。下面把用户tom 的硬盘使用量的硬限额从5MB 提升到8MB:
[root@linuxprobe ~]# edquota -u tom
Disk quotas for user tom (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sda 6144 3072 8192 1 3 6
[root@linuxprobe ~]# su - tom
Last login: Mon Sep 7 16:43:12 CST 2017 on pts/0
[tom@linuxprobe ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB) copied, 0.0268044 s, 313 MB/s
[tom@linuxprobe ~]$ dd if=/dev/zero of=/boot/tom bs=10M count=1
dd: error writing ‘/boot/tom’: Disk quota exceeded
1+0 records in
0+0 records out
8388608 bytes (8.4 MB) copied, 0.167529 s, 50.1 MB/s
6.8 软硬方式链接
在Windows 系统中,快捷方式
就是指向原始文件的一个链接文件,可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方后,会导致链接文件失效。
但是,这个概念在Linux中不太一样。在Linux系统中存在硬链接
和软链接
两种文件:
- 硬链接(hard link):
可以将它理解为一个“指向原始文件inode 的指针”,系统不为它分配独立的inode 和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode 连接数就会增加1;而且只有当该文件的inode 连接数为0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。 - 软链接(也称为符号链接[symbolic link]):
仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows 系统中的“快捷方式”具有一样的性质。
ln命令
ln 命令用于创建链接文件,格式为“ln [选项] 目标”,其可用的参数如下所示。在使用ln 命令时,是否添加-s 参数,将创建出性质不同的两种“快捷方式”:
软链接示例:
【当原始文件被删除后,就无法读取新建的链接文件了】
[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > readme.txt
[root@linuxprobe ~]# ln -s readme.txt readit.txt
[root@linuxprobe ~]# cat readme.txt
Welcome to linuxprobe.com
[root@linuxprobe ~]# cat readit.txt
Welcome to linuxprobe.com
[root@linuxprobe ~]# ls -l readme.txt
-rw-r--r-- 1 root root 26 Jan 11 00:08 readme.txt
[root@linuxprobe ~]# rm -f readme.txt
[root@linuxprobe ~]# cat readit.txt
cat: readit.txt: No such file or directory
硬链接示例:
【相当于针对原始文件的硬盘存储位置创建了一个指针,这样一来,新创建的这个硬链接就不再依赖于原始文件的名称等信息,也不会因为原始文件的删除而导致无法读取。同时可以看到创建硬链接后,原始文件的硬盘链接数量增加到了2。】
[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > readme.txt
[root@linuxprobe ~]# ln readme.txt readit.txt
[root@linuxprobe ~]# cat readme.txt
Welcome to linuxprobe.com
[root@linuxprobe ~]# cat readit.txt
Welcome to linuxprobe.com
[root@linuxprobe ~]# ls -l readme.txt
-rw-r--r-- 2 root root 26 Jan 11 00:13 readme.txt
[root@linuxprobe ~]# rm -f readme.txt
[root@linuxprobe ~]# cat readit.txt
Welcome to linuxprobe.com