1、磁盘管理体系概述

第一层:物理硬盘,比如:/dev/sda、:/dev/sdb、/dev/sdc...
第二层:RAID、lvm
第三层:分区、分区表、fdisk、parted
第四层:格式化,挂载
第五层:磁盘管理,如:df、fdisk、parted、swap、fstab文件等

2、磁盘基础

1)概述

内存:临时存放、断电后丢失

磁盘:永久保存

2)分类
机械硬盘(HDD):电机带动磁盘高速旋转,读取数据,速度可达到5400、7200rpm(每分钟5400转、7200转)
固态硬盘(SSD):集成电路与芯片,储存芯片
3)磁盘接口

硬盘接口不同,有着不同的读写速度。

磁盘接口分类

SATA:一般家用,一般用于机械硬盘,也有固态硬盘,容量大,价格低
SAS:给企业级环境使用,一般用于机械硬盘,也有固态硬盘
PCI-E:企业级使用,固态硬盘
U.2:企业级固态硬盘使用,PCI-E类似
m.2:nvme固态,一般用于笔记本
4)企业级硬盘选型

磁盘选型

一般情况下,数据备份:SATA硬盘,10k rpm,4T、8T容量
网站服务器使用:SAS接口,15k rpm,300G、600G、900G
高并发网站服务器:固态硬盘PCI-E,SAS,SATA

rpm:round per minute,每分钟多少转

5)机械 vs 固态

固态硬盘存储颗粒:SLC、TLC、MLC、3D、Nand

6)磁盘内部结构

机械硬盘内部组成

盘片:实际存放数据的地方
磁头:贴近盘片,读写数据
磁道:磁盘中的圆环形区域,从0开始
扇区:磁盘上最小的存储单元,默认512字节
柱面:不同盘面上相同的磁道组成的形状

3、RAID

1)概述

在物理服务器中,往往有多快硬盘,这些硬盘并不是直接使用,而是通过raid卡(设备)进行统一管理

大部分需要做raid后才能安装系统,部署服务

raid磁盘冗余阵列,管理磁盘方式

2)特点

根据用户所设置的Raid级别,可以获取如下一个或多个特点:

a、可以获取更高的容量
b、可以获取更高的性能
c、可以获取更高的冗余(安全)

一般情况下,无法同时满足上面3个特点

3)raid级别

raid级别就是对这些硬盘的管理方式

 raidji级别最少需要几块硬盘安全冗余可用容量性能应用场景举例
条带串联raid  01最低所有硬盘容量的和读写最快不要求安全,只要求速度数据从库、存储从库、web服务器
镜像raid  12100%容量总和的一半写入速度慢,读取速度可以只追求安全性,对速度没要求系统盘、监控服务器
 raid  53最多损坏一块损失一块硬盘的容量写入性能不好,读取速度可以对安全速度不高普通数据库,存储访问量不高
 raid  104可以损坏一半损失所有硬盘一半的容量读写速度快对于安全和性能都要高并发或高访问量数据库主库存储

4、磁盘分区

磁盘分区:主分区、扩展分区、逻辑分区。MBR、GPT

1)概述

MBR:Master Boot Record,每一块硬盘上面存放磁盘引导程序,引导程序在磁盘开头部分,用于引导系统,

位置:磁盘分区表,磁盘的开始部分:0磁头,0磁道,1扇区(512字节)

这512字节存放了:

引导程序:446字节(MBR)
磁盘分区表:4个分区表(共64字节)
结束标记:55AA,2字节

MBR简单示意图:

分区表64字节,每个分区占用16字节,因此,最多只有4个分区

这4个分区叫做主分区

如果只划分1个分区使用所有空间,将无法继续划分分区

如果划分了4个分区,但磁盘空间还有剩余,那么剩余的空间将无法继续使用

扩展分区使用于解决主分区数量问题主分区只能有4个的问题,扩展分区无法直接使用,需要在扩展分区下面创建逻辑分区,存在数据。

逻辑分区只在扩展分区中,用于存放数据。

分区使用MBR形式,主分区+扩展分区 ,最多4个,扩展分区只能有1个。扩展分区用于创建逻辑分区。

未来分区是在安装系统的时候创建与规划的,安装系统后增加硬盘直接使用或者划分1个分区。

2)磁盘及分区命名

