Loading

八、磁盘管理

八、磁盘管理

8.1 机械与固态知识

image-20230104160718140


8.2 RAID知识

8.2.1 RAID概述

磁盘冗余阵列RAID,物理服务器的硬盘通过RAID卡进行配置,然后才能使用。


8.2.2 RAID优势
  • 可以获取更高容量
  • 可以获取更高性能(读写速度 io(input写/output读)速度
  • 可以获取更高冗余(安全性)

8.2.3 RAID级别

常见的raid级别:raid 0 ,raid 1,raid 5,raid 10

需要几块盘 安全冗余 可用容量 性能 应用场景
RAID 0 1 最低 所有硬盘总和 读写最快 不要求安全,只要求速度(数据库从库、存储从库、web服务器)
RAID 1 只能有2块 100% 所有硬盘总和/2 写入速度慢,读取OK 系统盘、监控服务器
RAID 5 3 最多坏一块盘 损失一块盘的容量 写入性能不好,读取OK 普遍数据库,存储等访问量不高的
RAID 10 4 可以损坏一半 所有硬盘总和/2 读取很快 高并发或高访问的数据库从库、存储等

8.3 MBR与GPT

早期的 Linux 系统为了兼容于 Windows 的磁盘,因此使用的是支持 Windows 的 MBR(Master Boot Record, 主要开机纪录区) 的方式来处理开机管理程序与分区表!而开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区。


这个扇区通常是 512bytes 的大小,所以说第一个扇区 512bytes 会有这两个数据:

  • 主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有 446 bytes
  • 分区表(partition table):记录整颗硬盘分区的状态,有 64 bytes

由于分区表所在区块仅有 64 bytes 容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的磁柱号码。 若将硬盘以长条形来看,然后将磁柱以柱形图来看,那么那 64 bytes 的记录区段有点像底下的图示:

image-20230105144329696


由于分区表就只有 64 bytes 而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为主要(Primary)或延伸(Extended)分区槽。


如何分出四个以上分区?利用延伸分区(Extended)的方式来处理,既然第一个扇区所在的分区表只能记录四笔数据, 那我可利用额外的扇区来记录更多的分区信息。实际上图示有点像底下这样:

image-20230105144802973


主分区、扩展分区、逻辑分区(GPT随便用分区)

主分区: 最多有4个,每个占用16字节分区表空间。

扩展(延伸)分区:

  • 主要用来解决主分区最多4个。
  • 主分区无法直接存放数据与使用。
  • 如果要使用需要在扩展分区中创建逻辑分区。
  • 扩展分区在一个磁盘中只有1个。

逻辑分区:

  • 需要先创建扩展分区。
  • 使用逻辑分区存放数据。

MBR vs GPT

MBR

  • MBR主引导记录,磁盘分区格式。
  • 磁盘大小不能大于2tb,如果大于2tb则无法使用。

GPT

  • GPT分区表格式,解决分区数量问题。
  • 解决系统支持大硬盘的问题。
  • 主分区随便用,不用区分主分区,扩展分区,逻辑分区。

image-20230105150131003


8.4 分区命名规则

img


#Linux系统磁盘名字的命名规则
##物理服务器...
sata/sas/pci-e/ 接口的硬盘
/dev/sd?开头

##云服务器
/dev/vd? 开头

##第1块硬盘
/dev/sda

##第2块硬盘
/dev/sdb

#Linux系统磁盘分区名字的命名规则
#主分区或扩展分区 1-4
/dev/sda1-4

#逻辑分区从5开始
/dev/sda5

#第3块sata硬盘的第1个主分区
/dev/sdc1

#第4块sas硬盘的第2个逻辑分区
/dev/sdd6

8.5 磁盘分区实战

8.5.1 添加并识别硬盘

先查看现在系统的硬盘信息

image-20230105151421109


在vmware上给虚拟机添加一块10G的硬盘,这个操作模拟在物理服务器热插拔进一块硬盘,此时再查看硬盘信息,还是没有新的硬盘信息加入。在生产环境中,磁盘空间不足时需新加磁盘,一般来说,新加磁盘后需要重启系统才能识别加载,但是生产环境不能随便重启,所以需要一种方法能够不重启系统也可以加载识别新磁盘。那就是通过加载总线扫描方法


查看总线并进行重新扫描SCSI总线

image-20230105151855161


重新查看硬盘信息,已成功添加

image-20230105152001929


8.5.2 磁盘相关工具和命令
8.5.2.1 lsblk 列出所有磁盘列表

由于目前磁盘分区主要有 MBR 以及 GPT 两种格式,这两种格式所使用的分区工具不太一样!当然可以使用parted 这个通通有支持的工具来处理,不过,还是比较习惯使用 fdisk 或者是 gdisk 来处理分区!因此,我们自然就得要去找一下目前系统有的磁盘有哪些?这些磁盘是 MBR 还是 GPT 等等的!


lsblk命令的选项与参数:
-d :仅列出磁盘本身,并不会列出该磁盘的分区数据
-f :同时列出该磁盘内的文件系统名称
-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
-p :列出该装置的完整文件名!而不是仅列出最后的名字而已。
-t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等


示例

[root@localhost ~]# lsblk -d  #仅列出磁盘本身,并不会列出该磁盘的分区数据
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda    8:0    0  200G  0 disk
sdb    8:16   0   10G  0 disk
sr0   11:0    1 1024M  0 rom

[root@localhost ~]# lsblk -f  #同时列出该磁盘内的文件系统名称
NAME            FSTYPE      LABEL UUID                                   MOUNTPOINT
sda
├─sda1          xfs               f04bb86f-4d3b-4480-8d55-26a02737fdfd   /boot
└─sda2          LVM2_member       iYfH5U-yJ7e-zRTs-Qawv-cHNA-BMK1-DfNfZE
  ├─centos-root xfs               7f59fa7d-0250-4596-98be-452bff4c9ab7   /
  ├─centos-swap swap              4de69bc7-e53a-4286-910d-a61f4f34f71d   [SWAP]
  └─centos-home xfs               2c738e1d-1165-4e81-ab4a-06d0396e8173   /home
sdb
└─sdb1          ext4              97c969a2-0f20-4933-88fb-723bea58bdbb   /root/test
sr0

[root@localhost ~]# lsblk -m  #同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
NAME              SIZE OWNER GROUP MODE
sda               200G root  disk  brw-rw----
├─sda1              1G root  disk  brw-rw----
└─sda2            199G root  disk  brw-rw----
  ├─centos-root    50G root  disk  brw-rw----
  ├─centos-swap   7.9G root  disk  brw-rw----
  └─centos-home 141.1G root  disk  brw-rw----
sdb                10G root  disk  brw-rw----
└─sdb1              1G root  disk  brw-rw----
sr0              1024M root  cdrom brw-rw----

[root@localhost ~]# lsblk -p    #列出该装置的完整文件名!而不是仅列出最后的名字而已。
NAME                        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
/dev/sda                      8:0    0   200G  0 disk
├─/dev/sda1                   8:1    0     1G  0 part /boot
└─/dev/sda2                   8:2    0   199G  0 part
  ├─/dev/mapper/centos-root 253:0    0    50G  0 lvm  /
  ├─/dev/mapper/centos-swap 253:1    0   7.9G  0 lvm  [SWAP]
  └─/dev/mapper/centos-home 253:2    0 141.1G  0 lvm  /home
/dev/sdb                      8:16   0    10G  0 disk
└─/dev/sdb1                   8:17   0     1G  0 part /root/test
/dev/sr0                     11:0    1  1024M  0 rom

[root@localhost ~]# lsblk -t   #列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
NAME            ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED    RQ-SIZE   RA WSAME
sda                     0    512      0     512     512    1 deadline     128 4096   32M
├─sda1                  0    512      0     512     512    1 deadline     128 4096   32M
└─sda2                  0    512      0     512     512    1 deadline     128 4096   32M
  ├─centos-root         0    512      0     512     512    1              128 4096   32M
  ├─centos-swap         0    512      0     512     512    1              128 4096   32M
  └─centos-home         0    512      0     512     512    1              128 4096   32M
sdb                     0    512      0     512     512    1 deadline     128 4096    0B
└─sdb1                  0    512      0     512     512    1 deadline     128 4096    0B
sr0                     0    512      0     512     512    1 deadline     128  128    0B

8.6.2.2 blkid 列出UUID、文件系统等参数

image-20230105235330754


8.6.2.3 parted 列出磁盘信息

parted 不仅可以列出磁盘的分区表类型与分区信息,还可以对磁盘进行分区操作。

image-20230105235851374


8.5.2.4 磁盘分区工具

image-20230105152122200


fdisk用法

fdisk的命令行用法为: fdisk 硬盘设备名

进入fdisk后,首先键入'm',即可显示fdisk全部菜单。

再键入'p',显示当前分区表状态。

键入'n',增加一个分区,然后会提示你选择分区类型(基本分区或扩展分区),再选择分区号(1-4)。
注:每块硬盘最多可划分四个主分区(包括基本分区和扩展分区),其中:基本分区最多可划分四个,扩展分区最多可划分一个,但扩展分区内可再划分多个逻辑分区。

选中你要建立的分区类型和分区号后,会提示输入起始柱面,从1开始;然后再输入终止柱面,此时可输入实际的柱面数,也可用"+分区尺寸"的方式输入,如:+1024M表示在起始柱面后加上1024M,或者用G,会自动计算。

主分区的设备名依次为:/dev/hda1,/dev/hda2,/dev/hda3,/dev/hda4
逻辑分区的设备名依次为:/dev/hda5,/dev/hda6,/dev/hda7...等等。

键入’d‘,删除分区,输入分区号即可删除。注意,删除扩展分区时,将会同时删除所有的逻辑分区。

键入’t‘,改变分区标志(这是Linux的fdisk最精华的部份!),新建的分区默认标志是83(Linux Ext2),你可以把它改为82(Linux 交换区)、或是'b'(FAT32)、'f'(FAT32 Extend,只限于扩展分区)、'86'(NTFS)...等几十种类型。这样一来,使用多操作系统的朋友们就可以用Linux的fdisk划分出你想要的所有分区了!

键入'a',切换分区激活开关。请注意:每键入一次,被选的分区就会在激活与非激活间变化一次,但你必须保证最后只有一个分区被激活。这时就用得到'p'命令了,被激活的分区上会有个'*'号。

除以上的几个命令外,还有其它几个,但不太常用。

最后,键入’w',你对分区所做的改变被写入硬盘;键入'q',则放弃所有的修改。

灵活应用fdisk,还可以修复一些损坏的分区表,前提是你必须准确记住原有每个分区的起始柱面和终止柱面。

gdisk用法与fdisk相似,暂不单独列出,请看8.5.4 gdisk创建分区案例。


8.5.3 fdisk 创建分区

在/dev/sdb中创建1个G的磁盘分区

[root@localhost ~]# fdisk /dev/sdb      #对/dev/sdb进行分区
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
#更改将只保留在内存中,直到您决定编写它们。
Be careful before using the write command.
#在使用w(write)命令之前要小心。

#fdisk 磁盘分区指令详解
p (print) 显示当前磁盘分区信息.
n (new)  创建磁盘分区.
d (delete) 删除分区.
q (quit) 退出不保存.
w (write) 保存并退出. 让磁盘分区生效.

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-20971519, default 2048): #起始扇区位置
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +1G  #结束扇区位置(使用方法 +size{K,M,G},会自动计算)
Partition 1 of type Linux and of size 1 GiB is set

