Linux 硬盘分区管理
硬盘为什么要分区?
- 将操作系统文件与用户文件分隔开,避免应用数据太多撑满操作系统盘。
- 限制应用或用户的可用空间。
- 如果一个分区出现逻辑损坏,仅损坏该分区数据而不影响硬盘上其他分区。
- 用于创建交换分区。
- 限制磁盘空间使用,以提高诊断工具和备份镜像的性能。
- 便于定制文件系统,例如有的文件系统存放大量小文件,有的文件系统存放大量大文件。
MBR 分区方案
自 1982年以来,主启动记录(MBR)分区方案指定了在运行 BIOS 固件的系统上如何对磁盘进行分区:

-
该方案支持最多4个主分区。
-
在 Linux系统上,管理员可以使用扩展分区和逻辑分区来创建最多 15个分区。
逻辑分区是可以格式化(format),扩展分区是不可以格式化。
-
MBR 记录用4个字节(1byte=8bit)存储分区的总扇区数,最大能表示2的32次方的扇区个数,按每扇区512字节计算,每个分区最大不能超过 2 TiB。
通常,我们将磁盘第一个扇区称为主引导扇区,位于硬盘的柱面0、磁头0、扇区1的位置,这一扇区包含MBR引导代码,承担系统启动职能。它不属于磁盘上任何分区,因而分区空间内的格式化命令不能清除主引导记录的任何信息
主引导扇区由三个部分组成:
- 引导程序(占446个字节),硬盘启动时将系统控制权转给分区表中的某个操作系统。
- 磁盘分区表项(DPT,Disk Partition Table),由四个分区表项构成(每个16个字节)。
- 结束标志(占2个字节),其值为AA55(十六进制)。
查看分区
fdisk工具大部分操作通过交互式完成,出了查看分区表。
[root@server ~ 10:29:34]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
└─centos-home 253:2 0 145.1G 0 lvm /home
sdb 8:16 0 100G 0 disk
sr0 11:0 1 4.4G 0 rom
[root@server ~ 10:30:03]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x25bf8279 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):m
命令操作
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
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
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
#创建分区
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-209715199,默认为 2048):
将使用默认值 2048
#分区结束位置+20G
Last 扇区, +扇区 or +size{K,M,G} (2048-209715199,默认为 20
分区 1 已设置为 Linux 类型,大小设为 10 GiB
#查看分区表
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x25bf8279
设备 Boot Start End Blocks Id Syste
/dev/sdb1 2048 20973567 10485760 83 Lin
#保存并退出
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
#查看分区情况
[root@server ~ 10:31:06]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
└─centos-home 253:2 0 145.1G 0 lvm /home
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 10G 0 part
sr0 11:0 1 4.4G 0 rom
删除分区
输入d,删除分区,因为只有1个分区,所以自动删除了第一个分区
新版本的fdisk已经可以接管gpt分区
GPT 分区方案
GPT是运行统一可扩展固件接口(UEFI)固件系统上硬盘分区表的标准。
-
MBR分区方案只能管理最大2TiB分区和磁盘。全局唯一标识分区表(GPT,GUID Partition Table)使用8个字节(1byte=8bit)存储分区的总扇区数,可支持最多8 ZiB(=264*512 Byte),即80亿太字节的分区和磁盘。
-
MBR分区方案支持最多15个分区。GPT分区方案最多可提供128个分区。
-
GPT提供分区表信息的冗余。
gdisk 工具
gdisk工具用于管理采用GPT分区方案的磁盘分区,主要用于管理磁盘容量超过2T的磁盘。
#查看磁盘
[root@server ~ 10:37:30]# gdisk -l /dev/sdc
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries.
Disk /dev/sdc: 209715200 sectors, 100.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 92890109-BAFB-4EF2-A13A-14B4E63D1CE7
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 209715166
Partitions will be aligned on 2048-sector boundaries
Total free space is 209715133 sectors (100.0 GiB)
Number Start (sector) End (sector) Size Code Name
[root@server ~ 10:38:34]# gdisk /dev/sdc
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries.
Command (? for help): p
Disk /dev/sdc: 209715200 sectors, 100.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): D388A588-0CB5-488B-A640-3C40FEFDAD4F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 209715166
Partitions will be aligned on 2048-sector boundaries
Total free space is 209715133 sectors (100.0 GiB)
Number Start (sector) End (sector) Size Code Name
#创建新分区
Command (? for help): n
#分区号
Partition number (1-128, default 1):
#起始位置 默认值
First sector (34-209715166, default = 2048) or {+-}size{KMGTP}:
#分区结束位置 +10G
Last sector (2048-209715166, default = 209715166) or {+-}size{KMGTP}: +10G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
#查看分区表
Command (? for help): p
Disk /dev/sdc: 209715200 sectors, 100.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): D388A588-0CB5-488B-A640-3C40FEFDAD4F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 209715166
Partitions will be aligned on 2048-sector boundaries
Total free space is 188743613 sectors (90.0 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 20973567 10.0 GiB 8300 Linux filesystem
#再创建新分区
Command (? for help): n
Partition number (2-128, default 2):
First sector (34-209715166, default = 20973568) or {+-}size{KMGTP}:
#分区结束位置+20G
Last sector (20973568-209715166, default = 209715166) or {+-}size{KMGTP}: +20G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'
Command (? for help): p
Disk /dev/sdc: 209715200 sectors, 100.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): D388A588-0CB5-488B-A640-3C40FEFDAD4F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 209715166
Partitions will be aligned on 2048-sector boundaries
Total free space is 146800573 sectors (70.0 GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 20973567 10.0 GiB 8300 Linux filesystem
2 20973568 62916607 20.0 GiB 8300 Linux filesystem
#保存并退出
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.
#查看两个分区
[root@server ~ 10:40:21]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 199G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
└─centos-home 253:2 0 145.1G 0 lvm /home
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 10G 0 part
sdc 8:32 0 100G 0 disk
├─sdc1 8:33 0 10G 0 part
└─sdc2 8:34 0 20G 0 part
sr0 11:0 1 4.4G 0 rom
删除分区 输入d
wipefs 工具
作用:清除磁盘分区表信息。
注意:数据无价,操作需谨慎,最好提前备份。
parted 工具
parted 工具既可以管理采用MBR分区方案的磁盘,又可以管理采用GPT分区方案的磁盘。
parted 命令同时支持交互式操作和非交互式操作(编写脚本)。
我们先来看看交互式操作。
操作流程:
- 查看分区表。如果是未初始化硬盘,创建分区。
- 设置单位(MiB)
- 创建分区
- 调整分区大小
- 调整分区类型
- 删除分区
查看分区表
交互式管理
[root@server ~ 11:17:47]# parted /dev/sdb mklabel msdos
[root@server ~ 11:18:44]# parted /dev/sdb
GNU Parted 3.1
使用 /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of
commands.
(parted) unit MiB
(parted) mkpart
分区类型? primary/主分区/extended/扩展分区? primary
文件系统类型? [ext2]? ext4
起始点? 1
结束点? 10241
(parted) print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 102400MiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
1 1.00MiB 10241MiB 10240MiB primary
(parted) q
信息: You may need to update /etc/fstab.
非交互式管理
[root@server ~ 11:20:04]# parted /dev/sdb unit MiB mkpart primary xfs 10241 30721
信息: You may need to update /etc/fstab.
[root@server ~ 11:22:11]# parted /dev/sdb unit MiB print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 102400MiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
1 1.00MiB 10241MiB 10240MiB primary
2 10241MiB 30721MiB 20480MiB primary
[root@server ~ 11:22:31]# parted /dev/sdb rm 2
信息: You may need to update /etc/fstab.
#查看是否删除
[root@server ~ 11:23:24]# parted /dev/sdb unit MiB print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 102400MiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
1 1.00MiB 10241MiB 10240MiB primary
文件系统持久化挂载
环境准备
利用 parted 创建一个分区,并格式化为xfs文件系统。
扩容 物理空间和文件系统空间扩容
#格式化挂载
[root@server ~ 11:23:47]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2621440, 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
[root@server ~ 11:38:37]# mkdir /data01
#挂载到data01
[root@server ~ 11:38:52]# mount /dev/sdb1 /data01
#确认容量
[root@server ~ 11:39:17]# df -h /data01
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 10G 33M 10G 1% /data01
#取消挂载
[root@server ~ 11:39:31]# umount /data01
#扩大容量
[root@server ~ 11:39:46]# parted /dev/sdb unit MiB resizepart 1 51201
信息: You may need to update /etc/fstab.
#查看扩容 [root@server ~ 11:40:21]# parted /dev/sdb unit MiB print
Model: ATA VMware Virtual S (scsi)
Disk /dev/sdb: 102400MiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system 标志
1 1.00MiB 51201MiB 51200MiB primary xfs
#继续挂载
[root@server ~ 11:41:39]# mount /dev/sdb1 /data01
#发现文件系统空间不变
[root@server ~ 11:42:21]# df -h /data01
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 10G 33M 10G 1% /data01
#扩文件系统
[root@server ~ 11:42:43]# xfs_growfs /data01
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 2621440 to 13107200
#查看是否扩容成功
[root@server ~ 11:42:53]# df -h /data01
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 50G 33M 50G 1% /data01
持久化挂载
当服务器重启时,系统不会再次将文件系统自动挂载到目录树上,用户无法访问。为了确保系统在启动时自动挂载文件系统, 需要在 /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 ~ 11:42:57]# yum install -y httpd
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
base | 3.6 kB 00:00
epel | 4.3 kB 00:00
extras | 2.9 kB 00:00
updates | 2.9 kB 00:00
软件包 httpd-2.4.6-99.el7.centos.1.x86_64 已安装并且是最新版本
无须任何处理
#启用
[root@server ~ 13:48:39]# systemctl enable httpd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
#编辑配置文件
[root@server ~ 13:49:29]# vim /etc/fstab
#最后加上一条
/dev/sdb1 /var/www/html xfs defaults 0 0
[root@server ~ 13:51:30]# echo hello world > /var/www/index.html
[root@server ~ 13:51:56]# setenforce 0
#重启
[root@server ~ 13:52:07]# reboot
#查看是否挂载
[root@server ~ 14:11:47]# df -h /dev/sdb1
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 50G 33M 50G 1% /var/www/html