磁盘分区或分区文件放在/dev/下面

磁盘命名:

#磁盘接口
  sas/sata/scsi接口的硬盘:硬盘名字以sd开头
  虚拟机(kvm)/公有云: 硬盘名字以vd开头
#第几块硬盘:通过字母表示,从a开始,如:
/dev/sda
#第1块(sas接口)硬盘
/dev/sda

分区命名:

分区命名,是根据分区类型进行命名
主分区、扩展分区:1-4
逻辑分区:从5开始

比如:

第2块sata硬盘的第1个分区:/dev/sdb1

第5块公有云盘的第3个分区:/dev/vde3

5、磁盘分区实战

1)概述

一块硬盘分区三部曲:

打隔断:分区操作
装修、格式化:创建文件系统
安装门窗:挂载(命令、配置文件)

Linux设备(光盘、磁盘)不挂载就无法使用

挂载:给设备设置个入口,如果不挂载,则这个设备无法访问

2)分区实战

实战环境准备:添加2块硬盘(scsi),每个1g

1、添加2块scsi硬盘,每个1g,如下:

设置大小:

添加完成如下:

添加完成后,重启系统。查看一下磁盘信息:

[root@linux-87-01 ~]# fdisk -l | grep '/dev/sd'
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    41943039    19921920   8e  Linux LVM
Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors
Disk /dev/sdd: 3221.2 GB, 3221225472000 bytes, 6291456000 sectors
[root@linux-87-01 ~]# 

2、分区

案例01:sdb硬盘创建20MB的分区

分区参数解释:

p:print,输出磁盘分区信息
n:new,创建分区
w:write,保存退出
d:delete,删除分区
q:quit,退出不保存

具体操作:

#执行分区命令
[root@linux-87-01 ~]# 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 0x082efbdb.
#创建20MB分区
Command (m for help): n  # n:创建分区
Partition type:    #提示选择类型,默认是主分区
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):    #输入p,创建主分区
Using default response p
Partition number (1-4, default 1):  #分区号码,默认是1
First sector (2048-2097151, default 2048):   #直接回车,使用默认起点
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +20M  #+20M,大小20MB
Partition 1 of type Linux and of size 20 MiB is set

Command (m for help): w  # w,写入保存,退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

再创建1个扩展分区,大小为:剩余的全部容量

扩展分区创建后,就可以创建逻辑分区:

Command (m for help): n
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l  #l:逻辑分区
Adding logical partition 5
First sector (45056-2097151, default 45056): 
Using default value 45056
Last sector, +sectors or +size{K,M,G} (45056-2097151, default 2097151): +10M
Partition 5 of type Linux and of size 10 MiB is set

输入p就可以查看分区信息:

Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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: 0x082efbdb

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048       43007       20480   83  Linux
/dev/sdb2           43008     2097151     1027072    5  Extended
/dev/sdb5           45056       65535       10240   83  Linux

Command (m for help): 

案例02:创建一个分区使用硬盘所有容量

把刚才分区的/dev/sdb删除后,再分区

#删除已有的分区
Command (m for help): d
Partition number (1,2,5, default 5): 
Partition 5 is deleted

Command (m for help): d
Partition number (1,2, default 2): 
Partition 2 is deleted

Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): 
#重新分区
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
Partition number (1-4, default 1): 
First sector (2048-2097151, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151):  #不设置大小,默认使用全部空间
Using default value 2097151
Partition 1 of type Linux and of size 1023 MiB is set
Command (m for help): 

查看一下:

[root@linux-87-01 ~]# ll /dev/sdb*
brw-rw---- 1 root disk 8, 16 May 19 22:45 /dev/sdb
brw-rw---- 1 root disk 8, 17 May 19 22:45 /dev/sdb1
[root@linux-87-01 ~]# 

注意:

fdisk分区:基于mbr分区表,且磁盘小于2TB,否则无法使用fdisk进行分区
大磁盘(大于2TB)、gpt磁盘:用parted命令
3)格式化

格式化,也就是创建文件系统。可以使用mkfs命令。

mkfs:make filesystem

命令格式:

mkfs.文件系统类型    磁盘或分区

文件系统类型:

xfs:centos 7默认的文件系统类型
ext4:用于centos 6或公有云

查看分区文件系统:df -Th