Command (m for help): p  #查看分区信息

Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x5eef554a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux

Command (m for help): w  #保存并生效 分区表
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@localhost ~]# ll /dev/sdb1
brw-rw---- 1 root disk 8, 17 Jan  5 03:16 /dev/sdb1

8.5.4 gdisk 创建分区

对刚从添加的磁盘清除分区信息,然后进行gdisk /dev/sdb,下面信息就显示我们刚从的硬盘是有过MBR记录的,如果新磁盘用gdisk进行分区过后再删除分区保存分区表信息,重新进入gdisk也会识别出是GPT记录。

[root@localhost ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!

#发现无效的GPT和有效的MBR;将MBR转换为GPT格式
#在内存中。此操作具有潜在的破坏性!退出时间:
#如果不想转换MBR分区,请键入“q”
#转换为GPT格式!
***************************************************************

Command (? for help): ?
b       back up GPT data to a file
c       change a partition's name
d       delete a partition      #删除一个分区
i       show detailed information on a partition
l       list known partition types
n       add a new partition      #增加一个分区
o       create a new empty GUID partition table (GPT)
p       print the partition table  #印出分区表 (常用)
q       quit without saving changes  #不储存分区就直接离开gdisk
r       recovery and transformation options (experts only)
s       sort partitions
t       change a partition's type code
v       verify disk
w       write table to disk and exit   #储存分区操作后离开gdisk
x       extra functionality (experts only)
?       print this menu


Command (? for help): n   #增加一个分区
Partition number (1-128, default 1):  #默认回车
First sector (34-20971486, default = 2048) or {+-}size{KMGTP}: #默认回车
Last sector (2048-20971486, default = 20971486) or {+-}size{KMGTP}: +1G  #配置大小
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):  #使用默认值即可,除非要设置其他文件系统类型,可以提前“L”查看,然后在此输入类型
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/sdb: 20971520 sectors, 10.0 GiB   #磁盘文件名、扇区数与总容量
Logical sector size: 512 bytes              #单一扇区大小为 512 bytes
Disk identifier (GUID): 06CB467D-9595-44CD-8CAF-80A881A444F9  #磁盘的 GPT 标识符
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 18874301 sectors (9.0 GiB)   #还剩余多少扇区数与总容量