取消持久化挂载
删除/etc/fstab中对应条目即可。
综合案例:文件系统空间不足
情况1:大量的大文件占用空间
准备环境
[root@server ~ 14:28:28]# 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? y
信息: You may need to update /etc/fstab.
[root@server ~ 14:29:26]# parted /dev/sdb unit MiB mkpart data01 xfs 1 2049
信息: You may need to update /etc/fstab.
#强制格式化
[root@server ~ 14:30:11]# mkfs.xfs /dev/sdb1 -f
[root@server ~ 14:30:28]# mkdir /myapp
[root@server ~ 14:30:55]# mount /dev/sdb1 /myapp
mount: /dev/sdb1:不能读超级块
[root@server ~ 14:31:08]# cp -r /etc/ /myapp/
[root@server ~ 14:31:30]# dd if=/dev/zero of=/myapp/etc/bigfile bs=1M count=2000
记录了2000+0 的读入
记录了2000+0 的写出
2097152000字节(2.1 GB)已复制,9.17533 秒,229 MB/秒
原因:大文件占用大量空间。
解决方法:找到文件后删除。
#find查找
[root@server ~ 14:37:54]# find /myapp/ -size +100M
/myapp/etc/bigfile
#du命令查找
[root@server ~ 14:39:30]# du -s /myapp/* |sort -n |tail -2
2050160 /myapp/etc
[root@server ~ 14:40:10]# du -s /myapp/etc/* |sort -n |tail -2
23220 /myapp/etc/selinux
2007040 /myapp/etc/bigfile
[root@server ~ 14:40:22]# du -s /myapp/etc/bigfile/* |sort -n |tail -2
du: 无法访问"/myapp/etc/bigfile/*": 不是目录
#找到后删除
[root@server ~ 14:40:33]# rm -f /myapp/etc/bigfile/
情况2 :删除文件后,空间没有释放
准备环境
[root@server ~ 14:46:16]# dd if=/dev/zero of=/myapp/etc/bigfile bs=1M count=2000
dd: 写入"/myapp/etc/bigfile" 出错: 设备上没有空间
记录了1962+0 的读入
记录了1961+0 的写出
2056257536字节(2.1 GB)已复制,8.85488 秒,232 MB/秒
[root@server ~ 15:03:06]# tail -f /myapp/etc/bigfile &
[1] 3153
原因:被删除的文件,仍然有程序在使用。
解决方法:找到像一个的程序并,终止程序。
[root@server ~ 15:03:41]# df -h /myapp/
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 2.0G 2.0G 880K 100% /myapp
#删除文件后,空间没有被释放
[root@server ~ 15:04:43]# rm -f /myapp/etc/bigfile
[root@server ~ 15:04:54]# df -h /myapp/
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 2.0G 2.0G 880K 100% /myapp
#查看哪个程序在被使用
[root@server ~ 15:04:57]# lsof | grep delete | grep myapp
tail 3153 root 3r REG 8,17 2056257536 1049 /myapp/etc/bigfile (deleted)
[root@server ~ 15:05:46]# kill 3153
[root@server ~ 15:05:59]# df -h /myapp/
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb1 2.0G 77M 2.0G 4% /myapp
[1]+ 已终止 tail -f /myapp/etc/bigfile
情况3:大量的小文件占用空间
准备环境
[root@server ~ 15:08:54]# parted /dev/sdb unit MiB mkpart data02 ext4 2049 3073
信息: You may need to update /etc/fstab.
[root@server ~ 15:09:01]# mkfs.ext4 /dev/sdb2
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
第一个数据块=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: 完成
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@server ~ 15:09:20]# mkdir /myapp-2
[root@server ~ 15:09:33]# mount /dev/sdb2 /myapp-2
[root@server ~ 15:10:42]# touch /myapp-2/file-{1..200}
[root@server ~ 15:14:04]# touch /myapp-2/hello
No space left on device
原因:文件系统中inode使用完了。
解决方法:删除大量的小文件或者将这些小文件备份到其他地方。
#没有可用的inode
[root@server ~ 15:14:07]df -hi /myapp-2
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb2 64K 64K 0 100% /myapp-2
#直接删除小文件
[root@server ~ 15:14:12]# rm -f /myapp-2/file-0*
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@server ~ 15:09:20]# mkdir /myapp-2
[root@server ~ 15:09:33]# mount /dev/sdb2 /myapp-2
[root@server ~ 15:10:42]# touch /myapp-2/file-{1…200}
[root@server ~ 15:14:04]# touch /myapp-2/hello
No space left on device
**原因**:文件系统中inode使用完了。
**解决方法**:删除大量的小文件或者将这些小文件备份到其他地方。
```bash
#没有可用的inode
[root@server ~ 15:14:07]df -hi /myapp-2
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb2 64K 64K 0 100% /myapp-2
#直接删除小文件
[root@server ~ 15:14:12]# rm -f /myapp-2/file-0*
8870

被折叠的 条评论
为什么被折叠?



