磁盘概述
什么是磁盘
大多数人对硬盘都不陌生,一块小小的硬盘里,就可以存储海量的照片音乐和电影,尤其是我们喜爱的各类动作片。但如此小的空间,是如何储存那么多信息的呢?
每个硬盘中心都是一摞高速运转的圆盘,在圆盘上附着的一圈金属颗粒,每个金属颗粒都有自己的磁化程度,主要用于储存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、ntfslinux:ext2、ext3、ext4、xfs、vfat、ntfs-3g
文件系统结构
- 磁盘被划分为两大存储区域,一类是存储元数据
inode,一类是存储真实数据data blockinode划分了很多inode block,每个block块为128Bdata划分了很多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,仅测试效果
留言