00:00/00:00

章节简述:

本章节从Linux系统的存储结构引入,讲述硬盘存储结构硬件命名规则以及内核Udev设备管理器服务

让读者理解文件系统的作用,能够区分ext3,ext4,xfs有何不同并学习将硬盘设备分区格式化以及挂载等常用硬盘管理操作。

完整配置SWAP交换分区quota服务限制磁盘配额ln命令创建软/硬链接RAID磁盘阵列(01510)LVM逻辑卷管理器

6.1 一切从“/”开始

Linux系统中的目录、字符设备、块设备、套接字、打印机等等都被抽象成了文件,即我们所一直强调的——Linux系统中一切都是文件。既然平时跟我们打交道的都是文件,那么又应该如何的找到它们呢?在Windows™操作系统中想要找到一个文件,肯定就要依次进入“D盘”后再进入某某目录中找到所需要的文件,但在Linux系统中可并不存在C/D/E/F盘符呦,一切的文件都是从“根(/)”目录开始的,按照FHS文件系统层次结构标准协定采用树形结构来存放文件并定义了每个区域的用途,另外在Linux系统中的文件及目录名称是严格区分大小写的,例如root、rOOt、Root、rooT等等均代表是不同的独立目录,并且名称中不得包含反斜杠(/)。如图6-1所示:

Linux存储架构

图6-1 Linux系统中的文件存储结构

FHS文件系统层次结构标准协定(Filesystem Hierarchy Standard)是工程师们在Linux系统中存储文件的时候需要遵守的规则,FHS是根据以往无数Linux系统用户和开发者的经验而总结出来的,指导我们应该将文件保存到什么位置,以及告诉我们应该在何处找到所需的文件。但目前FHS对于运维工程师来讲也算是一种道德操守,有些运维人员就是懒得遵守,或者根本没有听说过这个东东,依然会把文件到处乱放,不过刘遄老师并不要求同学们去谴责他们,而应该把自己的知识活学活用,千万不要认准这个FHS协定只讲死道理,那吃亏的就可能是自己啦,最常见的目录所对应的用处包括有:

目录名称 应放置文件的内容
/boot 开机所需文件——内核,开机菜单及所需配置文件等
/dev 任何设备与接口都以文件形式存放在此目录
/etc 配置文件
/home 用户主目录
/bin 单用户维护模式下还能够被操作的命令
/lib 开机时用到的函数库及/bin与/sbin下面命令要调用的函数
/sbin 开机过程中需要的
/media 一般挂载或删除的设备
/opt 放置第三方的软件
/root 系统管理员的主文件夹
/srv 一些网络服务的数据目录
/tmp 任何人均可使用的“共享”临时目录
/proc 虚拟文件系统,例如系统内核,进程,外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin 非系统开机时需要的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件。
/var 主要存放经常变化的文件,如日志。
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里

另外还一个重要的概念——“路径”,路径指的是如何定位到某个文件,分为绝对路径相对路径。在Linux系统中的绝对路径指的是从根目录(/)开始写起的文件或目录名称,而相对路径则指的是相对于当前路径的写法,举个例子帮助同学们来理解吧,假如有个外国游客来到中国旅游找不到洗手间了来跟你问路,那么你就有了两种回答的方法:

绝对路径(absolute):首先坐飞机来到中国,到了北京出首都机场做地铁到十号线潘家园站,出站坐34路到农光里下车路口左转。

相对路径(relative):前面路口左转

这两种方法没有对错之分,因为如果你说的是绝对路径,那么任何一个外国人都可以按照这个提示找到洗手间,缺点是过于繁琐。如果你说的是相对路径,虽然话虽然变得很简练但这个外国人只能从当前出发找到洗手间,而并不能在以后的每个路口都左转后找到洗手间,因此缺点就是不具备普遍性。如果同学们还不能理解的话先不要着急,以后通过实践的练习肯定能够彻底明白的,倒是FHS中所规范的目录作用最好先背一背,以后肯定会有用的。

6.2 物理设备的命名规则

Linux系统中一切都是文件,那么硬件设备肯定也不例外。既然是文件就必须有名称啦,系统内核的udev设备管理器会自动将硬件名称规范起来,目的是让我们可以通过设备文件的名字猜出设备大致的属性以及分区信息等,对于陌生的设备这点特别的方便,另外udev服务会一直以守护进程的形式运行并侦听来自内核发出的信号来管理/dev目录下的设备文件。常见的硬件命名规则如下:

