Linux磁盘管理

查看磁盘或目录的容量:

命令df:

“df” 查看已挂载磁盘的总容量、使用容量、剩余容量等,可以不加任何参数,默认是按k为单位显示的。

df

图:df查看磁盘状态示例

df常用的选项有:

  • -i :显示inode 信息而非块使用量。
  • -h : 使用合适的单位显示,例如:M,K,G等。
  • -k:以K为单位显示。
  • -m:以M为单位显示。

dfcanshu

图:df常用参数使用示例

命令du:

du” 用来查看某个目录或文件所占空间大小.

语法 : du [-abckmsh] [文件或者目录名]

常用的参数有:

  • -a(all):全部文件与目录大小都列出来。
  • -b(bytes):列出的值以bytes为单位输出。
  • -k,-m:分别以K为单位和以M为单位。du默认单位k。
  • -h(human-readable):自动调节单位。
  • -c(total):最后加总。
  • -s(summarize):只列出总和。

du

图;du用法示例

磁盘的分区和格式化:

如果使用的是vmware虚拟机,可以通过配置新增加一块硬盘,以进行磁盘的操作。步骤如下:

  1. 先关闭正在运行的Linux系统 init 0.
  2. 到vmware的Linux虚拟机界面,点 “Edit virtual machine settings”, 点一下左侧靠下面的 “Add…” 按钮。
  3. 在左侧选中 “Hard Disk” 默认就是这一行,点右下角的 “Next”, 继续点 “Next”.
  4. “Virtual disk type” 选择 IDE, 点 “Next”
  5. 继续点 “Next”, “Disk size” 默认即可,最后点 “Finish”.

命令fdisk:

fdisk 是Linux下硬盘的分区工具,是一个非常实用的命令,但是fdisk只能划分小于2T的分区。

语法 : fdisk [-l ] [设备名称]

fdisk用法

图:fdisk用法

“-l” 后边不跟设备名会直接列出系统中所有的磁盘设备以及分区表,加上设备名会列出该设备的分区表。

fdisk -l

图:fdisk -l /dev/sda 列出sda的磁盘分区信息

fdisk” 如果不加 “-l” 则进入另一个模式,在该模式下,可以对磁盘进行分区操作。

创建分区

图:进行分区操作的界面

含义分别如下: 常用的为黑体

  • a:一个可引导的标志。
  • b:编辑bsd磁碟标签
  • c:切换dos兼容标志
  • d:删除一个分区
  • g:创建一个新的空GPT分区表
  • G:创建IRIX(SGI)分区表
  • l:列出已知的分区类型
  • m:打印这个菜单
  • n:增加一个新分区
  • o:创建一个新的空DOS分区表
  • p:打印分区表
  • q:在没有保存更改的情况下退出
  • s:创建一个新的空的Sun磁盘标签
  • t:改变分区的系统id
  • u:变化显示/输入单元
  • v:验证分区表
  • w:写表到磁盘和出口
  • x:额外功能(仅限专家)

如下为新建一个主分区的步骤:

新建分区

图:新建主分区

注意:

在创建分区时,最多只能创建四个主分区。如果想要创建更多分区,那么在创建第四个分区时,选择创建为扩展分区。在分配空间时,要把剩余空间都分配给扩展分区,然后就会被浪费掉。因为分完扩展分区后,再划分新的分区时是在已经划分的扩展分区里来分的。扩展分区时不可以格式化的,可以把它当成一个空壳子,在扩展分区下可以创建多个逻辑分区。而逻辑分区都是从sdb5开始的。如果想删掉某个分区,用命令d即可删除。

扩展分区

图:增加逻辑分区,删除分区操作

在删除分区时,如果删除了扩展分区,那么扩展分区下面的逻辑分区都会被删除掉。

分区完后,按w保存配置信息,然后按q退出即可。用fdisk -l 磁盘号,查看分区情况。

分好的去

图:查看示例

在进行分区操作时,切记小心,一不小心,就可能把服务器的数据都删除掉。

格式化磁盘分区:

