磁盘管理体系概述

磁盘基础

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

磁盘:永久保存

分类

运行方式与原理

详细信息

机械硬盘(HDD)

电机带动磁盘高速旋转,读取数据(速度可达到5400,7200rpm每分钟多少转)

固态硬盘(SSD)

集成电路与芯片,存储芯片

磁盘接口

磁盘接口:磁盘的读写速度(类似于水壶的壶嘴)

接口分类

说明

SATA

一般用于机械硬盘,也可用于固态硬盘,容量大,价格较低(家用)

SAS

一般用于机械硬盘,也可用于固态硬盘(企业使用)

PCI-E

用于固态硬盘(企业)

U.2

企业级固态硬盘使用

企业级环境磁盘选型⭐⭐⭐⭐⭐

磁盘选型

应用建议

一般情况下,数据备份

SATA硬盘,10k rpm 4TB、8TB存放备份

网站服务器使用

SAS接口 15k rpm 300G、600G、900G

高并发网站服务器

可以选择固态硬盘的PCL-E,SAS,SATA

机械硬盘 vs 固态硬盘

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

磁盘内部结构(了解)

机械硬盘内部组成

说明

盘片

实际存放数据的地方

磁头

贴近盘片,读写数据

磁道

磁盘中的圆环形区域(从0开始)

扇区

磁盘上最小存储单位(默认512字节)

柱面

不同盘面上相同的磁道组成的形状

raid级别(磁盘冗余阵列)⭐⭐⭐⭐⭐

概述

在使用物理服务器时,通过raid卡(设备),统一管理多块硬盘

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

raid(磁盘冗余阵列):管理磁盘的方式

特点

可以获得更高的容量

可以获得更高的性能

可以获得更高的安全(冗余)

raid级别⭐⭐⭐⭐⭐

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

raid 0

raid 1

raid 5

raid 10

磁盘分区⭐⭐⭐⭐⭐

磁盘分区基本知识点

磁盘分区概念⭐

主分区:直接用于存储数据的分区,可以直接被操作系统识别

扩展分区:无法直接用于存储数据,而是作为一个容器,允许在内部创建多个逻辑分区

逻辑分区:扩展分区内创建的分区单位,可以直接存储数据

MBR(磁盘引导程序)⭐⭐⭐

磁盘分区表格式:MBR、GPT

MBR(磁盘引导程序):引导系统的启动(每一块硬盘上存放磁盘引导程序,引导程序在磁盘开头部分)

位置:位于磁盘的第一个扇区(512字节)

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

全为主分区

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

如果划分4个分区,但磁盘还有剩余,剩余空间将无法使用

3主分区+1扩展分区

扩展分区用于解决主分区数量限制问题

需要在扩展分区下面创建逻辑分区存放数据

主分区-扩展分区-逻辑分区关系⭐⭐⭐

磁盘及分区命名

命名方式

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

磁盘命名

# 磁盘接口

sas、sata、scsi接口的磁盘,硬盘名字是以sd开头

虚拟机(kvm)/公有云的磁盘,硬盘名字是以vd开头

# 第几块硬盘:通常以字母表示(从字母a开始以此类推)

/dev/sda

分区命名

分区命名时根据分区类型进行命名

主分区、扩展分区 1-4

逻辑分区 从5开始

# 案例:硬盘及分区命名

第2块SATA硬盘的第1个主分区 /dev/sdb1

第3块SAS硬盘的第2个逻辑分区 /dev/sdc6

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

磁盘分区实战

df

查看已格式化并挂载的磁盘的使用情况

fdisk

列出所有硬盘及其分区信息(包括未挂载的分区)

lsblk

显示块设备的层次结构(包括挂载点和大小)

打隔断:分区操作

装修,格式化:创建文件系统

安装门窗:挂载(命令,配置文件)

# 环境准备(添加两块1个G硬盘)

[root@yuan ~]# fdisk -l |grep '/dev/sd*'

磁盘 /dev/sda:53.7 GB, 53687091200 字节,104857600 个扇区

/dev/sda1 * 2048 2099199 1048576 83 Linux

/dev/sda2 2099200 104857599 51379200 8e Linux LVM

磁盘 /dev/sdc:1073 MB, 1073741824 字节,2097152 个扇区

磁盘 /dev/sdb:1073 MB, 1073741824 字节,2097152 个扇区

磁盘分区⭐⭐⭐

案例:创建20MB的分区

温馨提示:fdisk操作时,按删除键会出现无法删除现象

ctrl + u 或 ctr + 删除键

# 1 操作硬盘

fdisk /dev/sdb

# 2 对磁盘分区进行增删改查

p print 输出磁盘分区信息

n new 创建分区

