Linux 硬盘分区管理
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 flagb edit bsd disklabelc toggle the dos compatibility flagd delete a partitiong create a new empty GPT partition tableG create an IRIX (SGI) partition tablel list known partition typesm print this menun add a new partitiono create a new empty DOS partition tablep print the partition tableq quit without saving changess create a new empty Sun disklabelt change a partition's system idu change display/entry unitsv verify the partition tablew write table to disk and exitx 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.10Partition table scan:MBR: not presentBSD: not presentAPM: not presentGPT: not presentCreating 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.10Partition table scan:MBR: not presentBSD: not presentAPM: not presentGPT: not presentCreating 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 Name1 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 Name1 2048 20973567 10.0 GiB 8300 Linux filesystem2 20973568 62916607 20.0 GiB 8300 Linux filesystem#保存并退出
Command (? for help): wFinal 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 primary2 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, 229376Allocating 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*