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