10.Linux磁盘管理
10.Linux磁盘管理
1.磁盘概述
1.1 什么是磁盘
大多数人对硬盘都不陌生,一块小小的硬盘里,就可以存
储海量的照片音乐和电影,尤其是我们喜爱的各类动作
片。但如此小的空间,是如何储存那么多信息的呢?
每个硬盘中心都是一摞高速运转的圆盘,在圆盘上附着的
一圈金属颗粒,每个金属颗粒都有自己的磁化程度,主要
用于储存0和1。
在数据写入时,硬盘的磁头开始通电,周围会产生磁场,
数据在磁场的作用下转变成电流,使磁盘的金属颗粒磁
化,从而将信息记录在圆盘上。
由海量颗粒组成的信息,就是我们存在硬盘里的数据
1.2磁盘物理结构
1.2.1 什么是盘片
硬盘一般有一个或多个盘片,每个盘片可以有两面,即第
一个盘片的正面为0面,反面为1面然后依次类推。
1.2.2什么是磁道
每个盘片的盘面在出厂的时候被划分出了多个同心圆环,
数据就存储在这样的同心圆环上面,我们将这样的圆环称
为磁道 Track ,每个盘面可以划分多个磁道。但肉业不
可见.
1.2.3 什么是扇区
在硬盘出厂时会对磁盘进行一次低格,其实就是再每个磁
道划分为若干个弧段,每个弧段就是一个扇区 Sector 。
扇区是硬盘上存储的物理单位,现在每个扇区可存储512
字节数据已经成了业界的约定。
1.2.4 什么是柱面
柱面实际上就是我们抽象出来的一个逻辑概念,简单来说
就是处于同一个垂直区域的磁道称为 柱面 ,即各盘面上
面相同位置磁道的集合。这样数据如果存储到相同半径磁
道上的同一扇区,这样可以实现并行读取,主要是减少磁
头寻道时间
1.2.5 什么是磁头
读取磁盘磁道上面金属块,主要负责读或写入数据。
1.3 磁盘的接口类型
1.3.1 IDE-SCSI
- IDE,Scsi (已经被淘汰)
1.3.2 SATA-SAS
- SATA III 与 SAS
接口类型 | 接口速率 | 盘片转速 | 写入速度 | 应用场景 |
---|---|---|---|---|
SATA III | 6Gbps/s | 7.5k/s | 300MB/s | 个人 |
SAS | 8Gbps/s~12Gbps/s | 15k/s | 300~600MB/s | 企业 |
1.3.3 MSATA-M2
-
MSATA 与 M.2
-
MSATA 接口是专门为超级笔记本而设计的,m.2接口
参考文档 -
m.2 接口是 inter 推出的一种替代 MSATA 新的接口
规范; -
m.2 接口相比 MSATA 接口有两方面的优势
- 1.速度优势
- 2.体积优势
M.2接口类型 | 支持接口类型 | 兼容性 | 读取速度 | 写入速度 |
---|---|---|---|---|
socket2 | SATA,PCI-E X2 | 几乎主板都支持 | 700MB/s | 550MB/s |
socket3 | PCI-E x4 Nvme | 需要检查主板是否支持 | 4Gb/s |
2.磁盘命名
2.1 物理服务器
- 真是物理服务器
设备名称 | 分区信息 | 设备类型 |
---|---|---|
/dev/sda | /dev/sda1 | 第一块物理磁盘第一分区 |
/dev/sdb | /dev/sdb2 | 第二块物理磁盘第二个分区 |
/dev/sdd | /dev/sdd4 | 第四块物理磁盘的第四个分区 |
2.2 虚拟服务器
- 阿里云主机或者KVM虚拟化主机的磁盘命名格式
设备名称 | 分区信息 | 设备类型 |
---|---|---|
/dev/vda | /dev/vda1 | 第一块虚拟磁盘的第一个分区 |
/dev/vdb | /dev/vdb2 | 第二块虚拟磁盘的第二个分区 |
/dev/vdc | /dev/vdc3 | 第三块虚拟磁盘的第三个分区 |
3. 分区管理
3.1 为什么要分区
-
分区是为了便于数据分门别类的存储;分区有 MBR、
GPT 两种方式; -
分区表:(记录分区的编号、每个编号从哪个扇区开
始,到哪个扇区结束)- MBR :主引导记录,用来找到磁盘上的操作系统,
并且引导启动(0磁道,1扇区,512字节)- 446字节: boot loader
- 64字节:存储分区表,每16字节表示一个分区,
最多四个“主分区”(主分区+扩展分区) - 2字节:结束位;
- GPT :新型的分区表 GPT 支持分配128个主分区。
- MBR 与 GPT 的区别,传送门 http://www.udaxia.com/wtjd/6117.html
- 注意 MBR 与 GPT 之间不能互转,会导致数丢失。
- MBR :主引导记录,用来找到磁盘上的操作系统,
3.2 fdisk分区工具
- fdisk 仅支持分配小于 2TB 的磁盘(MBR)
- 查看当前设备 fdisk -l
- 对设备进行分区 fdisk /dev/sdb
- 分区命令
- m:显示帮助
- n:创建新分区
- d:删除分区
- p:查看分区
- w:保存分区
- q:退出
- 分区案例:
- 案例1:分配4个分区 (4P)
- 案例2:分配5个分区 (1P+1E+4L)
- 案例3:分配6个分区 (3P+1E+3L)
3.3 gdisk分区工具
- gdisk 支持分配大于 2TB 的磁盘
- 查看当前设备 gdisk [-l] device
- 对设备进行分区 gdisk /dev/sdb
- 分区命令
- ?:显示帮助
- n:创建新分区
- p:打印分区
- w:保存分区
- q:退出
- 分区案例:
- 案例1:分配4个主分区(4P)
- 案例2:分配5个主分区(5P)
- 案例3:分配6个主分区(6P)
3.4 mkfs格式化系统
- mkfs 命令用于格式化硬盘,类似于将房子装修成3室
一厅,还是2室一厅;- -b :设定数据区块占用空间大小,目前支持 1024、
2048、4096 bytes 每个块; - -t :用来指定什么类型的文件系统,可以是 ext4、
xfs ;
- -b :设定数据区块占用空间大小,目前支持 1024、
- 提示:
- 1.分区工具,可以针对整块磁盘,或者单个分区进
行格式化操作 - 2.一般情况下建议,不要直接格式化使用整磁盘,
要分区后再格式化,头部有预留空间;
- 1.分区工具,可以针对整块磁盘,或者单个分区进
1.使用 mkfs 命令,格式化整个硬盘
# ex2 ext3 ext4
[root@node~]# mkfs.ext4 /dev/sdb
2.使用 mkfs 命令,格式化磁盘的某个分区
[root@node ~]# mkfs.xfs /dev/sdb1
3.使用 mkfs 命令指定一个数据块的大小 4096字节=4k
[root@node ~]# mkfs.xfs -b size=1024
/dev/sdb2
4.挂载管理
- 当需要使用磁盘空间的时,需要准备一个目录作为挂
载点,然后使用 mount 命令与该设备进行关联;
4.1 临时挂载mount
- 通过mount进行挂载,但重启将会失效。我们称为临
时生效。- -t :指定文件系统挂载分区;
- -a :检查并且挂载 /etc/fstab 配置文件中未挂载
的设备; - -o :指定挂载参数, ro、rw ;
1.挂载磁盘设备;
[root@node ~]# mkdir /db1
[root@node ~]# mount -t xfs /dev/sdb1 /db1
2.挂载磁盘设备,设置参数为仅可读;
[root@node ~]# mkdir /db2
[root@node ~]# mount -t xfs -o ro /dev/sdb2 /db2
[root@node ~]# touch /db2/new_file
touch: cannot touch '/db2/new_file': Read-
only file system
4.2 临时卸载umount
- 如果不想使用可以使用 umount
[device|directory] 进行临时卸载。- -l :强制卸载;
1.卸载入口目录示例;
[root@node ~]# umount /db1
2.卸载设备方式示例;
[root@node ~]# umount /dev/sdb1
3.如碰到无法正常卸载情况处理;
[root@node 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)
#如上情况解决办法有两种,1.切换至其他目录 2.强制卸载
[root@node db1]# umount -l /db1
4.3永久挂载fstab
- 如果需要实现永久挂载,则需要将挂载相关信息写入
/etc/fstab 配置文件中实现。
4.3.1 永久挂载配置书写
-
配置文件规范: 设备名称|挂载的入口目录|文件系统类
型|挂载参数|是否备份|是否检查- 1.获取设备名称,或者获取设备 UUID
- 2.手动临时挂载测试;
- 3.写入 /etc/fstab 配置文件;
- 4.使用 mount -a 检查是否存在错误;
1.获取设备名称,或设备的 UUID
[root@node ~]# blkid |grep "sdb1" /dev/sdb1: UUID="e271b5b2-b1ba-4b18-bde5- 66e394fb02d9" TYPE="xfs"
2.手动挂载测试
[root@node ~]# mount UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" /db1
3.写入 /etc/fstab 测试
# 手动编写 [root@node ~]# tail -1 /etc/fstab UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0 # 自动实现 [root@node ~]# blkid |grep /dev/sda1 | awk -F '[: ]+' '{print $2}' | \ sed -r 's#(.*)#\1 /db1 xfs defaults 0 0#g' >> /etc/fstab
4.加载 /etc/fstab 配置文件, 同时检测是否存在语法错误
[root@node ~]# mount –a
4.3.2 配置文件/etc/fstab
- /etc/fstab 配置文件格式
- 第一列:指定需要挂载的设备
- 设备名称: /dev/sdb1
- 设备ID: UUID
- 第二列:挂载的入口目录
- 第三列:文件系统类型
- xfs 类型
- ext4 类型
- 第四列:挂载参数
- async/sync :使用同步或异步方式存储数据;
默认 async - user/nouser :是否允许普通用户使用mount
命令挂载。默认 nouser - exec/noexe :是否允许可执行文件执行。默认
exec - suid/nosuid :是否允许存在 suid 属性的文
件。默认 suid - auto/noauto :执行 mount -a 命令时,此文件
系统是否被主动挂载。默认 auto - rw/ro :是否以只读或者读写模式进行挂载。默
认 rw - defaults :具有
rw,suid,dev,exec,auto,nouser,async 等参数; - 第五列:是否要备份磁盘
- 0:不做备份
- 1:每天进行备份操作
- 2:不定日期的进行备份操作
- 第六列: 开机是否检验扇区
- 0:不要检验磁盘是否有坏道
- 1:检验
- 2:校验 (当1级别检验完成之后进行2级别检验)
- async/sync :使用同步或异步方式存储数据;
- 第一列:指定需要挂载的设备
5. 虚拟磁盘SWAP
5.1 什么是SWAP
- Swap 分区在系统的物理内存不够时,将硬盘中的一部
分空间供当前运行的程序使用。
5.2 为什么需要SWAP
- 当物理内存不够时会随机 kill 占用内存的进程,从
而产生 oom ,临时使用 swap 可以解决。 - 案例:模拟服务器 OOM ;
[root@node ~]# dd if=/dev/zero of=/dev/null
bs=800M
#故障日志
[root@node ~]# tail -f /var/log/messages
Out of memory: Kill process 2227 (dd) score
778 or sacrifice child
Killed process 2227 (dd) total-vm:906724kB,
anon-rss:798820kB, file-rss:0kB
5.3 SWAP基本应用
1.创建分区,并格式化为 swap 分区。
[root@node ~]# fdisk /dev/sdb
# 格式化为swap
[root@node ~]# mkswap /dev/sdb1
2.查看当前 swap 分区大小
[root@node ~]# free -m
total used free
shared buff/cache available
Mem: 1980 1475 80
10 424 242
Swap: 2047 4 2043
5.3.1 扩展swap分区
- 扩展 swap 分区,使用 swapon 命令
- swapon device :将某个磁盘大小添加到 swap 分
区中 - swapon -a :添加所有 swap 分区
- swapon device :将某个磁盘大小添加到 swap 分
[root@node ~]# swapon /dev/sdb1
[root@node ~]# free -m
total used free
shared buff/cache available
Mem: 1980 1475 80
10 424 242
Swap: 3047 4 2043
5.3.2 缩小swap分区
- 缩小 swap 分区,使用 swapoff 命令
- swapoff device :关闭某个磁盘的 swap 分区
- swapoff -a :关闭所有 swap 分区
[root@node ~]# swapoff /dev/sdb1
[root@node ~]# free -m
total used free
shared buff/cache available
Mem: 1980 1475 80
10 424 242
Swap: 2047 4 2043
6.文件系统
6.1 文件系统的作用
- 用户无法直接与硬件进行交互,那如果需要申请 100G
磁盘空间,怎么办? - 为了简化磁盘使用的过程,操作系统提供了一个辅助
系统 FS (文件系统)
6.2 文件系统的类型
- Windows : FAT32、NTFS
- Linux : EXT2、EXT3、EXT4、XFS、VFAT、NTFS-3g
6.3 文件系统结构
- 磁盘被划分为两大存储区域,一类是存储元数据
inode ,一类是存储真实数据 data block- inode 划分了很多 inode block ,每个 block 块为
128B - data 划分了很多 data block ,每个 block 块为 4k
- inode 划分了很多 inode block ,每个 block 块为
- 如下图所示:磁盘在存储文件时,至少占用一个
inode 、与一个 block
-
目前有个1T的磁盘设备,那么它被格式化后会被划分
几千万个 4k 的 block 块,那如何从这么多 block 块中
定位到哪个是可用的,哪个是不可用的呢; -
如果进行全盘扫描,一次要扫描几千万个 block 块,
需要花费很长的时间,有什么办法可以解决?- inode bitmap : inde 位图
- block bitmap : block 位图
-
文件删除原理
- 首先删除目录下的文件名称,然后将 inode、
block 的 bitmap 状态修改为可用状态,但文件并没
有真正的被删除,还有恢复的可能性,而一旦有新
的数据写入,将其覆盖,数据才算真正的删除
- 首先删除目录下的文件名称,然后将 inode、
-
文件移动原理
- 仅仅将文件名称从一个目录移动到另一个目录下
面,并不会修改其 inode 和 block ;
- 仅仅将文件名称从一个目录移动到另一个目录下
6.4 文件系统故障修复
-
在 Linux 系统中,为了增加系统性能,通常系统会将
一些数据先写入内存中,然后在刷新至磁盘中; -
万一公司服务器突然断电或者其他未知原因,再次启
动后,会造成文件系统错误;1.添加磁盘,给磁盘分配 1G 空间;
[root@node ~]# fdisk /dev/sdc # 分配1G分区 [root@node ~]# mkfs.xfs /dev/sdc1 [root@node ~]# mount /dev/sdc1 /mnt [root@node ~]# echo "Hello" > /mnt/new.txt
2.使用 dd 模拟磁盘断电损坏,然后取消挂载,会发现无
法正常重新挂载;[root@node ~]# dd if=/dev/zero of=/dev/sdc bs=300M count=1 [root@node ~]# umount /mnt [root@node ~]# mount /dev/sdb1 /mnt #无法 挂载
3.使用 xfs_repair 修复文件系统;
[root@node ~]# xfs_repair /dev/sdc1
4.如出现修复失败,可采用强制修复,但可能会造成部分
数据丢失;[root@oldxu ~]# xfs_repair -L /dev/sdc1
7. 磁盘满了.Inode满了
磁盘满了;会提示错误;无法写入数据;
磁盘没有满,但还是提示磁盘空间不足---> Inode满了造
成的问题:
一个文件,至少占用1个inode、1个block块;
1TB;
存储大量的小文件; 500G
# 创建一个虚拟设备文件,大约100M,格式化为xfs
# dd if=/dev/zero of=/opt/big bs=100M
count=1
# mkfs.xfs /opt/big
# 创建目录,挂载
mkdir /new
mount /opt/big /new/
# 查看目录的空间、Inode的空间
df -h |grep new
df -i |grep new
# 进入目录。,创建10w个文件;
cd /new/
touch {1..100000}
#########################错误
# 在查看磁盘空间,和Inode 的空间;
df -i |grep new
df -h |grep new
本文来自博客园,作者:GaoBeier,转载请注明原文链接:https://www.cnblogs.com/gao0722/p/15086810.html