• 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
    
    

    本文来自博客园,作者:GaoBeier,转载请注明原文链接:https://www.cnblogs.com/gao0722/p/15086810.html

  • 相关阅读:
    过滤器解决乱码问题
    读取配置文件javase
    Django
    python之路
    最火的前端框架--Vue
    web前端
    MySQL笔记
    python 从想学到坚持
    python 坚持下来会更好
    简单的装系统大佬别喷谢谢拉 欢迎指出不足指出
  • 原文地址:https://www.cnblogs.com/gao0722/p/15086810.html
Copyright © 2020-2023  润新知