磁盘概述
什么是磁盘
大多数人对硬盘都不陌生,一块小小的硬盘里,就可以存储海量的照片音乐和电影,尤其是我们喜爱的各类动作片。但如此小的空间,是如何储存那么多信息的呢?
每个硬盘中心都是一摞高速运转的圆盘,在圆盘上附着的一圈金属颗粒,每个金属颗粒都有自己的磁化程度,主要用于储存0和1
在数据写入时,硬盘的磁头开始通电,周围会产生磁场,数据在磁场的作用下转变成电流,使磁盘的金属颗粒磁化,从而将信息记录在圆盘上
由海量颗粒组成的信息,就是我们存在硬盘里的数据。
磁盘物理结构
什么是盘片
硬盘一般有一个或多个盘片,每个盘片可以有两面,即第一个盘片的正面为0面,反面为1面然后依次类推
什么是磁道
每个盘片的盘面在出厂的时候被划分出了多个同心圆环,数据就存储在这样的同心圆环上面,我们将这样的圆环称为磁道track
,每个盘面可以划分多个磁道,但肉眼不可见
什么是扇区
在硬盘出厂时会对磁盘进行一次低格,其实就是在每个磁道划分为若干个弧段,每个弧段就是一个扇区sector
。扇区是硬盘上存储的物理单位,现在每个扇区可存储512字节数据已经成了业界的约定
什么是柱面
柱面实际就是我们抽象出来的一个逻辑概念,简单来说就是处于同一个垂直区域的磁道称为柱面,即各盘面上面相同位置磁道的集合。这样数据如果存储到相同半径磁道上的同一扇区,这样可以实现并行读取,主要是减少磁头寻道时间。
什么是磁头
读取磁盘磁道上面金属块,主要负责读或写入数据
磁盘的接口类型
IDE-SCSI
IDE,scsi
(已经被淘汰)
sata-sas
sata III
与sas
接口类型 | 接口速率 | 盘片转速 | 写入速度 | 应用场景 |
---|---|---|---|---|
SATA III | 6Gbps/s | 7.5k/s | 300MB/s | 个人 |
SAS | 8Gbps/s~12Gbps/s | 15k/s | 300MB/s~600MB/s | 企业 |
MSATA-M2
= MSATA
与M.2
MSATA
接口是专门为超级笔记本而设计的M.2
是inter
推出的一种替代MSATA
新的接口规范M.2
接口相比MSATA
接口有两方面的优势- 速度优势
- 体积优势
M.2接口类型 | 支持接口类型 | 兼容性 | 读取速度 | 写入速度 |
---|---|---|---|---|
socket2 | sata、pci-e x2 | 几乎主板都支持 | 700MB/s | 550MB/s |
socket3 | pci-e x4 | 需要检查主板是否支持 | 4GB/s |
磁盘命名
物理服务器
- 真实物理服务器
设备名称 | 分区信息 | 设备类型 |
---|---|---|
/dev/sda | /dev/sda1 | 第一块物理磁盘的第一个分区 |
/dev/sdb | /dev/sdb2 | 第二块物理磁盘的第二个分区 |
/dev/sdd | /dev/sdd4 | 第四块物理磁盘的第四个分区 |
- 虚拟服务器
设备名称 | 分区信息 | 设备类型 |
---|---|---|
/dev/vda | /dev/vda1 | 第一块虚拟磁盘的第一个分区 |
/dev/vdb | /dev/vdb2 | 第二块虚拟磁盘的第二个分区 |
/dev/vdc | /dev/vdc3 | 第四块虚拟磁盘的第三个分区 |
分区管理
为什么要分区
- 分区是为了便于数据分门别类的存储,分区有
MBR、GPT
两种方式 - 分区表:(记录分区的编号、每个编号从哪个扇区开始,到哪个扇区结束)
MBR
:主引导记录,用来找到磁盘上的操作系统,并且引导启动(0磁道,1扇区,512字节)
1.446字节:boot loader
2.64字节:存储分区表,每16字节表示一个分区,最多四个“主分区”(主分区+扩展分区)
3.2字节:结束位GPT
:新型的分区表,GPT
支持分配128个主分区
注意:MBR
与GPT
之间不能互转,会导致数据丢失
fdisk分区工具
fdisk # manipulate disk partition table
-
fdisk
仅支持分配小于2TB
的磁盘(MBR
)- 查看当前设备
fdisk -l List the partition tables for the specified devices and then exit
- 对设备进行分区
fdisk /dev/sdb
- 查看当前设备
-
分区命令
- m:显示帮助
- n:创建新分区
- d:删除分区
- p:查看分区
- w:保存分区
- q:退出
-
分区案例:
- 案例1:分配4个分区(4P)
- 案例2:分配5个分区(1P+1E+4L)
- 案例3:分配6个分区(3P+1E+3L)
gdisk分区工具
gdisk Interactive GUID partition table (GPT) manipulator
gdisk
支持分配大于2TB
的磁盘- 查看当前设备
gdisk -l device
- 对设备进行分区
gdisk /dev/sdb
- 查看当前设备
- 分区命令
- ?:显示帮助
- n:创建新分区
- p:打印分区
- w:保存分区
- q:退出
- 分区案例:
- 案例1:分配4个分区(4P)
- 案例2:分配5个分区(5P)
- 案例3:分配6个分区(6P)
mkfs格式化系统
mkfs # build a Linux filesystem
mkfs
命令用于格式化硬盘,类似于将房子装修成3室一厅,还是2室一厅-b
:设定数据区块占用空间大小,目前支持1024、2048、4096 bytes
每个块-t,--type(Specify the type of filesystem to be built)
用来指定什么类型的文件系统,可以是ext4、xfs
- 提示:
- 分区工具,可以针对整块磁盘,或者单个分区进行格式化操作
- 一般情况下建议,不要直接格式化使用整个磁盘,要分区后再格式化,头部有预留空间;但是又建议对整个磁盘只划分一个分区。(建议对整个磁盘格式化直接使用)
blockdev --getbsz /dev/vda
查看块大小
1.使用mkfs
命令,格式化整个硬盘
mkfs.ext4 /dev/sdb
2.使用mkfs
命令,格式化磁盘的某个分区
mkfs.xfs /dev/sdb1
3.使用mkfs
命令指定一个数据块的大小
mkfs.xfs -b size=1024 /dev/sdb2
挂载管理
- 当需要使用磁盘空间时,需要准备一个目录作为挂载点,然后使用
mount
命令与该设备进行关联
临时挂载mount
mount # mount a filesystem
- 通过
mount
进行挂载,但重启将会失效。我们称为临时生效-t,--types(is used to indicate the filesystem type)
-a,--all(Mount all filesystems (of the given types) mentioned in fstab)
-o,--options(ro、rw)
1.挂载磁盘设备
mkdir /db1
mount -t xfs /dev/sdb1 /db1
2.挂载磁盘设备,设置参数为仅可读
mkdir /db2
mount -t xfs -o ro /dev/sdb2 /db2
touch /db2/new_file
touch:cannot touch '/db2/new_file':Read-only file system
临时卸载umount
- 如果不想使用,可以使用
umount [device|directory]
进行临时卸载-l
:强制卸载
1.卸载入口目录示例
umount /db1
2.卸载设备方式示例
umount /dev/sdb1
3.如碰到无法正常卸载情况处理
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))
# 如上情况解决办法有2种,1.切换至其他目录 2.强制卸载
umount -l /db1
永久挂载fstab
- 如果需要实现永久挂载,则需要将挂载相关信息写入
/etc/fstab
配置文件中实现
永久挂载配置
- 配置文件规范:设备名称|挂载的入口目录|文件系统类型|挂载参数|是否备份|是否检查
- 1.获取设备名称,或者获取设备
UUID
,blkid # locate/print block device attributes
- 2.手动临时挂载测试
- 3.写入
/etc/fstab
配置文件 - 4.使用
mount -a
检查是否存在错误
- 1.获取设备名称,或者获取设备
1.获取设备名称,或设备的UUID
blkid | grep "sdb1"
/dev/sdb1: UUID="2de1527e-09c2-4cb7-8d79-0d974bd6d0fb" TYPE="xfs"
2.手动挂载测试
mount UUID="2de1527e-09c2-4cb7-8d79-0d974bd6d0fb" /db1
3.写入/etc/fstab
测试
# 手动编写
vim /etc/fstab
UUID=2de1527e-09c2-4cb7-8d79-0d974bd6d0fb /db1 xfs defaults 0 0
# 自动实现
blkid | grep /dev/vda1 | awk -F '"' '{print $2}' | sed -r 's#(.*)#\1 /db1 xfs defaults 0 0#g' >> /etc/fstab
blkid | grep /dev/vda1 | awk -F '"' '{print $2}' | sed -r 's#$# /db1 xfs defaults 0 0#' | sed -r 's/^/UUID=/' >> /etc/fstab
4.加载/etc/fstab
配置文件,同时检测是否存在语法错误
mount -a
- 云平台扩容虚机硬盘的容量后,执行
xfs_growfs /dev/sda
刷新xfs
文件系统容量
配置文件/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
default
:具有rw,suid,dev,exec,auto,nouser,async
等参数 - 第五列:是否要备份数据。0:不做备份,1:每天进行备份操作,2:不定日期的进行备份操作
- 第六列:开机是否检验扇区
0:不要检验磁盘死否有坏道
1:检验
2:校验(当1级别检验完成之后进行2级别检验)
- 第一列:指定需要挂载的设备。设备名称:
虚拟磁盘SWAP
什么是SWAP
swap
分区在系统的物理内存不够时,将硬盘中的一部分空间供当前运行的程序使用
为什么需要SWAP
- 当物理内存不够时会随机
kill
占用内存的进程,从而产生oom
临时使用swap
可以解决
SWAP基本应用
1.创建分区,并格式化为swap
分区
mkswap # set up a Linux swap area
fdisk /dev/sdb
# 格式化为swap
mkswap /dev/sdb
2.查看当前swap
分区大小
free # Display amount of free and used memory in the system
free -m # Display the amount of memory in megabytes.
total used free shared buff/cache available
Mem: 7963 641 5628 93 1693 6930
Swap: 4095 0 4095
扩展swap分区
swapon # enable/disable devices and files for paging and swapping
- 扩展
swap
分区,使用swapon
命令swapon device
:将某个磁盘大小添加到swap
分区中swapon -a,--all
:添加所有swap
分区
mkswap /dev/sdb1
swapon /dev/sdb1
free -m
缩小swap分区
- 缩小
swap
分区,使用swapoff
命令swapoff device
:关闭某个磁盘的swap
分区swapoff -a,--all
:关闭所有swap
分区
swapoff /dev/sdb1
free -m
文件系统
文件系统的作用
- 用户无法直接与硬件进行交互,那如果需要申请
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:inode
位图block bitmap:block
位图
- 文件删除原理
- 首先删除目录下的文件名称,然后将
inode、block
的bitmap
状态修改为可用状态,但文件并没有真正的被删除,还有恢复的可能性,而一旦有新的数据写入,将其覆盖,数据才算真正的删除
- 首先删除目录下的文件名称,然后将
- 文件移动原理
- 仅仅将文件名称从一个目录移动到另一个目录下面,并不会修改其
inode
和block
- 仅仅将文件名称从一个目录移动到另一个目录下面,并不会修改其
文件系统故障修复
- 在
linux
系统中,为了增加系统性能,通常系统会将一些数据先写入内存中,然后再刷新至磁盘中 - 万一公司服务器突然断电或者其他未知原因,再次启动后,会造成文件系统错误
1.使用xfs_repair
修复文件系统
xfs_repair /dev/sdc1
2.如出现修复失败,可采用强制修复,但可能会造成部分数据丢失
xfs_repair -L /dev/sdc1
逻辑卷lvm
为何要用lvm
- 当刚开始安装
linux
系统时,往往不能确定每个分区使用的空间大小,只能凭经验分配不科学- 如果分区设置的过大,就浪费了磁盘空间
- 如果分区设置的过小,就会导致空间不够
- 如何希望分配的空间过大或过小,都能动态调整,则需要使用
lvm
逻辑卷
什么是lvm
LVM
是logical volume manager
逻辑卷管理的简写,它是对磁盘分区管理的一种机制LVM
优点:LVM
可以创建和管理逻辑卷,而不是直接使用物理硬盘LVM
可以弹性的管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据LVM
可以随意将新的硬盘添加到LVM
,以直接扩展已经存在的逻辑卷
LVM
缺点:LVM
如果有一个磁盘损坏,整个LVM
都坏了,LVM
只有动态扩展作用- 解决办法:用
RAID+LVM
,既有冗余又有动态扩展
lvm相关术语
- 物理卷(PV):将常规的磁盘通过
pvcreate
命令对其进行初始化,形成了物理卷。(面粉) - 卷组(VG):把多个物理卷组成一个逻辑的整体,这样卷组的大小就是多个盘之和。(大面团)
- 逻辑卷(LV):从卷组划分需要的空间大小出来,用户仅需要对其格式化然后即可挂载使用。(切成馒头)
- 基本单元(PE):分配的逻辑大小的最小单元,默认4MB,假设分配100MB的空间,则需要创建25个
PE
lvm配置实践
环境与思路
- 1.准备三块物理磁盘,建议在虚拟机关闭状态添加,以便更好的实验
- 2.创建物理卷,将普通磁盘转换为物理卷
- 3.创建卷组,将物理卷加入到卷组中
- 4.在卷组中划分逻辑卷,然后挂载使用
创建物理卷
1.将磁盘转换为物理卷,并加入pv
pvcreate # initialize a disk or partition for use by LVM
pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
2.检测pv
创建情况
pvs # report information about physical volumes
pvs
PV VG Fmt Attr PSize PFree
/dev/vda2 centos lvm2 a-- <39.00g 0
创建卷组
1.创建名为datavg
的卷组,然后将物理卷加入进卷组
vgcreate datavg /dev/sdb
Volume group "datavg" successfully created
2.检查卷组(发现存在一个PV卷)
vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <39.00g 0
创建逻辑卷
1.分配datavg
的逻辑卷,-n
指定逻辑卷名称,-L
指定逻辑卷大小
lvcreate # create a logical volume in an existing volume group
lvcreate -L 100M -n lv1 datavg
Logic volume "lv1" created.
2.检查逻辑卷lvs/lvscan
lvscan
ACTIVE '/dev/centos/swap' [4.00 GiB] inherit
ACTIVE '/dev/centos/root' [<35.00 GiB] inherit
挂载使用
1.格式化逻辑卷
mkfs.xfs /dev/datavg/lv1
2.创建目录并挂载
df # report file system disk space usage
-h,--human-readable(print sizes in human readable format)
-i,--inodes(list inode information instead of block usage)
mkdir /lv1
mount /dev/datavg/lv1 /lv1/
df -h
lvm卷组管理
扩大卷组
1.准备新的磁盘转换为pv
,然后检查卷组当前的大小
pvcreate /dev/sdc
vgs
2.使用vgextend
扩展卷组
vgextend datavg /dev/sdc
Volume group "datavg" successfully exttended
3.再次检查,发现卷组已经扩大。vgs
缩减卷组
- 假设想移除
/dev/sdb
磁盘,建议先将sdb
磁盘数据先迁移到sdc
磁盘,然后再移除 - 注意:同一卷组的磁盘才可以进行在线迁移
1.检查当前卷组vg
中pv
使用情况。pvs
2.pvmove # move physical extents
在线数据迁移,将sdb
的数据迁移至sdc
pvmove /dev/sdb
/dev/sdb:Moved:100.00%
3.检查是否将sdb
数据迁移至sdc
。pvs
4.从卷组中移除sdb
磁盘
vgreduce datavg /dev/sdb
Removed "/dev/sdb" from volume group "datavg"
lvm逻辑卷管理
扩展逻辑卷组
- 扩展逻辑卷组:取决于
vg
卷中是否还有剩余的容量 - 注意扩展逻辑卷不能超过卷组
vg
的总大小
1.扩展lv
逻辑卷,增加800M
分配给逻辑卷
lvextend -L +800M /dev/datavg/lv1
# 也可以选择分配卷组中多少百分比给逻辑卷
lvextend -l +50%FREE /dev/datavg/lv1
2.扩展逻辑卷后需要更新fs
文件系统
xfs_growfs /dev/datavg/lv1 # xfs文件格式扩容
resize2fs /dev/datavg/lv1 # ext文件格式扩容
缩小逻辑卷
1.卸载挂载点 umount /lv1
2.使用lvreduce
调整lv
大小为1G
lvreduce -L 1G /dev/datavg/lv1
3.重新挂载分区
mount -t xfs /dev/datavg/lv1 /lv1
删除逻辑卷
1.先卸载挂载点,然后再移除逻辑卷
umount /dev/datavg/lv1
lvremove /dev/datavg/lv1
2.删除vg
vgremove datavg
3.删除pv
pvremove /dev/sdb
pvremove /dev/sdc
磁盘阵列RAID
什么是RAID
RAID
简称磁盘阵列,那什么是阵列- 古代打仗时会对士兵进行排兵布阵,其目的在于提高士兵的整体的作战能力,而不是某个士兵的战斗力
- 那么回到磁盘中,我们可以将多块盘组合进行排列,提供磁盘的整体读写能力和冗余能力,通常我们将其称为磁盘阵列
为什么需要RAID
- 1.提升读写能力:在
RAID
中,可以让很多磁盘同时传输数据,因为多块磁盘在逻辑上感觉是一个磁盘,所以使用RAID
可以达到单个磁盘的几倍、几十倍甚至上百倍的速率 - 2.保证数据安全:硬盘非常的脆弱,它经常会坏掉,所以有了
RAID
。它的目的是将好多个硬盘组合在一起,就是坏掉一块盘,也不影响服务器对外提供服务,保证磁盘高可用 RAID
可以预防数据丢失,但不能百分百保证数据不丢,所以在使用RAID
的同时还需要备份数据
实现RAID的几种模式
RAID0
RAID0
条带卷,最少两块盘。读写性能好,但没有容错机制。坏一块磁盘数据全丢- 磁盘空间使用率:100%,成本低
- 读性能:
N x
单块磁盘的读性能 - 写性能:
N x
单块磁盘的写性能 - 冗余:无,任何一块磁盘损坏都将导致数据不可用
- 应用场景:无状态服务(
web
)
RAID1
RAID1
镜像卷,写入性能一般、读取性能快、有容错机制,但磁盘有50%浪费- 磁盘空间使用率:50%成本较高
- 读性能:
N x
单块磁盘的读性能 - 写性能:
1 x
单块磁盘的写性能 - 冗余:在这一对镜像盘中有一块磁盘可以使用,那么无影响
- 应用场景:系统盘
RAID5
RAID5
校验卷,至少3块相同大小的盘,并且只允许坏一块盘,有效空间(N-1
),读写速度快。坏掉一块盘,读的性能会下降- 磁盘空间利用率:(
N-1
),即只浪费一块磁盘用于奇偶校验 - 读性能:
(N-1)x
单块磁盘的读性能,接近RAID0
的读性能 - 写性能:
(N-1)x
单块磁盘的写性能,写入数据需要做校验值;性能会下降 - 冗余:只允许一块磁盘损坏;修复时间会比较长,修复过程中可能会出现其他盘损坏
- 应用场景:常规选择
(all)
- 磁盘空间利用率:(
RAID10
RAID10
,先做RAID1
,再做RAID0
- 磁盘空间利用率:
50%
- 读性能
- 写性能
- 冗余:只要一对镜像盘中有一块磁盘可以使用就没问题
- 用用场景:数据(
DB
)
- 磁盘空间利用率:
实现RAID的方式
硬RAID
- 硬
RAID
使用硬件阵列卡,在安装操作系统之前进入bios
配置
软RAID
- 软
RAID
通过操作系统软件来实现,性能远不如硬RAID
,仅测试效果
留言