命令 : mke2fs, mkfs.ext2, mkfs.ext3, mkfs.ext4

当用man查询这四个命令的帮助文档时,您会发现我们看到了同一个帮助文档,这说明四个命令是一样的。mke2fs常用的选项有:

  • ‘-b’ : 分区时设定每个数据区块占用空间大小,目前支持1024, 2048 以及4096 bytes每个块。
  • ‘-i’ :设定inode的大小
  • ‘-N’: 设定inode数量,有时使用默认的inode数不够用,所以要自定设定inode数量。
  • ‘-c’: 在格式化前先检测一下磁盘是否有问题,加上这个选项后会非常慢
  • ‘-L’: 预设该分区的标签label
  • ‘-j’ :建立ext3格式的分区,如果使用mkfs.ext3 就不用加这个选项了
  • ‘-t’ :用来指定什么类型的文件系统,可以是ext2, ext3 也可以是 ext4.

格式化

图:格式化示例

如上图,指定文件系统为ext4,标签fdisk。该命令直接等同于mkfs.ext4 /dev/sdb3, 目前CentOS7默认文件系统格式都为xfs。

在格式化中,有个块大小设置,默认为4096,即4k,需要指定块大小时,加-b 4096/2048等即可。

命令e2label:

用来查看或修改分区的标签。比较少用。

查看标签

图:查看和修改标签

挂载和卸载磁盘:

在上面的内容中讲到了磁盘的分区和格式化,那么格式化完了后,如何去用它呢?这就涉及到了挂载这块磁盘。格式化后的磁盘其实是一个块设备文件,类型为b,也许您会想,既然这个块文件就是那个分区,那么直接在那个文件中写数据不就写到了那个分区中么?当然不行。

在挂载某个分区前需要先建立一个挂载点,这个挂载点是以目录的形式出现的。一旦把某一个分区挂载到了这个挂载点(目录)下,那么再往这个目录写数据使,则都会写到该分区中。这就需要注意一下,在挂载该分区前,挂载点(目录)下必须是个空目录。其实目录不为空并不影响所挂载分区的使用,但是一旦挂载上了,那么该目录下以前的东西就不能看到了。只有卸载掉该分区后才能看到。

命令mount:

mount的用来挂载磁盘,具体用法如下:

mount用法

图:mount的用法

如果不加任何选项,直接运行mount命令:这个命令可以查看当前系统已经挂载的所有分区,以及分区文件系统的类型,挂载点和一些选项等信息。如下图:

mount

图:mount命令运行结果


在进行挂载分区前,先新建一个空目录,然后在目录里新建一个空白文档。然后把刚才格式化的/dev/sdb3挂载到该目录下。。具体操作如下:

我们也可以使用LABEL的方式挂载分区:mount LABEL=fdisk /mountPoint/

挂载

图:挂载磁盘示例


mount 命令常用的选项有:’-a’, ‘-t’, ‘-o’. 在讲 ‘-a’ 选项前,我们有必要先了解一下这个文件 /etc/fstab.

1
2
3
4
5
6
7
8
9
10
11
12
[hadoop@localhost ~]$ cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Jun 6 04:23:31 2018
#
# 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/centos-root / xfs defaults 0 0
UUID=0b59d613-ef63-4234-ae0b-5086cef89248 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0