[root@linux-87-01 ~]# df -Th
Filesystem                            Type      Size  Used Avail Use% Mounted on
devtmpfs                              devtmpfs  1.2G     0  1.2G   0% /dev
tmpfs                                 tmpfs     1.2G     0  1.2G   0% /dev/shm
tmpfs                                 tmpfs     1.2G  9.6M  1.2G   1% /run
tmpfs                                 tmpfs     1.2G     0  1.2G   0% /sys/fs/cgroup
/dev/mapper/centos_linux--87--01-root xfs        17G  1.9G   16G  12% /
/dev/sda1                             xfs      1014M  138M  877M  14% /boot
tmpfs                                 tmpfs     245M     0  245M   0% /run/user/0
[root@linux-87-01 ~]# 

格式化,比如:

[root@linux-87-01 ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=65472 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=261888, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@linux-87-01 ~]# 
4)挂载

Linux设备,需要挂载才能使用,挂载就是给设备指定入口(已经存在的目录)

挂载命令:mount

卸载命令:umount 命令格式: umount 挂载点

入口:也叫挂载点,一般是个空目录即可。一般用于临时挂载的目录:/mnt/

命令格式:mount 设备 目录

比如:把上面的/dev/sdb1挂载到/mnt目录:

#临时挂载,系统重启后,挂载失效
[root@linux-87-01 ~]# mount /dev/sdb1 /mnt/
[root@linux-87-01 ~]# df -Th
Filesystem                             Size  Used Avail Use% Mounted on
/dev/sdb1                             1020M   33M  988M   4% /mnt
[root@linux-87-01 ~]# 
5)永久挂载

一般情况下,我们需要临时+永久挂载

实行永久挂载的方案:

 方案1:使用rc.local文件,把挂载命令:“mount   设备    目录”写入/etc/rc.d/rc.local文件 
       中,注意:命令最好为绝对路径
 方案2:在/etc/fstab文件配置

/etc/fstab文件内容如下:

/dev/mapper/centos_linux--87--01-root   /          xfs   defaults  0 0
UUID=5fcb5343-5fae-4d6c-9ab7-70192094f758  /boot   xfs   defaults  0 0
/dev/mapper/centos_linux--87--01-swap  swap       swap   defaults  0 0

内容共有6列,每一列的含义:

UUID为设备的ID号码,每个设备唯一

如何查看设备的UUID?

使用blkid命令,例如:

[root@linux-87-01 ~]# blkid 
/dev/sda1: UUID="5fcb5343-5fae-4d6c-9ab7-70192094f758" TYPE="xfs" 
/dev/sda2: UUID="Jn6hKw-eiw5-8VQ0-obaR-fOHl-JRD1-63Ft3q" TYPE="LVM2_member" 
/dev/sdb1: UUID="f6d37937-8e22-4ddf-b54d-424a27472091" TYPE="xfs" 
/dev/mapper/centos_linux--87--01-root: UUID="8a9cb5f5-9e1c-48eb-8711-2190808bfaa4" TYPE="xfs" 
/dev/mapper/centos_linux--87--01-swap: UUID="637de51a-6a88-4381-8ae0-f8227560c9ef" TYPE="swap" 
[root@linux-87-01 ~]# 

6、MBR vs GPT

分区表特点对应命令
mbr支持2TB以内的硬盘,大于2TB的则只识别2TB,区别主分区、扩展分区、逻辑分区fdisk/parted
gpt支持大容量硬盘,主分区无限使用(可以支持100多个主分区)gdisk/parted

案例1:创建gpt格式的分区,大小为10Mb

#查看硬盘分区信息
[root@linux-87-01 ~]# parted /dev/sdc  print
#编辑/dev/sdc
[root@linux-87-01 ~]# parted /dev/sdc
GNU Parted 3.1
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)                                                                  
#创建分区表gpt格式
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable gpt   # 或者使用mklabel gpt,注意:mbr的话叫做msdos类型
#创建分区,大小为10MB
(parted) mkpart primary 0 10  # 或者:(parted) mkpart primary 10 20
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? I  
#分多几个
(parted) mkpart primary 10 20
(parted) mkpart primary 20 30   
#查看分区
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      17.4kB  10.0MB  9983kB               primary
 2      10.5MB  19.9MB  9437kB               primary
 3      19.9MB  30.4MB  10.5MB               primary