#分区编号   开始扇区号码       结束扇区号码  容量大小
Number  Start (sector)    End (sector)  Size       Code  Name   #底下为完整的分区信息了!
   1            2048         2099199   1024.0 MiB  8300  Linux filesystem

Command (? for help): w   #储存分区操作后离开gdisk

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
#最终检查完成。即将写入GPT数据。这将覆盖现有的分区!!


Do you want to proceed? (Y/N): y  
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
[root@localhost ~]# parted /dev/sdb print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name              Flags
 1      1049kB  1075MB  1074MB  ext4         Linux filesystem

如果分区完遇到以下情况,一般为此硬盘已分区过,并进行了格式化以及挂载,处于正在使用状态。

image-20230106000409238


并没有发现sdb2,因为核心还没有更新。 Linux 此时还在使用这颗磁盘,为了担心系统出问题,所以分区表并没有被更新!这个时候我们有两个方式可以来处理! 其中一个是重新启动,另外一个则是透过 partprobe 这个命令来处理即可!

image-20230106000516070


partprobe 更新 Linux 核心的分区表信息

cat /proc/partitions #核心的分区纪录
partprobe -s         #更新Linux核心的分区表信息
lsblk /dev/sdb       #实际的磁盘分区状态

image-20230106001135562


8.5.5 mkfs 格式化分区

