Linux 硬盘分区管理

综合案例:文件系统空间不足

硬盘为什么要分区?

  • 将操作系统文件与用户文件分隔开,避免应用数据太多撑满操作系统盘。
  • 限制应用或用户的可用空间。
  • 如果一个分区出现逻辑损坏,仅损坏该分区数据而不影响硬盘上其他分区。
  • 用于创建交换分区。
  • 限制磁盘空间使用,以提高诊断工具和备份镜像的性能。
  • 便于定制文件系统,例如有的文件系统存放大量小文件,有的文件系统存放大量大文件。

fdisk 工具

fdisk 工具可用于管理采用 MBR 分区方案的磁盘,用户可以根据实际情况进行划分分区。

查看分区

fdisk工具大部分操作通过交互式完成,出了查看分区表。

DOS disklabel 指的硬盘管理方式是MBR。

我们使用上一章准备的一块硬盘/dev/sdb。

# 方法1:
[root@server ~ 16:39:54]# fdisk -l /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: DC285F96-F414-4FC8-A428-EEDA235DC885


#         Start          End    Size  Type            Name
 1         2048      4196351      2G  Microsoft basic data01
 2      4196352      6293503      1G  Microsoft basic data02

# 方法2:
[root@server ~ 16:41:30]# fdisk /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: DC285F96-F414-4FC8-A428-EEDA235DC885


#         Start          End    Size  Type            Name
 1         2048      4196351      2G  Microsoft basic data01
 2      4196352      6293503      1G  Microsoft basic data02

创建分区

[root@server ~ 16:44:13]# fdisk /dev/sdb
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

# 选择分区类型
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
# 直接回车,选择默认分区类型:primary
Select (default p): `回车`
Using default response p

# 直接回车,分区号,使用默认值1
Partition number (1-4, default 1): 

# 直接回车,设置分区起始位置为:默认值2048扇区,也就是1M位置。
First sector (2048-41943039, default 2048): 
Using default value 2048

# 设置分区结束位置,输入+2G,也就是起始位置之后2
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G

# 输入w,保存更改并退出
# 输入q,不保存更改并退出
Command (m for help): w
The partition table has been altered!

# 再次验证分区表变化
[root@server ~ 16:45:03]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   99G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0   47G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
├─sdb1            8:17   0    2G  0 part 
└─sdb2            8:18   0    5G  0 part 

注意:如果此时分区表未生成,执行以下命令,通知kernel重新生成分区表。有时候重启系统才会生成最新分区表

# partprobe

删除分区

[root@server ~ 16:45:10]# fdisk /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):d
分区号 (1,2,默认 2):2
分区 2 已删除

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
Disk identifier: DC285F96-F414-4FC8-A428-EEDA235DC885


#         Start          End    Size  Type            Name
 1         2048      4196351      2G  Microsoft basic data01

非交互方式管理

示例1:创建一个分区

# 将要执行的fdisk命令行写入到一个文本文件
[root@server ~ 16:59:18]# vim fdisk-create.txt
n
p
1
2048
+2G
p
w
[root@server ~ 17:01:58]# fisk /dev/sdb < fdisk-create.txt 

# 执行
[root@server ~ 17:03:12]# fdisk /dev/sdb < fdisk-create.txt
[root@server ~ 17:03:57]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   99G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0   47G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
└─sdb1            8:17   0    2G  0 part 

wipefs 工具

作用:清除磁盘分区表信息。

注意:数据无价,操作需谨慎,最好提前备份。

# 清除未挂载磁盘的分区表
[root@server ~ 17:07:41]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   99G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0   47G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
└─sdb1            8:17   0    2G  0 part 
sdc               8:32   0  200G  0 disk 
└─sdc1            8:33   0   20G  0 part 
sr0              11:0    1  4.4G  0 rom  
[root@server ~ 17:07:53]# wipefs -a /dev/sdb
/dev/sdb:8 个字节已擦除,位置偏移为 0x00000200 (gpt):45 46 49 20 50 41 52 54
/dev/sdb:8 个字节已擦除,位置偏移为 0x4fffffe00 (gpt):45 46 49 20 50 41 52 54
/dev/sdb:2 个字节已擦除,位置偏移为 0x000001fe (PMBR):55 aa
/dev/sdb: calling ioclt to re-read partition table: 成功
[root@server ~ 17:08:08]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0  100G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   99G  0 part 
  ├─centos-root 253:0    0   50G  0 lvm  /
  ├─centos-swap 253:1    0    2G  0 lvm  [SWAP]
  └─centos-home 253:2    0   47G  0 lvm  /home
