2.1 一切从“/”开始
Linux系统中的目录、字符设备、块设备、套接字、打印机等等都被抽象成了文件,即刘遄老师所一直强调的——Linux系统中一切都是文件。既然平时跟咱们打交道的都是文件,那么又应该如何的找到它们呢?在Windows操作系统中想要找到一个文件,肯定就要依次进入“D盘”后再进入某某目录中找到所需要的文件,但在Linux系统中可并不存在C/D/E/F盘符呦,一切的文件都是从“根(/)”目录开始的,按照FHS文件系统层次结构标准协定采用树形结构来存放文件并定义了每个区域的用途。另外在Linux系统中的文件及目录名称是严格区分大小写的,例如root、rOOt、Root、rooT等等均代表是不同的独立目录,并且名称中不得包含斜杠(/)。如图6-1所示:
图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开始。
图6-2 设备文件名称
首先/dev/目录中保存的应当是硬件设备文件,其次sd开头代表是存储设备,然后a代表是系统中同类接口中第一个被识别到设备,最后的5代表这个设备一定是个逻辑分区。简单总结来说“/dev/sda5”代表的就是——“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的文件”。很多同学可能基础并不好,不太理解前面所说的主分区、扩展分区和逻辑分区的概念,接下来简单科普下硬盘的知识,如前面《Linux就该这么学》书籍第0章中强调的编写初衷,刘遄老师不要求同学们记住下面的知识,只要看懂就行了。
计算机中有了硬盘设备才使得游戏通关过后可以保存记录而不是再每次再重头开始,硬盘设备则是由大量的扇区组成的,其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。单个扇区容量为512bytes组成,主引导记录需要占用446bytes,分区表的为64bytes,结束符占用2bytes,而其中每记录一个分区信息需要16bytes,这最多四个能有幸被写到第一个扇区中的分区信息就叫做主分区,扇区的信息写入如图6-3所示。
图6-3 第一扇区中的数据信息
那么问题来了——好像最多只能创建出4个分区?于是为了解决分区个数不够的问题,可以将其中的16bytes(原本要写入主分区信息)的空间拿出来指向到另外一个分区上面,也就是说扩展分区其实并不是一个“分区”,而更像是一个“指针”,指向了另外的一个分区的指针。那么运维人员一般会选择用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,这样就可以用分区来满足多分区的需求了,主分区、扩展分区、逻辑分区可以像如图6-4来规划。
图6-4 硬盘分区的规划
这是第三块IDE设备(比较少见了)中的编号为8的逻辑分区
2.1.2 文件系统与数据资料
用户在硬件存储设备上面正常建立文件、写入,读取,修改,转存文件与控制文件等等操作都是依靠了文件系统来完成的,文件系统的作用是把硬盘合理的规划,保证用户正常的使用需求,在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下隐藏了自己的特性和细节,使得咱们在日常使用时觉得“文件系统都是一样的”,比如使用cp命令就在任何文件系统中复制文件了。
图6-5 VFS虚拟文件系统结构
2.1.3 挂载硬件设备
用习惯了Windows系统让咱们觉得一切都理所应当,平时把U盘插入到电脑后也根本没有考虑过到底系统做了那些事情,又是为什么能够访问到这个U盘内资料的。刘遄老师推荐在Linux系统中这些最好是手动来做,因为这会让同学们更好的把控数据。如前面所讲当拿到了一块全新的硬盘存储设备之后首先要分区,然后格式化最后才能挂载正常使用。分区和格式化大家以前常常听到,但“挂载”又是个什么东东呢?挂载操作指的是当用户需要使用硬盘设备或分区数据时,需要先将其与一个已存在的目录文件做关联,而这个动作就叫“挂载”。下面的课程中会逐步教会同学们如何使用硬盘设备,但这个挂载理论知识实在比较复杂,而且实在太重要了,因此决定再单独拿出一个小节单独的讲解一下,不光要能看懂还要记住。
mount命令用于挂载文件系统,格式为:“mount 文件系统 挂载目录”。
挂载是在使用硬件设备前的最后操作的一步,只需要用mount命令把硬件设备与一个目录做关联,然后就能在这个目录中看到硬件设备中的数据了。对于比较新的Linux系统来讲一般是不需要使用-t参数来指定说明文件系统类型的,这点Linux系统会自动进行判断。而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/iso9660(此为光盘设备)等等。 权限选项:默认为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 2017
#
# 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
6.5 添加硬盘设备
根据刚刚对管理硬件设备所学的理论知识,先来理清一下思路吧~首先需要在虚拟机中模拟再添加入一块新的硬盘存储设备,然后逐步的进行分区、格式化、挂载操作,最后通过检查系统挂载状态和真实的使用来最终验证硬件是否已正确部署好了吧。
第1步:使用虚拟机软件的好处又一次体现出来了,因为咱们不需要为了做这个实验而特意去买一块真实的硬盘,而是通过虚拟机软件进行硬件模拟就可以,操作步骤首先是把虚拟机系统关机后点击“编辑虚拟设置”选项,选择添加按钮新增一块新的硬件设备,如图6-6所示。
![第6章 存储结构与磁盘划分。第6章 存储结构与磁盘划分。 第6章 存储结构与磁盘划分。第6章 存储结构与磁盘划分。](https://i-blog.csdnimg.cn/blog_migrate/ce7e41d720dc818931a9a9d1d73fce03.jpeg)
第2步:然后选择想要添加的硬件类型为硬盘,这确实没有什么需要说明的,点击下一步按钮就可以啦~如图6-7所示。
第3步:选择硬盘设备的类型为SCSI(默认推荐)并点击下一步按钮,这样一会虚拟机中的设备名称应该会为“/dev/sdb”,如图6-8所示。
第4步:选中“创建新虚拟磁盘”选项,而不是调取以前已有的硬盘,再次点击下一步按钮即可,如图6-9所示。
第5步:设置最大磁盘大小为默认20GB,这个数值是限制这台虚拟机使用的最大硬盘空间而不是立即会占用满,因此默认20GB就很合适了,点击下一步按钮吧~如图6-10所示。
第6步:设置磁盘设备文件的保存位置和名称,这一项不需要修改,直接点击完成按钮吧,如图6-11所示。
第7步:将新硬盘添加好后就可以看到设备信息了,这里不需要做任何修改,直接点击确认按钮后开启虚拟机就可以了,如图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/sdb1: 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 2017
#
# 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 2017
#
# 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系统使用经验的同学可能会犯一个小错误,因为早期Linux系统想让设备支持quota磁盘配额服务的是usrquota参数,而在本系统中则是uquota参数,然后重启系统后就能使用mount命令看到/boot目录已经支持了quota磁盘配额技术啦:
[root@linuxprobe ~]# vim /etc/fstab # # /etc/fstab # Created by anaconda on Wed May 4 19:26:23 2017 # # 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 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 软硬方式链接
当咱们学习完了第六章中所有对硬盘管理的知识后,刘遄老师终于放心可以给同学们讲一下在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