分区完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,mkfs.xfs、mkfs.ext4等等。

[root@localhost ~]# mkfs.ext4 /dev/sdb1   #格式化为ext4文件系统
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=                         #显示Label name
OS type: Linux
Block size=4096 (log=2)                   #每一个 block 的大小
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks               #总计 inode/block 的数量
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost ~]# blkid /dev/sdb1  #确定建置好ext4文件系统了!
/dev/sdb1: UUID="97c969a2-0f20-4933-88fb-723bea58bdbb" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="bc1eb810-ca92-4c9a-884b-6b23e095c755"

8.5.6 mount 文件系统挂载

挂载点是目录, 而这个目录是进入磁盘分区(文件系统)的入口就是了。不过要进行挂载前,先确定要被挂载的磁盘无被挂载,要挂载到的目录此时没有挂载其他磁盘,理论上要作为挂载点的目录应该是空目录才是。


举个例子来说,假设你的 /home 原本与根目录 (/) 在同一个文件系统中,底下原本就有 /home/test 与/home/vbird 两个目录。然后你想要加入新的磁盘,并且直接挂载 /home底下,那么当你挂载上新的分区时,则 /home 目录显示的是新分区内的内容,至于原先的 test 与vbird 这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉, 而是暂时的隐藏了起来,等到新分区被卸除挂载之后,则 /home 原本的内容就会再次的跑出来啦!


mount选项与参数:
-a :依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来

-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称!

-t :可以加上文件系统种类来指定欲挂载的类型。常见的 Linux 支持类型有:xfs, ext3, ext4,reiserfs, vfat, iso9660(光盘格式), nfs, cifs, smbfs (后三种为网络文件系统类型)

-n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序的运作。但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入。此时就得要使用 -n 选项。

-o :后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等:async, sync: 此文件系统是否使用同步写入 (sync) 或异步 (async) 的内存机制,请参考文件系统运作方式。预设为 async。
    atime,noatime: 是否修订文件的读取时间(atime)。为了效能,某些时刻可使用 noatime
    ro, rw: 挂载文件系统成为只读(ro) 或可擦写(rw)
    auto, noauto: 允许此 filesystem 被以 mount -a 自动挂载(auto)
    dev, nodev: 是否允许此 filesystem 上,可建立装置文件? dev 为可允许
    suid, nosuid: 是否允许此 filesystem 含有 suid/sgid 的文件格式?
    exec, noexec: 是否允许此 filesystem 上拥有可执行 binary 文件?
    user, nouser: 是否允许此 filesystem 让任何使用者执行 mount ?一般来说,
    mount 仅有 root 可以进行,但下达 user 参数,则可让一般 user 也能够对此 partition 进行 mount 。	defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async

