10.Linux磁盘管理

10.Linux磁盘管理

1.磁盘概述

1.1 什么是磁盘

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

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

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

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

1.2磁盘物理结构

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个主分区。

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 ;
  • 提示:
    • 1.分区工具,可以针对整块磁盘,或者单个分区进
      行格式化操作
    • 2.一般情况下建议,不要直接格式化使用整磁盘,
      要分区后再格式化,头部有预留空间;

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级别检验)

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 分区
[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 、与一个 block

  • 目前有个1T的磁盘设备,那么它被格式化后会被划分
    几千万个 4k 的 block 块,那如何从这么多 block 块中
    定位到哪个是可用的,哪个是不可用的呢;

  • 如果进行全盘扫描,一次要扫描几千万个 block 块,
    需要花费很长的时间,有什么办法可以解决?

    • inode bitmap : inde 位图
    • block bitmap : block 位图
  • 文件删除原理

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

    • 仅仅将文件名称从一个目录移动到另一个目录下
      面,并不会修改其 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

posted @ 2021-08-01 15:43  GaoBeier  阅读(312)  评论(0编辑  收藏  举报