六、磁盘管理体系

发布时间 2023-05-26 02:43:32作者: lichengbo

1. 磁盘管理系统详解

1.1磁盘管理系统概述

  • 目标:
    • 熟练掌握常用磁盘配置(容量,转速,个数)
    • 熟练说出或写出:raid级别
    • 熟练掌握磁盘基本使用
    • 熟练掌握磁盘空间不足的故障,原因,排查,解决

1.2 磁盘管理基础

1)磁盘介绍
  • 介绍一块企业级硬盘结构
  • 磁盘(硬盘):永久(持续)存放数据
  • 磁盘分类(结构):机械硬盘(HDD),固态硬盘(SSD)
  • 磁盘接口(类似与水壶的壶嘴):sata(接口),SAS(接口,企业级),pci-e(固态硬盘接口,企业级,家用)
  • 硬盘指标:
    • 硬盘转速:每分钟 5400 rpm 7200rpm(家用) 10k 15k rpm(企业级)
    • 硬盘容量
    • 性能
2)磁盘选型?????
  • 企业磁盘选型:
接口 应用场景
sata 企业内部使用,存放备份。线下业务(给自己内部人员使用) 4tb 6tb 7.2K转 *8
SAS 企业标配,一般线上业务使用(线上环境,生产环境) 300g 600g 900g 15K转 *8
固态硬盘(pci-e /sas/sata) 访问量巨大(并发高),数据量不是很大。(架构优化:把用户经常访问的数据存放在固态) 500g 1tb 2tb *4
3)磁盘内部结构
  • 机械
    • 磁头
    • 盘片
  • 机械磁盘细致结构:
    • 磁头:用于读写数据,径向运行(半径),从数字0开始命名
    • 磁道:类似与环形跑道,用来存放数据的区域
      • 最外面的圈开始时0号磁道
      • 每个磁道存放的数据量是一样的
    • 扇区:存放数据最小单位。默认是512字节
    • 柱面:不同盘面上,相同的磁道组成的形状,磁盘读写是以柱面单位进行的。
4)机械VS固态

1.3 RIAD?????

1)概述
  • 磁盘我们冗余阵列 RAID

  • 物理服务器的硬盘,通过raid管理,才能使用

  • 使用raid优势

    • 可以获取更高容量
    • 可以获取更高性能
    • 可以获取更高冗余
2)raid级别
  • raid:raid管理磁盘具体方式
  • 常见的raid级别:raid0 raid1 raid5 raid10
最少需要几块 容量 冗余 性能
raid0 1 所有硬盘容量总和 最低,没有冗余 最快的
raid1(镜像) 2块硬盘(制作的时候,1次稚嫩给2块硬盘做raid1) 一半 冗余100% 写入新能较慢,读取类似与单块硬盘
raid5 至少3块硬盘 损失n-1(n硬盘总数,n>=3) 损坏一块 读取性能还可以,写入较慢
raid10 至少需要4块硬盘 减半 损坏一半,但是不能在一个组里 读写很快
3)raid级别及应用场景

4)未来应用
  • 物理服务器需要配置raid
  • 物理服务器拿到手
    • 拆开包装
    • 上电
    • 配置raid
    • 安装系统(光盘,u盘)
    • 选择软件包
    • 创建磁盘分区
    • 安装完成
    • 部署环境
5)raid vs lvm
  • raid 硬件控制
  • lvm 软件 逻辑卷,优点:动态扩容磁盘空间。

1.4磁盘分区

1)磁盘分区概述
  • MBR:磁盘的引导程序(主引导记录),引导系统启动
  • 分区表:存放分区开始结束信息
2) 主分区,扩展分区,逻辑分区
  • 主分区:最多有4个,每个占用16个字节分区表空间
  • 扩展分区:
    • 主要用来解决主分区最多4个
    • 主分区无法直接存放数据与使用
    • 如果要使用需要在扩展分区中创建逻辑分区
    • 扩展分区在一个磁盘中只有1个
  • 逻辑分区
    • 需要先创建扩展分区
    • 使用逻辑分区存放数据

3)linux系统磁盘及分区命名规则
/dev/sda    #硬盘名字
/dev/sda1
/dev/sda2

#Linux系统磁盘名字的命名规则
#物理机
sata/sas/pci-e 接口的硬盘
/dea/sa?开头
##云服务器
/dav/vd开头

