4

前面系列文章讲解了VI编辑器、常用命令、防火墙及网络服务管理,本篇将讲解磁盘管理相关知识。

本文将会介绍大量的Linux命令,其中有一部分在“linux入门系列5--新手必会的linux命令”一文中已经介绍,遗忘了或没学习过的请自行查看。

磁盘管理主要涉及磁盘扩容以及磁盘配额管理,当服务器磁盘空间达到一定程度(个人认为一般使用量占到总容量的70-80%)就需要考虑新加磁盘实现扩容,一般操作步骤为分区、格式化、挂载、验证及使用。而磁盘配额主要是针对用户设置其最大的磁盘空间使用量,防止当个用户占用磁盘过多的情况。下面将在虚拟机中模拟磁盘的这些管理操作,生产环境中操作命令和方式都是一样的。

在演示具体操作之前先了解一下相关的理论知识。

一、磁盘管理相关理论知识

1.1 文件存储结构与文件定位

Linux系统中一切都是文件,既然是文件那就涉及文件的存储以及文件的定位查找。

1.1.1 文件存储结构

在windows系统中,我们存储文件一般是将磁盘划分为几个不同的盘符(比如C、D、E、F等等),然后将资料存储在不同的盘符下。查找的时候也是根据对应的盘符找到相应的存储文件夹,进而找到对应的文件。

但是在Linux下,情况有些不一样,一切文件都是从根目录开始的,并不像windows一样存在盘符的说法,并且Linux下的目录名称是严格区分大小写的。

文件在Linux中存储是有一定规律的,它是按照文件系统层次化标准(FHS)采用树形结构来存放文件,并且定义了常见的目录的用途(也就是规定了什么文件夹放什么文件)。具体的树形目录结构与FHS规定的目录用途参见系列第二篇文章“linux入门系列2--GUI基本操作及目录结构”的Centos目录结构部分,在此不再赘述。

注意:FHS只是一个约定的标准并没有强制要求某一类文件一定要放在指定的文件夹下,因此在接手一台新服务器时需要注意,有的人可能并没按这个标准来放置文件,需要灵活对待。当然强烈建议按FHS要求来对文件进行管理。
1.1.2 文件定位

文件是通过路径来定位,分为绝对路径相对路径

绝对路径是指从根目录开始到文件或目录,而相对路径则是相对于当前路径。

示例中假设当前路径为:/root/test/test1

[root@heimatengyun test1]# pwd
/root/test/test1
[root@heimatengyun test1]# ls
hello  test
[root@heimatengyun test1]# cat hello 
hello 
[root@heimatengyun test1]# cat /root/test/test1/hello 
hello
[root@heimatengyun test1]# 

在/root/test/test1目录下有一个hello文件,其中“cat hello”命令是相对于当前路径下的hello文件,而 “cat /root/test/test1/hello ”则是给出了完整的绝对路径。通过相对路径和绝对路径都可以访问到具体的文件。

1.2 Linux文件的快捷方式

1.2.1 Linux的“快捷方式”

相信大家一定熟悉windows下的快捷方式,尤其是软件的快捷方式。比如第一篇文章“linux入门系列1--环境准备及linux安装”讲解安装虚拟机VMware时,相应的文件安装在指定的盘符下,同时会在桌面和菜单中创建快捷方式,这样每次启动虚拟机只需要点击桌面快捷方式即可,而无需每次找到对应的盘符,然后在进入目录点击相应的运行文件。

快捷方式的好处显而易见,同样Linux系统中也存在快捷方式,只是Linux中的快捷方式和Windows中的快捷方式有些区别。

Windows中额快捷方式是指向原始文件的一个连接文件,原文件一旦删除或移动位置就会导致快捷方式的连接失效。但是在Linux中链接却分为两种:软链接硬链接

  • 软链接

也称为符号连接(symbolic link),仅仅包含所链接文件的路径名,可以连接目录文件,也可以跨越文件系统进行链接。与Windows中的快捷方式类似,删除原始文件后,链接文件将失效。

  • 硬链接