d delete 删除分区

w write 保存并退出

q quit 退出不保存

# 3 创建20MB分区

命令(输入 m 获取帮助):n # 创建分区

Partition type: # 提示选择、类型

p primary (0 primary, 0 extended, 4 free)

e extended

Select (default p): p # 输入p或回车默认使用主分区

分区号 (1-4,默认 1):1 # 输入1或回车使用分区号

起始 扇区 (2048-2097151,默认为 2048): # 回车,使用默认的起点

将使用默认值 2048

Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):+20M # +20M 分区20MB

分区 1 已设置为 Linux 类型,大小设为 20 MiB

# 4 通过p查看

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:1073 MB, 1073741824 字节,2097152 个扇区

Units = 扇区 of 1 * 512 = 512 bytes

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0x2da82560

设备 Boot Start End Blocks Id System

/dev/sdb1 2048 43007 20480 83 Linux

# 通过w保存

命令(输入 m 获取帮助):w

The partition table has been altered!

Calling ioctl() to re-read partition table.

正在同步磁盘。

# 6 查看/dev/sab*

[root@yuan ~]# ll /dev/sdb*

brw-rw----. 1 root disk 8, 16 9月 27 19:57 /dev/sdb

brw-rw----. 1 root disk 8, 17 9月 27 19:57 /dev/sdb1

创建文件系统(格式化)⭐⭐⭐⭐⭐

创建文件系统(make filesystem):给磁盘分区创建规则,对存储设备进行初始化过程

mkfs 命令创建文件系统

格式化的格式:ext4、xfs、FAT32

挂载

将存储设备与操作系统的文件系统连接起来,使得用户和应用程序能够访问存储设备上的数据(类似于驱动器)

挂载⭐⭐⭐⭐⭐

临时挂载

Linux中需要通过挂载命令,给设备指定挂载点已经存在的空目录),否者将无法使用

通过mount命令指定设备,指定挂载点(目录)mount 设备 目录

挂载点:一般是个空目录就行

# 临时挂载(重启linux系统后挂载失效)

[root@yuan ~]# mount /dev/sdb1 /mnt/ # 给/dev/sdb1分区设置入口,入口叫做/mnt/

[root@yuan ~]# df -h |grep mnt # df 显示系统中磁盘空间的使用情况

/dev/sdb1 17M 1.1M 16M 7% /mnt

# 卸载

umount + 挂载点 # 表示卸载

umount + /mnt

# 挂载光盘到/media目录

mount /dev/cdrom /media/

永久挂载

把挂载命令mount /dev/sdb1 /data/写到/etc/rc.local中(最好写绝对路径)

专业的开机自动挂载配置文件/etc/fstab,根据配置文件的要求把mount命令改为配置文件形式

/etc/fstab每一列含义

第1列

第2列

第3列

第4列

第5列

第6列

设别名字/dev/sdb1或UUID形式

挂载点

文件系统类型:xfs、ext4、swap

挂载选项(一般是default)

是否备份

是否检查

设备名字方式:/dev/sdb1

/data/

xfs

default

0

0

UUID形式:

UUID=74b69113-bbb0-4017-8ad7-f2463c060c1d

配置文件形式的mount命令

mount /dev/sdb1 /data/

#/etc/fstab配置中的样子

/dev/sdb1 /data/ xfs defaults 0 0

MBR vs GPT

利用parted命令创建磁盘分区时实时生效

磁盘分区表格式

特点

对应的命令

MBR

最大支持2TB的硬盘,区分主分区,扩展分区,逻辑分区

fdisk/parted

GPT

支持大容量硬盘,主分区无限使用

gdisk/parted

# 案例:创建GPT格式的分区,分区大小为10MB(/dev/sdc)

# 编辑/dev/sdc

parted /dev/sdc

# 创建磁盘分区表gpt

mktable gpt 或者 mklabel gpt

# 注意:磁盘分区格式为mbr类型 mktable msdos

# 创建分区10MB

mkpart

mkpart primary 0 10

mkpart primary 10 20

# 删除分区

rm 1(磁盘分区Number)

# 退出编辑

q 或 quit

swap创建⭐⭐⭐⭐⭐

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

建议:如果内存充足且服务对性能要求较高,可以关闭swap

# 案例:服务器运行Java程序,大量占用内存,以至于开始占用swap如何解决

增加1G的swap空间

1.创建指定大小的文件

2.把文件转换成swap

3.激活这个swap,将其加入到Linux中

4.配置永久挂载

操作过程

# 1.创建指定大小的文件(1G的文件)

dd if=/dev/zero of=/tmp/swap_1g bs=1M count=1000

if === input file 输入文件(数据从哪里来)