(parted)                      

跟mbr,不同的是,分区即可生效。

删除分区:rm 分区

例如:

(parted) rm 3

退出:q或quit

有一块3T的硬盘:

[root@linux-87-01 ~]# fdisk -l | grep sdd
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use
Disk /dev/sdd: 3221.2 GB, 3221225472000 bytes, 6291456000 sectors
[root@linux-87-01 ~]# 

使用fdisk看看:

提示:超过2T,要使用gpt。mbr最多支持2T

7、swap

swap:交换分区,当内存不足的时候,临时充当内存,占用的磁盘空间。

问题:假如服务器运行java程序,占用大量内存,以至于开始占用swap,如何解决?

增加swap空间。
1、创建指定大小的文件(比如,创建1g的文件)
2、把文件转换为swap
3、激活这个swap,把它加入到Linux中
4、配置永久挂载

操作过程:

#1、创建大小为1g的文件
[root@linux-87-01 ~]# dd if=/dev/zero of=/tmp/1g  bs=1M count=1024

#2、把文件转换为swap(即格式化)
[root@linux-87-01 ~]# mkswap /tmp/1g 
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=244cd031-550e-4c9d-a372-a981ef838898
[root@linux-87-01 ~]# 
#查看一下:
[root@linux-87-01 ~]# file /tmp/1g 
/tmp/1g: Linux/i386 swap file (new style), version 1 (4K pages), size 262143 pages, no label, UUID=244cd031-550e-4c9d-a372-a981ef838898
[root@linux-87-01 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           2.4G        217M        1.0G        9.4M        1.2G        2.0G
Swap:          2.0G          0B        2.0G
[root@linux-87-01 ~]# 

#3、激活,加入Linux中
[root@linux-87-01 ~]# swapon /tmp/1g  #激活
swapon: /tmp/1g: insecure permissions 0644, 0600 suggested.
[root@linux-87-01 ~]# chmod 0600 /tmp/1g
#查看一下:
[root@linux-87-01 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           2.4G        218M        1.0G        9.4M        1.2G        2.0G
Swap:          3.0G          0B        3.0G
[root@linux-87-01 ~]#

#4、永久挂载
#方法1:配置/etc/fstab
[root@linux-87-01 ~]# vim /etc/fstab
/tmp/1g  swap    defaults    0 0
#方法2:将swapon /tmp/1g 写入/etc/rc.d/rc.local文件

参数解释:

if:input  file,输入文件/dev/zero,不断输出空。
of:output  file,输出文件
bs:block size,每次读出多少
count:读取次数

bs=1M count=1024:每次读1M,读取1024次,那么大小是:1*1024

关闭swap:

[root@linux-87-01 ~]# swapoff /tmp/1g
#关闭全部swap
swapoff -a

8、磁盘分区方案

即使系统重新安装,用户的数据不能丢失。

1、分区方案

1)方案1:服务器存放的数据,不重要

/boot/ :引导分区,引导系统启动与存放引导文件、存放系统内核镜像。推荐1G即可
swap:根据实际物理内存配置,大于8G,swap配置8G;内存小于8G,则配置为内存的1.5或2倍,最大8G。补充:公有云的话,可以不配置swap,如果是运行java,建议配置
/ :分区,所有剩余空间分配给根分区

2)方案2:服务器存放重要的数据

/boot/ :引导分区,引导系统启动与存放引导文件、存放系统内核镜像。推荐1G即可
swap :根据实际物理内存配置,大于8G,swap配置8G;内存小于8G,则配置为内存的1.5或2倍,最大8G。补充: 公有云的话,可以不配置swap,如果是运行java,建议配置
/ :根分区,40-200G,主要安装一些软件。重要数据单独存放
/data/:剩余的所有空间(分区名根据实际情况定义)

3)方案3:不知道是否重要

/boot/ :引导分区,引导系统启动与存放引导文件、存放系统内核镜像。推荐1G即可
swap :根据实际物理内存配置,大于8G,swap配置8G;内存小于8G,则配置为内存的1.5或2倍,最大8G。补充:公有云的话,可以不配置swap,如果是运行java,建议配置
/ :根分区,40-200G,主要安装一些软件。重要数据单独存放
剩余空间不划分:未来谁使用谁划分
2、分区实战