硬件设备 文件名称
IDE设备 /dev/hd[a-d]
SCSI/SATA/U盘 /dev/sd[a-p]
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-15]
光驱 /dev/cdrom
鼠标 /dev/mouse
磁带机 /dev/st0或/dev/ht0(IDE设备)

因为现在的IDE设备已经很少见啦,所以一般硬盘设备都会是以“/dev/sd”开头的,而一台主机上可以有多块硬盘,因此系统便会用a-p来代表16块不同的硬盘(默认从a开始分配)且分区编号也很有讲究。

主分区或扩展分区的编号从1开始至4结束。

逻辑分区从编号5开始。

很多Linux老师讲到设备和分区名称的时候总会讲错2个知识点,这其中还不乏很多知名Linux书籍,第一点是设备名称的理解错误,很多技术书籍中提到比如“/dev/sda”就是代表系统主板上第一个插槽上的存储设备,当我们在实践操作的时候会发现果然如此,因此就对这条理论知识更加深信不疑,但其实并不是这样的,/dev目录中sda设备之所以是a,并不是由插槽决定的,而是由系统内核的识别顺序决定的,而恰巧很多主板的插槽顺序就是系统内核的识别顺序因此才会被命名为/dev/sda,当我们在使用iscsi网络存储设备时候就会发现,明明主板上第二个插槽是空着的,但却能识别到“/dev/sdb”这个设备就是这个道理。第二点是分区名称的理解错误,很多Linux老师告诉学生分区的编号代表分区的个数,比如sda3就代表这是设备上的第三个分区,一般学生做实验的时候确实也会得出同样的效果,但这个理论知识其实也讲错了,,因为分区的数字编码不一定是强制顺延下来的,而有可能是手工指定的,因此sda3只能表示是编号为3的分区文件,而不能因此判断sda设备上已经存在了3个分区。好啦,排除了这两个“坑”之后,我们来一起分析下“/dev/sda5”这个设备文件包含有那些信息吧~如图6-2所示。

硬盘命名规则

图6-2 设备文件名称

首先/dev/目录中保存的应当是硬件设备文件,其次sd开头代表是存储设备,然后a代表是系统中同类接口中第一个被识别到设备,最后的5代表这个设备一定是个逻辑分区。简单总结来说“/dev/sda5”代表的就是——“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的文件”。很多同学可能基础并不好,不太理解我们前面所说的主分区、扩展分区和逻辑分区的概念,所以在这里简单科普下硬盘的知识,如前面第0章中强调的书籍编写初衷,刘遄老师不要求你记住下面的知识,只要看懂就行了。

因为计算机中有了硬盘设备才使得我们游戏通关过后可以保存记录而不是再重新开始,硬盘设备则是由大量的扇区组成的,其中第一个扇区最重要,它里面保存着主引导记录分区表信息。单个扇区容量为512bytes组成,主引导记录需要占用446bytes,分区表的为64bytes,结束符占用2bytes,而其中每记录一个分区信息需要16bytes,这最多四个能有幸被写到第一个扇区中的分区信息就叫做主分区,扇区的信息写入如图6-3所示。

硬盘的扇区

图6-3 扇区的信息写入

那么问题来了——好像只能记逻辑录4个分区信息?于是为了解决分区个数不够的问题,我们可以将其中的16bytes(原本要写入主分区信息)的空间拿出来指向到另外一个分区上面,也就是说扩展分区其实并不是一个“分区”,而更像是一个“指针”,指向了另外的一个分区的指针。那么运维人员一般会选择用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,这样我们就可以用分区来满足多分区的需求了,当然这里同学们只需明白为什么主分区不能超过4个就足够啦。主分区、扩展分区、逻辑分区可以想如图6-4来规划。

逻辑分区

图6-4 硬盘分区的规划

读者们来试着解读下/dev/hdc8代表着什么?答案模式

答案:这是第三块IDE设备(比较少见了)中的编号为8的逻辑分区。

6.3 文件系统与数据资料

用户在硬件存储设备上面正常建立文件写入读取修改转存文件控制文件等等操作都是依靠了文件系统来完成的,文件系统的作用是将硬盘合理的规划,保证用户正常的使用需求,在Linux系统中支持的文件系统就有数十种,而最常见的文件系统有:

