linux硬件篇-磁盘管理
linux的磁盘篇
文章目录
一,磁盘的概述
1,磁盘的基本描述
- 固态硬盘
- 机械硬盘
- 服务器硬盘
这个是网上查找的图片
- 下面插入我真实服务器中使用更多硬盘
在·服务器上的位置
- 常见的RAID磁盘阵列卡。
- 分为硬RAID卡通过服务器上配置的磁盘阵列卡
- 软RAID卡,通过软件的方式实现。
- 常用的有RAID5,0,10。
1.2 Linux中磁盘命名方式
-
Linux中磁盘的命名方式与磁盘的接口有关,规则如下:
- a,传统IDE接口硬盘:/dev/hd[a-z]
- b,SCISI接口硬盘:/dev/sd[a-z]
- c,虚拟化硬盘:/dev/vd[a-z]
在设备名称的定义规则如下, 其他的分区可以以此类推
系统的第一块SCSI接口的硬盘名称为/dev/sda
系统的第二块SCSI接口的硬盘名称为/dev/sdb
-
系统中分区由数字编号表示, 1-4留给主分区使用和扩展分区, 逻辑分区从5开始
- //第一块磁盘
/dev/sda - //第一块磁盘的第一个分区
/dev/sda1 - //第二块磁盘的第一个分区
/dev/sdb1
- //第一块磁盘
1.3 MBR与GPT
-
在使用新磁盘之前,你必须对其进行分区。MBR(Master Boot Record)和GPT(GUID Partition Table)是在磁盘上存储分区信息的两种不同方式。这些分区信息包含了分区从哪里开始的信息,这样操作系统才知道哪个扇区是属于哪个分区的,以及哪个分区是可以启动的。在磁盘上创建分区时,你必须在MBR和GPT之间做出选择
-
1,MBR是Master Boot Record的简称,也就是主引导记录,是位于磁盘最前边的一段引导(Loader)代码,主要用来引导操作系统的加载与启动
- 特点:
MBR支持最大2TB磁盘,它无法处理大于2TB容量的磁盘
只支持最多4个主分区。若想要更多分区,需要创建扩展分区,并在其中创建逻辑分区(逻辑分区可以有任意个)
- 特点:
-
2,GPT磁盘是指使用GUID分区表的磁盘,GUID磁盘分区表(GUID Partition Table,缩写:GPT)其含义为“全局唯一标识磁盘分区表”,是一个实体硬盘的分区表的结构布局的标准
-
特点:
GPT对磁盘大小没有限制
最多可以创建128个分区 -
注意:
MBR与GPT之间互相转换会导致数据丢失
-
-
二,磁盘容量检查
-
格式化的概念:以一种指定的文件格式去填充分区,组织内容的存放。
-
文件系统:组织文件存储方式的系统。
-
windows上常用的文件系统。:
-
NFS分布式文件系统:5个大磁盘块 blocks 。
- FAT32 10个小磁盘 blocks 单个文件不要超过4G
- FAT16
- FAT8
-
linux上的文件系统。
- Ext/2/3/4
- xfs文件系统
- Btreefs:是在RedHat7之后出现的文件系统。
- exfat:结合ext和FAT建议U盘使用。
-
blocks:磁盘块,块文件。
- 使用df命令查看磁盘容量,不加参数以k为单位:
- df -i //查看inode使用情况(记录使用情况)
- df -h //以G或者T或者M人性化方式显示
- df -T //查看文件类型
- 使用df命令查看磁盘容量,不加参数以k为单位:
-
//使用df命令查看磁盘,下面分别介绍每列什么含义
[[email protected] ~]# df -h
//设备名称 //磁盘大小 已用大小 可用大小 使用百分比 挂载点
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 12G 5.6G 68% / -
使用lsblk查看分区情况:
[[email protected] ~]# lsblk-
NVME是固态硬盘的标识,如果有设备名称是nvme开头的。
-
使用du命令查看目录或者文件的容量,不加参数以k为单位:
- du -sh opt //人性化输出显示大小
- -s:列出总和
- -h:人性化显示容量信息
- du -sh opt //人性化输出显示大小
-
-
三. 磁盘分区
- 分区之前, 需要先给虚拟机添加一块磁盘,以便于我们做后续的实验vmware虚拟机,请按如下进行操作:
- 1.找到对应虚拟主机点击右键, 选择设置
- 2.在硬件向导里面点击添加按钮, 在硬件类型中选中“硬盘”, 点击下一步
- 3.磁盘类型选择默认, 然后创建新虚拟磁盘, 调整大小(不要勾选立即分配空间)
- 4.最后点击下一步, 完成即可
- 分区工具有fdisk和gdisk,当硬盘小于2T的时候我们应该用fdisk来分区,而当硬盘大于2T的时候则应用gdisk来进行分区
1 fdisk分区(MBR分区格式)
-
//生产分区建议: 如无特殊需求, 直接使用整个磁盘即可, 无需分区
-
//学习分区建议:1P(主分区)+1E(扩展分区)(3L)(逻辑分区) 2P+1E(2L) 3P+1E(1L) (仅适用于练习)
-
命令工具:
- [[email protected] ~]# fdisk -l
- 进入fdisk工具
[[email protected] ~]# fdisk /dev/sdb
Command (m for help): m //输入m列出常用的命令
Command action
工具选项 | 选项描述 | 中文含义 |
---|---|---|
a | toggle a bootable flag | //切换分区启动标记 |
b | edit bsd disklabel | //编辑sdb磁盘标签 |
c | toggle the dos compatibility flag | //切换dos兼容模式 |
d | delete a partition | //删除分区 |
l | list known partition types | //显示分区类型 |
m | print this menu | //显示帮助菜单 |
n | add a new partition | //新建分区 |
o | create a new empty DOS partition table | //创建新的空白分区表 |
p | print the partition table | //显示分区表的信息 |
q | quit without saving changes | //不保存退出 |
s | create a new empty Sun disklabel | //创建新的Sun磁盘标签 |
t | change a partition’s system id | //修改分区ID,可以通过l查看id |
u | change display/entry units | //修改容量单位,磁柱或扇区 |
v | verify the partition table | //检验分区表 |
w | write table to disk and exit | //保存退出 |
x | extra functionality (experts only) | //拓展功能 |
-
//创建主分区(系统分区从1到5。分为主分区和扩展分区)
Command (m for help): n //新建分区
Partition type:
p primary (0 primary, 0 extended, 4 free) //主分区
e extended //扩展分区
Select (default p): p //选择主分区
Partition number (1-4, default 1): //默认回车
First sector (2048-2097151, default 2048): //默认扇区回车默认从2048开始
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +50M //分配50MB分配第一个分区的空间。 -
//创建扩展分区
Command (m for help): n //新建分区:为创建更多的逻辑分区做准备
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e //创建扩展分区
Partition number (2-4, default 2):
First sector (104448-2097151, default 104448):
Using default value 104448
Last sector, +sectors or +size{K,M,G} (104448-2097151, default 2097151): //默认划分所有空间给扩展分区 -
//创建逻辑分区(逻辑分区从5开始)
Command (m for help): n //新建分区
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l //创建逻辑分区
Adding logical partition 5
First sector (106496-2097151, default 106496):
Using default value 106496
Last sector, +sectors or +size{K,M,G} (106496-2097151, default 2097151): +100M //分配100MB空间 -
//查看分区创建
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sdb1 2048 104447 51200 83 Linux
/dev/sdb2 104448 2097151 996352 5 Extended
/dev/sdb5 106496 311295 102400 83 Linux
//保存分区
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks. -
//检查磁盘是否是MBR分区方式
[[email protected] ~]# fdisk -l /dev/sdb|grep type
Disk label type: dos -
//安装parted, 刷新内核立即生效,无需重启
[[email protected] ~]# yum -y install parted
[[email protected] ~]# partprobe /dev/sdb 可直接使用partprobe命令刷新内核。2 gdisk分区(GTS分区格式)
-
//安装gdisk工具
[[email protected] ~]# yum -y install gdisk -
进入分区工具
[[email protected] ~]# gdisk /dev/sdb
Command (? for help): n //创建新分区
Partition number (1-128, default 1):
First sector (34-2097118, default = 2048) or {±}size{KMGTP}:
Last sector (2048-2097118, default = 2097118) or {±}size{KMGTP}: +500M //分配500M大小
Command (? for help): p //打印查看
Number Start (sector) End (sector) Size Code Name
1 2048 1026047 500.0 MiB 8300 Linux filesystem
Command (? for help): w //保存分区
Do you want to proceed? (Y/N): y //确认
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully. -
//检查磁盘是否是gpt格式
[[email protected] /]# fdisk /dev/sdb -l|grep type
Disk label type: gpt -
//安装parted, 刷新内核立即生效,无需重启
[[email protected] ~]# yum -y install parted
[[email protected] ~]# partprobe /dev/sdb
四. 磁盘格式化
-
使用mkfs(make filesystem创建文件系统)命令格式化磁盘,创建文件系统
//mkfs常用的选项有
-b | //设定数据区块占用空间大小,目前支持1024、2048、4096 bytes每个块。 |
---|---|
-t | //用来指定什么类型的文件系统,可以是ext3,ext4, xfs |
-i | //设定inode的大小 |
-N | //设定inode数量,防止Inode数量不够导致磁盘不足 |
-L | //预设该分区的标签label |
-
//格式化整个sdb磁盘为ext4文件系统
[[email protected] ~]# mkfs.ext4 /dev/sdb1
并且可以查看到mkfs.支持的文件系统。 -
//也可以使用-t指定方式创建ext4文件系统
[[email protected] ~]# mkfs -t ext4 /dev/sdb1 -
//也可以格式化sdb1分区为xfs文件系统
[[email protected] ~]# mkfs.xfs /dev/sdb1
五. 磁盘挂载
-
在上面的内容中讲到了磁盘的分区和格式化, 那么格式化完了后, 如何使用, 这就涉及到了挂载这块磁盘
-
第一步,挂载分区前需要创建挂载点, 挂载点以目录形式出现
-
第二步,如果往挂载点目录写入数据, 实际上会写入到该分区
-
第三步,挂载点建议是空目录, 不是也不影响挂载分区的使用,但是会隐藏原有的文件
1 临时挂载磁盘
- 命令:mount挂载磁盘,实质为文件系统指定访问入口
-
mount -t //指定文件系统挂载分区,如ext3,ext4, xfs
-
mount -a //重新读取/etc/fstab配置文件的所有分区
-
mount -o //指定挂载参数
-
//fstab被损坏情况下,让只读文件系统可写(正常情况下不使用)可能在**密码时会用到
[[email protected] ~]#mount -o rw,remount / -
//挂载/dev/sdb1至db1目录
[[email protected] ~]# mkdir /db1
[[email protected] ~]# mount -t xfs /dev/sdb1 /db1
-
2 永久挂载磁盘
-
磁盘处理的方式:
- 同步:立马处理。立即写的时候会导致其他进程等待。
- 异步:不会等待同步执行,会延迟处理。收到写的指令可以进行缓存,稍后同一处理,但是如果中途断电会导致内存数据丢失。
-
//使用blkid命令获取各分区的UUID
[[email protected] ~]# blkid |grep “sdb1”
/dev/sdb1: UUID=“e271b5b2-b1ba-4b18-bde5-66e394fb02d9” TYPE=“xfs” -
//使用UUID挂载磁盘sdb1分区至于db1, 临时挂载
[[email protected] ~]# mount UUID=“e271b5b2-b1ba-4b18-bde5-66e394fb02d9” /db1 -
//也可以把下面这行写到/etc/fstab中,永久挂载, 开机自动挂载
[[email protected] ~]# tail -1 /etc/fstab
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0 -
/加载fstab配置文件, 同时检测语法是否有错误
[[email protected] ~]# mount –a
fstab配置文件介绍:
[[email protected] ~]# vim /etc/fstab -
//分区标识(UUID或设备名) 挂载点 文件类型 挂载参数 不检查 不备份
UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0 -
//挂载参数, 可写fstab配置文件, 也可以mount时使用-o参数指定
参数 | 参数意义 | 系统默认值 |
---|---|---|
async | 系统每隔一段时间把内存数据写入磁盘中, | |
sync | 时时同步内存和磁盘中数据; | |
suid,nosuid | 允许/不允许分区有suid属性 | suid |
rw,ro | 可以指定文件系统是只读(ro)或可写(rw) | rw |
exec,noexec | 允许/不允许可执行文件执行,不要挂载根分区 | exec |
user,nouser | 允许/不允许root外的其他用户挂载分区 | nouser |
auto,noauto | 开机自动挂载/不自动挂载 | auto |
default | 默认文件系统挂载设置 | rw, suid, dev, exec, auto, nouser, async |
- //加载所有配置
[[email protected] ~]# mount -a
3 卸载挂载磁盘
-
umount -lf //强制卸载挂载
-
//使用站点目录卸载
[[email protected] ~]# umount /db1 通过挂载点卸载也可通过UUID卸载。 -
//使用设备名卸载/dev/sdb1
[[email protected] ~]# umount /dev/sdb1 -
//umount不能卸载的情况
[[email protected] db1]# umount /db1
umount: /db1: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1) -
//如上情况解决办法有两种, 切换至其他目录 或使用’-l’选项强制卸载
[[email protected] db1]# umount -l /db1
六, 交换分区SWAP
-
交换分区SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用。
-
交换分区一般指定虚拟内存的大小为实际内存的1~1.5倍。如果实际内存超过8GB,可以直接划分16GB给虚拟内存即可,如果虚拟内存不够用的情况,须增加一个虚拟磁盘,由于不能给原有的磁盘重新分区,所以可以选择新建。是一个虚拟内存,速度相比较硬盘较快。
-
/dev/zero 吐零设备,一直吐内存。
-
/dev/null 黑洞设备,无底线
1 创建swapfile
- [email protected] ~]# dd if=/dev/zero of=/opt/newdisk bs=1M count=1024
- //if:指定源 一般写/dev/zero
- //of:指定目标
- //bs:定义块大小
- //count:数量
2 格式化swap分区
- [[email protected] opt]# mkswap -f /opt/newdisk
Setting up swapspace version 1, size = 1926952 KiB
no label, UUID=69d11824-8d72-4ea5-b383-ddbfd970db3d
3 检测当前swap分区情况
[[email protected] ~]# free -m
total used free shared buff/cache available
Mem: 976 133 325 6 517 646
Swap: 2047 0 2047 //原来分区是2G
4 开启新建的SWAP分区
- [[email protected] ~]# swapon /opt/newdisk 将新建的swap分区加载进swap空间内
[[email protected] ~]# free -m
total used free shared buff/cache available
Mem: 976 133 325 6 517 646
Swap: 3071 0 3071 //swap分区多出来1G
5 关闭新建的swap分区
-
[[email protected] ~]# swapoff /opt/newdisk 将关闭指定的swap分区。
[[email protected] ~]# free -m
total used free shared buff/cache available
Mem: 976 133 325 6 517 646
Swap: 2047 0 2047 //还原到没有增加虚拟磁盘-
/创建swap分区并且持久化使用
例子: 给系统新增加一个交换分区(swap)
考试题目:一般是要求新建一个分区,并且把分区作为swap分区使用
查看内存和交换分区的使用情况
# free -m
total used free shared buffers cached
Mem: 1841 613 1227 16 0 258
-/+ buffers/cache: 354 1486
Swap: 0 0 0 <— 没有交换分区 -
swapon -s 也能用该命令查看,只是默认也是没有交换分区所有没有输出
-
fdisk -l /dev/sdb
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
/dev/sdb2 2099200 6293503 2097152 83 Linux <—准备把该分区作为交换分区 -
分区步骤
-
1、新建一个分区,并且把分区类型更改为82
新分区我们在上面的练习已经完成了,所以本例子不用分区,而是需要修改该分区的类型
执行命令:fdisk /dev/sdb
命令(输入 m 获取帮助):l 列出所有支持的分区类型对应的id
命令(输入 m 获取帮助):t 修改分区id(默认会选中最后的一个分区ID)
分区号 (1-5,默认 5):2 修改第2个分区
Hex 代码(输入 L 列出所有代码):82 修改成id为82
已将分区“Linux”的类型更改为“Linux swap / Solaris”
命令(输入 m 获取帮助):p
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
/dev/sdb2 2099200 6293503 2097152 82 Linux swap / Solaris <—修改成功
命令(输入 m 获取帮助):w
强烈建议: 对分区做了修改后都刷新一下
刷新命令:partprobe /dev/sdb 或者直接partprobe也可 -
2、把sdb2格式化为交换分区
输入命令:mkswap /dev/sdb2
正在设置交换空间版本 1,大小 = 2097148 KiB
无标签,UUID=ba08eb90-2003-44e6-9769-9a9351aebb05 -
3、启动交换分区
输入命令: swapon /dev/sdb2 或者 swanon -a 启动所有交换分区- 查看命令:swapon -s
文件名 类型 大小 已用 权限
/dev/sdb2 partition 2097148 0 -1
- 查看命令:swapon -s
-
4、持久化保存交换分区的使用
- 命令:blkid /dev/sdb2
/dev/sdb2: UUID=“ba08eb90-2003-44e6-9769-9a9351aebb05” TYPE=“swap” - 编辑fstab文件: vim /etc/fstab
- 命令:blkid /dev/sdb2
-
-
七. 生产磁盘故障案例
-
1,inode节点
-
Inode被占满,导致磁盘有可用的剩余空间也无法继续使用
[[email protected] ~]# dd if=/dev/zero of=/opt/newdisk bs=1k count=1024
[[email protected] ~]# mkfs.ext4 -i 1024 /opt/newdisk
[[email protected] ~]# mkdir /data
[[email protected] ~]# mount -t ext4 -o loop /opt/newdisk /data/ -
//inode被占满
[[email protected] ~]# touch {1…20000}
touch: cannot touch 19997: No space left on device
touch: cannot touch 19998’: No space left on device
touch: cannot touch 19999’: No space left on device
touch: cannot touch `20000’: No space left on device -
//inode被占满,剩余block也是无法继续使用
[[email protected] ~]# df -i|grep data
/opt/newdisk 1024 1024 0 100% /data -
[[email protected] ~]# df -h|grep data
/opt/newdisk 891K 34K 806K 5% /data
1,Block空间即将被占满, 但删除大文件也没有释放空间
假设现在线上正在运行Nginx服务, Nginx产生的日志已经达到了20个G, 磁盘眼看就看沾满了, 请问不重启Nginx的方式如何处理
2, //是会删除文件, 但Nginx持续占用着文件, 所以空间并不会被释放
rm -f access.log
就算文件删除了,但是因为进程在占用,所以相对设备的磁盘空间来将并未释放空间。
- //正确做法如下, 清空该文件即可释放文件内容
>access.log 覆盖掉文件的内容,释放空间。
覆盖文件,或者通过echo “ ”>/test_file inode节点,清空文件,导致磁盘有可用的剩余空间也无法继续使用。然后清理日志及不重要的文件,保证服务不中断的情况下进行磁盘空间整理。