##第一块硬盘
/dev/sda
##第二块硬盘
/dev/sda


#Linux系统磁盘分区的命名规则

#主分区或扩展分区1-4
/dev/sda1-4
#逻辑分区从5开始
/dev/sda5
4)MBR vs GPT
  • MBR主引导记录,磁盘分区格式

  • 磁盘大小不能大于2tb,如果大于2tb则无法使用

  • GPT分区表格式,解决问题

  • 解决系统支持大硬盘问题

  • 主分区随便用,不用区分主分区,扩展分区,逻辑分区。

MBR VS GPT 支持的主分区数量 支持的硬盘大小????? 磁盘分区命令
MBR 支持的主分区+扩展分区最多4个 小于2tb硬盘 fdsik 只支持mbr
GPT 可以理解无限 可以各种容量的磁盘 parted/gdisk 支持gpt和mbr

1.5 磁盘分区实战

1)环境准备
[root@lichengbo-nb ~]# fdisk -l | grep '/dev/sd[a-c]:'
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 sectors
Disk /dev/sdc: 106 MB, 106954752 bytes, 208896 sectors
2)磁盘分区
  • ⚠️磁盘分区属于危险操作,操作前备份。
磁盘分区指令 共同点 区别
fdisk 都可以进行磁盘分区 仅支持mbr格式分区,磁盘大小不能超过2tb
parted/gdisk 都可以进行磁盘分区 支持gpt格式分区表,(parted支持mbr和gpt),用于大硬盘分区
3)磁盘分区-fdisk
#01 查看磁盘分区信息
[root@lichengbo-nb ~]# fdisk -l | grep '/dev/sd[a-c]:'
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 sectors
Disk /dev/sdc: 106 MB, 106954752 bytes, 208896 sectors

#02 对/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.
#在使用write命令之前要小心。
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xb5ecdcf3.

#03 fdisk 磁盘分区指令详解
p (print) 显示单签磁盘分区信息
n  (new)  创建磁盘分区
d (delete)删除分区
q  (quit) 退出不保存
w  (write)保存并退出,让磁盘分区生效

#04 案例01 在/dev/sdb中创建一个10mb的磁盘分区
#第一步:进入磁盘分区模式
fdisk /dev/sdb
#第二步:创建分区
Command (m for help): n     #创建分区
Partition type: #请选择分区类型
   p   primary(主分区) (0 primary, 0 extended, 4 free) #(0个主分区,0个扩展分区,4个可用主分区和扩展分区)
   e   extended (扩展分区)
Select (default p):  #输入回车选择(默认的主分区)
Using default response p
Partition number (1-4, default 1):  #指定分区号,回车就行
First sector (2048-208895, default 2048): #磁盘分区的第一个扇区是从哪里开始(不需要关注从哪里开始,回车就行)
#重点:输入+10M表示这个分区空间是10MB
Last sector, +sectors or +size{K,M,G} (2048-208895, default 208895):  #磁盘分区结束于哪里。
Partition 1 of type Linux and of size 10 MiB is set  #创建磁盘分区号是1,大小是10MB分区
#第三步:查看分区
Command (m for help): p

Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 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: 0xb5ecdcf3

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048       22527       10240   83  Linux
#第四步:保存并生效
Command (m for help): w
The partition table has been altered!

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


# 案例02  企业案例 创建1个分区使用整个磁盘空间的容量
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-208895, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-208895, default 208895): 
Using default value 208895
Partition 1 of type Linux and of size 101 MiB is set

Command (m for help): p

Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 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: 0xb5ecdcf3

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      208895      103424   83  Linux
#一直按回车就可以把一个磁盘空间给一个分区
4)磁盘分区-parted
#第一步:进入到磁盘
(parted) p                                                                
Error: /dev/sdc: unrecognised disk label
Model: VMware, VMware Virtual S (scsi)                                    
Disk /dev/sdc: 107MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags: 
#第二步:创建磁盘分区表
mktable           #gpt格式:mktable gpt     mbr格式:mktable msdos
(parted) mktable gpt
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 107MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  Flags

#第三步:创建磁盘分区
(parted) mkpart primary 0  10   #创建10mb分区
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? I 

#删除分区
rm
(parted) rm 4
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 107MB
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

1.6 磁盘使用全流程