示例

1.直接mount挂载

[root@localhost ~]# mount /dev/sdb1 /root/test/
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 3.8G     0  3.8G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G   21M  3.8G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  5.0G   46G  10% /
/dev/mapper/centos-home  142G   33M  142G   1% /home
/dev/sda1               1014M  185M  830M  19% /boot
tmpfs                    781M   36K  781M   1% /run/user/0
/dev/sdb1                976M  2.6M  907M   1% /root/test

2.使用UUID进行mount挂载

找出 /dev/sdb1 的 UUID 后,用该 UUID 来挂载文件系统到 /root/test内

[root@localhost ~]# umount /dev/sdb1    #卸载刚从的挂载
[root@localhost ~]# blkid    #查看磁盘的UUID信息
/dev/sda1: UUID="f04bb86f-4d3b-4480-8d55-26a02737fdfd" TYPE="xfs"
/dev/sda2: UUID="iYfH5U-yJ7e-zRTs-Qawv-cHNA-BMK1-DfNfZE" TYPE="LVM2_member"
/dev/mapper/centos-root: UUID="7f59fa7d-0250-4596-98be-452bff4c9ab7" TYPE="xfs"
/dev/mapper/centos-swap: UUID="4de69bc7-e53a-4286-910d-a61f4f34f71d" TYPE="swap"
/dev/mapper/centos-home: UUID="2c738e1d-1165-4e81-ab4a-06d0396e8173" TYPE="xfs"
/dev/sdb1: UUID="97c969a2-0f20-4933-88fb-723bea58bdbb" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="bc1eb810-ca92-4c9a-884b-6b23e095c755"
[root@localhost ~]# mount UUID="97c969a2-0f20-4933-88fb-723bea58bdbb" /root/test  #使用UUID进行挂载
[root@localhost ~]# df -h   #查看挂载情况
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 3.8G     0  3.8G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G   21M  3.8G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  5.0G   46G  10% /
/dev/mapper/centos-home  142G   33M  142G   1% /home
/dev/sda1               1014M  185M  830M  19% /boot
tmpfs                    781M   36K  781M   1% /run/user/0
/dev/sdb1                976M  2.6M  907M   1% /root/test   #已成功挂载

umount 将文件系统卸载

选项与参数:
-f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;
-l :立刻卸除文件系统,比 -f 还强!
-n :不更新 /etc/mtab 情况下卸除。

平常使用常规卸载即可

[root@localhost ~]# umount /dev/sdb1

8.5.7 开机自动挂载
8.6.7.1 修改 /etc/rc.local

/etc/rc.local里面存放的命令,脚本会在开机的时候自动运行,第1次使用需要给 /etc/rc.d/rc.local 加上执行权限。

chmod +x /etc/rc.d/rc.local

示例

[root@localhost ~]# mount /dev/sdb1 /root/test/
[root@localhost ~]# vim /etc/rc.local
[root@localhost ~]# cat /etc/rc.local
touch /var/lock/subsys/local
mount /dev/sdb1 /root/test

8.6.7.2 修改 /etc/fstab

直接到 /etc/fstab进行修改,实现开机自动挂载。以下是挂载的注意事项:

  • 根目录 / 是必须挂载的,而且一定要先于其它挂载点被挂载进来。
  • 其它挂载点必须为已建立的目录,可任意指定,但一定要遵守必须的系统目录架构原则 (FHS)
  • 所有挂载点在同一时间之内,只能挂载一次。
  • 所有磁盘分区(partition)在同一时间之内,只能挂载一次。
  • 如若进行卸除,您必须先将工作目录移到挂载点(及其子目录)之外。

/etc/fstab文件详解

[root@localhost ~]# cat /etc/fstab
# 设备                 挂载点                 文件系统类型  文件系统参数   dump fsck
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=f04bb86f-4d3b-4480-8d55-26a02737fdfd /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