硬链接与原始文件是同一个文件,只是名字不同而已,每添加一个硬链接,该文件的inode连接数就会加1,并且只有当该文件的连接数为0时才算彻底删除文件。简单说就是硬链接实际是指向原文件的指针,即便删除原始文件,依然可以通过硬链接文件来访问。不能跨分区对目录文件进行链接。

1.2.2 Linux软、硬链接创建

创建链接采用ln命令,语法格式为:ln [选项] 目标文件 链接名称

常见参数如下表,更多参数及用法请使用“man ln”命令查看。

参数 作用
-s symbolic,创建符号连接,如果不带此参数默认创建硬链接
-f force,强制创建文件或目录的链接
-i 覆盖前先询问

案例:

(1)创建软链接并删除原文件,验证能否查看链接文件

[root@heimatengyun test]# mkdir testln
[root@heimatengyun test]# cd testln/
[root@heimatengyun testln]# echo "symbolic link">slink
[root@heimatengyun testln]# ln -s slink slink.ln
[root@heimatengyun testln]# cat slink
symbolic link
[root@heimatengyun testln]# cat slink.ln 
symbolic link
[root@heimatengyun testln]# ll
total 4
-rw-r--r--. 1 root root 14 Dec 26 23:23 slink
lrwxrwxrwx. 1 root root  5 Dec 26 23:24 slink.ln -> slink
[root@heimatengyun testln]# rm -f slink
[root@heimatengyun testln]# cat slink.ln 
cat: slink.ln: No such file or directory
[root@heimatengyun testln]# ls
slink.ln
[root@heimatengyun testln]# rm slink.ln 
rm: remove symbolic link ‘slink.ln’? y
[root@heimatengyun testln]# ls
[root@heimatengyun testln]# 

先创建testln文件夹,并切换到该文件夹下创建slink原始文件,然后创建slink文件的软链接slink.ln。查看文件发现引用量为1,并且链接文件会有箭头标识。此时删除原始文件slink,然后链接文件slink.lnye 也不能访问。虽然文件不能访问但是文件还存在,可以手动删除它。

(2)创建硬链接并删除原文件,验证能否查看链接文件

[root@heimatengyun testln]# ls
[root@heimatengyun testln]# echo "hard link">hlink
[root@heimatengyun testln]# ln hlink hlink.ln
[root@heimatengyun testln]# cat hlink
hard link
[root@heimatengyun testln]# cat hlink.ln 
hard link
[root@heimatengyun testln]# ll
total 8
-rw-r--r--. 2 root root 10 Dec 26 23:30 hlink
-rw-r--r--. 2 root root 10 Dec 26 23:30 hlink.ln
[root@heimatengyun testln]# rm -f hlink
[root@heimatengyun testln]# cat hlink.ln 
hard link
[root@heimatengyun testln]# ll
total 4
-rw-r--r--. 1 root root 10 Dec 26 23:30 hlink.ln

先创建hlink原始文件,然后hlink文件的硬链接hlin.ln文件,查看文件引用量显示为2,并且不会像软连接一样有箭头标识。删除原文件,链接文件依然能正常访问,再次查看文件的应用量已经变为1。

1.3 物理硬件设备命名规则

硬件设备在Linux中是以文件形式进行定义和管理,而文件需要命名规范,udev设备管理器在/dev/目录下为所有的设备定义了内核设备的名称,它是当前Linux默认的设备管理工具,以守护进程的形式运行,通过侦听内核发出来的uevent 来管理/dev目录下的设备文件。通过命名规范目的是让用户通过设备文件的名字即可猜出设备大致的属性以及分区信息等。

Linux系统中常见的硬件设备文件名称如下:

硬件设备 文件名称
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

常用的也就SCSI/SATA硬盘或光驱,当进行磁盘扩容等空间管理时会用到磁盘设备,当安装光盘镜像时会用到光驱设备。

硬盘设备一般以“/dev/sd”开头,而一台主机上可以有多块硬盘,因此系统采用 a~p 来代表 16 块不同的硬盘,默认从a开始分配。分区编号也有一定规则:主分区或扩展分区的编号从 1- 4 ,而逻辑分区从5开始编号。

假设一个设备文件名为:/dev/sda5,我们详细分析下该设备文件名包含哪些信息?