这个文件是系统启动时,需要挂载的各个分区。第一列就是分区的标识,可以写分区的LABEL,也可以写分区的UUID,当然也可以写分区名(/dev/sda1);第二列是挂载点;第三列是分区的格式;第四列则是mount的一些挂载参数,等下会详细介绍一下有哪些参数,一般情况下,直接写defaults即可;第五列的数字表示是否被dump备份,是的话这里就是1,否则就是0;第六列是开机时是否自检磁盘。1,2都表示检测,0表示不检测,在Redhat/CentOS中,这个1,2还有个说法,/ 分区必须设为1,而且整个fstab中只允许出现一个1,这里有一个优先级的说法。1比2优先级高,所以先检测1,然后再检测2,如果有多个分区需要开机检测那么都设置成2吧,1检测完了后会同时去检测2。下面为第四列中常用到的参数。

  • async/sync” : async表示和磁盘和内存不同步,系统每隔一段时间把内存数据写入磁盘中,而sync则会时时同步内存和磁盘中数据;
  • “auto/noauto” : 开机自动挂载/不自动挂载;
  • “default” : 按照大多数永久文件系统的缺省值设置挂载定义,它包含了rw, suid, dev, exec, auto, nouser, async
  • “ro” : 按只读权限挂载 ;
  • “rw” : 按可读可写权限挂载 ;
  • “exec/noexec” : 允许/不允许可执行文件执行,但千万不要把根分区挂载为noexec,那就无法使用系统了,连mount命令都无法使用了,这时只有重新做系统了;
  • “user/nouser” : 允许/不允许root外的其他用户挂载分区,为了安全考虑,请用nouser ;
  • “suid/nosuid” : 允许/不允许分区有suid属性,一般设置nosuid ;
  • “usrquota” : 启动使用者磁盘配额模式,磁盘配额相关内容在后续章节会做介绍;
  • “grquota” : 启动群组磁盘配额模式;

学完这个/etc/fstab后,我们就可以自己修改这个文件,增加一行来挂载新增分区。

执行 vim /etc/fatab 按 i 进入插入模式:在最后一行,添加如下内容:/dev/sdb3/ /mountPoint/ ext4 defaults 0 0 ,然后按wq保存退出。

应为先前已经在/mountPoint/下挂载了该磁盘,首先执行umount /dev/sdb3 卸载该磁盘。然后执行df -h 查看挂载的磁盘,此时会发现磁盘卸载成功。

然后在执行 mount -a, 此时再输入df -h 查看挂载磁盘,会发现/dev/sdb3/ 又重新挂载到了/mountPoint/目录下。操作示例如下图:

fastab

图:mount -a的作用

‘-a’ 选项会把/etc/fstab中出现的所有磁盘分区挂载上。


‘-t’ 选项用来指定挂载的分区类型,默认不指定会自动识别。

‘-o’ 选项用来指定挂载的分区有哪些特性,即上面 “/etc/fatab” 配置文件中第四列的那些。

ro

图:mount -o配置示例

如上图,因为配置了ro,所有该分区成了只读。

通过mount命令,可以看到/dev/sdb3的信息如下:

1
/dev/sdb3 on /mountPoint type ext4 (ro,relatime,sync,seclabel,data=ordered)

通过mount -o remount /dev/sdb3 /mountPoint/ 重新挂载来恢复读写。

命令blkid:

假如在一台服务器上新装了两块磁盘,磁盘a(在服务器上显示为sdc)和磁盘b(在服务器上显示为sdd),有一次把这两块磁盘都拔掉了,然后再重新插上,重启机器,结果磁盘编号调换了,a变成了sdd,b变成了sdc(这是因为把磁盘插错了插槽),问题来了。通过上边的学习,您挂载磁盘是通过/dev/hdb1 这样的分区名字来挂载的,如果先前加入到了/etc/fstab 中,结果系统启动后则会挂载错分区。那么怎么样避免这样的情况发生?

这就用到了UUID,可以通过 blkid 命令获取各分区的UUID:

1
2
3
4
5
6
7
8
[root@localhost mountPoint]# blkid 
/dev/sda1: UUID="0b59d613-ef63-4234-ae0b-5086cef89248" TYPE="xfs"
/dev/sda2: UUID="aouLF3-Rp2s-H1cO-rSyA-imRI-qqRU-qCtmAY" TYPE="LVM2_member"
/dev/sdb1: LABEL="Label" UUID="beadb214-e697-494e-8caa-f92ee3f3b963" TYPE="ext4"
/dev/sdb3: LABEL="fdisk" UUID="aef7352c-4ad6-44ba-91e9-1edc9236c291" TYPE="ext4"
/dev/sr0: UUID="2018-05-03-20-55-23-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/mapper/centos-root: UUID="f9453016-07b9-488a-8060-fabefdaeb086" TYPE="xfs"
/dev/mapper/centos-swap: UUID="e11bdf96-040b-44f3-8f43-7906eea020d5" TYPE="swap"