Ext3是一款日志文件系统,能够在异常宕机中避免文件系统资料丢失的情况,自动修复数据的不一致与错误,然而对于容量较大的硬盘来说需要耗费在修复上的时间也会非常多,并且也不能保证100%资料不流失。它会将整个磁盘的每个写入动作细节都预先记录下来,以便在异常宕机后能够回溯追踪到被中断的部分。

Ext4可以称为是Ext3的后继版本,作为RHEL6系统中的默认文件管理系统,它支持更大的文件系统到1EB(1EB=1,073,741,824GB且能够有无限多的子目录),另外Ext4文件系统能够批量分配block块并作"Extents"极大的提高了读写效率。

XFS作为最新RHEL7中默认的文件管理系统,它的日志型文件管理系统的优势在意外宕机后尤其明显,可以快速的恢复可能被破坏的文件,另外经过优化后日志功能对硬盘性能影响非常小,同时最大支持18EB的存储容量满足了几乎所有需求。

在红帽RHEL7系统中比较大的变化之一就是在文件系统方面使用XFS替换了Ext4,从红帽官方发布的说明来看确实是一次不小的进步,但是刘遄老师在实测中发现并不完全属实,因为单讲对于测试一款文件系统的“读取”这一评测项目,到底要测试读取的文件个数有多少个?每个文件的大小是多少?读取时占用CPU、内存等系统资源情况,以及操作系统、不同的硬件配置等等因此当刘遄老师充分的考虑到这些不定因素后就会发现实在不敢直接照抄红帽官方的介绍,老师个人认为在效能方面XFS虽然比Ext4有所提升,但绝不是压倒性的,因此XFS文件系统带给我们最卓越的亮点应该当属可支持18EB的存储容量吧~

当我们拿到了一块新的硬盘存储设备之后首先要分区,然后格式化文件系统最后才能挂载正常的使用,就像当我们拿到了一张大白纸,首先为了使用方便要裁剪,然后为了书写工整要先画格。分区的操作取决于您的需求和硬盘大小,也是可以不做的,而格式化文件系统则是必做的,刘遄老师再来给您简单的科普下格式化后发生的事情吧,但是再强调下不用记,只要看懂就行了~

日常中在硬盘要保存的数据实在太多了,因此就要有个叫super block的“硬盘地图”,并不是把数据直接写入到这个“大地图”里面,而是在上面记录着整个文件系统的信息,因为如果把所有的信息都写入到这里面的话,就一定会导致它的体积变的很大,查询与写入速度会变的很慢,于是每个文件的权限与属性都会记录在inode中(每个文件都会占用一个独立的inode表格,默认为128bytes),记录着:

该文件的访问权限(read,write,execute)

该文件的所属主与组(owner,group)

该文件的大小(size)

该文件的创建或状态修改时间(ctime)

该文件的最后一次访问时间(atime)

该文件的修改时间(mtime)

文件的特殊权限(SUID,SGID,SBIT)

该文件的真实数据地址(point)

而文件的实际数据内容则保存在block块中(大小可以是1K、2K或4K),一个inode大小仅为128bytes(Ext3),记录一个block消耗4bytes,一般当把inode写满后就会取出一个block用于号码记录而不再是保存实际的文件系统。下面的说明中,我们以4K为例。

情况一:文件体积很小(1K),那么依然会占用一个block,潜在的浪费3K。

情况二:文件体积很大(5K),那么会占用两个(5K-4K剩下的1K也要占用一个block)。

实际上随着计算机系统的发展产生出了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,于是在Linux内核中的软件层为用户程序提供了一个VFS文件系统接口(Virtual File System),这样就转而统一对这个虚拟文件系统进行操作啦。如图6-5所示,即实际文件系统在VFS下隐藏了自己的特性和细节,使得我们在日常使用时觉得“文件系统都是一样的”。
虚拟文件系统VFS

图6-5 VFS虚拟文件系统结构

6.4 挂载硬件设备