file

/dev/目录中保存的应当是硬件设备文件;sd 表示是存储设备;a 表示 系统中同类接口中第一个被识别到的设备;5 表示这个设备是一个逻辑分区。一句话描述:这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件。

再来看一下另外一个例子,查看本机挂载的磁盘设备

[root@heimatengyun ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
...省略部分内容
/dev/sda1                497M  119M  379M  24% /boot

/dev/sda1表示这是系统中第一块被识别到的硬件设备中分区编号为1的主分区的设备文件。

1.4 Linux文件系统类型

文件系统的作用是合理规划硬盘,用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依 靠文件系统来完成的。

Linux系统支持数十种的文件系统,常见的有以下几种:

文件系统 描述
Ext3 是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能 自动修复数据的不一致与错误。缺点是当硬盘容量很大时,修复时间长
Ext4 改进版的Ext3,是RHEL6默认的文件管理系统,存储容量达到1EB,读写效率比Ext3极大的提高
XFS 是一种高性能的日志文件系统,是RHEL7默认的文件管理系统,优点是意外宕机后恢复非常快,并且支持最大存储容量为18EB

拿到一块新的硬盘存储设备后,需要先分区,然后再格 式化文件系统,最后才能挂载并正常使用。硬盘的分区操作取决于需求和硬盘大小,也可以选择不进行分区,但是必须对硬盘进行格式化处理。

刚说到Linux系统支持数十种文件系统,其实每种文件系统底层操作肯定有很多区别,但是为了让用户在读取和写入文件是不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供 了一个VFS接口(Virtual File System),这个接口封装了底层文件系统的特性和细节,这样用户实际上在操作文件时就是统一对这个VFS进行操作,从而不必关心每种文件系统的不同。

VFS架构示意图如下:

file

1.5 mount命令挂载硬件设备

相信大家都在windows上使用过移动硬盘或U盘,即插即用,无须其他操作非常方便。但实际上windows其实是悄悄帮我们做了很多事情,才使得我们能访问新插入的设备。在Linux系统中当我们拿到一块全新的硬盘后,我们需要先分区、格式化、然后才是挂载使用。

此处提到的挂载其实就是当需要使用硬盘设备或分区中的数据时,先将其与一个已存在的目录文件进行关联的过程。挂载和取消挂载主要用到两个命令:mount、umount。下面分别进行介绍。

1.5.1 mount命令

语法:

​ mount [参数] 文件系统 挂载目录

参数:

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

其中-a参数,它会在执行后自动检查 /etc/fstab 文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。而-t参数相对于较新的Linux系统来说无须指定,系统会自动进行判断。

案例:

(1)把设备/dev/sdb2挂载到/test目录

在 mount 命令中填写设备与挂载目录参数即可,系统会自动去判断要挂载文件的类型。

[root@heimatengyun ~]# mount /dev/sdb2 /backup
说明:此处只是为了说明mount命令的用法,实际上此时并没有加入sdb第二块硬件设备,因此如果立刻执行此命令可能不会成功。下一节“添加硬盘”实战将完整演示如何将一块新的磁盘设备挂载到系统中。

执行上边mount命令后设备即可挂载成功,但是这是临时的,当系统重启后挂载就会失效,需要每次开机都手动挂载一下,这比较麻烦。我们可以通过将挂载信息按指定格式写入/etc/fstab文件,这样硬件设备就会在每次开机后自动进行关联。

下面我们研究下该fstab文件的内容和格式:

[root@heimatengyun ~]# cat /etc/fstab 
...省略注释部分
/dev/mapper/centos-root /                       xfs     defaults        1 1
UUID=bfd83b27-ed2b-4770-8d17-9e5412f2be27 /boot                   xfs     defaults        1 2
/dev/mapper/centos-swap swap                    swap    defaults        0 0

可以看到,其格式固定为: “设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检

各个自动含义如下表:

字段 含义
设备文件 一 般 为 设 备 的 路 径 + 设 备 名 称 , 也 可 以 写 唯 一 识 别 码 ( UUID , Universally Unique Identifier)
挂载目录 指定要挂载到的目录,需在挂载前创建好
格式类型 指定文件系统的格式,比如 Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
权限选项 若设置为 defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
是否备份 若为 1 则开机后使用 dump 进行磁盘备份,为 0 则不备份
是否自检 若为 1 则开机后自动进行磁盘自检,为 0 则不自检

学习fstab文件格式后,我们便可以将上边通过命令挂载的/dev/sdb2设备信息写入fstab文件,使其永久生效。

假设文件系统类型为ext4,保持默认全选无须开机自检,则在fstab文件添加如下一行即可。

/dev/sdb2 /test ext4 defaults 0 0
1.5.2 umount命令

umount 命令用于撤销已经挂载的设备文件。挂载文件系统的目的是为了使用硬件资源,而卸载文件系统就意味不再使用硬件的设备资源。挂载操作就是把硬件设备与目录进行关联的动作,因此卸载操作只需要说明想要 取消关联的设备文件或挂载目录的其中一项即可。

语法:

​ umount [挂载点/设备文件]

案例:

​ 假设卸载掉前边挂载的/dev/sdb2设备,命令如下:

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

1.6 du命令查看目录或文件大小

我们使用du命令查看一个或多个文件占用了多大的硬盘空间。

语法:

​ du [选项] [文件或目录]

选项:

参数 作用
-h human-readable,已人类可读的方式显示单位(K、M、G等)
-s summarize,仅显示后边参数的总数

案例:

(1)使用du命令查看目录大小

以我本机的test目录为例,其中有目录有文件,如下图:

[root@heimatengyun ~]# ll test/
total 104
-rw-rwxr--+ 1 root root 135 Dec  1 23:26 case.sh
-rw-rwxr--+ 1 root root 219 Dec  2 23:57 function.sh
-rw-rwxr--+ 1 root root  91 Dec  2 21:55 getsum.sh
-rw-rwxr--+ 1 root root  85 Dec  2 21:48 greeting.sh
-rwxrwxrwx+ 1 root root  53 Dec  1 09:22 hello.sh
-rw-rwxr--+ 1 root root 186 Dec  1 23:11 if.sh
-rwsrwxrwx+ 1 root root 145 Dec  1 16:06 mypid.sh
-rw-rwxr--+ 1 root root 142 Dec  3 00:18 para.sh
-rw-rwxr--+ 1 root root 338 Dec  1 16:00 pid.sh
-rw-rwxr--+ 1 root root  99 Dec  1 15:22 sum.sh
drwxrwxrwx+ 2 test test  29 Dec 20 14:52 test1
-rw-rwxr--+ 1 root root   9 Nov 30 20:43 test1.txt
-rw-rwxr--+ 1 root root   0 Nov 30 15:34 test2.txt
drwxr-xr-x. 2 root root  21 Dec 26 23:31 testln
-rw-rwxr--+ 1 root root 139 Dec  2 23:55 while.sh

接下来,我们看下不同参数的作用

[root@heimatengyun ~]# du test/
20      test/test1
4       test/testln
132     test/
[root@heimatengyun ~]# du -s test/
132     test/
[root@heimatengyun ~]# du -sh test/
132K    test/

通过以上案例,我们可以看到,仅仅可以看到test目录下的一级目录大小,如果加-s参数则仅仅能看到自身目录大小,如果加-h参数则可以看到添加了单位k。

如何查看目录下所有内容呢?

(2)查看目录包括文件和目录的所有内容的大小

[root@heimatengyun ~]# du test/*
8       test/case.sh
8       test/function.sh
8       test/getsum.sh
8       test/greeting.sh
8       test/hello.sh
8       test/if.sh
8       test/mypid.sh
8       test/para.sh
8       test/pid.sh
8       test/sum.sh
20      test/test1
8       test/test1.txt
4       test/test2.txt
4       test/testln
8       test/while.sh
[root@heimatengyun ~]# du -s test/*
8       test/case.sh
8       test/function.sh
8       test/getsum.sh
8       test/greeting.sh
8       test/hello.sh
8       test/if.sh
8       test/mypid.sh
8       test/para.sh
8       test/pid.sh
8       test/sum.sh
20      test/test1
8       test/test1.txt
4       test/test2.txt
4       test/testln
8       test/while.sh
[root@heimatengyun ~]# du -sh test/*
8.0K    test/case.sh
8.0K    test/function.sh
8.0K    test/getsum.sh
8.0K    test/greeting.sh
8.0K    test/hello.sh
8.0K    test/if.sh
8.0K    test/mypid.sh
8.0K    test/para.sh
8.0K    test/pid.sh
8.0K    test/sum.sh
20K     test/test1
8.0K    test/test1.txt
4.0K    test/test2.txt
4.0K    test/testln
8.0K    test/while.sh
[root@heimatengyun ~]# 

对比以上三个命令可以看出,如果命令后用*表示查看所有内容,那么-s参数将失去意义,加与不加此参数效果都一样。

1.7 df命令查看磁盘空间

df命令用户查磁盘的挂载信息及空间占用情况。

语法:

​ df [参数] [目录]

常用参数:

参数 作用
-a all,显示所有文件,包括虚拟文件系统
-h human-readable,以人类可读的方式大小,比如单位K,M,G等

案例:

(1)查看指定目录挂载状态及占用的磁盘空间

[root@heimatengyun ~]# df -h /newDisk/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       2.0G   33M  2.0G   2% /newDisk

(2)查看所有一级目录占用空间大小

[root@heimatengyun ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  3.7G   14G  21% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sdb1                2.0G   33M  2.0G   2% /newDisk
/dev/sda1                497M  119M  379M  24% /boot

如果加-a参数,则显示所有的目录

[root@heimatengyun ~]# df -ah
Filesystem               Size  Used Avail Use% Mounted on
rootfs                    18G  3.7G   14G  21% /
proc                        0     0     0    - /proc
sysfs                       0     0     0    - /sys
devtmpfs                 905M     0  905M   0% /dev
...省略部分内容

具体参数可以通过man命令查看,并多多练习查看不同参数的不同结果。

二、添加硬盘

通过前面的学习,我们已经具备磁盘管理的能力,因此本节将模拟真实生产环境中对服务器添加磁盘设备进行扩容管理。

整体步骤为:在虚拟机中模拟添加入一块新的硬盘存储设备、分区、格 式化、挂载、检查系统的挂载状态、真实使用硬盘验证是否成功添加。

2.1 添加新磁盘

此过程我们在虚拟机中模拟添加一块新的磁盘设备。

确保关闭虚拟机后,我们在虚拟机管理主界面单击“编辑虚拟机设置”选项

file

在弹出框中单击“添加按钮”

file

选择硬件类型为“磁盘”

file

点击“下一步”按钮,在新弹出的对话框中,保持默认的磁盘类型为SCSI

file

点击“下一步”按钮,在新弹出对话中中保持默认的“创建新的虚拟磁盘”

file

单击“下一步”按钮,在新弹出的界面中保持默认的容量即可

file

单击“下一步”按钮,在新界面中选择磁盘文件的保存位置,也可以保持默认即可。

file

点击“完成”按钮,将返回虚拟机设置界面,并在此界面中可以看到刚才新添加的磁盘。

file

单击“确定”按钮,磁盘添加完成,并在虚拟机管理主界面中也可以看到刚才添加的新磁盘。

file

根据前面讲解的物理设备命名规则,我们大胆猜想设备名称应该为sdb,表示是第二块识别到的磁盘。后边的步骤中,我们将验证这个猜想的正确性。

2.2 磁盘分区

正式分区之前,先介绍一下Linux的磁盘分区命令fdisk,它提供了集添加、删除、转换分区等功能于一身的全套服务。

语法:fdisk [磁盘名称]

fdisk提供了交互式的参数,可以根据需求动态调整,常见参数如下:

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

除了fdisk之外,再介绍一个命令lsblk,这个命令可以列出所有可用块设备的信息,而且还能显示他们之间的依赖关系。

2.2.1 查看新添加的设备

学会fdisk和lsblk命令之后,我们先查看一下第一步新添加的磁盘信息(找出还没有分区的设备)。

可以使用fdisk -l 命令查看,结果如下:

[root@heimatengyun ~]# fdisk -l
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
...省略部分内容

也可以通过lsblk命令查看,结果如下:

[root@heimatengyun ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
  └─centos-root 253:1    0 17.5G  0 lvm  /
sdb               8:16   0   20G  0 disk 
sr0              11:0    1  3.9G  0 rom  

可以看到设备名称为sdb,跟我们前面猜想的设备名称吻合。

2.2.2 磁盘分区

使用fdisk命令管理/dev/sdb硬盘设备

通过参数p查看硬盘设备已有的分区信息,可以看到硬盘的容量大小、扇区个数等信息:

[root@heimatengyun ~]# 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 0xf69cc7c1.
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: 0xf69cc7c1
   Device Boot      Start         End      Blocks   Id  System

通过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

接下来会让输入主分区编号,我们采用默认1,接下来会提示输入扇区的起始位置,我们保持默认直接按回车键,系统会自动帮我们计算最靠前的空闲扇区位置。随后提示我们输入扇区结束位置,我们直接输入+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
这个扇区结束位置其实是定义整个分区的大小,我们无需计算扇区的个数,直接输入+2g即可创建一个容量为2GB的硬盘分区。

接下来我们再次用p参数查看刚才的分区信息:

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: 0xf69cc7c1
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux

这样我们就可以看到名称为/dev/sdb1的主分区信息了,可以看到它的起始扇区位置为2048,结束扇区位置为4196351。

此时通过w参数保存并回车:

Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.

这样分区信息就写入成功,可以通过前文讲解的fdisk -l命令或lsblk命令查看硬件设备的分区信息。

经过上面的一些列操作之后,Linux 系统会自动把这个硬盘主分区抽象成/dev/sdb1设备文件。下面我们就通过file命令进行查看该设备文件。

2.2.3 查看分区设备文件

可以通过file命令查看文件该分区设备文件。在查看之前,我们先学习以下file命令

语法格式:file [参数选项] 目录或文件

作用:辨识文件类型

明确语法格式之后,我们用file命令查看刚才的分区文件/dev/sdb1设备文件类型

[root@heimatengyun ~]# file /dev/sdb1
/dev/sdb1: block special

由此可见,刚才添加分区的操作已经成功了。

注意:有时候系统并没有自动把分区信息同步给Linux内核,因此执行上边语句时可能得到的结果为:/dev/sdb1: cannot open (No such file or directory)。如果出现这种情况需要手动执行partprobe命令将分区信息同步到内核中,并且建议是连续执行两次partprobe命令。如果执行二次还是无效,可以直接重启计算机,重启之后就可以了。

确认分区设备文件成功之后,我们在补充下file命令的案例:

[root@heimatengyun ~]# file test/
test/: directory
[root@heimatengyun ~]# file test/test1.txt 
test/test1.txt: ASCII text

可以看到file命令可以方便的查看出目录或文件的类型。

分区创建成功,接下来就要格式化磁盘。

2.3 磁盘格式化

如果硬件存储设备没有进行格式化,Linux 系统无法得知怎么在其上写入数据。Linux中用于磁盘格式化的命令为mkfs。

语法格式:mkfs.文件系统类型 设备分区文件

我们通过命令补齐命令可以查看到mkfs命令根据系统类型分为不同的命令:

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

了解mkfs命令之后,我们使用xfs文件类型将之前创建的分区/dev/sdb1进行格式化:

[root@heimatengyun ~]# 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

这样就完成了分区的格式,接下来对文件进行挂载后就可以使用设备了。

2.4 挂载磁盘

挂载磁盘使用之前讲解的mount命令,需要先创建一个挂载点目录。

[root@heimatengyun ~]# mkdir /newDisk
[root@heimatengyun ~]# mount /dev/sdb1 /newDisk/
[root@heimatengyun ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  3.7G   14G  21% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sda1                497M  119M  379M  24% /boot
/dev/sdb1                2.0G   33M  2.0G   2% /newDisk

挂载成功后,通过df -h命令即可查看到已经挂载的设备。

接下来就可以使用新加的磁盘设备了。

切换到新加设备所在的目录,添加文件并查看文件及其占用的大小:

[root@heimatengyun ~]# cd /newDisk/
[root@heimatengyun newDisk]# echo 'test'>test.txt
[root@heimatengyun newDisk]# ll
total 4
-rw-r--r--. 1 root root 5 Dec 28 18:57 test.txt
[root@heimatengyun newDisk]# du -sh /newDisk/
4.0K    /newDisk/

可以看到文件创建成功。

接下来使用df -h命令查看挂载状态和硬盘使用量:

[root@heimatengyun ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  3.7G   14G  21% /
devtmpfs                 905M     0  905M   0% /dev
tmpfs                    914M   80K  914M   1% /dev/shm
tmpfs                    914M  8.9M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/sdb1                2.0G   33M  2.0G   2% /newDisk
/dev/sda1                497M  119M  379M  24% /boot

可以看到磁盘挂载成功,至此,说明新挂载的文件没有任何问题,可以正常使用。

到目前为止磁盘可以正常使用了,但是正如前面提到的mount命令挂载的设备需要写入fstab文件才能永久生效,因此我们编辑fstab文件将挂载信息写入:

[root@heimatengyun newDisk]# vi /etc/fstab 
...省略部分内容,添加以下一行即可
/dev/sdb1   /newDisk xfs defaults 0 0

这样就完成了新磁盘设备添加。

三、添加交换分区

交换分区(SWAP)是在硬盘中预先划分一定的空间,当真实物理内存不够用时,将内存中暂时不常用的数据临时放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术。

但是需要注意的是,毕竟硬盘的读写速度肯定比内存man,所以也只有当真实物理内存耗尽后才会调用交换分区的资源。

交换分区的创建过程与挂载过程基本一致,前面添加的设备总大小为20G,/dev/sdb挂载使用了2G,此处添加一个4G的主分区作为交换分区,过程如下:

3.1 创建分区

[root@heimatengyun ~]# 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.
Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (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): +4G
Partition 2 of type Linux and of size 4 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: 0xf69cc7c1
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux
/dev/sdb2         4196352    12584959     4194304   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.
[root@heimatengyun ~]# 

3.2 格式SWAP分区

交换分区格式化使用的命令与产品分区格式化有点区别,使用的是mkswap命令

[root@heimatengyun ~]# mkswap /dev/sdb2       
/dev/sdb2: No such file or directory
[root@heimatengyun ~]# partprobe

如果遇到上述情况,需要执行partprobe或重启即可

[root@heimatengyun ~]# mkswap /dev/sdb2
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=ef101e7c-e17d-42b7-8124-bed7c27a08e0

3.3 挂载分区

挂载SWAP分区使用的是swapon命令,注意普通分区使用mount。

先使用free 命令查看下交互分区的大小,然后再用swapon命令挂载SWAP分区设备,再次对比查看分区大小的变化:

[root@heimatengyun ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          1826        605       1221          8          1        219
-/+ buffers/cache:        383       1443
Swap:         2047          0       2047
[root@heimatengyun ~]# swapon /dev/sdb2 
[root@heimatengyun ~]# free -m          
             total       used       free     shared    buffers     cached
Mem:          1826        608       1218          8          1        219
-/+ buffers/cache:        386       1440
Swap:         6143          0       6143

可以看到,挂载后SWAP交换分区变大了,说明挂载成功。

与普通分区挂载一样,也需要将配置信息写入fstab文件使其开启自动挂载,在fstab文件加入最后一行,注意文件系统各类型为swap。

[root@heimatengyun ~]# vim /etc/fstab 
...省略部分内容
/dev/sdb1 /newDisk xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0

这样交换分区也就添加成功。

四、限定用户磁盘容量

前文提到过,Linux系统是多用户多任务操作系统,这就意味着可能有很多用户同时在使用该操作系统。

但是服务器硬件资源是有限的,我们需要通过磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的 最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。

磁盘容量配额功能通过quota命令实现,分为软限制和硬限制,当达到软限制时提示用户但仍可以使用,直到达到硬配额为止;而达到硬限制则直接不允许用户在继续使用。

4.1 开启quota支持

RHEL7已经安装quota 磁盘容量配额服务程序包,但存储设备默认没有开启对quota 的支持,需要手动编辑/etc/fstab配置文件。

在fstab配置文件中的挂载目录/boot中添加uquota参数使其支持磁盘配额功能。

[root@heimatengyun ~]# vim /etc/fstab 
...省略部分内容
UUID=bfd83b27-ed2b-4770-8d17-9e5412f2be27 /boot xfs  defaults,uquota 1 2
...省略部分内容

重启系统,查看是否生效

[root@heimatengyun ~]# reboot
[root@heimatengyun ~]# mount |grep boot
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)

可以看到包含了usrquota表明已经生效。

4.2 xfs_quota命令

xfs_quota命令是一个专门针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令。我们先了解一下xfs_quota命令的基本用法。

语法:

​ xfs_quota [参数] 配额 文件系统

参数:

参数 作用
-x 专家模式,可以对quota服务进行更多复杂的配置
-c 于以参数的形式设置要执行的命令

接下来我们使用 xfs_quota 命令来设置用户对/boot 目录的 quota 磁盘容量配额。

(1)先创建一个普通用户:testquota,并对/boot目录添加其他人写入的权限,保证用户能正常写入数据:

[root@heimatengyun ~]# useradd testquota
[root@heimatengyun ~]# chmod -Rf o+w /boot/

(2)限制testquota用户磁盘使用量和创建文件的大小

具体的限额控制包括:硬盘使用量的软限制和硬限制分别为1MB 和3MB;创建文件数量的软限制和硬限制分别为2个和4个。

创建磁盘配额并查看设置是否成功:

[root@heimatengyun ~]# xfs_quota -x -c 'limit bsoft=1m bhard=3m isoft=2 ihard=4 testquota' /boot/
[root@heimatengyun ~]# xfs_quota -x -c report /boot/
User quota on /boot (/dev/sda1)
                               Blocks                     
User ID          Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root            95328          0          0     00 [--------]
testquota           0       1024       3072     00 [--------]

创建成功后,切换到普通用户并分别创建一个2M和4M的文件。(选择2M的目的是刚好超过最小配额但又没超过最大配额,而选择4M则是超过了最大配额,这样就能模拟出磁盘配额的效果)

[root@heimatengyun ~]# su - testquota 
[testquota@heimatengyun ~]$ dd if=/dev/zero of=/boot/testquota bs=2M count=1
1+0 records in
1+0 records out
2097152 bytes (2.1 MB) copied, 0.00166952 s, 1.3 GB/s
[testquota@heimatengyun ~]$ dd if=/dev/zero of=/boot/testquota bs=4M count=1 
dd: error writing ‘/boot/testquota’: Disk quota exceeded
1+0 records in
0+0 records out
3145728 bytes (3.1 MB) copied, 0.00411569 s, 764 MB/s
[testquota@heimatengyun ~]$ ll /boot/testquota 
-rw-rw-r--. 1 testquota testquota 3145728 Dec 28 21:07 /boot/testquota
[testquota@heimatengyun ~]$ exit
logout

可以看到2M的文件创建成功,但是4M的文件提示失败了,说明针对用户的磁盘配额生效了。

4.3 edquota命令

edquota 命令用于编辑用户的 quota 配额限制,在为用 户设置了quota 磁盘容量配额限制后,可以使用edquota命令按需修改限额的数值。

语法:

​ edquota [参数] [用户]

参数:

参数 作用
-u 要针对哪个用户进行设置
-g 要针对哪个用户组进行设置

edquota 命令会调用 Vi编辑器来让 root 管理员修改要限制的具体细节。下面把 testquota用户的硬盘使用量的硬限额从5M提升到8M:

[root@heimatengyun ~]# edquota -u testquota
Disk quotas for user testquota (uid 1002):
  Filesystem     blocks  soft       hard     inodes     soft hard
  /dev/sda1      3072    1024       3072          1        2 4

修改并保存即可。

本文介绍了Centos7系统中基本的磁盘管理技术,下一篇将讲解更高级一点的磁盘阵列RAID及LVM技术。


黑马腾云
33 声望12 粉丝