sdb               8:16   0   20G  0 disk 
sdc               8:32   0  200G  0 disk 
└─sdc1            8:33   0   20G  0 part 
sr0              11:0    1  4.4G  0 rom  

# 禁止使用 -f 强制清除分区表
# wipefs -fa /dev/sdb

parted 工具

parted 工具既可以管理采用MBR分区方案的磁盘,又可以管理采用GPT分区方案的磁盘。

parted 命令同时支持交互式操作和非交互式操作(编写脚本)。

我们先来看看交互式操作。

操作流程:

  1. 查看分区表。如果是未初始化硬盘,创建分区。
  2. 设置单位(MiB)
  3. 创建分区
  4. 调整分区大小
  5. 调整分区类型
  6. 删除分区

查看分区表

[root@server ~ 17:08:13]# parted /dev/sdb
GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
                                                                         (parted) print
错误: /dev/sdb: unrecognised disk label
                                                                         Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags: 

设置单位

parted工具默认单位是MB(103K),设置为MiB(210KiB)

(parted) unit MiB

管理 MBR 磁盘

设置磁盘分区管理方案
(parted) print
错误: /dev/sdb: unrecognised disk label
                                                                         Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags: 

# 输入mklabel或mktable设置磁盘分区管理方案
# 设置分区方案为msdos,也就是MBR,输入mklabel msdos
(parted) mklabel msdos
                                                                         (parted) print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
# 分区表已改成msdos
Partition Table: msdos
Disk Flags: 

Number  Start  End  Size  Type  File system  标志

**注意:**parted命令所做更改立刻生效。

创建分区
# 创建分区,输入 mkpart
(parted) `mkpart`

# 设置分区类型,输入 primary
Partition type?  primary/extended? `primary`                     

# 设置分区文件系统类型,输入 xfs,实际不生效,格式化文件系统仍需手动操作
File system type?  [ext2]? `xfs`                                 

# 设置分区起始位置,输入 1
Start? `1` 

# 设置分区结束位置,输入 2049
End? `2049`                                                              
(parted) `print`   
(parted) print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  标志
 1      1049kB  2049MB  2048MB  primary  xfs

删除分区
# 1 代表分区号
(parted) rm 1
                                                                         (parted) print 
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start  End  Size  Type  File system  标志

免交互操作
# 设置磁盘分区管理方案
[root@server ~ 17:16:29]# parted /dev/sdb mklabel msdos
警告: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue?
                                                                                                                                                  是/Yes/否/No? yes
信息: You may need to update /etc/fstab.

# 查看分区                                                               [root@server ~ 17:16:52]# parted /dev/sdb unit MiB print
...
Number  Start  End  Size  Type  File system  标志

# 创建分区
[root@server ~ 17:17:14]# parted /dev/sdb unit MiB mkpart primary 1 2049
信息: You may need to update /etc/fstab.

                                                                         [root@server ~ 17:18:06]# parted /dev/sdb unit MiB print
...
Number  Start    End      Size     Type     File system  标志
 1      1.00MiB  2049MiB  2048MiB  primary  xfs


# 扩展分区
[root@server ~ 17:18:24]# parted /dev/sdb unit MiB resizepart 1 5121
信息: You may need to update /etc/fstab.

                                                                         [root@server ~ 17:20:39]#  parted /dev/sdb unit MiB print
...
Number  Start    End      Size     Type     File system  标志
 1      1.00MiB  5121MiB  5120MiB  primary  xfs

# 删除分区
[root@server ~ 17:20:53]# parted /dev/sdb rm 1
信息: You may need to update /etc/fstab.

                                                                         [root@server ~ 17:22:12]# parted /dev/sdb unit MiB print