用习惯了Windows系统让我们觉得一切都理所应当,平时把U盘插入到电脑后也根本没有考虑过到底系统做了那些事情,我们又是为什么能够访问到这个U盘内资料的,但是在Linux系统中这些最好是手动来做,因为这会让你更好的把控数据。如前面我们来讲当拿到了一块全新的硬盘存储设备之后首先要分区,然后格式化最后才能挂载正常使用。分区和格式化我们以前常常听到,但“挂载”又是个什么东东呢?刘遄老师给您一个最简单、最贴切的解释——挂载操作指的是当用户需要使用硬盘设备分区数据时,需要先将与一个已存在的目录文件做关联,而这个动作就叫“挂载”。咱们下面的课程中会逐步教会同学们如何使用硬盘设备,但这个挂载理论知识上面比较负责,而且实在太重要了,因此刘遄老师决定单独拿出一个小节单独的讲解一下,但这部分不光要看懂,也要记住。

mount命令用于挂载文件系统,格式为:“mount 文件系统 挂载目录”。

挂载是我们在使用硬件设备前的最后操作的一步。我们只需要用mount命令将硬件设备与一个目录做关联,然后就能在这个目录中看到硬件设备中的数据了。对于比较最新的RHEL7系统来讲,一般是不需要使用-t参数来制定说明文件系统类型的,这点系统会自动进行判断。而mount -a命令参数是非常厉害的,执行后会自动检查/etc/fstab文件中有无疏漏被挂载的设备文件,然后进行自动挂载操作。

参数 作用
-a 挂载所有在/etc/fstab中定义的文件系统
-t 指定文件系统的类型


例如我们想要将如果需要将设备"/dev/sdb2"挂载到"/backup"目录,文件格式是ext4。mount命令只需要填写设备与挂载目录参数就行,一般系统会自动去判断要挂载文件的类型~因此只需要这样来做:

执行命令:mount /dev/sdb2 /backup

虽然按照上面的方法执行mount命令后就能立即使用文件系统了,但重启后挂载就会失效,也就是说我们需要每次开机后都手动的挂载一下,这肯定不是我们想要的方案,因此如果您想让硬件设备和目录永久的进行自动关联,就必须将挂载信息按照指定的格式写入到/etc/fstab文件中。这个文件中包含着诸多挂载所需的信息项目,一旦配置好之后就会永久的为咱们服务啦。

填写格式如下:“设备文件 挂载目录 格式类型 权限选项 自检 优先级”

设备文件:一般为设备的路径+设备名称,也可以写UUID值。
挂载目录:指定要挂载到的目录,需挂载前创建好。
格式类型:即指定文件系统的格式,比如有ext3/ext4/xfs/swap/iso9960(此为光盘设备)等等。
权限选项:默认为defaults(rw,suid,dev,exec,auto,nouser,async),可指定acl或quota等。
自检:若为1则开机后进行磁盘自检,0为不自检。
优先级:若“自检”为1,则可对多块硬盘进行优先级设置。

那么要想让文件系统为"ext4"的硬件设备"/dev/sdb2"开机后自动挂载到"/backup"目录上,默认权限无需开机自检,就需要在/etc/fstab文件中写入下面的信息,重启后检查也会成功~