1)磁盘使用流程概述
  • 一般流程:
    • 1️⃣磁盘分区
    • 2️⃣格式化(创建文件系统)
    • 3️⃣挂载 (linux下面设备必须要挂载才能访问与使用,挂载相当于给设备设置了一个入口)
2)磁盘使用实战
#对 /dev/sdb 创建一个分区,使用全部空间,挂载到/mnt目录

#第一步:磁盘分区
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-208895, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-208895, default 208895): 
Using default value 208895
Partition 1 of type Linux and of size 101 MiB is set

Command (m for help): 
Command (m for help): p

Disk /dev/sdb: 106 MB, 106954752 bytes, 208896 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: 0xb5ecdcf3

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      208895      103424   83  Linux

#第二步:格式化
make file system
[root@lichengbo-nb ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=6464 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=25856, 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

#第三步:挂载
linux下面,设备(磁盘,磁盘分区,光盘)不挂载无法使用,挂载给设备设置入口
入口叫做挂载点    挂载点是目录
/mnt  是linux临时挂载点
[root@lichengbo-nb ~]# mount /dev/sdb1 /mnt/
[root@lichengbo-nb ~]# df -h
Filesystem                                Size  Used Avail Use% Mounted on
devtmpfs                                  2.0G     0  2.0G   0% /dev
tmpfs                                     2.0G     0  2.0G   0% /dev/shm
tmpfs                                     2.0G   12M  2.0G   1% /run
tmpfs                                     2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/mapper/centos_lichengbo--xuexi-root   50G  2.1G   48G   5% /
/dev/sda1                                1014M  138M  877M  14% /boot
/dev/mapper/centos_lichengbo--xuexi-home   47G   33M   47G   1% /home
tmpfs                                     394M     0  394M   0% /run/user/0
/dev/sdb1                                  98M  5.3M   93M   6% /mnt
  • 补充指令

    卸载分区(挂载点)
    mount  挂载
    umount  /mnt   
    [root@lichengbo-nb ~]# umount /mnt/
    [root@lichengbo-nb ~]# df -h
    Filesystem                                Size  Used Avail Use% Mounted on
    devtmpfs                                  2.0G     0  2.0G   0% /dev
    tmpfs                                     2.0G     0  2.0G   0% /dev/shm
    tmpfs                                     2.0G   12M  2.0G   1% /run
    tmpfs                                     2.0G     0  2.0G   0% /sys/fs/cgroup
    /dev/mapper/centos_lichengbo--xuexi-root   50G  2.1G   48G   5% /
    /dev/sda1                                1014M  138M  877M  14% /boot
    /dev/mapper/centos_lichengbo--xuexi-home   47G   33M   47G   1% /home
    tmpfs                                     394M     0  394M   0% /run/user/0
    
  • 修改/etc/rc.local

  • 存放命令,脚本会在开机的时候自动运行

  • 第一次使用需要给/etc/rc.d/rc.local 加上执行权限

    #开机自动挂载
    方法一:
    mount /dev/sdb1 /mnt  写入到/etc/rc.local
    
    方法二:
    修改/etc/fstab   #开机自动挂载的配置文件
    #fstab格式
    /dev/mapper/centos_lichengbo--xuexi-root /                       xfs     defaults        0 0
    UUID=4cb251ec-e843-48ab-887e-3a918462f619 /boot                   xfs     defaults        0 0
    /dev/mapper/centos_lichengbo--xuexi-home /home                   xfs     defaults        0 0
    /dev/mapper/centos_lichengbo--xuexi-swap swap                    swap    defaults        0 0
    配置一共是6列
    
    

#挂载生效
mount /dev/sdb1 /mnt/   #临时挂载,重启linux后挂载失效
#永久挂载
/data #新的目录
两种方法
3)小结
  • 磁盘使用三部曲:分区、格式化、挂载
  • 命令:分区fdisk、parted、gdisk,mkfs.xfs 挂载mount、umount
  • 永久挂载:/etc/rc.local /etc/fstab

1.7 磁盘企业级分区方案

  • 新安装的系统如何划分分区及设置容量。
1)物理机
#磁盘分区方案 01  通用  (运行一些不太重要的环境,没有用户的数据)

/boot分区  #用于引导系统启动,linux内核文件。  1GB即可(如果需要升级linux内核)

