• Linux—磁盘管理


    🚀 优质资源分享 🚀

    学习路线指引(点击解锁)知识定位人群定位
    🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
    💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

    Linux 磁盘管理

    1、磁盘简介

    1.1 认识磁盘

    磁盘是一种计算机的外部存储器设备,由一个或多个覆盖有磁性材料的铝制或玻璃制的碟片组成,用来存储用户的信息,这种信息可以反复地被读取和改写;绝大多数磁盘被永久封存在一个密封的盒子里。

    磁盘结构.jpg

    1.2 磁盘运行机理

    简单来说就是多个盘片之间靠主轴连接,电机带动主轴做旋转运动,通过多个磁头臂的摇摆和磁盘的旋转,磁头就可以在磁盘旋转的过程中就读取到磁盘中存储的各种数据。

    1.3 磁盘的扇区、磁道、柱面

    磁道: 磁盘的每个盘面被划分为许多同心圆,这些同心圆的轨道叫做磁道。

    扇区: 一个盘面划分为若干个内角相同的扇形,这样盘面上的每个磁道就被分为若干段圆弧,每段圆弧叫做一个扇区。每个扇区中的数据作为一个单元同时被读入或写入。每一个扇区是512字节,其中有64个字节存储的是分区表,一条分区信息占16个字节。

    柱面: 每一个盘片同一大小的同心圆可以看成连在一起的柱面,磁盘在分区的时候最小单位是柱面,每一个盘片的上下面都可以读取数据,每一个磁头,不可以跨盘面读取数据。

    1.4 磁盘的分类

    IDE接口磁盘: 特点价格低廉,兼容性强,性价比高,数据传输较慢,不支持热插拔等。

    SCSI接口磁盘: 传输速率高,读写性能好,运行稳定,可连接多个设备;可支持热插拔,占用CPU低,但是价格相对来说比较贵,一般用于工作站或服务器上。

    SATA接口磁盘: 结构简单、支持热插拔。

    USB接口磁盘: 移动硬盘,随身携带,性能较低。

    IDE接口的磁盘在Linux系统中命名为:/dev/hd[a-z]

    SCSI、SATA、USB接口的磁盘在Linux系统中命名为:/dev/sd[a-z]

    虚拟化磁盘在Linux系统中命名为:/dev/vd[a-z]

    打印机设备在Linux系统中命名为:/dev/lp[0-15]

    2、磁盘分区

    2.1 为什么要分区?

    易于管理和使用:
    比如说我们把磁盘分成多个盘(分区)sda1、sda2、sda3、sda4,假设sda1盘为系统盘,其他的比如说游戏、办公、软件盘,这样我们想管理哪个盘直接选中操作即可不会影响其他盘;而且根据用途我们也能较快的去使用相应的磁盘。

    有利于数据的安全:
    通过分区可以降低数据损失的风险;出现硬盘坏道、错误操作、重装系统都有可能造成数据损失,如果分区了,那么我们就可以将损失最小化。

    节约寻找文件的时间:
    寻找文件的时间是指电脑搜索文件的时间;分区以后,电脑搜索文件时只需要在相对应的分区搜索就可以了,没必要进行全盘搜索,大大节省了寻找文件的时间。

    磁盘分区图示:
    磁盘分区

    2.2 分区类型

    MBR(Master Boot Record)和GPT(GUID Partition Table)是在磁盘上存储分区信息的两种不同方式;这些分区信息包含了分区从哪里开始的信息,这样操作系统才知道哪个扇区是属于哪个分区的,以及哪个分区是可以启动的。在磁盘上创建分区时,你必须在MBR和GPT之间做出选择。

    MBR是Master Boot Record的简称,也就是主引导记录,是位于磁盘最前边的一段引导(Loader)代码,主要用来引导操作系统的加载与启动。

    特点:

    • MBR支持最大2TB磁盘,它无法处理大于2TB容量的磁盘
    • 只支持最多4个主分区。若想要更多分区,需要创建扩展分区,并在其中创建逻辑分区

    GPT磁盘是指使用GUID分区表的磁盘,GUID磁盘分区表(GUID Partition Table,缩写:GPT)其含义为“全局唯一标识磁盘分区表”,是一个实体硬盘的分区表的结构布局的标准。

    特点:

    • GPT对磁盘大小没有限制
    • 最多可以创建128个分区

    3、分区工具使用

    3.1 查看分区使用情况

    df	//命令查看已挂载磁盘或分区使用情况,默认K为单位
    -h	//以G或者T或者M人性化方式显示
    -i	//查看inode使用情况
    -T	//查看文件系统类型
    
    [root@localhost ~]# df -h
    设备名称      	  磁盘大小 已用大小 可用大小 使用百分比 挂载点
    Filesystem             Size  Used  Avail   Use%      Mounted on
    devtmpfs               1.9G     0   1.9G     0%      /dev
    tmpfs                  1.9G     0   1.9G     0%      /dev/shm
    tmpfs                  1.9G  9.7M   1.9G     1%      /run
    tmpfs                  1.9G     0   1.9G     0%     
     /sys/fs/cgroup
    /dev/mapper/rhel-root   55G   14G    42G    26%      /
    /dev/sr0               7.9G  7.9G      0   100%      /mnt/cdrom
    /dev/nvme0n1p1        1014M  229M   786M    23%      /boot
    tmpfs                  376M  4.0K   376M     1%      /run/user/0
    tmpfs                  376M  1.2M   375M     1%      /run/user/42
    
    lsblk	//查看所有磁盘和分区使用情况
    [root@localhost ~]# lsblk 
    NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sr0            11:0    1  7.9G  0 rom  /mnt/cdrom
    nvme0n1       259:0    0   60G  0 disk 
    |-nvme0n1p1   259:1    0    1G  0 part /boot
    |-nvme0n1p2   259:2    0   19G  0 part 
    | |-rhel-root 253:0    0   55G  0 lvm  /
    | `-rhel-swap 253:1    0    2G  0 lvm  [SWAP]
    `-nvme0n1p3   259:3    0   40G  0 part 
      `-rhel-root 253:0    0   55G  0 lvm  /
    
    du	//统计文件占用磁盘大小
    -s	//列出总和
    -h	//人性化显示容量信息
    
    [root@localhost ~]# du -sh /etc/
    30M     /etc/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    3.2 磁盘分区工具

    分区工具有fdisk和gdisk,当硬盘小于2T的时候我们应该用fdisk来分区,而当硬盘大于2T的时候则应用gdisk来进行分区;fdisk默认使用MBR分区表,gdisk默认使用GPT分区表。

    //生产分区建议: 如无特殊需求, 直接使用整个磁盘即可, 无需分区
    //学习分区建议: 1P+1E(3L) 2P+1E(2L) 3P+1E(1L) (仅适用于练习)      
    
    fdisk	//磁盘分区工具,默认采用MBR分区表
    -l	//列出系统中所有磁盘
    
    [root@localhost ~]# fdisk -l			//查看系统中磁盘信息
    
    [root@localhost ~]# fdisk  /dev/sdb		//对/dev/sdb进行分区
    Command (m for help): m 			//获取帮助
    Command action
       a   toggle a bootable flag   		//切换分区启动标记
       d   delete a partition     			//删除分区
       l   list known partition types   		//显示分区类型
       m   print this menu      			//显示帮助菜单
       n   add a new partition  			//新建分区
       o   create a new empty DOS partition table   //创建新的空白分区表
       p   print the partition table       		//显示分区表的信息
       q   quit without saving changes  		//不保存退出
       t   change a partition's system id   	//修改分区ID类型,可以通过l查看id
       w   write table to disk and exit     	//保存退出
    
    //创建主分区
    Command (m for help): n 			//新建分区
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)  //主分区
       e   extended 				//扩展分区
    Select (default p): p   			//选择主分区
    Partition number (1-4, default 1):  		//分区序号
    First sector (2048-2097151, default 2048): 	//起始扇区位置,回车默认即可
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +50M //结束扇区位置,+50M表示此分区大小为50MB
    
    //创建扩展分区
    Command (m for help): n 			//新建分区
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): e   			//创建扩展分区
    Partition number (2-4, default 2):
    First sector (104448-2097151, default 104448):
    Using default value 104448
    Last sector, +sectors or +size{K,M,G} (104448-2097151, default 2097151):  //回车默认划分所有空间给扩展分区
    
    //创建逻辑分区
    Command (m for help): n 			//新建分区
    Partition type:
       p   primary (1 primary, 1 extended, 2 free)
       l   logical (numbered from 5)
    Select (default p): l   			//创建逻辑分区
    Adding logical partition 5
    First sector (106496-2097151, default 106496):
    Using default value 106496
    Last sector, +sectors or +size{K,M,G} (106496-2097151, default 2097151): +100M  //分配100MB空间
    
    //查看分区创建
    Command (m for help): p
    Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048      104447       51200   83  Linux
    /dev/sdb2          104448     2097151      996352    5  Extended
    /dev/sdb5          106496      311295      102400   83  Linux
    
    //保存分区
    Command (m for help): w
    The partition table has been altered!
    Calling ioctl() to re-read partition table.
    Syncing disks.
    
    //安装parted, 刷新内核立即生效分区配置,无需重启
    [root@localhost ~]# dnf -y install parted
    [root@localhost ~]# partprobe /dev/sdb
    
    //检查磁盘是否是MBR分区方式
    [root@localhost ~]# fdisk -l /dev/sdb | grep type
    Disk label type: dos
    gdisk	//磁盘分区工具,默认采用GPT分区表
    
    [root@localhost ~]# gdisk /dev/sdb
    Command (? for help): n     			//创建新分区
    Partition number (1-128, default 1):
    First sector (34-2097118, default = 2048) or {+-}size{KMGTP}:
    Last sector (2048-2097118, default = 2097118) or {+-}size{KMGTP}: +500M //分配500M大小
    
    Command (? for help): p 			//查看分区情况
    Number  Start (sector)    End (sector)  Size       Code  Name
       1            2048         1026047   500.0 MiB   8300  Linux filesystem
    
    Command (? for help): w 			//保存分区
    Do you want to proceed? (Y/N): y    		//确认
    OK; writing new GUID partition table (GPT) to /dev/sdb.
    The operation has completed successfully.
    
    //检查磁盘是否是gpt格式
    [root@localhost /]# fdisk /dev/sdb -l | grep type
    Disk label type: gpt
    
    //安装parted, 刷新内核立即生效分区配置,无需重启
    [root@localhost ~]# yum -y install parted
    [root@localhost ~]# partprobe /dev/sdb
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100

    3.2 磁盘格式化

    mkfs命令用来格式化磁盘或分区,创建文件系统;磁盘分区后必须格式化创建文件系统才能正常使用。

    mkfs	//格式化磁盘或分区
    -b	//设定数据区块占用空间大小,目前支持1024、2048、4096 bytes每个块。
    -t	//用来指定什么类型的文件系统,可以是ext3,ext4, xfs
    -i	//设定inode的大小
    -N	//设定inode数量,防止Inode数量不够导致磁盘不足
    -L	//预设该分区的标签label
    
    //使用-t指定方式创建xfs文件系统
    [root@localhost ~]# mkfs -t xfs  /dev/sdb1
    
    //也可以使用另一种方式格式化sdb1分区为ext4文件系统
    [root@localhost ~]# mkfs.ext4  /dev/sdb1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.3 磁盘挂载

    磁盘分区格式化之后, 在Linux中必须进行挂载才能进行使用;挂载分区前需要创建挂载点, 挂载点就是一个目录,如果往挂载点目录写入数据, 实际上会写入到挂载的分区当中;挂载点建议是空目录, 如果不是也不影响挂载分区的使用,但是原有的文件会被隐藏。

    挂载分为两种临时挂载和永久挂载;临时挂载即重启之后失效,永久挂载即开机自动挂载。

    临时挂载磁盘:

    mount		//磁盘挂载命令,实质为文件系统指定访问入口
    -t		//指定挂载分区的文件系统类型,如ext3,ext4, xfs
    -o		//指定挂载参数
    -a		//重新读取/etc/fstab配置文件的所有挂载
    
    //挂载/dev/sdb1至db1目录
    [root@localhost ~]# mkdir /mnt/disk1
    [root@localhost ~]# mount -t xfs /dev/sdb1  /mnt/disk1
    
    //fstab被损坏情况下,让只读文件系统可写(正常情况下不使用)
    [root@localhost ~]# mount -o rw,remount /
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    永久挂载磁盘:

    blkid		//获取所有分区的UUID
    
    //blkid命令获取sdb1分区的UUID
    [root@localhost ~]# blkid | grep "sdb1"
    /dev/sdb1: UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" TYPE="xfs"
    
    //使用UUID临时挂载磁盘sdb1分区至于db1
    [root@localhost ~]# mount UUID="e271b5b2-b1ba-4b18-bde5-66e394fb02d9" /mnt/disk1
    
    //将挂载写入到/etc/fstab中,实现永久挂载, 开机自动挂载
    [root@localhost ~]# vim /etc/fstab    
    UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /mnt/disk1 xfs  defaults 0  0
    
    //加载fstab配置文件, 同时检测语法是否有错误
    [root@localhost ~]# mount –a
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    fstab配置文件介绍:

    [root@localhost ~]# vim /etc/fstab
    分区标识(UUID或设备名)                      挂载点     文件类型  挂载参数    不检查 不备份
    UUID=e271b5b2-b1ba-4b18-bde5-66e394fb02d9 /mnt/disk1        xfs  defaults    0     0
    
    //挂载参数, 可写fstab配置文件, 也可以mount时使用-o参数指定
    参数             参数意义                                  系统默认值
    async            系统每隔一段时间把内存数据写入磁盘中
    sync             时时同步内存和磁盘中数据;
    suid,nosuid     允许/不允许分区有suid属性                  suid
    rw,ro           可以指定文件系统是只读(ro)或可写(rw)        rw
    exec,noexec     允许/不允许可执行文件执行,不要挂载根分区    exec
    user,nouser     允许/不允许root外的其他用户挂载分区         nouser
    auto,noauto     开机自动挂载/不自动挂载                    auto
    defaults         默认文件系统挂载设置			  rw, suid, dev, exec, auto, nouser, async
    
    //加载fstab配置文件中所有配置
    [root@localhost ~]# mount -a
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    卸载挂载磁盘:

    umount		//取消挂载
    -lf		//强制取消挂载
    
    //使用站点目录卸载
    [root@localhost ~]# umount /mnt/disk1
    
    //使用设备名卸载/dev/sdb1
    [root@localhost ~]# umount /dev/sdb1
    
    //umount不能卸载的情况
    [root@localhost 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)
           
    //如上情况解决办法有两种, 切换至其他目录或使用'-l'选项强制卸载    
    [root@localhost db1]# umount -lf /db1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4、SWAP交换分区

    交换分区SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用。交换分区一般指定虚拟内存的大小为实际内存的1~1.5倍。如果实际内存超过8GB,可以直接划分16GB给虚拟内存即可。

    //为系统添加SWAP分区
    
    //查看内存和SWAP交换分区的使用情况
    [root@localhost ~]# free -mh
                  total        used        free      shared  buff/cache   available
    Mem:           1.8G        258M        103M         61M        1.4G        1.3G
    Swap:             0           0           0 <--- 没有交换分区
    
    //使用磁盘创建一个分区作为SWAP交换分区,并且把分区类型更改为82
    [root@localhost ~]# fdisk  /dev/sdb
    
    Command (m for help): n 			//新建分区
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p): p   			//选择主分区
    Partition number (1-4, default 1):  		//分区序号
    First sector (2048-2097151, default 2048): 	//起始扇区位置,回车默认即可
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +2G //结束扇区位置,+2G表示此分区大小为2G
    
    Select (default p): t				//修改分区id
    Partition number (default 1)			//选择要成为SWAP的分区
    Hex code (type L to list all codes):82  	//修改成id为82
    Changed type of partition 'Linux LVM' to 'Linux swap / Solaris'.
    
    Command (m for help): p
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048     2099199     1048576   83  Linux
    /dev/sdb2         2099200     6293503     2097152   82  Linux swap / Solaris <---修改成功
    
    Command (m for help): w
    
    //强烈建议对分区做了修改后都刷新一下
    [root@localhost ~]# partprobe  /dev/sdb
    
    //把sdb1格式化为交换分区
    [root@localhost ~]# mkswap  /dev/sdb1
    正在设置交换空间版本 1,大小 = 2097148 KiB
    无标签,UUID=ba08eb90-2003-44e6-9769-9a9351aebb05
    
    //启动交换分区
    [root@localhost ~]# swapon /dev/sdb1
    或者
    [root@localhost ~]# swanon -a  //启动所有交换分区
    
    //查看交换分区
    [root@localhost ~]# free -mh
                  total        used        free      shared  buff/cache   available
    Mem:           1.8G        258M        103M         61M        1.4G        1.3G
    Swap:            2G           0          2G
    
    //永久挂载交换分区
    [root@localhost ~]# blkid /dev/sdb1
    /dev/sdb1: UUID="ba08eb90-2003-44e6-9769-9a9351aebb05" TYPE="swap" 
    
    [root@localhost ~]# vim /etc/fstab 
    UUID=ba08eb90-2003-44e6-9769-9a9351aebb05  swap	swap	defaults  0 0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    5、生产磁盘故障案例

    //Inode被占满,导致磁盘有可用的剩余空间也无法继续使用
    
    [root@localhost ~]# dd if=/dev/zero of=/opt/newdisk bs=1k count=1024
    [root@localhost ~]# mkfs.ext4 -i 1024 /opt/newdisk
    [root@localhost ~]# mkdir /mnt/data
    [root@localhost ~]# mount -t ext4 -o loop /opt/newdisk /mnt/data/
    
    //inode被占满
    [root@localhost ~]# cd /mnt/data/
    [root@localhost data]# touch {1..20000}
    touch: cannot touch `19997': No space left on device
    touch: cannot touch `19998': No space left on device
    touch: cannot touch `19999': No space left on device
    touch: cannot touch `20000': No space left on device
    
    //inode被占满,剩余block也是无法继续使用
    [root@localhost ~]# df -h|grep data
    /opt/newdisk    891K   34K  806K   5% /mnt/data/
    
    [root@localhost ~]# df -i | grep data
    /opt/newdisk      1024  1024       0  100% /mnt/data/
    
    //假设现在线上正在运行Nginx服务, Nginx产生的日志已经达到了20个G, 磁盘眼看就看沾满了, 请问不重启Nginx的方式如何处理
    
    //删除文件, 但虽然文件被删除但是Nginx持续占用着文件, 所以空间并不会被释放
    rm -f access.log
    
    //正确做法如下, 使用重定向清空该文件即可释放文件内容
    > access.log
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
    • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角**【[推荐](javascript:void(0)😉】**一下。
  • 相关阅读:
    家店wifi软件开发搭建平台
    2022年9月月赛乙组 T3.棋盘问题
    java Map遍历的5种方法和一些基本使用
    React Hooks useState 使用详解+实现原理+源码分析
    硬件设计专题-DCDC电路起源
    《MLB棒球创造营》:走近棒球运动·纽约大都会队
    SpringBoot前后端分离整合cas(客户端)
    处理器知识基础
    值得掌握的Java代码优化技巧
    java毕业设计房产中介管理系统Mybatis+系统+数据库+调试部署
  • 原文地址:https://blog.csdn.net/m0_56069948/article/details/126339163