第一栏:设备文件名/UUID/LABEL name:

  • 文件系统或磁盘的装置文件名,如 /dev/vda2 等
  • 文件系统的 UUID 名称,如 UUID=xxx
  • 文件系统的 LABEL 名称,例如 LABEL=xxx

第二栏:挂载点,一定是目录。

第三栏:磁盘分区的文件系统,在手动挂载时可以让系统自动测试挂载,但在这个文件当中我们必须要手动写入文件系统才行!包括 xfs, ext4, vfat, reiserfs, nfs 等等。

第四栏:文件系统参数,默认填写defaults即可,详情可查询相关资料

第五栏:能否被 dump 备份指令作用,dump 是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会啦!直接输入 0 就好了!

第六栏:是否以 fsck 检验扇区,早期开机的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整 (clean)。 不过
这个方式使用的主要是透过 fsck 去做的,我们现在用的 xfs 文件系统就没有办法适用,因为 xfs会自己进行检验,不需要额外进行这个动作!所以直接填 0 就好了。


额外注意

/etc/fstab 是开机时的配置文件,不过,实际文件系统的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个文件当中的。每次我们在更动文件系统的挂载时,也会同时更动这两个文件!但是,万一发生你在 /etc/fstab 输入的数据错误,导致无法顺利开机成功,而进入单人维护模式当中,那时候的 / 可是 read only 的状态,当然你就无法修改 /etc/fstab ,也无法更新 /etc/mtab ~那怎么办?没事,可以利用底下这一招:

[root@localhost ~]# mount -n -o remount,rw /   #重新挂载改成读写

8.5.8 磁盘企业级分区方案

1.通用磁盘分区方案(不太重要的环境,没有用户数据)

运行不太重要的环境,没有用户数据。

/boot 分区 用于引导系统启动,linux内核文件。可能需要升级linux内核,预留到1G即可。

swap 分区 内存不足的时候,swap空间临时充当内存使用。

  • 内存小于8G swap 可以给内存的1.5倍或2倍。 最大控制在8-16G
  • 内存大于8G swap 给8G 8-16G

在一些生产环境中为了极致的速度、性能。会关闭swap。温馨提示:云服务器默认没有swap

/ 分区 根分区剩余多少给多少。


2.通用磁盘分区方案(有重要数据)

/boot 分区 用于引导系统启动,linux内核文件。可能需要升级linux内核,预留到1G即可。

swap 分区 内存不足的时候,swap空间临时充当内存使用。

  • 内存小于8G swap 可以给内存的1.5倍或2倍。 最大控制在8-16G
  • 内存大于8G swap 给8G 8-16G

在一些生产环境中为了极致的速度、性能。会关闭swap。温馨提示:云服务器默认没有swap

/ 分区 根分区 40-100G

/data 数据分区 重要数据放在/data 目录、分区中。


3.通用磁盘分区方案(不知道是否有重要数据)

/boot 分区 用于引导系统启动,linux内核文件。可能需要升级linux内核,预留到1G即可。

swap 分区 内存不足的时候,swap空间临时充当内存使用。

  • 内存小于8G swap 可以给内存的1.5倍或2倍。 最大控制在8-16G
  • 内存大于8G swap 给8G 8-16G

在一些生产环境中为了极致的速度、性能。会关闭swap。温馨提示:云服务器默认没有swap

/ 分区 根分区 40-100G

剩余空间暂不分配,未来谁使用谁分配。


8.5.9 磁盘故障案例(出现磁盘空间不足 no space left on device)

下面会常用到这两个命令,模拟、排查、解决。

dd  if=/dev/zero  of=/usr/local/big   bs=1M  count=5000  #模拟生成大文件,文件大小=bs*count
df -h 查看磁盘使用情况
df -i 查看inode使用情况

8.5.9.1 因为大文件(block不足)

先查看现有的磁盘使用情况

image-20230107104256889


1.模拟创建大文件

创建一个5G的大文件存放在/root目录下

image-20230107105632080


2.排查定位问题

目标:定位大文件在哪里,在哪个目录,是什么文件名字。首先先整体看一下是哪里磁盘看见不足(哪个分区),根据有问题的分区进行详细的一层一层排查,排查到具体目录或文件。


查看磁盘使用情况,相比前面的信息,根目录下的磁盘使用多了5G,也就是上面的模拟大文件存放在/root目录下多出来的。

image-20230107105939344


根据有问题的分区一层一层排查,排查到具体目录或文件。已看到最大的空间使用在/root目录下

