Linux磁盘管理
磁盘基础
分类
运行方式与原理 | 详细信息 |
机械硬盘(HDD)-家用 | 电机带动磁盘高速旋转,读取数据;速度可以达到5400,7200 rpm(round per minute-转/分钟) |
固态硬盘(SSD) | 集成电路与芯片,存储芯片 |
磁盘接口
类似于水壶的壶嘴,表示磁盘的读写速度。不同类型的磁盘接口有不同的读写速度
接口分类 | 说明 |
SATA | 一般家用,一般用于机械硬盘,也有固态硬盘,容量大,价格较低 |
SAS | 给企业环境使用,一般用于机械硬盘,也有固态硬盘 |
PCI-E | 企业级使用,固态硬盘用 |
U.2 | 企业级固态硬盘使用,类似PCI-E |
磁盘选型
此建议基于物理服务器,如果是公有云,一般不用考虑过多
磁盘选型 | 应用建议 |
一般情况的数据备份 | SATA硬盘,10k rpm,4TB、8TB存放备份 |
网站服务器 | 使用SAS接口,15k rpm,300G 、600G、900G |
高并发网站服务器 | 可以选择固态硬盘PCI-E,SAS,SATA |
机械VS固态
机械VS固态 | 机械硬盘 | 固态硬盘 |
性价比 | 容量大、价格低 | 容量小、价格高 |
稳定 | 抗击打能力弱 | 抗击打能力强 |
速度 | IO读写速度稍慢 | IO读写速度很快 |
数据安全 | 数据恢复易 | 数据恢复难 |
寿命 | 几乎无限寿命 | 1~2W次寿命 |
固态硬盘存储颗粒:SLC,TLC,MLC,3D Nand
磁盘内部结构
机械硬盘内部组成 | 说明 |
盘片 | 实际存放数据地方 |
磁头 | 贴近盘片,读写数据 |
磁道 | 磁盘中的圆环形区域,从0开始 |
扇区 | 磁盘上最小存储单位,默认512字节 |
柱面 | 不同盘面上相同的磁道组成的形状 |
RAID
概述
独立磁盘冗余阵列,Redundant Array of Independent Disks,管理磁盘方式
将物理服务器的多个物理磁盘通过raid卡组合成一个逻辑单元统一进行管理的技术,旨在提升数据存储的性能、可靠性
特点
根据用户所设置的Raid级别可以获取如下一个或多个特点:①可获取更高的容量;②可获取更高的性能;③可获取更高的冗余(安全)
温馨提示:上面三个特点会根据选用的raid方式(raid级别)而所有区别,一般无法同时都满足以上三点
raid级别
至少需要几块硬盘 | 安全冗余 | 可用容量 | 性能 | 使用场景 | 举例 | |
Raid 0 | 1 | 最低 | 所有硬盘容量和 | 读写最快 | 不要求安全,只要求速度 | 数据库从库;存储服务;Web服务器 |
Raid 1 | 只能有两块 | 100% | (两块硬盘容量之和)的一半 | 写入速度慢,读取OK | 只追求安全性,对于速度没有要求 | 系统盘,监控服务器 |
Raid 5 | 3 | 最多损坏一块 | 损失一块盘的容量 | 写入性能不好,读取速度OK | 对于速度安全要求不高 | 普遍数据库;存储访问量不高 |
Raid 10 | 4 | 可以损坏一半 | 损失所有硬盘一半的容量 | 读写很快 | 对于安全和性能都要 | 数据库主库,存储;高并发或高访问量 |
Raid 0条带串联;Raid 1镜像
原理
RAID 5
采用奇偶校验的条带化技术,数据被分块并分步到多快磁盘上(条带化),每个条带中除了数据块外,还会存储一个通过XOR(异或)运算生成的奇偶校验块;奇偶校验块分步在所有磁盘上,而非集中在一块磁盘上;因此若有一块磁盘出现故障,则可以通过剩余磁盘上的数据和奇偶校验信息重建丢失数据(相当于空出一块盘的容量)
RAID 10
结合RAID 1和RAID 0,先分布式生成条带,将每个条带镜像到另一组磁盘上;每组镜像磁盘存储相同的数据,若一块磁盘产生故障,镜像中的另一块磁盘可以继续提供服务,数据不会丢失
物理机使用流程
分类
机架式服务器;塔式服务器;刀片式服务器
每个服务器高度单位是U,1U为4.45cm,常用有2U,1U,4U,更多U数的服务器一般为小型机,大型机
路数:两路表示此服务器有两颗CPU
机柜:存放物理服务器(大多为19英寸机柜)
机房:存放机柜的房间
新服务器使用流程
拆包装;插电,联网;开机并配置远程控制卡;配置Raid卡实现Raid(系统一般配置Raid 1,剩余空间一般配置Raid 5);U盘安装系统,如果大量服务器装机,可通过Cobbler等软件进行批量装机;根据要求部署服务;关闭并上架(放在机柜上)物理服务器
详细视频: 老男孩教育-李导-手把手带你玩转物理服务器_哔哩哔哩_bilibili
配置远程控制卡
适用于物理机故障,远程连接失败
Dell(戴尔):iDrac
IBM:imm
hp(惠普):ilo
华为:iBMC
磁盘分区
基础
MBR:每一块硬盘上存放磁盘引导程序,在磁盘开头部分,用于引导系统启动。一般不太关注,安装系统时候自动安装
位置:磁盘分区表 磁盘的开始部分:0磁头,0磁道,1扇区(512字节)
这512字节存放了引导程序MBR(446字节);四个磁盘分区表(64字节);结束标记55
AA(2字节)
磁盘分区表为64字节,最多有四个分区,每个分区占用16字节,这四个分区叫做主分区
主分区若只划分一个分区使用所有空间,将无法继续划分分区;若划分了四个分区,但是磁盘空间还有剩余,剩余空间将无法继续使用
扩展分区用于解决主分区数量主分区只能有四个的问题,扩展分区无法直接使用,需要在扩展分区下面创建逻辑分区,存放数据(只能有一个)
逻辑分区在扩展分区中,由扩展分区创建,用于存放数据
主分区-扩展分区-逻辑分区关系
未来使用基本为创建主分区就够了;安装系统的时候自动创建主分区、创建扩展分区、创建逻辑分区
传统MBR分区表有主分区、拓展分区和逻辑分区的限制;现代GPT分区表没有这些限制,支持最多128个分区并且所有分区都是主分区
磁盘分区命名
根据接口类型命名原则有所不同,例如IDE接口一般以hd开头,SAS/SATA/SCSI等接口的硬盘一般以sd开头;若以vd开头的硬盘,则表示为虚拟磁盘设备,一般常见于公有云、虚拟机(kvm);通过字母来表示是第几块硬盘(从字母a开始依次递推),如第一块硬盘以a表示,第二块硬盘则用b表示;通过数字来表示分区,区号1~4表示主分区或者拓展分区,从5开始的区号表示逻辑分区。
例:/dev/sdb1表示第二块SATA硬盘的第一个主分区
/dev/sdc6表示第三块SAS硬盘第二个逻辑分区
/dev/vde3表示第五块公有云云盘第三个主分区
磁盘分区
一块硬盘分区三部曲
①打隔断:分区操作
②装修,格式化:创建文件系统
③安装门窗:通过命令,配置文件方式挂载(给设备设置个入口,如果不挂载,这个设备无法访问,类似于没有门窗的监狱)
查看磁盘使用情况和磁盘分区
命令:fdisk
它采用传统的问答式界面,而非类似DOS fdisk的cfdisk互动式操作界面,因此在使用上较为不便,但功能却丝毫不打折扣。
例:
在设备上创建Linux文件系统
命令:mkfs 全拼:make filesystem
选项:-c:在制做档案系统前,检查该partition是否有坏轨
再分区创建完成后,创建文件系统(相当于格式化)
例:mkfs.ext4 /dev/sdb1 使用ext4文件系统格式化分区
mkfs.xfs /dev/sdb1 使用xfs文件系统格式化分区
重复格式化错误
LVM动态分区
物理卷 | PV,实际硬盘 | 映射到磁盘上特定的物理分区 |
卷组 | VG,物理硬盘 | 多个物理卷集中组成的存储池 |
逻辑卷 | LV,物理硬盘分区 | 从卷组中划分出的逻辑分区 |
fdisk创建分区后,输入t->8e->w将分区类型转换为物理卷
不重启的情况下重新读取磁盘分区表
命令:partprobe
适用于fdisk已创建的分区,而lsblk看不到新分区的情景
例:partprobe /dev/sdb
将物理硬盘分区初始化为物理卷PV
命令:pvcreate
例:pvcreate /dev/sdb2
显示物理卷信息
命令:pvdisplay
显示物理卷名称、所属卷组、物理卷大小、PE大小和UUID
例:pvdisplay /dev/sdb2
创建LVM卷组
命令:vgcreate
例:vgcreate lvm /dev/sdb1 /dev/sdb2 创建卷组名为lvm,将物理卷sdb1和sdb2添加
显示LVM卷组信息
命令:vgdisplay
不指定参数则显示所有卷组属性
例:vgdisplay lvm 查看卷组lvm的属性
创建LVM逻辑卷
命令:lvcreate
逻辑卷对应设备文件保存再卷组目录下,如在卷组lvm上创建一个逻辑卷lvol,则逻辑卷对应设备文件为/dev/lvm/lvol
选项:-L:指定逻辑卷大小,或要用逻辑区段的百分比
-n:指定逻辑卷的名称
例:lvcreate -n lvtest -L 1G lvm lvteat从lvm中取出1G空间
显示LVM逻辑卷属性信息
命令:lvdisplay
显示空间大小、读写状态和快照信息等属性
例:lvdisplay lvm 显示逻辑卷创建详细情况
添加物理卷增加卷组容量
命令:vgextend
例:vgextend lvm /dev/adb1 将物理卷/dev/sdb1加入卷组lvm
删除物理卷减少卷组容量
命令:vgreduce
不能删除卷组中剩余的最后一个物理卷
例:vgreduce lvm /dev/adb1 从卷组lvm中移除物理卷/dev/sdb1
在线拓展逻辑卷大小
命令:lvextend
例:lvextend -L +2G /dev/lvm/lvtest 为逻辑卷增加2G空间
减少逻辑卷占用空间
命令:lvreduce
可能会删除逻辑卷已有的数据
例:lvreduce -L -2G /dev/lvm/lvtest
删除指定逻辑卷
命令:lvremove
若使用mount挂载,则必须使用umount取消挂载
例:lvremove /dev/lvm/lvtest
删除LVM卷组
命令:vgremove
当要删除卷组中已创建逻辑卷,需要确认是否删除
例:vgremove lvm 删除卷组lvm
LVM使用建议
优点:可以动态调整分区大小;缺点:软件实现,其效率较低
未来可以搭配RAID+LVM使用,或者直接RAID部署系统,不使用LVM
预测:未来3-5年的增长情况
磁盘挂载
临时挂载
挂载Linux系统外的文件
命令:mount
格式:mount 源路径目录 挂载目录
具有临时性,重启Linux系统后挂载失败
例:mount /dev/cdrom /mnt 挂载光盘至/mnt目录
mount -o loop /tmp/image.iso /mnt/cdrom 将/tmp/image.iso光碟使用loop模式挂在/mnt/cdrom目录下,不烧录光碟下检视内容
mount -t davfs https://web.dev.com /soft 将网络存储以网络磁盘的形式挂载到系统路径/soft目录下
通过WebDav协议挂载网络磁盘,需要安装必要的组件davfs2
mount /dev/sdb1 /sdb-u 将/dev/sdb1挂载到/sdb-u目录
(图例)挂载前:
挂载后:
卸载已加载的文件系统
命令:umount
选项:-v 执行时显示详细信息
例:umount -v /dev/cdrom 通过设备名卸载
umount -vl /mnt 执行延迟卸载(lazy unmount)会立即卸载目录树里的文件系统,等设备不繁忙时才清理相关资源
常见原因:某个打开shell当前目录为挂载点里的目录,原因不详时可用lsof列出已经打开的文件
退出抽取式设备
命令:eject
允许可移动介质(典型是cd-ROM、软盘、磁带、或者JAZ以及zip磁盘)在软件控制下弹出。该命令也可以控制一些多盘片CD-ROM控制器,控制一些设备支持的自动弹出功能,以及控制一些CD-ROM驱动器磁盘托盘的关闭。若设备已挂入,则eject命令会先将该设备卸除再退出
例:eject /dev/cdrom 卸载并弹出CD
永久挂载
①使用rc.local将挂载命令 mount /dev/sdb1 /data/以绝对路径形式写入到/etc/rc.local(不推荐)
②专业的开机自动挂载的配置文件/etc/fstab,依配置文件格式更改mount命令
/etc/fstab配置文件格式
blkid命令查看设备的UUID(每个设备独一无二)
文件系统类型:ext4、xfs、ntfs-3g、nfs、cifs……
挂载选项:defaults、noatime、rw、_netdev(网络)
创建SWAP交换分区
服务器运行Java程序,占用大量内存,以至于开始占用SWAP
解决方案:为保证网站正常,临时增加SWAP空间,之后联合开发一起排查
内存拓展:内存不足时充当临时内存,占用的磁盘空间。若内存充足且服务对性能要求较高,可关闭内存拓展
swap交换分区:内存不足的时候临时充当内存,.
操作过程
①创建指定大小为1G的文件
命令:dd if=/dev/zero of=/tmp/1G bs=1M count=1000
if==input file 输入文件,数据从哪里来,一般使用/dev/zero,不断输出空字符
of==ouput file 输出文件,创建用于存放数据的文件
bs==block size 每次读取大小,一般为1MB
count 读取次数
文件大小=bs*count=1M*1000=1000MB=1GB
②把文件转换为swap(格式化)
mkswap /tmp/1G
③激活这个交换分区,把它加入到Linux中
命令:chmod 600 /tmp/1G
swapon /tmp/1G
④配置永久挂载
(1)echo "swapon /tmp/1G">>/etc/rc.local
(2)echo "/tmp/1G swap swap defaults 0 0">>/etc/fstab
⑤关闭swap交换分区文件
命令:swapoff /tmp/1G 关闭swap分区交换文件
swapoff -a>/dev/null 关闭所有交换空间
企业分区方案
存放不重要数据的服务器
分区 | 作用与大小 | 补充 |
/boot/引导分区 | 引导系统启动与存放引导文件,存放系统内核镜像,推荐1G | |
swap | 根据实际内存配置,实际内存大于8G,swap配置8G即可; 实际内存低于8G,配置1.5倍或2倍,最大8G | 公有云可以不配置,但如果是Java建议配置一些 |
/根分区 | 所有剩余空间给根 |
存放重要数据的服务器
分区 | 作用与大小 | 补充 |
/boot/引导分区 | 引导系统启动与存放引导文件,存放系统内核镜像. 推荐1G | |
swap | 根据实际内存配置,实际内存大于8G,swap配置8G即可; 实际内存低于8G,配置1.5倍或2倍,最大8G | 公有云可以不配置,但如果是Java建议配置一些 |
/根分区 | 给40G-200G,主要安装一些软件,重要数据单独存放 | |
/data/ | 剩余所有空间 |
存放数据重要程度不详的服务器
分区 | 作用与大小 | 补充 |
/boot/引导分区 | 引导系统启动与存放引导文件,存放系统内核镜像. 推荐1G | |
swap | 根据实际内存配置,实际内存大于8G,swap配置8G即可; 实际内存低于8G,配置1.5倍或2倍,最大8G | 公有云可以不配置,但如果是Java建议配置一些 |
/根分区 | 给40G-200G,主要安装一些软件,重要数据单独存放 | |
剩余空间 | 剩余空间不划分,未来谁使用谁划分 |
MBR vs GPT
分区表 | 特点 | 对应的命令 |
MBR | 支持2TB以内的硬盘,大于2TB则只识别2TB,区别主分区、扩展分区、逻辑分区 | fdisk/parted |
GPT | 支持大容量硬盘,主分区一百多个,可无限使用 | gdisk/parted |
磁盘分区和分区大小调整
命令:parted
该命令配置实时生效
例:创建GPT格式分区大小10MB(/dev/sdc)
磁盘故障案例
显示每个文件和目录的磁盘使用空间
命令:du 全拼:disk usage
命令 | 作用 |
du /usr | 显示使用情况 |
du -h /usr --human-readable | 用恰当的单位,可读的单位显示 |
du -h /root --max-depth=1 | 加上层级限制 |
du -h --max-depth=1 | sort -hr | 降序排列 |
du -ah /root | sort -hr | head -n 3 | 查看前三个最大的文件 |
du -ah /root --exclude="*/.*" | 排除隐藏目录 |
du -kt 10M ./* | 找出10M以上的文件 |
系统运行状态统计工具
命令:sar 全拼:system activity reporter
%user:用于表示用户模式下消耗的CPU时间的比例
%nice:通过 nice 改变了进程调度优先级的进程,在用户模式下消耗的CPU 时间的比例
%system:系统模式下消耗的CPU 时间的比例
%iowait:CPU 等待磁盘 I/O 导致空闲状态消耗的时间比例等待时间越低越好
%steal:利用 Xen 等操作系统虚拟化技术,等待其它虚拟CPU计算占用的时间比例
%idle:CPU 空闲时间比例空闲时间越高越好
显示当前已打开的所有文件列表
命令:lsof
若不存在此命令,需要"yum -y install lsof.x86_64"安装
选项:
-a:列出打开文件存在的进程
-c<进程名>:列出指定进程所打开的文件
-g:列出GID号进程详情
-d <文件号>:列出占用该文件号的进程
+d <目录>:列出目录下被打开的文件
+D <目录>:递归列出目录下被打开的文件
-n <目录>:列出使用NFS的文件
-i <条件>:列出符合条件的进程(协议、:端口、 @ip )
-p <进程号>:列出指定进程号所打开的文件
-u:列出UID号进程详情
例:
lsof -i:9981 -P -t -sTCP:LISTEN 获取端口对应的进程ID=>pid
lsof -i:$port 查看端口占用
lsof -u <username> 查看指定用户打开的文件
lsof +D /path/to/directory 查看正在使用某个目录的进程
lsof -u +L1 查看被删除但仍然被某个进程打开的文件
lsof -F 以列表形式显示结果
lsof -b 显示结果中不包含进程路径
lsof -r 以逆序显示结果
lsof -r <interval> 以特定间隔时间循环显示结果
lsof -t <interval> 以持续模式显示结果
lsof输出各列信息的意义如下:
标识 | 说明 |
COMMAND | 进程的名称 |
PID | 进程标识符 |
PPID | 父进程标识符(需要指定-R参数) |
USER | 进程所有者 |
PGID | 进程所属组 |
FD | 文件描述符,应用程序通过它识别该文件 |
文件描述符
标识 | 说明 |
cwd | 表示当前工作目录,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 |
txt | 该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 |
lnn | 库引用 (AIX); |
er | FD 信息错误(参见名称栏) |
jld | jail 目录 (FreeBSD); |
ltx | 共享库文本(代码和数据) |
mxx | 十六进制内存映射类型编号xx |
m86 | DOS合并映射文件 |
mem | 内存映射文件 |
mmap | 内存映射设备 |
pd | 父目录 |
rtd | 根目录 |
tr | 内核跟踪文件 (OpenBSD) |
v86 | VP/ix 映射文件 |
0 | 表示标准输出 |
1 | 表示标准输入 |
2 | 表示标准错误 |
文件状态模式
一般在标准输出、标准错误、标准输入后
标识 | 说明 |
u | 表示该文件被打开并处于读取/写入模式 |
r | 表示该文件被打开并处于只读模式 |
w | 表示该文件被打开并处于写入模式 |
空格 | 表示该文件的状态模式为 unknow,且没有锁定 |
- | 表示该文件的状态模式为 unknow,且被锁定 |
相关的锁
一般在文件状态模式后
标识 | 说明 |
N | 对于未知类型的Solaris NFS锁 |
r | 用于部分文件的读取锁定 |
R | 对整个文件进行读取锁定 |
w | 对文件的一部分进行写锁定(文件的部分写锁) |
W | 对整个文件进行写锁定(整个文件的写锁) |
u | 用于任何长度的读写锁 |
U | 对于未知类型的锁 |
x | 对于文件部分的SCO OpenServer Xenix锁 |
X | 对于整个文件的SCO OpenServer Xenix锁 |
space | 如果没有锁 |
文件类型
标识 | 说明 |
DIR | 表示目录 |
CHR | 表示字符类型 |
BLK | 块设备类型 |
UNIX | UNIX 域套接字 |
FIFO | 先进先出 (FIFO) 队列 |
IPv4 | 网际协议 (IP) 套接字 |
DEVICE | 指定磁盘的名称 |
SIZE | 文件的大小 |
NODE | 索引节点(文件在磁盘上的标识) |
NAME | 打开文件的确切名称 |
REG | 常规文件 |
block占用(经典)
现象:错误提示:no space left on device,而df -h查看某个磁盘分区使用率达到100%
模拟:创建1个大文件
dd if=/dev/zero of=/var/log/nginx.log bs=1M count=2000
排查: df -h 查看哪里空间不足,哪个分区空间不足;du -sh 详细查看目录所占空间,例:du -sh /var/*
解决:找到具体的大文件或大目录,找出后进行确认是否可以进行删除操作
温馨提示:/sys/、/proc/等目录是虚拟目录,不要在里面创建文件,/dev/目录是设备目录,也不要在里面创建文件(详见目录管理)
inode占用
现象:操作时,提示no space left on device,而df -h查看磁盘空间没有满
原因:磁盘空间不足,不是block导致的,还有一种情况是inode数量不足(服务生成大量小文件,导致占用inode速度快于block,inode不足)
模拟:创建多个小文件
echo CK{01……5211314}.txt | xargs touch
排查:df -h 检查磁盘空间没有满;df -i 查看inode使用情况
找出有大量小文件的目录(目录本身大小大于1MB,du -sh目录所占空间):find /ck/ -type d -size +1M #或find /ck/ -type f | xargs dirname | sort | uniq -C
未来工作中可能出现大量小文件,了,也会导致磁盘空间不足
文件未彻底删除
文件彻底删除条件
①删除文件,并且使其硬链接数量为零(使用用rm命令)
②文件调用数为零,文件不被命令、服务使用
常见形式:文件硬链接数为零,但进程调用数
现象:提示no space left on device,df -h提示存储空间已满;du -sh统计总大小未满
模拟(文件被调用中,但是没有入口)
seq 500000000 > big.log 生成一个五亿行数字日志文件(不明显)
dd if=/dev/zero of=/tmp/10G bs=1M count=10000 生成一个10G空文件
tail -f big.log 通过tail -f调用文件
rm -f big.log
排查
通过du -sh /分析发现实际占用的才7.7GB ,使用lsof | grep delete,查看并结束进程,重启服务
在lsof中delete标记表示这个文件没有入口(硬连接数为0),但是还有进程调用
结束进程
磁盘空间不足故障分类 | 现象 | 排查 | 解决 |
block | df -h 磁盘空间不足 | df -h,du -sh 一层一层找,找出对应的文件或目录 | 确认后再删除 |
inode | df -h 磁盘空间有剩余,创建文件,操作服务提示磁盘空间不足 | df -h,df -I 找出系统中的大目录 | 确认后再删除 |
block 文件未彻底删除 | df -h 查看磁盘空间不足,du -sh 查看磁盘空间还有剩余 | lsof | grep delete 找出进程或服务 | 重启服务 |