[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0 
/dev/sdb2 /backup ext4 defaults 0 0

umount命令用于撤销已经挂载的设备文件,格式为:“umount [挂载点/设备文件]”。

挂载文件系统是为了使用硬件资源,卸载文件系统就意味不再使用硬件的设备资源,而我们挂载的操作就是硬件设备与目录的关联动作,因此我们的卸载操作只需要说明想要取消关联的设备文件或挂载目录其中的一项即可,而且一般也不需要加其他额外的参数,例如我们来尝试手动的卸载掉“/dev/sdb2”这个设备文件吧:

[root@linuxprobe ~]# umount /dev/sdb2

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流请加A群:560843(),B群:340829(推荐),C群:463590(推荐),点此查看全国群

*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。

6.5 添加硬盘设备

根据我们刚刚对管理硬件设备所学的理论知识,先来理清一下思路吧~首先我们需要在虚拟机中模拟再添加入一块新的硬盘存储设备,然后逐步的进行分区、格式化、挂载操作,最后通过检查系统挂载状态和真实的使用来最终验证硬件是否已正确部署好了吧。

1.使用虚拟机软件的好处又一次体现出来了,因为我们不需要为了做这个实验而特意去买一块真实的硬盘,而是通过虚拟机软件进行硬件模拟就可以,操作步骤首先是把虚拟机系统关机后点击“编辑虚拟设置”选项,选择添加一块新的硬件设备,如图6-6所示。

在虚拟机中添加硬盘
图6-6 在虚拟机系统中添加硬件设备

2.然后我们选择想要添加的硬件类型为硬盘,这确实没有什么需要说明的,点击下一步就可以啦~如图6-7所示。

图6-7 选择添加硬件类型

3.选择硬盘设备的类型为SCSI(默认推荐)并点击下一步,这样一会虚拟机中的设备名称应该会为“/dev/sdb”,如图6-8所示。

图6-8 选择硬盘设备类型

3.选中“创建新虚拟磁盘”选项,而不是调取以前已有的硬盘,再次点击下一步即可,如图6-9所示。

图6-9 选择磁盘类型

4.设置最大磁盘大小为默认20GB,这个数值是限制这台虚拟机使用的最大硬盘空间而不是立即会占用满,因此默认20GB就很合适了,点击下一步吧~如图6-10所示。

图6-10 设置硬盘的最大使用空间

5.设置磁盘设备文件的保存位置和名称,这一项不需要修改,直接点击完成吧,如图6-11所示。

图6-11 磁盘设备文件的保存位置

6.当我们将新硬盘添加好后就可以看到设备信息了,这里不需要做任何修改,直接点击确认开启虚拟机就可以了,如图6-12所示。

图6-12 查看虚拟机硬件设置信息

将虚拟机中成功模拟了硬盘设备后就应该能够看到抽象成的设备文件了,按照我们前面说的udev服务命名规则,第二个被识别的SCSI设备应该会被保存成/dev/sdb,这个就是硬盘设备文件啦。但我们在开始使用前还应该进行分区操作,从中取出一个500M的分区设备以供后面的操作使用。

fdisk命令用于管理磁盘分区,格式为:“fdisk [磁盘名称]”。

管理Linux系统中的硬盘设备最常用的方法就当属是fdisk命令了,这条命令提供了添加、删除、转换分区等等功能于一身的“一站式服务”,不过这条命令的参数是交互式的,而不是像我们以前直接写到命令后面的参数一样,这样在管理硬盘设备的时候特别方便,可以根据需求动态的调整。

参数 作用
m 查看全部可用的参数
n 添加新的分区
d 删除某个分区信息
l 列出所有可用的分区类型
t 改变某个分区的类型
p 查看分区表信息
w 保存并退出
q 不保存直接退出

1.首先使用fdisk命令尝试管理/dev/sdb硬盘设备,看到提示信息后输入参数p来查看硬盘设备内已有的分区信息,这其中包括了硬盘的容量大小,扇区个数等等信息:

[root@linuxprobe ~]# 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 0x47d24a34.
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0x47d24a34
Device Boot Start End Blocks Id System

2.输入参数n来尝试新建分区信息,系统会要求选择继续输入参数p来创建主分区,或者输入参数e来创建扩展分区,因此我们输入参数p来创建一个主分区:

Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p

3.确认创建一个主分区后,系统要求您先输入分区的编号,我们知道主分区的编号范围是1-4,因此默认输入1就可以了,接下来系统会提示咱们定义下起始的扇区,这一项我们默认不需要改动,系统会自动计算出最靠前空闲的扇区位置,我们只需要敲击一下回车就可以,最后系统会要求咱们定义分区的结束扇区位置,这其实就是想要咱们去定义下整个分区的大小是多少,但其实我们不用去算扇区的个数,只需要输入+2G即可创建出一个容量为2G的硬盘分区。

Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048):此处敲击回车
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
Partition 1 of type Linux and of size 2 GiB is set

4.再次使用参数p来查看下硬盘设备中的分区信息,果然就能看到一个名称为/dev/sdb1,起始扇区为2048,结束扇区是4196351的分区啦,这时候千万不要直接关闭窗口,而应该敲击参数w后回车,这样我们的分区信息才是真正的写入成功啦。

Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0x47d24a34
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

5.当我们做完上面所说的所有步骤后,咱们的Linux系统会自动将这个硬盘分区抽象成/dev/sdb1这个设备文件,我们可以用file命令来看到这个文件的属性,但是刘遄老师在讲课和工作中发现有些时候系统并没有自动的将分区信息同步给Linux内核,而且这种情况似乎还比较常见,但不能算作是严重的bug,因为如果设备信息没有被抽象为文件,我们也可以输入partprobe命令来手动的同步信息到内核,而且一般推荐敲击两次会效果更佳,但一旦遇到连这个命令都不能解决的时候,咱们就重启计算机吧,这个方法一定会有用的。