...
Number  Start  End  Size  Type  File system  标志

管理 GPT 磁盘

管理GPT磁盘基本与管理MBR磁盘一致,除了创建分区。

设置磁盘分区管理方案
# 设置分区方案为gpt,输入mklabel gpt
[root@server ~ 17:24:25]# parted /dev/sdb
GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
                                                                         (parted) mklabel gpt
警告: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue?
                                                                                                                                                  是/Yes/否/No? yes
             
创建分区
(parted) unit MiB
                                                                         (parted) mkpart
                                                                         分区名称?  []? data01
                                                                         文件系统类型?  [ext2]? xfs
                                                                         起始点? 1
                                                                         结束点? 2049
                                                                         (parted) print 
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 20480MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start    End      Size     File system  Name    标志
 1      1.00MiB  2049MiB  2048MiB  xfs          data01

扩展分区
(parted) resizepart 1 5121
                                                                         (parted) print 
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 20480MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start    End      Size     File system  Name    标志
 1      1.00MiB  5121MiB  5120MiB  xfs          data01
删除分区
(parted) rm 1
                                                                         (parted) print 
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 20480MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  标志
免交互操作
# 设置磁盘分区管理方案
[root@server ~ 17:28:59]# parted /dev/sdb mklabel gpt
警告: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue?
                                                                        是/Yes/否/No? yes

# 创建分区
[root@server ~ 17:29:27]# parted /dev/sdb unit MiB mkpart data01 1 2049
信息: You may need to update /etc/fstab.

# 查看分区                                                               [root@server ~ 17:30:50]# parted /dev/sdb unit MiB print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 20480MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start    End      Size     File system  Name    标志
 1      1.00MiB  2049MiB  2048MiB  xfs          data01

# 删除分区
[root@server ~ 17:31:07]# parted /dev/sdb rm 1
信息: You may need to update /etc/fstab.

                                                                         [root@server ~ 17:33:05]# parted /dev/sdb print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start  End  Size  File system  Name  标志

文件系统持久化挂载

环境准备

利用 parted 创建一个分区,并格式化为xfs文件系统。

[root@server ~ 17:33:24]# parted /dev/sdb mklabel gpt
警告: The existing disk label on /dev/sdb will be destroyed and all data on
this disk will be lost. Do you want to continue?
                                                                                                                                                  是/Yes/否/No? yes
信息: You may need to update /etc/fstab.

                                                                         [root@server ~ 17:34:27]# parted /dev/sdb unit MiB mkpart data01 xfs 1 2049
信息: You may need to update /etc/fstab.

                                                                         [root@server ~ 17:34:58]# mkfs.xfs /dev/sdb1
mkfs.xfs: /dev/sdb1 appears to contain an existing filesystem (xfs).
mkfs.xfs: Use the -f option to force overwrite.
# 如果格式化时候,提示存在文件系统,则需要-f选项强制格式化
[root@server ~ 17:35:12]# mkfs.xfs -f /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=524288, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

持久化挂载

当服务器重启时,系统不会再次将文件系统自动挂载到目录树上,用户无法访问。为了确保系统在启动时自动挂载文件系统, 需要在 /etc/fstab文件中添加一个条目。

/etc/fstab 是以空格分隔的文件,每行具有六个字段。

  • **第一个字段指定设备。**可以使用UUID或device来指定设备。
  • **第二个字段是目录挂载点。**通过它可以访问目录结构中的块设备。挂载点必须存在;如果不存在,请使用mkdir命令进行创建。
  • 第三个字段包含文件系统类型,如xfs或ext4 。
  • 第四个字段是挂载选项,以逗号分隔的。 defaults是一组常用选项。详细信息参考mount(8) 。
  • 第五个字段指定dump命令是否备份设备。
  • 第六个字段指定fsck顺序字段,决定了在系统启动吋是否应运行fsck命令,以验证文件系统是否干净。 该字段中的值指示了 fsck的运行顺序。 对于XFS文件系统, 请将该字段设为0 ,因为XFS并不使用fsck来检查自己的文件系统状态。 对于ext4 文件系统,如果是根文件系统, 请将该字段设 为 1 ; 如果是其他ext4 文件系统, 则将该字段设为2。 这样, fsck就会先处理根文件系统,然后同步检查不同磁盘上的文件系统,并按顺序检查同一磁盘上的文件系统。
