系统管理体系-磁盘管理体系
1.磁盘分区
- 磁盘分区概念:主分区,扩展分区,逻辑分区,MBR,GPT
- 磁盘命名及磁盘分区命名
- 实战操作
1.1.预备姿势
-
MBR: 每一块硬盘上存放磁盘引导程序,引导程序在磁盘开头部分,用于引导系统启动。我们一般不用太关注,我们安装系统的时候自动安装。
-
位置:磁盘分区表 磁盘的开始部分:0磁头,0磁道,1扇区(512字节)
-
这512字节存放了
- 引导程序446字节(MBR)
- 磁盘分区表(64字节) 4个分区表
- 结束标记 55AA,2字节
-
分区表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开始。
#案例01 硬盘及分区命名
第2块SATA硬盘的第1个主分区 /dev/sdb1
第3块SAS硬盘的第2个逻辑分区 /dev/sdc6
第5块公有云的云盘的第3个主分区 /dev/vde3
2.磁盘分区实战
2.1概述
- 一块硬盘,磁盘分区三部曲
- 打隔断:分区操作
- 装修,格式化:创建文件系统
- 安装门窗:挂载(命令,配置文件)
温馨提示:
挂载:给设备设置个入口,如果不挂载,这个设备无法访问,类似于没有门窗的监狱
- 环境准备
- 添加2块硬盘
- 2个1g硬盘即可
- 检查
[root@myvps ~]# fdisk -l |grep '/dev/sd'
磁盘 /dev/sdc:1073 MB, 1073741824 字节,2097152 个扇区
磁盘 /dev/sdb:1073 MB, 1073741824 字节,2097152 个扇区
磁盘 /dev/sda:42.9 GB, 42949672960 字节,83886080 个扇区
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 83886079 40893440 8e Linux LVM
2.2.磁盘分区
# 案例02 sdb硬盘创建20MB的分区
fdisk /dev/sdb
案例03 创建一个分区使用硬盘所有容量
- 案例02 创建20MB的分区
#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 或回车默认使用主分区
Using default response p
分区号 (1-4,默认 1):回车即可 #分区号回车使用默认的1号
起始 扇区 (2048-208895,默认为 2048):回车即可 #回车,使用默认的起点
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-208895,默认为 208895):+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
磁盘标识符:0x2af54b05
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 43007 20480 83 Linux #这里有sdb1即可。
#5. 通过w保存退出
#6. 查看/dev/sdb*
温馨提示:fdisk操作的时候,按删除键会出现无法删除现象,使用 ctrl+u 或 ctrl+删除键 即可删除
- 案例03 创建一个分区使用硬盘所有容量
令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-208895,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-208895,默认为 208895):
将使用默认值 208895
分区 1 已设置为 Linux 类型,大小设为 101 MiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
2.3.格式化(创建文件系统) ⭐️⭐️⭐️⭐️⭐
-
创建 make 文件系统 filesystem,表示给磁盘分区进行装修,给磁盘分区创建规则,一定量的inode,block。
-
mkfs(make filesystem) 创建文件系统(格式化)
mkfs 磁盘或分区
mkfs.xfs /dev/sdb1
xfs是文件系统类型,CentOS 7默认的文件系统类型。
mkfs.ext4 文件系统类型,用于CentOS 6.x 或公有云使用。
重复格式化错误提示
mkfs.xfs: /dev/sdb1 appears to contain an existing filesystem (xfs). 磁盘分区已经格式化。 mkfs.xfs: Use the -f option to force overwrite. 强制格式化mkfs.xxxx -f 即可
2.4.挂载⭐️⭐️⭐️⭐️⭐
-
Linux中的设备,需要通过挂载命令,给设备指定入口(已经存在的空目录),否则将无法使用.
-
通过mount命令指定 设备 ,指定 入口(目录) mount 设备 目录
-
入口: 挂载点,一般是个空目录就行. /mnt linux临时挂载点
#临时挂载(重启Linux系统后挂载失效)
mount /dev/sdb1 /mnt/
[root@myvps ~]# mount /dev/sdb1 /mntt/
[root@myvps ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
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-root 37G 4.6G 33G 13% /
/dev/sda1 1014M 168M 847M 17% /boot
tmpfs 199M 0 199M 0% /run/user/0
/dev/sdb1 1020M 33M 988M 4% /mntt
[root@myvps ~]# #给/dev/sdb1 设置入口,入口叫/mnt/
[root@myvps ~]# mount /dev/sdb1 /mnt/
[root@myvps ~]# df -h |grep mnt
/dev/sdb1 1020M 33M 988M 4% /mnt
- 卸载
umount /mnt
umount + 挂载点,表示卸载。
挂载光盘到/media目录
mount /dev/cdrom /media/
目前挂载整个流程:
1.磁盘分区
2.磁盘格式化
3.磁盘挂载
2.5.永久挂载⭐️⭐️⭐️⭐️⭐
我们在Linux下面的操作一般都分为临时和永久,对于挂载来说,我们希望永久生效(临时+永久)。
实现永久挂载的方案:
-
方案1️⃣使用rc.local ,把挂载命令 mount /dev/sdb1 /data/ 写入到/etc/rc.local,注意命令最好写为绝对路
径
-
方案2️⃣专业的开机自动挂载的配置文件/etc/fstab ,根据配置文件的要求把mount命令改为配置文件形式即可。
-
/etc/fstab每一列含义
第1列 | 第2列 | 第3列 | 第4列 | 第5列 | 第6列 |
---|---|---|---|---|---|
设备名字/dev/sdb1或UUID形式 | 挂载点 | 文件系统类型:xfs,ext4,swap | 一般是defaults,挂载选项 | 是否备份 | 是否检查 |
设备名字方式:/dev/sdb1 | /data/ | xfs | defaults | 0 | 0 |
UUID形式:UUID="048c0c5e-332a-44b6-bf70-99ff0c3fb2ff" |
配置文件形式的mount命令
mount /dev/sdb1 /data/
#/etc/fstab配置中的样子
/dev/sdb1 /data/ xfs defaults 0 0
如何知晓设备的UUID,UUID设备的ID号码,每个设备独一无二。(命令----> blkid)
2.6.挂载光盘
mount /dev/cdrom /mnt/
ls -l /mnt/Packages/*.rpm |wc -l
- 磁盘分区,格式化,挂载
- 磁盘分区:fdisk命令
- 格式化:创建文件系统, mkfs mkfs -t xfs === mkfs.xfs
- 挂载: mount(临时), 永久:/etc/rc.local 或 /etc/fstab
- fstab filesystem文件系统 table 表 文件系统开机自动挂载列表(清单)
3. mbr vs gpt
我们之前提到的Linux主分区,扩展分区合起来最多有4个.是MBR分区格式设置的.
分区表 | 特点 | 对应的命令 |
---|---|---|
mbr | 支持2tb以内的硬盘,大于2tb则只识别2tb. 区别主分区,扩展分区,逻辑分区 | fdisk/parted |
gpt | 支持大容量硬盘,主分区无限使用(100多个). | gdisk/parted |
#案例04 创建gpt格式的分区大小10MB (/dev/sdc)
查看硬盘分区信息
parted /dev/sdb print
#编辑/dev/sdc
parted /dev/sdc
#创建分区表gpt
mktable gpt 或者mklabel gpt 一样 #注意mbr叫做msdos类型 mktable msdos
#创建分区10mb
mkpart primary 0 10
mkpart primary 10 20
#删除分区
rm 1
#退出编辑
q 或quit
- 核心掌握MBR和GPT区别.
- 熟练使用parted进行分区即可,parted分区是实时生效
4.创建swap
- swap交换分区:内存不足的时候临时充当内存,swap占用的磁盘空间
- 所以未来应用建议:如果内存充足并且服务对性能要求较高,可以关闭swap.
案例05 服务器运行java程序,大量占用内存,以至于开始占用swap如何解决?
- 一步保证网站正常,增加swap空间.
- 联合开发一起排查.
增加1g的swap.
1.创建指定大小的文件1g的文件.
2.把文件转换为swap.
3.激活这个swap,把它加入到linux中.
4.记得配置永久挂载.
- 操作过程
#1.创建指定大小的文件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 === 读取次数
2.把文件转换为swap(格式化).
mkswap /tmp/1g
-----------------------
root@oldboy-king-v2 ~]# file /tmp/1g
/tmp/1g: data #刚刚创建的文件data普通数据文件
[root@oldboy-king-v2 ~]# mkswap /tmp/1g
正在设置交换空间版本 1,大小 = 1023996 KiB
无标签,UUID=0c072a5f-5ec2-4590-acd3-cae1e1926029
[root@oldboy-king-v2 ~]# file /tmp/1g #成为了swap 文件
/tmp/1g: Linux/i386 swap file (new style), version 1 (4K pages), size 255999 pages, no label,
UUID=0c072a5f-5ec2-4590-acd3-cae1e1926029
-----------------------
3.激活这个swap,把它加入到linux中.
[root@oldboy-king-v2 ~]# free -h
total used free shared buff/cache available
Mem: 1.9G 201M 596M 9.6M 1.2G 1.6G
Swap: 2.0G 0B 2.0G
# chmod 600 /tmp/1g
# swapon /tmp/1g
# free -h
total used free shared buff/cache available
Mem: 1.9G 202M 595M 9.6M 1.2G 1.6G
Swap: 3.0G 0B 3.0G
4.记得配置永久挂载.
方法01 : swapon /tmp/1g写入到rc.local
方法02: 写入/etc/fstab
/tmp/1g swap swap defaults 0 0
5. 企业分区方案
如何设置/,/boot/,swap大小建议.
-
公有云
-
物理机/虚拟机(私有云)
-
服务器存放的数据,不重要
分区 | 作用与大小 | |
---|---|---|
/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,主要安装一些软件.重要数据单独存放 | |
剩余空间不划分 | 未来谁使用谁划分. |
- lvm的使用建议
- 配合着raid+lvm使用,课后任务研究lvm.完成磁盘扩容即可.
逻辑卷.
优点: 可以动态调整分区大小.
缺点: 软件实现,效率较低.
未来可以搭配raid+lvm使用.
者直接raid部署系统,不使用lvm.
预测:未来3-5年的增长情况.
- 有个重装系统
没有IP地址:
nmtui >>> 选第一个
最后一个选项是改主机名的
没有自动挂载重新挂载就行
这里我没创建指定的/data分区文件所以没有data这个分区
系统管理-磁盘管理之故障案例
- 这部分我们掌握Linux常见磁盘空间不足故障案例:模拟,排查,原因,解决流程
1.1 磁盘空间不足-经典版本
- 错误提示: no space left on device
- 现象: df -h某个磁盘分区使用率达到100%,如何排查,如何处理?
- 模拟: 创建1个大文件(小伙伴完成)
dd if=/dev/zero of=/var/log/nginx.log bs=1M count=2000
- 排查 : df , du
#1. df -h 查看哪里空间不足,哪个分区
#2. du -sh详细查看目录所占空间
du -sh /* 排查占用空间大的目录
du -sh /var/*
du -sh /var/log/*
#3. 最终通过du -sh 排查到具体的大文件或大的目录
#4. 找出后确认是否可以删除.
- 解决: 通过du -sh 排查到具体的大文件或目录,找出后确认是否可以删除.
⚠ 温馨提示: /sys/ /proc/ 等目录是虚拟目录,不要在里面创建文件,/dev/是设备目录,也不要在里面创建.
- 这个磁盘空间不足案例是最常见的.
- 算是block占用导致的磁盘空间不足
1.2 磁盘空间不足-inode
inode存放文件属性信息,block存放文件内容.
inode在磁盘格式化后,数量是固定的
未来工作中可能出现大量小文件,导致占用inode速度快于block,inode不足了,也会导致磁盘空间不足
-
现象: 操作的时候,提示 no space left on device ,df -h查看发现磁盘空间没有满,问什么原因导致的?
-
原因: 磁盘空间不足,不是block导致的,还有一种情况是inode数量不足.
-
排查:
- 1️⃣ df -h查看磁盘空间没有满,df -i查看inode使用情况.
- 2️⃣找出这个分区中,大目录(目录本身大小大于1MB,du -sh目录所占空间)就行
- 3️⃣找出有大量小文件的目录
-
解决: 确认是否可以删除或处理.
具体查找: find /oldboy/ -type d -size +1M
- 找个目录模拟与分析
mkdir -p /oldboy/test-inode
cd /oldboy/test-inode
touch {1..100000}
ls -l 查看的目录大小表示目录下面1层,文件名字大小
目录占的磁盘空间: du -sh 查看 目录下面所有文件block大小只和
- ✔ 模拟inode满了,创建小文件1g
#创建指定大小文件(用于称为磁盘分区)
dd if=/dev/zero of=/tmp/1g-new bs=1M count=1000
#磁盘格式化
mkfs.xfs /tmp/1g-new
#创建挂载点
mkdir -p /oldboy/inode-error/
#进行挂载
mount /tmp/1g-new /oldboy/inode-error/
#创建测试文件
cd /oldboy/inode-error/
echo lidao{01..511111}.txt|xargs touch
提示磁盘空间不足的时候,检查df -h 与df -i .
[root@myvps inode-error]# ls |xargs rm -f #删除
- 核心掌握:inode使用也会导致磁盘空间不足
- 现象: df -h查看磁盘空间没有满,df -i查看不足
- 排查: find命令找出指定分区中大目录(大于1M目录
- 未来具体的情况,服务生成大量小文件.
补充排查某个目录下是否有大量小文件的方法第2个:
find /oldboy/inode-error/ -type f |xargs dirname |sort|uniq -c
1.3 磁盘空间不足-未彻底删除导致故障
1.3.1 预备姿势-文件删除原理
1个文件被彻底删除的条件:
-
条件1:删除文件,硬连接数为0,文件相当于被删除了. 使用rm命令
-
条件2:文件调用数为0,文件是否被使用中(命令,服务)
- 排查
- 如何知道硬连接数是否为0,一般rm后通过ls,find查看,没有则为0
- 如何知道进程调用数是否为0, lsof(list open files显示打开的文件), lsof |grep 文件名
[root@myvps ~]# lsof |grep passwd
tail 14086 root 3r REG 253,0 938 34237162 /etc/passwd
#显示出系统中所有被打开的文件(被调用的文件)
[root@myvps ~]# ps -ef |grep tail
root 14086 1735 0 15:30 pts/1 00:00:00 tail -f /etc/passwd
root 14174 1607 0 15:32 pts/0 00:00:00 grep --color=auto tail
lsof每一列 | 说明 |
---|---|
第1列 | 命令或服务名字 |
第2列 | pid |
第3列 | 用户 |
第7列 | 文件大小(字节 |
第8列 | 文件inode号码 |
最后一列 | 文件名 |
1.3.2 故障模拟
-
现象:
- 提示磁盘空间不足,df -h提示磁盘空间满了.
- 继续排查du -sh排查,统计总大小,发现没有满
- 怀疑可能是文件未彻底删除导致的
-
模拟与排查
#1. 模拟故障(文件被调用中,但是没有入口)
seq 500000000 >big.log
通过tail -f 调用
rm -f big.log
#2.
排查
df -h
[root@oldboy-aliyun-servers ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 461M 0 461M 0% /dev
tmpfs 471M 0 471M 0% /dev/shm
tmpfs 471M 728K 471M 1% /run
tmpfs 471M 0 471M 0% /sys/fs/cgroup
/dev/vda1 40G 24G 15G 63% /
tmpfs 95M 0 95M 0% /run/user/0
tmpfs 95M 0 95M 0% /run/user/1001
[root@oldboy-aliyun-servers ~]# du -sh /
3.9G /
#3. 发现问题
通过du -sh 分析发现实际占用的才3.9GB
#4. 继续排查
需要使用lsof
lsof |grep delete
在lsof中delete标记表示这个文件没有入口(硬连接数为0),但是还有进程调用.
lsof |grep nginx
tail 15974 root 3r REG 253,1 20971520000 792978 /var/log/nginx.log
(deleted)
#5. 解决问题
结束这个进程(服务),重启服务
文件硬链接数为0了,但是进程调用数不为0导致的问题.
现象:df -h查看磁盘满了,实际使用du -sh查看发现没有满
总结:
磁盘空间不足故障 分类 | 现象 | 排查 | 解决 |
---|---|---|---|
block | df -h磁盘空间不足 | df -h,du -sh一层一层找,直到找出对应的文件或目录 | 确认后再删除 |
inode | df -h磁盘空间有剩余,创建文件,操作服务提示磁盘空间不足. | df -h,df -i,找出系统中的大目录 | 确认后再删除 |
block 文件未彻底删除 | df -h查看磁盘空间不足,du -sh 查看磁盘空间还有剩余 | lsof | grep delete 找出进程或服务 | 重启服务 |
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码