of === output file 创建文件,存放数据,数据文件

bs === block size 每次读取多少(一般1MB大小)

count === 读取次数

# 2.把文件转换成swap

[root@yuan ~]# file /tmp/swap_1g # file命令查看文件的类型

/tmp/swap_1g:data

[root@yuan ~]# file /tmp/1g

/tmp/1g: cannot open (No such file or directory)

[root@yuan ~]# # file 检查文件类型

[root@yuan ~]# file /tmp/swap_1g

/tmp/swap_1g: Linux/i386 swap file (new style), version 1 (4K pages), size 255999 pages, no label, UUID=e607b45d-b099-433e-94aa-0f74d58a2334

# 3.激活这个swap,将其加入到Linux中

[root@yuan ~]# free -h

total used free shared buff/cache available

Mem: 1.9G 262M 74M 9.5M 1.6G 1.5G

Swap: 2.0G 8K 2.0G

[root@yuan ~]# chmod 600 /tmp/swap_1g

[root@yuan ~]# swapon /tmp/swap_1g

[root@yuan ~]# free -h

total used free shared buff/cache available

Mem: 1.9G 263M 73M 9.5M 1.6G 1.5G

Swap: 3.0G 8K 3.0G

# 4.永久挂载

方法1:swapon /tmp/swap_1g写入rc.loacl

方法2:写入/etc/fstab

/tem/swap_1g swap swap defaults 0 0

企业分区方案⭐⭐⭐⭐⭐

如何设置/、/boot、/swap大小

公有云

物理机//虚拟机(私有云)

服务器存放的数据相对不那么重要

分区

作用

大小

/boot引导分区

引导系统使用与存放引导文件,存放系统内核镜像

512-1025MB

/swap

物理内存不足充当临时内存

根据内存进行配置

内存大于8G,配置8G即可

内存小于8G,内存的1.5~2倍即可(最大8G)

/根分区

存放系统的所有核心文件和目录,操作系统的所有关键组件

所有剩余空间都给根分区

服务器存放重要数据

分区

作用

大小

/boot引导分区

引导系统使用与存放引导文件,存放系统内核镜像

512-1025MB

/swap

物理内存不足充当临时内存

根据内存进行配置

内存大于8G,配置8G即可

内存小于8G,内存的1.5~2倍即可(最大8G)

/根分区

存放系统的所有核心文件和目录,操作系统的所有关键组件

40G~200G,

/data(名字可自定义)

存放数据库及存储服务等重要数据(系统出现故障,该分区数据可以恢复)

剩余所有空间

LVM(逻辑卷管理器)

# 了解即可# LVM(逻辑卷管理器):Linux中用于管理磁盘存储的工具

# 基本概念

物理卷(PV, Physical Volume):LVM管理的基础存储单位,通常是一个分区或整个磁盘。

卷组(VG, Volume Group):由一个或多个物理卷组成的存储池,逻辑卷是从卷组中分配的。

逻辑卷(LV, Logical Volume):从卷组中分配的存储空间,类似于传统的分区。可以进行格式化并挂载到文件系统。

元数据:LVM使用元数据来存储卷组、物理卷和逻辑卷的信息。

# LVM的优点

动态调整:可以在线扩展或缩减逻辑卷,无需重启操作系统。

快照:允许创建逻辑卷的时间点快照,方便备份与恢复。

条带化和镜像:支持将数据条带化到多个物理卷上,提升性能;也可以创建镜像逻辑卷,增加数据安全性。

简化管理:通过将多个物理卷汇总成卷组,可以简化存储管理。

# 常用命令

创建物理卷:pvcreate /dev/sdX

创建卷组:vgcreate myvg /dev/sdX /dev/sdY

创建逻辑卷:lvcreate -n mylv -L 10G myvg

格式化逻辑卷:mkfs.ext4 /dev/myvg/mylv

挂载逻辑卷:mount /dev/myvg/mylv /mnt

扩展逻辑卷:lvextend -L +5G /dev/myvg/mylv 或 lvextend -l +100%FREE /dev/myvg/mylv

缩减逻辑卷:lvreduce -L -5G /dev/myvg/mylv(注意,请先卸载逻辑卷并在缩减之前调整文件系统大小)

创建快照:lvcreate --size 1G --snapshot --name mysnapshot /dev/myvg/mylv

查看LVM信息:pvdisplay, vgdisplay, lvdisplay

磁盘管理之故障案例⭐⭐⭐⭐⭐

掌握Linux常见的磁盘空间不足故障案例(模拟、排查、原因、解决方法)

磁盘空间不足--(block占用导致磁盘空间不足)

错误提示:no space left on device

现象:利用df -h命令查询到某个磁盘磁盘分区使用率达到100%