[root@server ~ 17:35:19]# blkid /dev/sdb1
/dev/sdb1: UUID="2bbc90b2-7d19-4d12-b84d-1b442958424f" TYPE="xfs" PARTLABEL="data01" PARTUUID="fcd3c29a-f293-4f4a-91ef-962b10ebe29e" 
[root@server ~ 17:36:19]# vim /etc/fstab

# 最后一行增加一个条目
UUID="2bbc90b2-7d19-4d12-b84d-1b442958424f" /data01 xfs defaults 0 0

# 使用如下命令立刻挂载
[root@server ~ 17:37:11]# mount /data01
mount: 挂载点 /data01 不存在
[root@server ~ 17:37:28]# mkdir /data01
[root@server ~ 17:37:40]# mount /data01

# 验证
[root@server ~ 17:37:42]# df -h /data01
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1       2.0G   33M  2.0G    2% /data01

# 重启系统验证
#reboot
#df -h /data01

取消持久化挂载

删除/etc/fstab中对应条目即可。

案例

情况1:大量的大文件占用空间

准备环境

[root@server ~ 14:15:29]# parted /dev/sdb mklabel gpt
信息: You may need to update /etc/fstab.

                                                                         [root@server ~ 14:34:46]# parted /dev/sdb unit MiB mkpart data01 xfs 1 2049
信息: You may need to update /etc/fstab.

                                                                         [root@server ~ 14:35:49]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb               8:16   0   20G  0 disk 
└─sdb1            8:17   0    2G  0 part 
sdc               8:32   0  200G  0 disk 
└─sdc1            8:33   0   20G  0 part 
sr0              11:0    1  4.4G  0 rom  

#格式化
[root@server ~ 14:36:28]# mkfs.xfs /dev/sdb1
mkfs.xfs: /dev/sdb1 appears to contain an existing filesystem (xfs).
mkfs.xfs: Use the -f option to force overwrite.

#加-f强制格式化
[root@server ~ 14:36:46]# mkfs.xfs -f /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
...

[root@server ~ 14:37:00]# mkdir /myapp-1
[root@server ~ 14:38:27]# mount /dev/sdb1 /myapp-1
[root@server ~ 14:38:44]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 475M     0  475M    0% /dev
tmpfs                    487M  7.7M  479M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/mapper/centos-root   50G  2.0G   49G    4% /
/dev/sdb1                2.0G   33M  2.0G    2% /myapp-1
[root@server ~ 14:38:48]# cp -r /etc/ /myapp-1/

# 创建一个大文件
[root@server ~ 14:39:02]# dd if=/dev/zero of=/myapp-1/etc/bigfile bs=1M count=2000
dd: 写入"/myapp-1/etc/bigfile" 出错: 设备上没有空间
记录了1972+0 的读入
记录了1971+0 的写出
2067202048字节(2.1 GB)已复制,7.99655 秒,259 MB/秒

原因:大文件占用大量空间。

解决方法:找到文件后删除。

[root@server ~ 14:40:35]# df -h /dev/sdb1
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1       2.0G  2.0G  344K  100% /myapp-1
# 方法1:find 查找
[root@server ~ 14:40:47]# find /myapp-1/ -size +100M
/myapp-1/etc/bigfile

# 方法2:du 查找
[root@server ~ 14:41:12]# du -s /myapp-1/*
2052328 /myapp-1/etc
[root@server ~ 14:41:34]# du -s /myapp-1/etc/* | sort -n |tail -5
656     /myapp-1/etc/services
1860    /myapp-1/etc/pki
8672    /myapp-1/etc/udev
19452   /myapp-1/etc/selinux
2018752 /myapp-1/etc/bigfile

#删除大文件
[root@server ~ 14:41:59]# rm -f /myapp-1/etc/bigfile 
[root@server ~ 14:43:23]# df -h /dev/sdb1
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1       2.0G   67M  2.0G    4% /myapp-1