创建/boot分区:1G

swap分区:2G

/分区:5G

/data分区:剩余所有空间。

分区使用标准模式:

/boot分区:

/data分区:

创建完成后如下图:

LVM使用建议:

lvm:逻辑卷
优点:可以动态调整分区大小
缺点:软件实现,效率低

未来可以搭配raid+lvm使用,或者直接raid,不使用lvm

9、磁盘空间不足

Linux系统中,导致磁盘空间不足的常见原因有3个:

原因1:大文件,数量多,导致的空间不足,Block不足
原因2:大量的小文件,数量非常多,导致inode不足
原因3:有些文件因为进程的调用,没有彻底删除,导致磁盘空间不足
1)原因1

大文件,数量多,导致的空间不足,Block不足

a)故障模拟

使用dd命令创建大文件

[root@linux-87-01 ~]# dd if=/dev/zero of=/var/log/big-file bs=1M count=6000

b)排查

使用df -h命令查看哪个分区是否满了

通过du -sh分析,是哪个目录或文件占用空间多

[root@linux-87-01 ~]# df -h
Filesystem                             Size  Used Avail Use% Mounted on
devtmpfs                               1.2G     0  1.2G   0% /dev
tmpfs                                  1.2G     0  1.2G   0% /dev/shm
tmpfs                                  1.2G  9.5M  1.2G   1% /run
tmpfs                                  1.2G     0  1.2G   0% /sys/fs/cgroup
/dev/mapper/centos_linux--87--01-root   17G   12G  5.7G  67% /
/dev/sda1                             1014M  138M  877M  14% /boot
tmpfs                                  245M     0  245M   0% /run/user/0
[root@linux-87-01 ~]# du -sh /* | sort -rhk1

使用df -h命令,发现根目录占用空间大。