注意:/sys/ /proc/等目录是虚拟目录,/dev/是设备目录,不要在里面创建

模拟:创建一个大文件

dd if=/dev/zero of=/var/opt/nginx.log bs=1M count=5000

# 1.df -h 命令查看哪个分区空间不足

[root@yuan ~]# df -h # 假设根目录空间使用100%

文件系统 容量 已用 可用 已用% 挂载点

/dev/mapper/centos-root 47G 6.9G 41G 15% /

/dev/sda1 1014M 138M 877M 14% /boot

tmpfs 199M 0 199M 0% /run/user/0

# 2.du -sh 命令查看目录所占空间

su -sh /*

su -sh /var/*

su -sh /var/opt*

# 找到具体的大文件或大目录

# 3.找出后取人是否可以删除

磁盘空间不足--(inode占用导致磁盘空间不足)

inode在磁盘格式化后,数量是固定的

现象:操作时提示no space left on device ,df -h 命令查看磁盘空间没有满

# 创建指定大小文件(用于作为磁盘分区)

dd if=/dev/zero of=/tmp/size_100MB bs=1M count=100

# 磁盘格式化

mkfs.xfs /tmp/size_100MB

# 创建挂载点进行挂载

touch -p /yuan/inode

mount /tmp/size_100MB /yuan/inode

# 创建测试文件

[root@yuan ~]# cd /yuan/inode

[root@yuan inode]# echo yuan{01..51300}.txt|xargs touch

接下来会出现磁盘空间不足的报错(no space left on device)

# 解决

df -h # 磁盘空间没有满

df -i # inode号使用100%

文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点

/dev/loop1 51200 51200 0 100% /yuan/inode

find / -type d -size +1Mls |xargs rm -f

磁盘空间不足--未彻底删除导致故障

linux中一个文件彻底删除的条件:

硬链接数为0

文件调用数为0

排查

如何知道硬链接数为0(一般rm后通过ls、find查看,没有则为0)

如何知道进程调用数为0(lsof(list open files 显示打开的文件),lsof |grep 文件名)

# 两个xshell远程连接桌面同时连接同一台虚拟机

其中一台:tail -f /etc/passwd

[root@yuan ~]# lsof /etc/passwd # 显示系统中所有被打开的文件(被调用的文件)

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

tail 23327 root 3r REG 253,0 938 34235338 /etc/passwd

lsof每一列

说明

第1列

命令或服务名字

第2列

pid

第3列

用户

第7列

文件大小(字节)

第8列

文件inode号码

第9列

文件名

故障模拟

提示磁盘空间不足,df -h 提示磁盘空间满了

继续排查du -sh 排查、统计总大小,发现没有满

怀疑可能是文件未删除导致的

# 1.故障模拟

seq 50000000 >/yuan/inode/big.log # 会显示磁盘已满

tail -f /yuan/inode/big.log # 连接同一台虚拟机的另一个窗口执行

ls /yuan/inode/big.log |xargs rm -rf

# 2.排查

[root@yuan ~]# df -h

文件系统 容量 已用 可用 已用% 挂载点

/dev/loop1 97M 97M 20K 100% /yuan/inode

[root@yuan ~]# du -sh /yuan/inode

0 /yuan/inode

# 3.发现问题继续排查

[root@yuan ~]# lsof |grep delete

tail 25657 root 3r REG 7,1 95862784 67 /yuan/inode/big.log (deleted)

# 在lsof中delete标记这个文件没有入口(硬链接数为0),但是还有进程调用

# 4.结束这个进程,重启服务

kill 进程号

总结

磁盘空间不足故障分类

现象

排查

解决

block

df -h磁盘空间不足

df-h,du -sh,一层一层的往下找

确认后再删除

inode

df -h磁盘空间有剩余,创建文件,操作服务显示磁盘空间不足

df -h,df -i,找出系统中最大的目录

确认后再删除

block文件未能彻底删除

df -h查看磁盘空间不足,du -sh查看磁盘空间还有剩余

lsof |grep delete,找出进程或服务

重启服务

文件系统

磁盘中文件的组织方式

常见文件系统

说明

xfs

centos 7默认的文件系统

ext4

centos 6.x Ubuntu默认的文件系统

ext3

centos 5.x 默认的文件系统

swap

交换分区(也可以算是文件系统)

磁盘性能指标

磁盘新能指标

说明

吞吐量(读写速度)

一般指的是磁盘读写速度

iops

每秒可以进行的io次数(io per second)

延迟

进行读写的操作延迟

测试块存储性能:如何在Linux实例中使用FIO工具测试块存储性能_云服务器 ECS(ECS)-阿里云帮助中心 (aliyun.com)