情况2:删除文件后,空间没有释放

准备环境

[root@server ~ 14:43:37]# dd if=/dev/zero of=/myapp-1/etc/bigfile bs=1M count=2000
dd: 写入"/myapp-1/etc/bigfile" 出错: 设备上没有空间
记录了1972+0 的读入
记录了1971+0 的写出
2067202048字节(2.1 GB)已复制,3.35014 秒,617 MB/秒
[root@server ~ 14:47:07]# tail -f /myapp-1/etc/bigfile &
[1] 109246
[root@server ~ 14:47:32]# rm -f /myapp-1/etc/bigfile
[root@server ~ 14:48:26]# df -h /myapp-1/
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1       2.0G  2.0G  344K  100% /myapp-1

原因:被删除的文件,仍然有程序在使用。

解决方法:找到像一个的程序并,终止程序。

[root@server ~ 14:54:28]# lsof |grep /myapp-1/
tail      123447         root    3r      REG               8,17 2067202048        797 /myapp-1/etc/bigfile (deleted)
[root@server ~ 14:54:48]# kill -9 123447
[root@server ~ 14:55:12]# df -h /myapp-1
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb1       2.0G   67M  2.0G    4% /myapp-1
[1]+  已杀死               tail -f /myapp-1/etc/bigfile

建议:清理大文件,先使用重定向清空文件内容,再删除文件。

情况3:大量的小文件占用空间

准备环境

[root@server ~ 15:04:12]# parted /dev/sdb unit MiB mkpart data02 ext4 2049 3073
信息: You may need to update /etc/fstab.

                                                                         [root@server ~ 15:07:45]# mkfs.ext4 /dev/sdb2
[root@server ~ 15:07:58]# mkdir /myapp-2
[root@server ~ 15:08:15]# mount /dev/sdb2 /myapp-2
[root@server ~ 15:08:28]# df -i /dev/sdb2
文件系统       Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb2      65536      11   65525       1% /myapp-2
[root@server ~ 15:08:48]# touch /myapp-2/file-{00001..65530}
touch: 无法创建"/myapp-2/file-65526": 设备上没有空间
touch: 无法创建"/myapp-2/file-65527": 设备上没有空间
touch: 无法创建"/myapp-2/file-65528": 设备上没有空间
touch: 无法创建"/myapp-2/file-65529": 设备上没有空间
touch: 无法创建"/myapp-2/file-65530": 设备上没有空间
[root@server ~ 15:09:39]# df -i /myapp-2
文件系统       Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb2      65536   65536       0     100% /myapp-2

原因:文件系统中inode使用完了。

解决方法:删除大量的小文件或者将这些小文件备份到其他地方。

# 思路1:直接将这些小文件移走或删除
[root@server ~ 15:09:46]# rm -rf /myapp-2/*
[root@server ~ 15:11:17]# df -i /myapp-2
文件系统       Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb2      65536      10   65526       1% /myapp-2

# 思路2:合并大量小文件为单个文件
# cat /myapp-2/file-{00001..10000} > file-00001

管理软 RAID

RHEL 提供多磁盘和设备管理 (mdadm) 程序实用程序来创建和管理软件RAID。

管理 RAID0

创建 RAID
# 创建一个包含2个块设备的raid0设备/dev/md0
[root@server ~ 18:05:36]# mdadm --create /dev/md0 --level 0 --raid-devices 2 /dev/sd{b,c}
mdadm: /dev/sdb appears to be part of a raid array:
       level=raid1 devices=2 ctime=Mon Sep 22 16:13:54 2025