[root@linuxprobe ]# file /dev/sdb1
/dev/sdb2: cannot open (No such file or directory)
[root@linuxprobe ]# partprobe
[root@linuxprobe ]# partprobe
[root@linuxprobe ]# file /dev/sdb1
/dev/sdb1: block special

Linux系统对于没有被格式化的存储设备是不知道怎么样写入数据的,因此当咱们对存储设备分区后需要再进行一次格式化操作,很类似于咱们平时给白纸划上横线,这样我们再写字的时候就会十分规整有条理啦,在Linux系统中用于格式化的是mkfs命令,这条命令很有意思,因为当我们在Shell终端中输入mkfs后再敲击两下Tab键补齐命令就会有这样的效果:

[root@linuxprobe ~]# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat

对!这个mkfs命令作为一款格式化的工具非常贴心,它把常用的文件系统名称用后缀的方式保存成了文件,使用方法非常的简单:"mkfs.文件类型名称",例如要格式分区为xfs,则命令为"mkfs.xfs/dev/sdb1"。

[root@linuxprobe ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=256 agcount=4, agsize=131072 blks
 = sectsz=512 attr=2, projid32bit=1
 = crc=0
data = bsize=4096 blocks=524288, imaxpct=25
 = sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
 = sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

终于把存储设备给分区、格式化好了,接下来就是要来挂载并使用啦。这些步骤也非常的简单,首先是创建一个用于挂载设备的挂载点目录,然后使用mount命令将存储设备与挂载点进行关联,最后我们还可以用df -h命令来查看下挂载状态和硬盘使用量信息。

[root@linuxprobe ~]# mkdir /newFS
[root@linuxprobe ~]# mount /dev/sdb1 /newFS/
[root@linuxprobe ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.5G 15G 20% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 140K 914M 1% /dev/shm
tmpfs 914M 8.8M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/sdb1 2.0G 33M 2.0G 2% /newFS

du命令用于查看文件的数据占用量,格式为:“ du [选项] [文件]”。

既然存储设备已经顺利的挂载完毕,我们就可以来尝试通过挂载点目录往存储设备中写入文件了,顺便再给同学们介绍一下用于查看文件数据占用量的du命令,简单来说就是看一个或多个文件占用了多大的硬盘空间,还可以用du -sh /*命令来查看在Linux系统根目录下所有一级目录分别占用的空间大小,那么比如我们可以先从某些目录中复制过来一批文件,然后查看下这些文件总共占用了多大的容量:

[root@linuxprobe ~]# cp -rf /etc/* /newFS/
[root@linuxprobe ~]# ls /newFS/
abrt hosts pulse
adjtime hosts.allow purple
aliases hosts.deny qemu-ga
aliases.db hp qemu-kvm
alsa idmapd.conf radvd.conf
alternatives init.d rc0.d
anacrontab inittab rc1.d
………………省略部分输入信息………………
[root@linuxprobe ~]# du -sh /newFS/
33M /newFS/

细心的同学一定想到刚刚咱们讲过使用mount命令挂载的设备文件会在下一次重启的时候失效,因此如果您还想让这个设备文件的挂载永久的有效下去,我们需要将挂载的信息项目写入到配置文件才可以:

[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0 
/dev/sdb1 /newFS xfs defaults 0 0
6.6 添加交换分区

SWAP交换分区是一种类似于Windows系统虚拟内存的功能,将一部分硬盘空间虚拟成内存来使用,从而解决内存容量不足的情况,因为SWAP毕竟是用硬盘资源虚拟的,速度上比真实物理内存要慢很多,所以一般只有当真实物理内存耗尽时才会调用SWAP交换分区,把内存中暂时不常用的数据临时存放到硬盘中,腾出内存空间让更活跃的程序服务来使用。

1.SWAP交换分区的创建过程非常类似于我们上一个小节所讲到的分区设备挂载使用的方法,首先第一步就是再进行对/dev/sdb存储设备分区操作,取出一个大小为5GB的主存储分区然后保存退出即可:

[root@linuxprobe ~]# 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 0xb3d27ce1.
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extendedSelect (default p): p
Partition number (2-4, default 2): 
First sector (4196352-41943039, default 4196352): 此处敲击回车
Using default value 4196352
Last sector, +sectors or +size{K,M,G} (4196352-41943039, default 41943039): +5G
Partition 2 of type Linux and of size 5 GiB is set
Command (m for help): p
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 0xb0ced57f
 Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
/dev/sdb2 4196352 14682111 5242880 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

2.将新建的存储分区使用SWAP交换分区专用的格式化mkswap命令进行格式化操作:

[root@linuxprobe ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 5242876 KiB
no label, UUID=2972f9cb-17f0-4113-84c6-c64b97c40c75

3.接下来我们使用swapon命令将准备好的SWAP交换分区设备正式的挂载到系统中,并可以使用free -m 命令来看到交换分区大小的变化(由2047M提升至了7167M):

[root@linuxprobe ~]# free -m
total used free shared buffers cached
Mem: 1483 782 701 9 0 254
-/+ buffers/cache: 526 957
Swap: 2047 0 2047
[root@linuxprobe ~]# swapon /dev/sdb2
[root@linuxprobe ~]# free -m
total used free shared buffers cached
Mem: 1483 785 697 9 0 254
-/+ buffers/cache: 530 953
Swap: 7167 0 7167

4.对了~为了能够让咱们新的SWAP交换分区设备在重启后依然生效,我们需要按照下面的格式写入到配置文件中,记得保存哦~

[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0 
/dev/sdb1 /newFS xfs defaults 0 0 
/dev/sdb2 swap swap defaults 0 0 
6.7 磁盘容量配额

前面章节讲到的Linux系统的设计初衷理念就让许多人一起使用,成为多用户、多任务的操作系统,但是硬件的资源是固定有限的,如果出现个小破坏份子不断的创建文件或下载电影,那么硬盘空间总有一天会被占满的吧,这时就需要磁盘配额服务帮助管理员限制某用户或某个用户组对特定文件夹可以使用的最大硬盘空间,一旦超出预算就不再允许他们继续使用。quota服务做磁盘配额可以限制用户的硬盘可用量或最大创建文件数量,并且还有软、硬限制的功能:

软限制:当达到软限制时会提示用户,但允许用户在规定额度内继续使用。

硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。

在红帽RHEL7系统中已经默认安装了quota磁盘配额服务程序包,但是硬盘设备默认是没有支持的,我们需要手动的编辑一下配置文件让对应的/boot目录能够支持了quota磁盘配额技术,对于学习过早期Linux系统或有红帽RHEL6系统使用经验的同学可能会范一个小错误,因为原先让设备支持quota磁盘配合服务的是usrquota参数,而在本系统中则是uquota参数,然后重启系统后就能使用mount命令看到/boot目录已经支持了quota磁盘配额技术啦:

[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults,uquota 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0 
/dev/sdb1 /newFS xfs defaults 0 0 
/dev/sdb2 swap swap defaults 0 0 
[root@linuxprobe ~]# reboot
[root@linuxprobe ~]# mount | grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)

接下来创建一个用于检查磁盘配额效果的用户,并对/boot目录增加其他人的写权限,保证咱们的用户能够正常的写入数据:

[root@linuxprobe ~]# useradd tom
[root@linuxprobe ~]# chmod -Rf o+w /boot

xfs_quota命令用于管理XFS文件系统的quota硬盘配额,格式为:“quota [参数] 配额 文件系统”。

这是一个专门针对于XFS文件系统管理quota磁盘配额服务而设计的命令,其中-c参数用于以参数的形式设置要执行的命令,-x参数是专家模式,让我们能够对quota服务做更多复杂的配置。那么我们来用xfs_quota命令设置tom用户对/boot目录的磁盘配额吧,具体的限额控制包括有硬盘使用软限制为3M,硬盘使用硬限制为6M,创建文件数量软限制为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 [--------]

当我们配置好quota磁盘配额服务对tom用户在/boot目录上的各种限制后,就可以尝试切换到这个普通用户的身份上,然后分别尝试创建一个体积为5M和8M的文件,很明显第二次就会受到了系统限制:

[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

edquota命令用于编辑用户的quota配额限制,格式为:“edquota [参数] [用户]”。

在为用户设置了quota磁盘配额限制后可以用edquota来随着需求的变化而进一步修改限额的数值,其中-u参数代表要针对那个用户进行的设置,-g参数则代表要针对那个用户组进行的设置,edquota命令会调用vi或vim编辑器来让用户修改要限制的项目,比如我们把tom用户的硬盘使用量限额从5M提升到8M来试一试吧:

[root@linuxprobe ~]# edquota -u tom
Disk quotas for user tom (uid 1001):
 Filesystem blocks soft hard inodes soft hard
 /dev/sda1 6144 3072 8192 1 3 6
[root@linuxprobe ~]# su - tom
Last login: Mon Sep 7 16:43:12 CST 2015 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@localhost ~]$ 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 软硬方式链接

当我们学习完了第六章中所有对硬盘管理的知识后,刘遄老师终于放心可以给同学们讲一下在Linux系统中的“快捷方式”啦。在Windows系统中的快捷方式就是指向原始文件的一个链接文件,让用户能够从不同的位置来访问到原始的文件,而原文件一旦被删除或剪切到其他地方也会导致链接文件失效,但是这个看似简单的东东在Linux系统中可不太一样。

硬链接(hard link)可以被理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode与文件,所以实际上来讲硬链接文件与原始文件其实是同一个文件,只是名字不同。于是每添加一个硬链接,该文件的inode连接数就会增加1,直到该文件的inode连接数归0才是彻底删除。也就是说因为硬链接实际就是指向原文件inode的指针,即便原始文件被删除依然可以通过链接文件访问,但是由于技术的局限性而不能跨文件系统也不能链接目录文件。

软链接也称为符号链接(symbolic link)即“仅仅包含它索要链接文件的路径名”因此能做目录链接也可以跨越文件系统,但原始文件被删除后链接文件也将失效,性质上和Windows™系统中的“快捷方式”是一样的。

ln命令用于创建链接文件,格式为:“ln [选项] 目标”。

咱们可以使用ln命令创建出两种性质不同的快捷方式文件,而这个差别实际只在这个-s参数上面,因此如果没有扎实的理论知识和实践经验做铺垫,可能实验能够做成功,但永远不会明白为什么会成功。

参数 作用
-s 创建"符号链接"(默认是硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程

为了更好的理解软、硬链接文件的不同性质,咱们先来尝试创建一个类似于Windows系统中的快捷方式软链接吧,这样当原始文件被删除后,新建出来的链接文件一定也就不能再继续读取了。

[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

接下来我们创建一个Linux系统中的硬链接来再对原文件硬盘存储位置做一个指针,而这样就不再依赖于原始文件的名称等等信息,也不会在因原文件被删除后导致新的文件读取失败,同时可以看到创建硬链接后的原文件的硬盘链接数量被增加到了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

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流请加A群:560843(),B群:340829(推荐),C群:463590(推荐),点此查看全国群

*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。

本章节的复习作业(答案就在问题的下一行哦,用鼠标选中即可看到的~)

1:简单谈谈/home与/root目录内存放文件有何相同点以及不同点?

答案:这两个目录都是用来存放用户的家目录数据的,而/root目录单独是用来存放root超级管理员用户的家目录数据的。

2:当我们看到了一个设备文件名称为/dev/sdb,肯定是主板上第二个插槽上的设备吗?

答案:不一定,因为名称是根据系统的识别顺序而决定的。

3:如果咱们需要硬盘中有5个分区,请问至少需要几个逻辑分区?

答案:可以选用3+1的方法,3个主分区以及最少需要2个逻辑分区。

4:/dev/sda5是主分区还是逻辑分区?

答案:一定是逻辑分区

5:是什么服务决定了设备在/dev目录中的名称?

答案:udev设备管理器服务。

6:用一句话描述“挂载”是一种怎样的操作?

答案:挂载操作指的是当用户需要使用硬盘设备或分区数据时,需要先将其与一个已存在的目录文件做关联,而这个动作就叫“挂载”。

7:在配置quota磁盘配额服务时,软限制数值必须小于硬限制数值,对吗?

答案:不一定,可以小于等于硬限制数值。

8:若原始文件被改名,那么之前做的硬链接还能访问到原先的数据吗?

答案:可以的

刘遄

刘遄

我们懂得《Linux就该这么学》作为一本Linux入门读物,更加有责任,有必要将文章质量不断提高,知识点不断扩充,让实验更加的实用,不辜负每位读者给予我们的支持,因此我们正在全球各地部署书籍的镜像站点,想用最迅猛的访问速度满足您心中那颗求知的小宇宙,同时,向每位会员承诺,本书可永久免费学习,提供所有所需工具以及在能力范围内的答疑支持。收费培训服务:http://www.linuxprobe.com/training
刘遄