这样可以获得全部磁盘分区的UUID,如果格式化的时候指定了 LABEL 则该命令也会显示LABEL值,甚至连文件系统类型也会显示。当然这个命令后面也可以指定哪个分区。

当获取到磁盘的UUID后,也可以通过UUID来挂载磁盘。

例:

1
[root@localhost ~]# mount UUID="aef7352c-4ad6-44ba-91e9-1edc9236c291" /mountPoint

也可以将该UUID取代磁盘分区名,写入到/etc/fstab中。

所以在挂载挂载磁盘分区的时候,尽量使用UUID或者LABEL这两种方法。


如果想让某个分区开机后就自动挂载,有两个办法可以实现:

  1. 在 /etc/fstab 中添加一行,如上例中那行;
  2. 把挂载命令写到 /etc/rc.d/rc.local 文件中去。系统启动完后会执行这个文件中的命令,所以只要您想开机后运行什么命令统统写入到这个文件下面吧,直接放到最后面即可。

命令umount:

这个命令用来卸载挂载点。后边可以跟挂载点,也可以跟分区名(/dev/hdb1), 但是不可以跟LABEL和UUID.

umount 命令有一个非常有用的选项那就是 ‘-l’, 有时候您会遇到不能卸载的情况:

1
2
3
4
5
6
[root@localhost mountPoint]# umount /dev/sdb3
umount: /mountPoint:目标忙。
(有些情况下通过 lsof(8) 或 fuser(1) 可以
找到有关使用该设备的进程的有用信息)
[root@localhost mountPoint]# umount -l /dev/sdb3
[root@localhost mountPoint]#

这是因为当前目录为要卸载的分区上,解决办法有两种,一是到其他目录,二是使用 ‘-l’ 选项。

建立一个swap文件增加虚拟内存:

从装系统时就接触过这个swap了,它类似与windows的虚拟内存,分区的时候一般大小为内存的2倍,如果您的内存超过8G,那么分16G似乎是没有必要了。分16G足够日常交换了。然而,还会有虚拟内存不够用的情况发生。如果真遇到了,莫非还要重新给磁盘分区?当然不能,那我们就增加一个虚拟的磁盘出来。基本的思路就是:建立swapfile -> 格式化为swap格式 -> 启用该虚拟磁盘。

命令dd:

dd作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

dd的使用方法,用 “if” 指定源,基本上除了 “/dev/zero” 外基本上不会写别的,而/dev/zero 是UNIX系统特有的一个文件,它可以提供源源不断的 “0”。 “of” 指定目标文件, “bs” 定义块的大小, “count” 定义块的数量,这两个参数的多少决定了目标文件的大小,目标文件大小 = bs x count。

例如:用dd建了一个大小为1G的文件,然后格式化成swap格式:

操作

图:增加交换分区具体操作

增加swap交换文件

1、使用dd命令创建一个swap交换文件

1
dd if=/dev/zero of=/home/swap bs=1024 count=1024000

这样就建立一个/home/swap的分区文件,大小为1G。

2、制作为swap格式文件:

1
mkswap /home/swap

3、再用swapon命令把这个文件分区挂载swap分区

1
/sbin/swapon /home/swap

4、为防止重启后swap分区变成0,要修改/etc/fstab文件

1
vi /etc/fstab

在文件末尾(最后一行)加上

1
/home/swap swap swap default 0 0

这样就算重启系统,swap分区还是有值。

删除swap交换文件

1、先停止swap分区

1
swapoff /home/swap

2、删除swap分区文件

1
rm -rf /home/swap

3、删除自动挂载配置命令

1
vi /etc/fstab

这行删除

1
/home/swap swap swap default 0 0

这样就能把手动增加的交换文件删除了。
注意:
1、增加删除swap的操作只能使用root用户来操作。
2、装系统时分配的swap分区貌似删除不了。
3、swap分区一般为内存的2倍,但最大不超过2G

