Linux基础之(磁盘管理)

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战


磁盘命名

物理服务器

真实物理服务器

设备名称 分区信息 设备类型
/dev/sda /dev/sda1 第一块物理磁盘第一分区
/dev/sdb /dev/sdb2 第二块物理磁盘第二个分区
/dev/sdd /dev/sdd4 第四块虚拟磁盘的第四个分区

虚拟服务器

阿里云主机或者KVM虚拟化主机的磁盘命名格式

设备名称 分区信息 设备类型
/dev/vda /dev/vda1 第一块虚拟磁盘的第一个分区
/dev/vdb /dev/vdb2 第二块虚拟磁盘的第二个分区
/dev/vdc /dev/vdc3 第三块虚拟磁盘的第三个分区

磁盘分区

为什么要分区

  • 分区是为了便于数据分门别类的存储;
  • 分区有MBRGPT两种方式;

MBR分区

  • MBR分区仅能分配4个主分区,如果需要划分多个分区,需要先分配扩展分区,然后再分配逻辑分区

image-20211110150942366

GPT分区

  • 对于MBR分区而言,只能分配4个主分区,但新型的分区表GPT理论上支持分配无限(128是windows系统的限制)个主分区
    • MBRGPT有何区别?
    • 注意MBRGPT之间不能互转,会导致数据丢失;

分区管理

fdisk

  • fdisk仅支持分配小于2TB的磁盘
    • 查看当前设备fdisk -l
    • 对设备进行分区fdisk /dev/sdb
  • 分区命令
    • m:显示帮助
    • n:创建新分区
    • d:删除分区
    • p:查看分区
    • w:保存分区
    • q:退出
  • 分区案例:
    • 案例1:分配4个分区(4P)
    • 案例2:分配5个分区(1P+1E+4L)
    • 案例3:分配6个分区(3P+1E+3L)

gdisk

  • gdisk支持分配大于2TB的磁盘
    • 查看当前设备gdisk [-l] device
    • 对设备进行分区gdisk /dev/sdb
  • 分区命令
    • ?:显示帮助
    • n:创建新分区
    • p:打印分区
    • w:保存分区
    • q:退出
  • 分区案例:
    • 案例1:分配4个主分区(4P)
    • 案例2:分配5个主分区(5P)
    • 案例3:分配6个主分区(6P)

mkfs

  • mkfs命令用于格式化硬盘,类似于将房子装修成3室一厅,还是2室一厅

    • -b:设定数据区块占用空间大小,目前支持1024、2048、4096bytes每个块;
    • -t:用来指定什么类型的文件系统,可以是ext4、xfs
    • -N:设定inode数量,防止inode数量不够导致磁盘不足;
  • 使用mkfs命令,格式化整个硬盘

    [root@web ~]# mkfs.ext4 /dev/sdb
    复制代码
  • 使用mkfs命令,格式化磁盘的某个分区

    [root@web ~]# mefs.xfs /dev/sdb1
    复制代码

挂载管理

当需要使用磁盘空间的时,需要准备一个目录作为挂载点,然后使用mount命令与该设备进行关联。

临时挂载mount

  • 通过mount进行挂载,但重启将会失效,我们称为临时生效。

    • -t:指定文件系统挂载分区;
    • -a:检查并且挂载/etc/fstab配置文件中未挂载的设备;
    • -o:指定挂载参数,ro、rw
  • 挂载磁盘设备

    [root@web ~]# mkdir /db1
    [root@web ~]# mount -t xfs /dev/sdb1 /db1
    复制代码
  • 挂载磁盘设备,设置参数为仅可读

    [root@web ~]# mkdir /db2
    [root@web ~]# mount -t xfs -o ro /dev /sdb2 /db2
    [root@web ~]# touch /db2/new_file
    touch: cannot touch '/db2/new_file': Read-only file system
    复制代码

临时卸载umount

  • 如果不想使用可以使用umount [device|directory]进行临时卸载;

    • -l:强制卸载;
  • 卸载入口目录示例;

    [root@web ~]#umount /db1
    复制代码
  • 卸载设备方式示例;

    [root@web ~]# umount /dev/sdb1
    复制代码
  • 如碰到无法正常卸载情况处理;

    [root@web 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@web db1]# umount -l /db1
    复制代码

永久挂载fstab

如果需要实现永久挂载,则需要将挂载相关信息写入/etc/fstab配置文件中实现。

永久挂载配置文件

  • 配置文件规范:设备名称|挂载的入口目录|文件系统类型|挂载参数|是否备份|是否检查
  1. 获取设备名称,或设备的UUID

    [root@web ~]# blkid |grep "sdb1"
    /dev/sdb1: UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" TYPE="xfs"
    复制代码
  2. 手动挂载测试;

    [root@web ~]# mount UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9"/db1
    复制代码
  3. 写入/etc/fstab测试;

    #手动编写
    [root@web ~]# tail -l /etc/fstab
    UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /db1 xfs defaults 0 0
    
    #自动实现
    [root@web ~]# blkid |grep /dev/sda1 |awk -F '[: ]+' '{print $2}' |\
    sed -r 's#(.*)#\1 /db1 xfs defaults 0 0#g' >> /etc/fstab
    复制代码
  4. 加载/etc/fstab配置文件,同时检测是否存在语法错误;

    [root@web ~]# mount -a
    复制代码

配置文件/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分区;

    [root@web ~]# fdisk /dev/sdb
    # 格式化为swap
    [root@web ~]# mkswap /dev/sdb1
    复制代码
  2. 查看当前swap分区大小;

    [root@web ~]# free -m
            total	used	free	shared	buff/cache	available
    Mem:	1980	1475	80		10		424			242
    Swap:	2047	4		2043
    复制代码

扩展swap分区

  • 扩展swap分区,使用swapon命令

    • swapon device:将某个磁盘大小添加到swap分区中;

    • swapon -a:添加所有swap分区;

    [root@web ~]# swapon /dev/sdb1
    [root@web ~]# free -m
    		total	used	free	shared	buff/cache	available
    Mem:	1980	1475	80		10		424			242
    Swap:	3047	4		2043
    复制代码

缩小swap分区

  • 缩小swap分区,使用swapoff命令

    • swapoff device:关闭某个磁盘的swap分区;

    • swapoff -a:关闭所有swap分区;

    [root@web ~]# swapoff /dev/sdb1
    [root@web ~]# free -m
    		total	used	free	shared	buff/cache	available
    Mem:	1980	1475	80		10		424			242
    Swap:	2047	4		2043
    复制代码

文件系统修复

  • Linux系统中,为了增加系统性能,通常系统会将一些数据先写入内存中,然后再刷新至磁盘中;

  • 万一公司服务器突然断电或者其他未知原因,再次启动后,会造成文件系统错误;

    [root@web ~]# fdisk /dev/sdc			# 分配1G分区
    [root@web ~]# mkfs.xfs /dev/sdc1
    [root@web ~]# mount /dev/sdc1 /mnt
    [root@web ~]# echo "Hello" > /mnt/new.txt
    
    # 模拟损坏
    [root@web ~]# dd if=/dev/zero of=/dev/sdc bs=300M count=1
    [root@web ~]# umount /mnt
    [root@web ~]# mount /dev/sdc1 /mnt		# 无法挂载
    
    # 尝试修复
    [root@web ~]# xfs_repair /dev/sdc1
    
    # 强制修复
    [root@web ~]# xfs_repair -L /dev/sdc1
    复制代码