内容目录

磁盘概述

什么是磁盘

大多数人对硬盘都不陌生,一块小小的硬盘里,就可以存储海量的照片音乐和电影,尤其是我们喜爱的各类动作片。但如此小的空间,是如何储存那么多信息的呢?

每个硬盘中心都是一摞高速运转的圆盘,在圆盘上附着的一圈金属颗粒,每个金属颗粒都有自己的磁化程度,主要用于储存0和1

在数据写入时,硬盘的磁头开始通电,周围会产生磁场,数据在磁场的作用下转变成电流,使磁盘的金属颗粒磁化,从而将信息记录在圆盘上

由海量颗粒组成的信息,就是我们存在硬盘里的数据。

磁盘物理结构

什么是盘片

硬盘一般有一个或多个盘片,每个盘片可以有两面,即第一个盘片的正面为0面,反面为1面然后依次类推

什么是磁道

每个盘片的盘面在出厂的时候被划分出了多个同心圆环,数据就存储在这样的同心圆环上面,我们将这样的圆环称为磁道track,每个盘面可以划分多个磁道,但肉眼不可见

什么是扇区

在硬盘出厂时会对磁盘进行一次低格,其实就是在每个磁道划分为若干个弧段,每个弧段就是一个扇区sector。扇区是硬盘上存储的物理单位,现在每个扇区可存储512字节数据已经成了业界的约定

什么是柱面

柱面实际就是我们抽象出来的一个逻辑概念,简单来说就是处于同一个垂直区域的磁道称为柱面,即各盘面上面相同位置磁道的集合。这样数据如果存储到相同半径磁道上的同一扇区,这样可以实现并行读取,主要是减少磁头寻道时间。

什么是磁头

读取磁盘磁道上面金属块,主要负责读或写入数据

磁盘的接口类型

IDE-SCSI

IDE,scsi(已经被淘汰)

sata-sas
  • sata IIIsas
接口类型 接口速率 盘片转速 写入速度 应用场景
SATA III 6Gbps/s 7.5k/s 300MB/s 个人
SAS 8Gbps/s~12Gbps/s 15k/s 300MB/s~600MB/s 企业
MSATA-M2

= MSATAM.2

  • MSATA接口是专门为超级笔记本而设计的
  • M.2inter推出的一种替代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个主分区
      注意:MBRGPT之间不能互转,会导致数据丢失

file

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.获取设备名称,或设备的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

file

  • 目前有个1T的磁盘设备,那么它被格式化后会被划分为几千万个4Kblock块,那如何从这么多block块中定位到哪个是可用的,哪个是不可用的呢
  • 如果进行全盘扫描,一次要扫描几千万个block块,需要花费很长的时间,有什么办法可以解决
    • inode bitmap:inode位图
    • block bitmap:block位图

file

  • 文件删除原理
    • 首先删除目录下的文件名称,然后将inode、blockbitmap状态修改为可用状态,但文件并没有真正的被删除,还有恢复的可能性,而一旦有新的数据写入,将其覆盖,数据才算真正的删除
  • 文件移动原理
    • 仅仅将文件名称从一个目录移动到另一个目录下面,并不会修改其inodeblock

文件系统故障修复

  • linux系统中,为了增加系统性能,通常系统会将一些数据先写入内存中,然后再刷新至磁盘中
  • 万一公司服务器突然断电或者其他未知原因,再次启动后,会造成文件系统错误

1.使用xfs_repair修复文件系统
xfs_repair /dev/sdc1
2.如出现修复失败,可采用强制修复,但可能会造成部分数据丢失
xfs_repair -L /dev/sdc1

逻辑卷lvm

为何要用lvm

  • 当刚开始安装linux系统时,往往不能确定每个分区使用的空间大小,只能凭经验分配不科学
    • 如果分区设置的过大,就浪费了磁盘空间
    • 如果分区设置的过小,就会导致空间不够
  • 如何希望分配的空间过大或过小,都能动态调整,则需要使用lvm逻辑卷

什么是lvm

  • LVMlogical volume manager逻辑卷管理的简写,它是对磁盘分区管理的一种机制
  • LVM优点:
    • LVM可以创建和管理逻辑卷,而不是直接使用物理硬盘
    • LVM可以弹性的管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据
    • LVM可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷
  • LVM缺点:
    • LVM如果有一个磁盘损坏,整个LVM都坏了,LVM只有动态扩展作用
    • 解决办法:用RAID+LVM,既有冗余又有动态扩展

lvm相关术语

  • 物理卷(PV):将常规的磁盘通过pvcreate命令对其进行初始化,形成了物理卷。(面粉)
  • 卷组(VG):把多个物理卷组成一个逻辑的整体,这样卷组的大小就是多个盘之和。(大面团)
  • 逻辑卷(LV):从卷组划分需要的空间大小出来,用户仅需要对其格式化然后即可挂载使用。(切成馒头)
  • 基本单元(PE):分配的逻辑大小的最小单元,默认4MB,假设分配100MB的空间,则需要创建25个PE

file

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.检查当前卷组vgpv使用情况。pvs

2.pvmove # move physical extents在线数据迁移,将sdb的数据迁移至sdc

pvmove /dev/sdb
/dev/sdb:Moved:100.00%

3.检查是否将sdb数据迁移至sdcpvs

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

file

RAID1
  • RAID1镜像卷,写入性能一般、读取性能快、有容错机制,但磁盘有50%浪费
    • 磁盘空间使用率:50%成本较高
    • 读性能:N x 单块磁盘的读性能
    • 写性能:1 x 单块磁盘的写性能
    • 冗余:在这一对镜像盘中有一块磁盘可以使用,那么无影响
    • 应用场景:系统盘

file

RAID5
  • RAID5校验卷,至少3块相同大小的盘,并且只允许坏一块盘,有效空间(N-1),读写速度快。坏掉一块盘,读的性能会下降
    • 磁盘空间利用率:(N-1),即只浪费一块磁盘用于奇偶校验
    • 读性能:(N-1)x单块磁盘的读性能,接近RAID0的读性能
    • 写性能:(N-1)x单块磁盘的写性能,写入数据需要做校验值;性能会下降
    • 冗余:只允许一块磁盘损坏;修复时间会比较长,修复过程中可能会出现其他盘损坏
    • 应用场景:常规选择(all)

file

RAID10
  • RAID10,先做RAID1,再做RAID0
    • 磁盘空间利用率:50%
    • 读性能
    • 写性能
    • 冗余:只要一对镜像盘中有一块磁盘可以使用就没问题
    • 用用场景:数据(DB

file

实现RAID的方式

硬RAID
  • RAID使用硬件阵列卡,在安装操作系统之前进入bios配置
软RAID
  • RAID通过操作系统软件来实现,性能远不如硬RAID,仅测试效果
最后修改日期: 2024年10月3日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。