磁盘配额:

磁盘配额其实就是给每个用户分配一定的磁盘额度,只允许他使用这个额度范围内的磁盘空间。在linux系统中,是多用户多任务的环境,所以会有很多人共用一个磁盘的情况。针对每个用户去限定一定量的磁盘空间是有必要的,这样才显得公平。随着硬件成本的降低,服务器上的磁盘资源似乎不再刻意的去限制了,所以磁盘配额也就可有可无了。

在linux中,用来管理磁盘配额的东西就是quota了。如果您的linux上没有quota,则需要您安装这个软件包 quota-3.13-5.el5.RPM 。quota在实际应用中是针对整个分区进行限制的。比如,如果我们限制了/dev/sdb1这个分区,而/dev/sdb1 是挂载在/home 目录下的,那么/home 所有目录都会受到限制。

quota 这个模块主要分为quota, quotacheck ,quotaoff ,quotaon ,quotastats ,edquota ,setquota ,warnquota, repquota这几个命令,下面就分别介绍这些命令。

命令:quota

“quota” 用来显示某个组或者某个使用者的限额。

语法:quota [-guvs] [user,group]

“-g” 显示某个组的限额

“-u” 显示某个用户的限额

“-v” 显示的意思

“-s” 选择inod或硬盘空间来显示

命令 : quotacheck

“quotacheck” 用来扫描某一个磁盘的quota空间。

语法:quotacheck [-auvg] /path

“-a” 扫描所有已经mount的具有quota支持的磁盘

“-u” 扫描某个使用者的文件以及目录

“-g” 扫描某个组的文件以及目录

“-v” 显示扫描过程

“-m” 强制进行扫描

命令 : edquota

“edquota” 用来编辑某个用户或者组的quota值。

语法:edquota [-u user] [-g group] [-t]

“-u” 编辑某个用户的quota

“-g” 编辑某个组的quota

“-t” 编辑宽限时间

“-p” 拷贝某个用户或组的quota到另一个用户或组

当运行 edquota -u user 时,系统会打开一个文件,会看到这个文件中有7列,它们分别代表的含义是:

“Filesystem” 磁盘分区,如/dev/sdb5

“blocks” 当前用户在当前的Filesystem中所占用的磁盘容量,单位是Kb。该值请不要修改。

“soft/hard” 当前用户在该Filesystem内的quota值,soft指的是最低限额,可以超过这个值,但必须要在宽限时间内将磁盘容量降低到这个值以下。hard指的是最高限额,即不能超过这个值。当用户的磁盘使用量高于soft值时,系统会警告用户,提示其要在宽限时间内把使用空间降低到soft值之下。

“inodes” 目前使用掉的inode的状态,不用修改。

命令 : quotaon

“quotaon” 用来启动quota,在编辑好quota后,需要启动才能是quota生效

语法:quotaon [-a] [-uvg directory]

“-a” 全部设定的quota启动

“-u” 启动某个用户的quota

“-g” 启动某个组的quota

“-s” 显示相关信息

命令 : quotaoff

“quotaoff” 用来关闭quota, 该命令常用只有一种情况 quotaoff -a 关闭全部的quota.

下面来进行具体的操作过程:

在本次示例中,将/home目录单独挂载在一个分区下,然后进行操作。所以首先通过df -h检查/home目录是否挂载在一个分区下。如果不是,进行如下操作。编辑/etc/fstab ,将原先添加的那行改为:

1
/dev/sdb3/  /home  ext4 defaults 0 0

保存退出后,运行mount -a 命令挂载全部的分区。通过df -h可查看是否挂载成功。

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost /]# mount -a
[root@localhost /]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 27G 3.9G 24G 15% /
devtmpfs 895M 0 895M 0% /dev
tmpfs 911M 0 911M 0% /dev/shm
tmpfs 911M 11M 901M 2% /run
tmpfs 911M 0 911M 0% /sys/fs/cgroup
/dev/sda1 1014M 152M 863M 15% /boot
tmpfs 183M 0 183M 0% /run/user/1000
tmpfs 183M 12K 183M 1% /run/user/42
/dev/sdb3 5.0G 21M 4.7G 1% /home