再通过du -sh /*命令,发现/var目录占用空间大

然后,使用du 命令查看/var目录:

[root@linux-87-01 ~]# du -sh /var/* | sort -rhk1
8.1G	/var/log
216M	/var/cache

发现,/var/log目录占用空间大,进一步分析:

[root@linux-87-01 ~]# du -sh /var/log/* | sort -rhk1
8.0G	/var/log/big-file
2.7M	/var/log/vmware-vmsvc-root.log

至此,找到了一个大文件(就是刚才创建的用于测试的)

然后,确认是否可以删除。这里只是测试用,删除即可。

一层一层排查

2)原因2

大量的小文件,数量非常多,导致inode不足。

每创建1个文件,需要1个inode,用于存储文件属性信息。

inode数量在磁盘格式化的时候固定。

一般情况下,block消耗快,但是一些服务可能有异常,会生成大量的小文件(不足4KB的文件),此时,就会占用大量的inode。

a)故障模拟

df -i:查看inode使用情况

#1、创建一个小分区(10M),来模拟。
#使用dd命令创建一个10Mb的文件:/tmp/10m
[root@linux-87-01 ~]# dd if=/dev/zero of=/tmp/10m  bs=1M count=10
#2、格式化
[root@linux-87-01 ~]# mkfs.ext4 /tmp/10m
#3、创建一个/inode目录,把/tmp/10m挂载到该目录
[root@linux-87-01 ~]# mkdir -p /inode
[root@linux-87-01 ~]# mount /tmp/10m /inode/
#4、查看挂载情况
[root@linux-87-01 ~]# df -h | grep inode
/dev/loop0                             8.7M  172K  7.9M   3% /inode
#5、查看inode使用情况
[root@linux-87-01 ~]# df -i 
Filesystem                             Inodes IUsed   IFree IUse% Mounted on
/dev/loop0                               2560    11    2549    1% /inode

inode已使用11

创建大量文件:

[root@linux-87-01 ~]# cd /inode/
[root@linux-87-01 inode]# touch {01..2560}.txt
touch: cannot touch ‘2550.txt’: No space left on device
touch: cannot touch ‘2551.txt’: No space left on device
touch: cannot touch ‘2552.txt’: No space left on device
touch: cannot touch ‘2553.txt’: No space left on device
touch: cannot touch ‘2554.txt’: No space left on device
touch: cannot touch ‘2555.txt’: No space left on device
touch: cannot touch ‘2556.txt’: No space left on device
touch: cannot touch ‘2557.txt’: No space left on device
touch: cannot touch ‘2558.txt’: No space left on device
touch: cannot touch ‘2559.txt’: No space left on device
touch: cannot touch ‘2560.txt’: No space left on device
[root@linux-87-01 inode]# 

提示:没有空间了

b)排查

#使用df  -h查看
[root@linux-87-01 ~]# df -h
Filesystem                             Size  Used Avail Use% Mounted on
/dev/loop0                             8.7M  230K  7.8M   3% /inode
[root@linux-87-01 ~]# 

发现,磁盘空间充足。继续排查

#df  -i查看inode
[root@linux-87-01 ~]# df -i
Filesystem                             Inodes IUsed   IFree IUse% Mounted on
/dev/loop0                               2560  2560       0  100% /inode
[root@linux-87-01 ~]# 

发现,inode不足。

解决:删除测试用的文件即可。

#未来,真的inode用完,需要找出大量的小文件,然后分析是否没有用了,然后删除

#方法01:找出系统中较大的目录(大于1MB)
find / -type d -size +1M
#方法02
find / -type f  | xargs dirname | sort | uniq -c | sort -rn | head

方法的思想:执行命令:find / -type f 的时候,如果某个目录的文件越多,它的目录名称出现的越多。然后排序,去重,找到每个目录名出现次数。

一个报错信息:

[root@linux-87-01 inode]# touch {01..350000}.txt
-bash: /usr/bin/touch: Argument list too long
[root@linux-87-01 inode]# 

报错:参数列表太长

原因:后面的文件名太多了。

解决:使用管道

[root@linux-87-01 inode]# echo touch {01..350000}.txt | xargs touch

删除:

[root@linux-87-01 inode]# rm -f  ./*
#同样也会报错:参数列表太长
#使用管道即可
[root@linux-87-01 inode]# ls | xargs rm -f
3)原因3

有些文件因为进程的调用,没有彻底删除,导致磁盘空间不足。

文件被彻底删除的条件:

1、rm删除,没有入口,硬链接数为0
2、进程调用数为0,也是就是这个文件没有被其他服务使用

a)故障模拟

创建文件var/log/big-file:

[root@linux-87-01 ~]# dd if=/dev/zero of=/var/log/big-file bs=1M count=6000

查看根分区空间使用情况:

[root@linux-87-01 ~]# df -h /
Filesystem                             Size  Used Avail Use% Mounted on
/dev/mapper/centos_linux--87--01-root   17G  7.8G  9.3G  46% /
[root@linux-87-01 ~]# 

使用tail -f命令查看/var/log/big-file

[root@linux-87-01 ~]# tail -f /var/log/big-file

如下图:

重新打开另外一个窗口,执行删除/var/log/big-file文件,再查看根分区空间:

#删除/var/log/big-file文件前,根分区使用情况
[root@linux-87-01 ~]# df -h /
Filesystem                             Size  Used Avail Use% Mounted on
/dev/mapper/centos_linux--87--01-root   17G  7.8G  9.3G  46% /
#删除/var/log/big-file文件后,根分区使用情况
[root@linux-87-01 ~]# rm -f /var/log/big-file 
[root@linux-87-01 ~]# df -h /
Filesystem                             Size  Used Avail Use% Mounted on
/dev/mapper/centos_linux--87--01-root   17G  7.8G  9.3G  46% /
[root@linux-87-01 ~]# 

发现:删除/var/log/big-file文件,根分区空间没有变化。/var/log/big-file文件有没删除?

[root@linux-87-01 ~]# ll /var/log/big-file
ls: cannot access /var/log/big-file: No such file or directory
[root@linux-87-01 ~]# 

文件已删除,但空间没有释放。

因为:tail -f /var/log/big-file 命令一直在执行。

解决方法:结束tail -f /var/log/big-file 命令

问题:怎么找到那些入口没有了、但还被其他进程(软件、命令)调用的文件?

b)排查

找出这种没有彻底删除的文件,找出对应的服务,重启该服务。

安装lsof:

#使用lsof命令找出这样的文件
[root@linux-87-01 ~]# lsof | grep delete
tail  17657   root  3r  REG    253,0  6291456000  17461419  /var/log/big-file (deleted)
#终止tail进程即可
kill 17657

参数解释:

查看分区空间使用情况:df -h、du -sh