mdadm: /dev/sdc appears to be part of a raid array:
       level=raid1 devices=2 ctime=Mon Sep 22 16:13:54 2025
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
查看 RAID
[root@server ~ 18:05:51]# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Mon Sep 22 18:05:51 2025
        Raid Level : raid0
        Array Size : 41908224 (39.97 GiB 42.91 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Mon Sep 22 18:05:51 2025
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

        Chunk Size : 512K

Consistency Policy : none

              Name : server.cloud:0  (local to host server.cloud)
              UUID : bc41d24c:6d740496:79c97587:c2c90f56
            Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

需要关注的属性

  • Raid Level : raid0
  • State : clean
  • Chunk Size : 512K
  • 设备清单
[root@server ~ 18:06:13]# lsblk /dev/md0
NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md0    9:0    0  40G  0 raid0 
格式化和挂载
[root@server ~ 18:10:30]# mkdir -p /data/raid0
[root@server ~ 18:10:49]#  mount /dev/md0 /data/raid0
mount: 将 /dev/md0 挂载到 /data/raid0 失败: 结构需要清理
[root@server ~ 18:11:02]# mkfs.xfs -f /dev/md0
meta-data=/dev/md0               isize=512    agcount=16, agsize=654720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=10475520, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=5120, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0


[root@server ~ 18:12:22]#  mount /dev/md0 /data/raid0
[root@server ~ 18:12:29]# df -h /data/raid0
文件系统        容量  已用  可用 已用% 挂载点
/dev/md0         40G   33M   40G    1% /data/raid0
[root@server ~ 18:12:33]# cp /etc/ho* /data/raid0
[root@server ~ 18:12:38]# ls /data/raid0/
host.conf  hostname  hosts  hosts.allow  hosts.deny
删除 RAID
[root@server ~ 18:12:43]#  umount /dev/md0
[root@server ~ 18:13:46]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
[root@server ~ 18:13:51]# mdadm --zero-superblock /dev/sd{b,c}
补充说明
  • raid0 条带不能增加新成员盘。
  • raid0 条带不能强制故障成员盘。

管理 RAID1

创建 RAID
[root@server ~ 18:15:39]# mdadm --create /dev/md1 --level 1 --raid-devices 2 /dev/sd{b,c}
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
查看 RAID
[root@server ~ 18:15:59]#  mdadm --detail /dev/md1
/dev/md1:
           Version : 1.2
     Creation Time : Mon Sep 22 18:15:59 2025
        Raid Level : raid1
        Array Size : 20954112 (19.98 GiB 21.46 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Mon Sep 22 18:15:59 2025
             State : clean, resyncing 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

     Resync Status : 4% complete

              Name : server.cloud:1  (local to host server.cloud)
              UUID : de9289f7:c2705404:737e1b21:02f12f4b
            Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

需要关注的属性

  • Raid Level : raid1
  • State : clean, resyncing,正在同步。
  • Consistency Policy : resync
  • Resync Status : 33% complete,同步进度。
  • 设备清单
[root@server ~ 18:16:04]# lsblk /dev/md1
NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md1    9:1    0  20G  0 raid1 
格式化和挂载

等待同步完成:直到同步进度达到100%,然后进行格式化和挂载。

[root@server ~ 18:17:48]# mkfs.xfs -f /dev/md1
[root@server ~ 18:17:55]#  mkdir /data/raid1
[root@server ~ 18:18:01]# mount /dev/md1 /data/raid1
[root@server ~ 18:18:05]# df -h /data/raid1
文件系统        容量  已用  可用 已用% 挂载点
/dev/md1         20G   33M   20G    1% /data/raid1

# 创建数据
[root@server ~ 18:18:09]#  cp /etc/ho* /data/raid1
[root@server ~ 18:18:14]# ls /data/raid1/
host.conf  hostname  hosts  hosts.allow  hosts.deny
增加热备盘
[root@server ~ 18:18:18]# mdadm /dev/md1 --add /dev/sdd
mdadm: added /dev/sdd
[root@server ~ 18:19:06]# mdadm --detail /dev/md1 |tail -5
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

       2       8       48        -      spare   /dev/sdd
模拟故障
# 强制成员盘故障
[root@server ~ 18:19:11]# mdadm /dev/md1 --fail /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md1

# 查看成员状态
[root@server ~ 18:19:36]# mdadm --detail /dev/md1 |tail -5
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       2       8       48        1      spare rebuilding   /dev/sdd

       1       8       32        -      faulty   /dev/sdc
       
# 数据依然正常访问       
[root@server ~ 18:19:43]# ls /data/raid1/
host.conf  hostname  hosts  hosts.allow  hosts.deny
删除故障磁盘
[root@server ~ 18:19:53]# mdadm /dev/md1 --remove /dev/sdc
mdadm: hot removed /dev/sdc from /dev/md1
[root@server ~ 18:21:16]#  mdadm --detail /dev/md1 |tail -5
            Events : 42

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       2       8       48        1      active sync   /dev/sdd
删除 RAID
[root@server ~ 18:21:29]#  umount /dev/md1
[root@server ~ 18:21:48]#  mdadm --stop /dev/md1
mdadm: stopped /dev/md1
[root@server ~ 18:21:53]#  mdadm --zero-superblock /dev/sd{b..d}
补充说明

RAID1的设计初衷是数据冗余和可靠性,‌而不是为了增加存储容量。‌因此,‌即使添加了新的硬盘并进行了扩容操作,‌由于RAID1的工作方式,‌其总容量是不会增加的。

管理 RAID5

创建 RAID
# 创建一个包含4个块设备的raid5设备/dev/md2
[root@server ~ 18:22:00]# mdadm --create /dev/md5 --level 5 --raid-devices 4 /dev/sd{b..e}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.
查看 RAID
[root@server ~ 18:23:10]# mdadm --detail /dev/md5
/dev/md5:
           Version : 1.2
     Creation Time : Mon Sep 22 18:23:09 2025
        Raid Level : raid5
        Array Size : 62862336 (59.95 GiB 64.37 GB)
     Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Mon Sep 22 18:23:10 2025
             State : clean, degraded, recovering 
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

    Rebuild Status : 3% complete

              Name : server.cloud:5  (local to host server.cloud)
              UUID : 81995236:dae7b827:638222b6:7426e4a2
            Events : 1

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      spare rebuilding   /dev/sde

需要关注的属性

  • Raid Level : raid5
  • State : clean, resyncing,正在同步。
  • Consistency Policy : resync
  • Resync Status : 17% complete,同步进度。
  • 设备清单
[root@server ~ 18:24:37]# mkfs.xfs -f /dev/md5
[root@server ~ 18:24:44]# mkdir /data/raid5
[root@server ~ 18:24:50]# mount /dev/md5 /data/raid5
[root@server ~ 18:24:55]#  df -h /data/raid5/
文件系统        容量  已用  可用 已用% 挂载点
/dev/md5         60G   33M   60G    1% /data/raid5
[root@server ~ 18:24:59]# cp /etc/ho* /data/raid5
[root@server ~ 18:25:04]#  ls /data/raid5/
host.conf  hostname  hosts  hosts.allow  hosts.deny
增加热备盘
# RAID5 阵列增加一个块热备盘
[root@server ~ 18:25:08]# mdadm /dev/md5 --add /dev/sdf
mdadm: added /dev/sdf
[root@server ~ 18:25:49]# mdadm --detail /dev/md5 |tail -7
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde

       5       8       80        -      spare   /dev/sdf
模拟故障
[root@server ~ 18:25:53]#  mdadm /dev/md5 --fail /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md5
[root@server ~ 18:27:01]# mdadm --detail /dev/md5 |tail -7
    Number   Major   Minor   RaidDevice State
       5       8       80        0      spare rebuilding   /dev/sdf
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde

       0       8       16        -      faulty   /dev/sdb
[root@server ~ 18:27:13]# ls /data/raid5/
host.conf  hostname  hosts  hosts.allow  hosts.deny
删除故障磁盘
[root@server ~ 18:27:37]#  mdadm /dev/md5 --remove /dev/sdb
mdadm: hot removed /dev/sdb from /dev/md5
[root@server ~ 18:28:06]# mdadm --detail /dev/md5 |tail -5
    Number   Major   Minor   RaidDevice State
       5       8       80        0      spare rebuilding   /dev/sdf
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde
删除 RAID
# 卸载
[root@server ~ 18:28:13]#  umount /dev/md5

# stop RAID 阵列,将删除阵列
[root@server ~ 18:29:12]#  mdadm --stop /dev/md5
mdadm: stopped /dev/md5

# 清除原先设备上的 md superblock
[root@server ~ 18:29:17]# mdadm --zero-superblock /dev/sd{b..g}
mdadm: Unrecognised md component device - /dev/sdg
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