此时/home 为一个单独的分区。可以进行下面的操作。


(1)建立测试账户:

首先建立一个test用户,则同时建立了一个test组。其中uid和gid都为1003 ,然后又建立一个test1账号,使其加入test组,查看/etc/passwd文件发现test和test1用户的gid都为1003.

1
2
3
4
5
6
[root@localhost /]# useradd test
[root@localhost /]# grep test /etc/passwd
test:x:1003:1003::/home/test:/bin/bash
[root@localhost /]# useradd -g 1003 test1
[root@localhost /]# grep test1 /etc/passwd
test1:x:1004:1003::/home/test1:/bin/bash

(2)打开磁盘的quota功能 :

默认linux并没有对任何分区做quota的支持,所以需要我们手动打开磁盘的quota功能。在前面内容中分析/etc/fstab文件的第四列时有过过这个quota选项(usrquota, grpquota),要想打开这个磁盘的quota支持就是需要修改这个第四列的。用vi编辑/etc/fstab 编辑刚才加的那一行,如下:

1
/dev/sdb3/  /home  ext4 defaults,usrquota,grpquota      0 0

保存后,重新挂载/home分区。

1
2
3
4
[root@localhost /]# umount /home/
[root@localhost /]# mount -a
[root@localhost /]# mount | grep /home
/dev/sdb3 on /home type ext4 (rw,relatime,seclabel,quota,usrquota,grpquota,data=ordered)

此时可以看到/home 分区已经加上了 “usrquota,grpquota” 两个配额相关的参数。

(3)扫描磁盘的使用者使用状况,并产生重要的aquota.group与aquota.user :

这一步就需要用到quotacheck了,aquota.group与aqouta.user分别是组以及用户磁盘配额需要的配置文件。如果没有这两个文件,则磁盘配额是不会生效的。执行如下命令quotacheck -augv .

扫描

通过查看有(aquota.group, aquota.user)两个文件。然后进入下一步。

(4)启动quota配额:

1
2
3
[root@localhost /]# quotaon -av
/dev/sdb3 [/home]: group quotas turned on
/dev/sdb3 [/home]: user quotas turned on

(5)编辑用户磁盘配额:

先来设定test账户的配额,然后直接把test的配额拷贝给test1即可。这里就需要用到edquota了。

1
2
3
4
[root@localhost ~]# edquota -u test
Disk quotas for user test (uid 1003):
Filesystem blocks soft hard inodes soft hard
/dev/sdb3 28 0 0 7 0 0

将其中soft和hard的数值改为:20000 ,30000。其中单位为Kb,所有soft值大约为20Mb,hard值约为30Mb,保存文件后退出。

下面将test的配额复制给test1.

1
[root@localhost ~]# edquota -p test test1

然后通过quota -uv test test1 查看用户的配额。

1
2
3
4
5
6
7
[root@localhost /]# quota -uv test test1
Disk quotas for user test (uid 1003):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb3 28 20000 30000 7 0 0
Disk quotas for user test1 (uid 1004):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb3 28 20000 30000

(6)编辑组磁盘配额:

1
2
3
4
[root@localhost ~]# edquota -g test
Disk quotas for group test (gid 1003):
Filesystem blocks soft hard inodes soft hard
/dev/sdb3 56 0 0 14 0 0

设定组test的soft配额值为40M,hard值为50M。下面查看组test的配额。

1
2
3
4
[root@localhost /]# quota -gv test
Disk quotas for group test (gid 1003):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb3 56 40000 50000 14 0 0

(7)设定开机启动:

前面已经讲到启动磁盘配额的命令是 quotaon -aug 所以要想开机启动,只需将这条命令加入到 /etc/rc.d/rc.local文件即可。

1
[root@localhost ~]# echo "quotaon -aug" >> /etc/rc.d/rc.local

坚持原创技术分享,您的支持将鼓励我继续创作!