swap 分区  #用于内存不足的时候,swap空间临时充当内存使用。
          #内存小于8G swap可以给内存的1.5-2倍,最大控制在8-16G
          #大于8G seap  给8-16G
          #在一些生成环境中为了极致的速度、性能。会关闭swap  (与服务器默认没有swap)
          
 /   分区  #剩余多少给多少
 
#磁盘分区方案 02 通用(有重要数据的时候)
/boot分区  #用于引导系统启动,linux内核文件。  1GB即可(如果需要升级linux内核)

swap 分区  #用于内存不足的时候,swap空间临时充当内存使用。
          #内存小于8G swap可以给内存的1.5-2倍,最大控制在8-16G
          #大于8G seap  给8-16G
          #在一些生成环境中为了极致的速度、性能。会关闭swap  (与服务器默认没有swap)
          
 /   分区  #给40-100G
 
/data 数据分区  #重要数据放在/data目录、分区中。
 
2)云服务器
  • 根据需求,规划好。所需要的磁盘空间。
  • 如果后期添加,扩容云服务器都很方便。
/     系统分区   40-100G  /dec/vda
/data 数据分区   不限制

1.8 磁盘故障案例

1)磁盘空间不足案例no space left on device?????
  • 因为大文件

    1️⃣如何模拟

    2️⃣如何排查

    3️⃣如何解决

    # 01 模拟 创建大文件
    dd if=/dev/zero of=/usr/local/big  bs=1M  count=5000
    
    dd  创建指定大小文件
        if  input file 输入文件
        of  output file 输出文件
        bs  block size  每次读取多少
        count           次数
        bs*count就是文件大小
        
    #02 排查
    - 目标:定位大文件在哪里,在那个目录,是什么文件名字。
    整体查看下:是哪里磁盘空间不足(那个分区),根据有问题的分区,详细,一层一层排查,排除到具体的目录或文件
    
    #第一步:整体查看下是哪里磁盘空间不足(那个分区)
    df -h
    #第二步:根据有问题的分区,详细,一层一层排查,排除到具体的目录或文件
    du -sh /*
    [root@lichengbo-nb ~]# du -sh /* | grep G
    6.5G	/usr
    
    [root@lichengbo-nb ~]# du -sh /* | sort -rh    以人类可读形式进行排序
    6.5G	/usr
    282M	/var
    105M	/boot
    61M	/oldboy
    33M	/opt
    33M	/etc
    12M	/run
    9.3M	/tmp
    96K	/root
    88K	/home
    4.0K	/app
    
    #01 发现/分区占用空间大
     du -sh /* | sort -rh
    #02 发现usr目录占用空间大
     du -sh /usr/* | sort -rh 
    #03发现/usr/local 占用空间大
     du -sh /usr/local/* | sort -rh 
    #04最终发现/usr/local/big文件最大
    #05确认文件是否重要,确认是否可以删除
    

1.9因为inode用光了导致的磁盘空间不足.

  • 原理:

    • inode存放文件属性信息. inode数量是在格式化后固定.
    • 如果耗尽也会提示磁盘空间不足no space left on device
  • 故障案例模拟

#模拟
创建小的磁盘分区. 进行挂载
在这个磁盘分区中,创建文件,占用inode.模拟inode耗尽.
#01通过dd来创建文件,格式化,挂载.
dd if=/dev/zero  of=/tmp/inode   bs=1k  count=2000
#02格式化
[root@oldboy81-golden-lnb ~]# mkfs.ext4   /tmp/inode 
mke2fs 1.42.9 (28-Dec-2013)
/tmp/inode is not a block special device.
Proceed anyway? (y,n) y
#03挂载
[root@oldboy81-golden-lnb ~]# mkdir -p /inode
[root@oldboy81-golden-lnb ~]# mount /tmp/inode   /inode/
[root@oldboy81-golden-lnb /inode]# touch {01..250}
touch: cannot touch ‘246’: No space left on device
touch: cannot touch ‘247’: No space left on device
touch: cannot touch ‘248’: No space left on device
touch: cannot touch ‘249’: No space left on device
touch: cannot touch ‘250’: No space left on device
  • 排查 与解决 ?????
如果出现磁盘空间不足:
1) df -h 查看 发现还有空间.
2) 创建文件仍然提示,磁盘空间不足. df -i 查看inode 使用情况. inode用光了.
[root@oldboy81-golden-lnb /inode]# df -h
Filesystem                                 Size Used Avail Use% Mounted on
devtmpfs                                   979M     0 979M   0% /dev
tmpfs                                       991M     0 991M   0% /dev/shm
tmpfs                                       991M  9.6M 981M   1% /run
tmpfs                                       991M     0 991M   0% /sys/fs/cgroup
/dev/mapper/centos_oldboy--81--golden-root   50G  8.1G   42G  17% /
/dev/sda1                                 1014M 138M 877M  14% /boot
/dev/mapper/centos_oldboy--81--golden-home   47G   33M   47G   1% /home
tmpfs                                       199M     0 199M   0% /run/user/0
/dev/sdb                                     99M  5.4M   94M   6% /mnt
/dev/loop0                                  2.0M   34K  1.8M   2% /inode
[root@oldboy81-golden-lnb /inode]# df -i
Filesystem                                   Inodes IUsed   IFree IUse% Mounted on
devtmpfs                                     250468   438   250030    1% /dev
tmpfs                                        253483     1   253482    1% /dev/shm
tmpfs                                        253483   808   252675    1% /run
tmpfs                                        253483    16   253467    1% /sys/fs/cgroup
/dev/mapper/centos_oldboy--81--golden-root 26214400 65410 26148990    1% /
/dev/sda1                                    524288   326   523962    1% /boot
/dev/mapper/centos_oldboy--81--golden-home 24637440    46 24637394    1% /home
tmpfs                                        253483     1   253482    1% /run/user/0
/dev/sdb                                      52224    29    52195    1% /mnt
/dev/loop0                                      256   256        0  100% /inode
#解决
删除,大量小文件.
  • 小结:
    • 排查inode导致的磁盘空间不足
    • 排查流程:
      • df -h ;然后看下df -i inode 使用情况.
      • 如何查找有大量小文件的目录. 找系统中目录大小大于1MB即可. find / -type d -size +1M
      • 精确到具体问题的目录,看看目录内容. 与老大确认是否可以删除.
      • 确认后再处理.
    • 模拟故障作为熟悉项目.
#了解: 为何找系统中大于1mb目录.
# 目录中文件越多,目录本身大小越大.
# 10w个小文件,目录已经是2.3mb
[root@oldboy81-golden-lnb /oldboy]# ls many-small/ | wc -l 
100001
[root@oldboy81-golden-lnb /oldboy]# ll -hd many-small/
drwxr-xr-x. 2 root root 2.3M Mar 18 10:04 many-small/
#找出系统中 大量小文件的目录: 思路02     
显示系统中所有文件. 取出路径部分(目录).然后uniq 统计次数.
显示系统中所有文件
find /  -type f  
取出路径部分(目录)
dirname 
然后uniq 统计次数
uniq 
find /etc /var/ /usr /oldboy   -type f |xargs dirname |uniq -c |sort -rn |head  
find /etc/ /usr/ /var/ /oldboy   -type f     |xargs dirname     |uniq -c |sort -rn | head  
100001 /oldboy/many-small
   1718 /usr/share/man/man3
   1164 /usr/share/man/man1
    966 /usr/bin
    882 /usr/lib/python2.7/site-packages/sos/plugins
    801 /usr/share/man/man8
    566 /usr/share/vim/vim74/syntax
    447 /usr/share/nmap/scripts
    421 /usr/share/mime/application
    360 /usr/lib64/python2.7/encodings

1.10 因为文件没有被彻底删除导致的磁盘空间不足案例

1) 什么是彻底删除?(文件删除原理)
  • 文件删除条件:
    • 硬链接数为0: 没有入口了(硬链接数为0,rm删除.)
    • 进程调用数为0: 这个文件没有任何调用(服务软件/命令)

2) 故障模拟.
#模拟创建大文件.
seq  500000000 >>/var/log/big.log   
dd 
#模拟占用
tail -f /var/log/big.log
3) 排查与解决
#日常 磁盘空间不足排查 block  
df -h
du -sh /* |sort -hr
du -sh /var/* |sort -hr
du -sh /var/log/* |sort -hr
\rm -f   /var/log/lidao.log 
#过了几天,发现磁盘空间仍然不足,文件的空间没有释放.
[root@oldboy81-golden-lnb ~]# ll /var/log/lidao.log 
ls: cannot access /var/log/lidao.log: No such file or directory
[root@oldboy81-golden-lnb ~]# 
df -h      #查看 使用 18GB
du -sh /*  #查看 使用不到 18GB
#怀疑文件没有被彻底删除,导致的文件越来越大.导致磁盘满了. df -h /du -sh 排查不到.
#解决:
结束(重启)对应的进程/服务
  • 磁盘空间不足之文件未被彻底删除导致
#排查
df -h       #磁盘满了
du -sh /*  #计算,发现没满.
基本是文件未被彻底删除导致的故障.
lsof |grep delete #即可 lsof 显示系统中所有被打开的文件.
                  #delete表示文件没有入口,进程调用数不为0
yum install -y lsof
#解决
重启或关闭对应服务/进程

4) 小结
  • 原理: 文件被删除删除原理(文件删除原理)
  • 故障:
    • 现象: df -h磁盘满,du -sh 磁盘没满. 怀疑文件未彻底删除导致的故障.
    • 排查: df -h,du -sh ; lsof |grep deleted
    • 解决: 找出占用文件的服务/进程,重启.

1.11 磁盘空间不足案例总结 ????�

磁盘空间不足原因 现象 排查 解决
常规大文件(大量文件)
block不足.
创建文件或使用服务
报错提示磁盘空间不足 no space left on device
df -h ; du -sh 一层一层排 查.
最终精确到文件或目录
确认后删除
大量inode使用,inode不足. 创建文件提示磁盘空间不足. df -h 磁盘没 满. df -i ; 哪个分区inode满 了.
使用find找分区中大于 1MB目录
确认后删除目录中大量 小文件
文件未彻底删除导致的磁盘 空间不足. 提示磁盘空间不足. df -h 真的不足. du -sh 看还有剩余. lsof |grep delete 重启对应的服务/进程.
待讲解 to be continued

2.磁盘管理体系之swap

2.1 swap 概述

  • swap 交换分区. 内存不足的时候临时充当内存.

2.2 swap手动创建

  • 目录: 熟练掌握手动创建swap方法.
1) 案例01 通过dd创建swap并添加到系统中 ?????
#01 dd创建500mb文件
#02 500mb文件成为swap (创建文件系统)
#03 激活swap(让他加入到系统中) (挂载)
#01 dd创建500mb文件
dd if=/dev/zero  of=/tmp/500mb   bs=1M  count=500
#02 500mb文件成为swap (创建文件系统)
mkswap /tmp/500mb
#03 激活swap(让他加入到系统中) (挂载)
chmod 600 /tmp/500mb
swapon /tmp/500mb 
free -h
#04 永久生效  
01) 方法01 /etc/rc.local  
swapon /tmp/500mb
02) 方法02 /etc/fstab  
/dev/mapper/centos_oldboy--81--golden-swap swap                   swap   defaults        0 0
#/tmp/500mb
UUID=756762b6-a234-4b59-999f-1e5efaa54a1d   swap                   swap   defaults        0 0  
#05 关闭swap
swapoff /tmp/500m
2) 案例02 通过创建磁盘分区创建swap 了解
#01 fdisk/parted 进行分区
#02 500mb文件成为swap (创建文件系统)
#03 激活swap(让他加入到系统中) (挂载)
#01 fdisk/parted 进行分区
#02 mkswap 
[root@oldboy81-golden-lnb ~]# mkswap /dev/sdc1 
Setting up swapspace version 1, size = 104408 KiB
no label, UUID=87a565c9-a37d-4233-8820-26a8fa0ebd40
#03 激活
[root@oldboy81-golden-lnb ~]# free -h
             total       used       free     shared buff/cache   available
Mem:           1.9G       342M        1.2G        9.5M       453M        1.4G
Swap:          2.0G         0B        2.0G
[root@oldboy81-golden-lnb ~]# swapon /dev/sdc1
[root@oldboy81-golden-lnb ~]# free -h
             total       used       free     shared buff/cache   available
Mem:           1.9G       342M        1.2G        9.5M       453M        1.4G
Swap:          2.1G         0B        2.1G
[root@oldboy81-golden-lnb ~]# swapon -s 
Filename Type Size Used Priority
/dev/sdc1                             partition 104408 0 -3
/dev/dm-1                             partition 2097148 0 -2

2.3 应用场景及建议 ? ?

  • 建议高并发,内存足够的时候,可以不开启swap.
  • 对于其他场景,不确定,就可以创建些swap.

2.4 企业故障案例:

  • 背景:
    • 企业生产环境运行java程序(Tomcat)软件,突然发现大量占用swap.
  • 如何处理:
    • 临时增加swap,防止系统宕机.
    • 后续根据日志,软件日志排查原因.
  • 结果:
    • 分析日志原理,找出程序代码问题

3. 磁盘管理体系之性能测试

3.1 磁盘核心性能指标 ? ? ? ??

磁盘关键性能指标
随机的读写次数(iops) io读写 per second 磁盘每秒的读写次数
吞吐量 (Throughput) 连续读写速度 磁盘最大读写速度
延迟 (随机读写延迟)
容量 磁盘/硬盘容量.

3.2 测试

# dd 
# fio (连续读写,随机读写,读写延迟)
yum install libaio libaio-devel fio -y
#测试顺序读
fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting
-filename=/dev/sda -name=Read_PPS_Testing
#测试顺序写
fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting
-filename=/dev/sda  -name=Write_PPS_Testing
#测试随机读 iops
fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -
group_reporting -filename=/dev/sda -name=Rand_Read_Testing
#测试随机写  
fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -
group_reporting -filename=/dev/sda -name=Rand_Write_Testing
#测试延迟 随机读
fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -
filename=/dev/sda -name=Rand_Read_Latency_Testing
参数 说明
-direct=1 表示测试时忽略I/O缓存,数据直写。
-iodepth=128 表示使用异步I/O(AIO)时,同时发出I/O数的上限为128。 同时发出多少个io请求.randwrite
-rw=randwrite 指定fio命令工作模式。(顺序、随机、读、写)(random writes)。
其它测试可以设置为:
random随机
randread(随机读random reads)
randwrite
read(顺序读sequential reads)
write(顺序写sequential writes)
randrw(混合随机读写mixed random reads and writes)
-ioengine=libaio 表示测试方式为libaio(Linux AIO,异步I/O)。应用程序使用I/O通常有两种方式:同步同步的I/O一 次只能发出一个I/O请求,等待内核完成才返回。这样对于单个线程iodepth总是小于1,但是可以透过多 个线程并发执行来解决。通常会用16~32根线程同时工作将iodepth塞满。异步异步的I/O通常使用libaio 这样的方式一次提交一批I/O请求,然后等待一批的完成,减少交互的次数,会更有效率。
-bs=4k 表示单次I/O的块文件大小为4 KiB。默认值也是4 KiB
测试随机io的时候bs推荐4k
测试顺序io(吞吐量)bs=1M(1024k)
-size=1G 表示测试文件大小为1 GiB。
-numjobs=1 表示测试线程数为1。
-runtime=1000 表示测试时间为1000秒。如果未配置,则持续将前述-size指定大小的文件,以每次-bs值为分块大小写 完。
-group_reporting 表示测试结果里汇总每个进程的统计信息,而非以不同job汇总展示信息。
- filename=/dev/your_device 指定的设备名,例如 /dev/sda /dev/vda
- name=Rand_Write_Testing 表示测试任务名称为Rand_Write_Testing,可以随意设定。

4.磁盘管理体系之文件系统-了解

  • 目标: 认识文件系统即可,认识常见系统的默认文件系统.
  • 文件系统: 组织和存放磁盘中文件的方式.
  • Linux:
    • XFS (CentOS 7) 默认的文件系统.
    • EXT4 (CentOS 6及之前的文件系统.)
    • Ext3 (CentOS 5.x)
    • Ext2 (裸奔状态文件系统.) Btrfs (小文件)
  • Windows: Fat32 NTFS

5. 磁盘管理体系-总结

  • 磁盘选型
  • Raid级别
  • Raid应用场景.
  • 磁盘分区: fdisk/parted/gdisk进行分区即可.
  • 磁盘分区格式化挂载.
  • 永久挂载(当前及重启后都生效.)
    • /etc/rc.local
    • /etc/fstab (每一列的含义)
  • 磁盘分区方案
  • 故障案例: 磁盘空间不足故障案例,原因,排查,解决.
  • 故障案例: 企业生产环境运行java程序(Tomcat)软件,突然发现大量占用swap.需要临时添加swap
  • 添加swap.
  • 磁盘性能衡量指标: 容量,吞吐量(顺序读写),iops, 延迟 dd,fio
  • 文件系统(了解)