image-20230107110139486


或者还可以使用以下命令进行排查

image-20230107110503036


3.解决问题

大致思路如下,一层一层查询大文件,最终找到大文件在/root下。

[root@localhost ~]# du -sh /* |grep G
du: cannot access ‘/proc/12348/task/12348/fd/3’: No such file or directory
du: cannot access ‘/proc/12348/task/12348/fdinfo/3’: No such file or directory
du: cannot access ‘/proc/12348/fd/3’: No such file or directory
du: cannot access ‘/proc/12348/fdinfo/3’: No such file or directory
4.9G    /root
3.6G    /usr
1.3G    /var
[root@localhost ~]# du -sh /root/* | sort -hr
4.9G    /root/big
40K     /root/test
4.0K    /root/initial-setup-ks.cfg
4.0K    /root/anaconda-ks.cfg
0       /root/Videos
0       /root/Templates
0       /root/Public
0       /root/Pictures
0       /root/Music
0       /root/Downloads
0       /root/Documents
0       /root/Desktop

确认文件是否重要,确认是否可以删除。删除后再查看磁盘使用情况。

image-20230107110824193


8.5.9.2 大量小文件(inode不足)

1.模拟

创建小的磁盘分区并格式化。

image-20230107111522580


挂载到/inode目录,查看磁盘inode使用情况。

image-20230107111844354


然后创建大量小文件进行占用inode,模拟inode耗尽,查看磁盘inode使用情况,已经被占满。而且从246开始就创建不了,那是因为这个小磁盘可用的就245个inode,所以从246就创建不了(可用inode情况看上图)

image-20230107112024534


2.排查定位问题

默认出现问题的时候,都是提示空间不足,所以一开始都是查磁盘是否还有空间,但创建文件仍然提示磁盘空间不足,就要查磁盘的inode使用情况。

image-20230107112848774


3.解决问题

排查出小文件处在什么目录下,然后确认是否可以删除。可删除后,再测试是否可以进行写入。

image-20230107113332964


如何寻找小文件多的目录

1.目录中文件越多,目录本身大小越大。

[root@localhost test]# ll -hd /root/test/   #查看目录大小情况
drwxr-xr-x 4 root root 1.5M Jan  6 22:38 /root/test/
[root@localhost test]# ls /root/test/ | wc -l   #统计目录下有多少文件
65521

image-20230107114445544


2.找出系统中大量小文件的目录

思路:显示系统中所有文件, 取出路径部分(目录),然后uniq 统计次数。

#找出/etc下所有文件的路径,交由给xargs转换成命令行参数。然后通过uniq -c统计/etc下各目录有多少文件。再通过sort -rn进行降序排序,最后head -5输出前五个文件多的目录
find /etc -type f | xargs dirname | uniq -c | sort -rn | head -5

8.5.9.3 文件没有被彻底删除

1.了解文件删除原理

Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。

  • i_count的意义是当前文件使用者(或被调用)的数量
  • i_nlink 的意义是介质连接的数量(硬链接的数量)

image-20230107140119200


当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。


对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?


这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。


当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?

前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名(目录block中数据)到文件本身的inode的链接删除了,此时,并没有删除文件的实体即(文件的block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了,那时就是神仙也没有办法了。


2.故障模拟

#模拟创建大文件
seq  50000000 >>/var/log/big.log 
#模拟占用
tail -f /var/log/big.log

模拟大文件的前后磁盘使用对比

image-20230107143351792


新开一个远程连接来模拟程序占用,同时开始排查大文件

du -sh /* |sort -hr
du -sh /var/* |sort -hr
du -sh /var/log/* |sort -hr

最终排查到大文件并删除

image-20230107143821704


但再次查看磁盘使用情况,还是占用这么多。

image-20230107143858975


继续排查,顶多加起来就5G,此时就要怀疑可能是文件没有被彻底删除,这种情况大多出现在被进程或者服务嗦占用了。

image-20230107144911790


3.问题解决

结束或重启对应的进程/服务,现在进行占用排查

lsof |grep delete   #lsof 显示系统中所有被打开的文件,delete表示文件没有入口,但进程调用数不为0。

image-20230107145214619


由于我们是模拟占用,直接kill对应进程即可,再次查看磁盘空间使用情况,已经恢复正常。

image-20230107145523742


posted @ 2023-07-17 21:19  YinJayChen  阅读(30)  评论(0编辑  收藏  举报