Centos7磁盘管理

背景

在使用虚拟机作为开发环境时,特别是作为数据库服务器时,磁盘随着使用也逐渐紧张。为了解决这一问题,需要对磁盘进行扩容或者缩容。

当在网上找相关解决方案时,发现大部分内容不是纯理论,就是直接几条命令堆砌,也未说明每一条命令目的以及未预期的出错原因。

当然,在安装机器的时候,也应该考虑到合理分配磁盘空间。所以本篇内容将围绕以下模块进行描述:

  • vmware安装centos7,合理分配磁盘空间
  • 磁盘管理命令工具
  • 扩容-硬盘扩容
  • 扩容-增加硬盘
  • 分区容量修改

另外,以下内容仅涉及容量2T以下的磁盘管理,这是因为2T以上的磁盘管理通过另外的命令实现。

而2T以上的磁盘管理由于没有现实条件,不进行叙述。

命令有 fdisk 和 parted。其中 fdisk 命令较为常用,但不支持大于 2TB 的分区;

如果需要支持大于 2TB 的分区,则需要使用 parted 命令,当然 parted 命令也能分配较小的分区。

命令说明

完成磁盘管理需要掌握以下命令:

1.fdisk

说明

fdisk命令的英文全称是“Partition table manipulator for Linux”,是实现磁盘的分区工具。

在 Linux 中分区中,有两种分区模式:MBR和GPT。而fdisk是一个基于MBR的分区工具。MBR只支持不超过2T的硬盘,超过2T的硬盘将只能用2T空间(有第三方解决方法)。

查看帮助 fdisk -h
[root@application01 ~]# fdisk -h
用法:
 fdisk [选项] <磁盘>    更改分区表
 fdisk [选项] -l <磁盘> 列出分区表
 fdisk -s <分区>        给出分区大小(块数)

选项:
 -b <大小>             扇区大小(512、1024、2048或4096)
 -c[=<模式>]           兼容模式:“dos”或“nondos”(默认)
 -h                    打印此帮助文本
 -u[=<单位>]           显示单位:“cylinders”(柱面)或“sectors”(扇区,默认)
 -v                    打印程序版本
 -C <数字>             指定柱面数
 -H <数字>             指定磁头数
 -S <数字>             指定每个磁道的扇区数
查看命令手册说明 man fdisk
[root@application01 ~]# man fdisk
NAME
       fdisk - manipulate disk partition table # Linux分区表操作工具软件
       ...
列出分区表fdisk -l
# 列出所有分区表
[root@application01 ~]# fdisk -l

磁盘 /dev/sda:107.4 GB, 107374182400 字节,209715200 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a7a1e

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    19531775     9764864   83  Linux
/dev/sda2        19531776    39061503     9764864   83  Linux
/dev/sda3        39061504    97654783    29296640   83  Linux
/dev/sda4        97654784   209715199    56030208    5  Extended
/dev/sda5        97656832   209715199    56029184   83  Linux

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3c71443f

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496   83  Linux

# 列出指定分区表/dev/sdb
[root@application01 ~]# fdisk -l /dev/sdb

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3c71443f

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496   83  Linux
管理指定分区 fdisk /dev/sda
[root@application01 ~]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。

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

管理指定分区后,将进入交互模式。进入交互后,可以通过输入选项,实现功能

选项列表
命令(输入 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)

其中常用的选项如上注释

2.mkfs

说明

当完成分区的创建后,如果不进行格式化,是不能使用的。而命令mkfs可以对硬盘分区进行格式化。

另外,mkfs无法格式化扩展分区,可以格式化主分区和逻辑分区

查看帮助
[root@application01 ~]# mkfs --help
用法:
 mkfs [选项] [-t <类型>] [文件系统选项] <设备> [<大小>]
选项:
 -t, --type=<类型>  文件系统类型;若不指定,将使用 ext2
     fs-options     实际文件系统构建程序的参数
     <设备>         要使用设备的路径
     <大小>         要使用设备上的块数
 -V, --verbose      解释正在进行的操作;
                      多次指定 -V 将导致空运行(dry-run)
 -V, --version      显示版本信息并退出
                      将 -V 作为 --version 选项时必须是惟一选项
 -h, --help         显示此帮助并退出


另外,在linux中,有mkfs的命令衍生,如mkfs.btrfs,mkfs.cramfs,mkfs.ext2,mkfs.ext3,mkfs.ext4,mkfs.minix和mkfs.xfs。

其实这些衍生命令相当于指定了相关类型,如mkfs.ext2 = mkfs -t ext2

3.mount

说明

命令mount称为挂载,指的是将硬件设备的文件系统和 Linux 系统中的文件系统,通过指定目录(作为挂载点)进行关联。

查看帮助
[root@application01 ~]# mount --help

用法:
 mount [-lhV]
 mount -a [选项]
 mount [选项] [--source] <源> | [--target] <目录>
 mount [选项] <源> <目录>
 mount <操作> <挂载点> [<目标>]

选项:
 -a, --all               挂载 fstab 中的所有文件系统
 -c, --no-canonicalize   不对路径规范化
 -f, --fake              空运行;跳过 mount(2) 系统调用
 -F, --fork              对每个设备禁用 fork(和 -a 选项一起使用)
 -T, --fstab <路径>      /etc/fstab 的替代文件
 -h, --help              显示此帮助并退出
 -i, --internal-only     不调用 mount.<类型> 助手程序
 -l, --show-labels       列出所有带有指定标签的挂载
 -n, --no-mtab           不写 /etc/mtab
 -o, --options <列表>    挂载选项列表,以英文逗号分隔
 -O, --test-opts <列表>  限制文件系统集合(和 -a 选项一起使用)
 -r, --read-only         以只读方式挂载文件系统(同 -o ro)
 -t, --types <列表>      限制文件系统类型集合
     --source <源>       指明源(路径、标签、uuid)
     --target <目标>     指明挂载点
 -v, --verbose           打印当前进行的操作
 -V, --version           显示版本信息并退出
 -w, --rw, --read-write  以读写方式挂载文件系统(默认)

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出

源:
 -L, --label <标签>      同 LABEL=<label>
 -U, --uuid <uuid>       同 UUID=<uuid>
 LABEL=<标签>            按文件系统标签指定设备
 UUID=<uuid>             按文件系统 UUID 指定设备
 PARTLABEL=<标签>        按分区标签指定设备
 PARTUUID=<uuid>         按分区 UUID 指定设备
 <设备>                  按路径指定设备
 <目录>                  绑定挂载的挂载点(参阅 --bind/rbind)
 <文件>                  用于设置回环设备的常规文件

操作:
 -B, --bind              挂载其他位置的子树(同 -o bind)
 -M, --move              将子树移动到其他位置
 -R, --rbind             挂载其他位置的子树及其包含的所有挂载
 --make-shared           将子树标记为 共享
 --make-slave            将子树标记为 从属
 --make-private          将子树标记为 私有
 --make-unbindable       将子树标记为 不可绑定
 --make-rshared          递归地将整个子树标记为 共享
 --make-rslave           递归地将整个子树标记为 从属
 --make-rprivate         递归地将整个子树标记为 私有
 --make-runbindable      递归地将整个子树标记为 不可绑定

更多信息请参阅 mount(8)。
挂载 mount
mount /dev/sdb1 /data01

以上命令可以将分区/dev/sdb1挂载到目录/data01,目录/data01必须存在;另外,这种挂载方式为手动挂载,机器重启后将失效。

所以,挂载不仅要手动挂载,也要修改/etc/fstab,实现自动挂载。

挂载 fstab 中的所有文件系统mount -a
mount -a

以上命令可以挂载fstab中的所有文件系统

列出所有带有指定标签的挂载,mount -l
[root@application01 data01]# mount -l
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=1919912k,nr_inodes=479978,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuacct,cpu)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_prio,net_cls)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/sda1 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=26,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=21095)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
/dev/sda3 on /data type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda2 on /home type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda5 on /data01 type ext4 (rw,relatime,seclabel,data=ordered)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=386152k,mode=700)

4.umount

说明

有挂载命令mount,则也一定有卸载命令。而umount就是这一卸载命令

命令umount可以卸载已经挂载的硬件设备。

显示帮助
[root@application01 ~]# umount --help

用法:
 umount [-hV]
 umount -a [选项]
 umount [选项] <源> | <目录>

选项:
 -a, --all               卸载所有文件系统
 -A, --all-targets       卸载当前名字空间内指定设备
                         对应的所有挂臷点
 -c, --no-canonicalize   不对路径规范化
 -d, --detach-loop       若挂臷了回环设备,也释放该回环设备
     --fake              空运行;跳过 umount(2) 系统调用
 -f, --force             强制卸载(遇到不响应的 NFS 系统时)
 -i, --internal-only     不调用 umount.<类型> 辅助程序
 -n, --no-mtab           不写 /etc/mtab
 -l, --lazy              立即断开文件系统,所有清理以后执行
 -O, --test-opts <列表>  限制文件系统集合(和 -a 选项一起使用)
 -R, --recursive         递归卸载目录及其子对象
 -r, --read-only         若卸载失败,尝试以只读方式重新挂臷
 -t, --types <列表>      限制文件系统集合
 -v, --verbose           打印当前进行的操作

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出

更多信息请参阅 umount(8)。
卸载

如果存在一个文件系统和挂载点,如下:

mount /dev/sdb1 /data01

可以通过以下命令实现卸载

# 卸载分区
umount /dev/sdb1
# 或者卸载挂载点
umount /data01
卸载报错

如果当前目录在挂载点,进行卸载操作,将报错。如下:

[root@application01 data]# cd /data01/
[root@application01 data01]# umount /data01
umount: /data01:目标忙。
        (有些情况下通过 lsof(8) 或 fuser(1) 可以
         找到有关使用该设备的进程的有用信息)

以上报错可以去到其它目录在进行卸载

合理分配磁盘空间

在vmware新建虚拟机时,为了快速完成,都会选择自动分区。自动分区虽然可以不用进行复杂设置,显然这会让机器的分区不符合预期。所以需要在安装机器的时候应该合理分配

1.新建虚拟机,可以指定磁盘大小

如下是设置为50GB

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_linux

2.执行外部机器存储磁盘文件的位置

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos_02

指定这一路径后,外部机器相关的文件路径下,会生成多个磁盘文件,如下:

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_linux_03

3.配置完成后,虚拟机设置中的硬件-硬盘

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos7 如何查看磁盘是否损坏_04

4.启动机器后,会进入安装向导

以下是磁盘划分向导,默认是自动配置分区

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos_05

由于想要获取预期分区,所以选择自定义

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_文件系统_06

5.添加分区

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_linux_07

切分如下:

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_子树_08


centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_文件系统_09

6.安装完成后,查看分区是否符合预期

使用df命令查看分区是否符合预期

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos_10

当磁盘空间不足时,有两种选择都可以实现扩容。在原磁盘增加容量,也可以新增磁盘。将分别进行笔记。

centos7扩容-硬盘扩容

1.硬盘扩容

在vmware扩展磁盘容量至100GB

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_linux_11

但使用df命令查看系统中各文件系统的硬盘使用情况。实际上与之前并没有变化。

# 查看系统中各文件系统的硬盘使用情况
df -h
# 查看分区信息
fdisk -l

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_文件系统_12


可以通过命令fdisk -l可以有以下内容:

  • 磁盘/dev/sda已提升至107GB,但分区还是只有原来的3个分区(/dev/sda1,/dev/sda2,/dev/sda3),分区的容量大小没有发生变化,仍然为50GB
  • 其中每个分区的容量可以通过Blocks获取,单位是KB,如分区/dev/sda1的容量是9764864KB≈9.3125GB
  • 而Blocks的计算公式是:

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_文件系统_13

所以Blocks=(19531775-2048) * 512 / 1000 = 19529727 * 512 / 1024 = 9999220224 / 1024 = 9764863.5KB ≈ 9764864KB

  • 3个分区(/dev/sda1,/dev/sda2,/dev/sda3)是连续的,即start和end是连续的

2.使用fdisk管理分区

使用fdisk对分区/dev/sda进行管理

fdisk /dev/sda

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos7 如何查看磁盘是否损坏_14


使用选项n增加分区

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos_15


从上面可以发现,因为已经有3个主分区,而根据分区标准,只能有4个主分区(3个主分区+1个扩展分区),扩展分区下可以有多个逻辑分区。所以使用选项e创建扩展分区/dev/sda4

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_文件系统_16

3.新增逻辑分区

在扩展分区/dev/sda4下创建逻辑分区/dev/sda5

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos7 如何查看磁盘是否损坏_17


完成分区管理后,选择选项w进行保存

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_子树_18


保存后获取/dev目录下是否成功创建目录sda5

ls /dev | grep sd

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos7 如何查看磁盘是否损坏_19


发现没有创建,可以通过重启机器reboot

reboot

再次获取/dev目录下是否成功创建目录sda5

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos7 如何查看磁盘是否损坏_20


成功创建

4. 使用mkfs格式化分区

mkfs.ext4 /dev/sda5

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_文件系统_21


其中mkfs.ext4命令是mkfs的扩展,可以指定分区的文件系统格式为ext4

5.使用mount手动挂载分区

将分区/dev/sda5挂载到目录/data01

mount /dev/sda5 /data01

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_文件系统_22

6.修改/etc/fstab实现自动挂载

为了实现自动挂载,需要将挂载动作记录到 /etc/fstab

/dev/sda5 /data01 ext4 defaults 0 0

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos7 如何查看磁盘是否损坏_23

系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘。

以下命令将 /etc/fstab 中定义的所有档案系统挂上

mount -a

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_子树_24


重启后,查看分区是否被重置

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_linux_25


发现挂载未失效

在虚拟机上,可以像上面一样,在硬盘的基础上增加容量,即/dev/sda从50GB到100GB.

但如果没有使用虚拟机,就需要通过空闲的硬盘插口增加硬盘,即增加/dev/sdb,如下:

centos7扩容-增加硬盘

1.增加磁盘

在vmware新增新硬盘,硬盘大小为20GB

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_linux_26


使用fdisk -l可以发现新增磁盘/dev/sdb,但下面没有任何分区信息

fdisk -l

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos_27

2.管理分区/dev/sdb

使用选项p查看分区/dev/sdb

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos_28


新增主分区/dev/sdb1

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_子树_29


保存后,通过fdisk -l,可以查看磁盘下/dev/sdb下有一分区/dev/sdb1

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_子树_30

3. 格式化分区/dev/sdb1

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos7 如何查看磁盘是否损坏_31

4.手动挂载

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos7 如何查看磁盘是否损坏_32

5.自动挂载

为了实现自动挂载,在/etc/fstab进行编辑

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_文件系统_33

分区容量修改

使用fdisk -l查看分区信息时,发现分区/dev/sdb1只有10GB,而磁盘/dev/sdb有20GB,还剩10GB未利用

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_文件系统_34


此时,可以新增分区,使用剩余空间。如上操作即可。

当然,也可以修改分区/dev/sdb1,使sdb1使用全部空间

1.卸载分区

卸载分区/dev/sdb1,并修改/etc/fstab,注释相关挂载配置

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_centos_35

注意以上动作会将/data02下的内容被删除
可以发现目录/data02被卸载

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_子树_36

2. 卸载后重启机器

必须重启机器

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_子树_37

3.重新创建分区

确认没问题后,删除分区,并重新创建分区,使用全部空间

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_linux_38

4.格式化分区/dev/sdb1

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_子树_39

5.手动挂载和自动挂载

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_linux_40


可以发现目录/data02的空间为20GB

centos7 如何查看磁盘是否损坏 centos7如何查看磁盘类型_linux_41

总结

篇幅虽然长,但实际上实现磁盘管理的命令并不多。主要是对磁盘相关认识和整个流程的把握。
在磁盘认识上,需要知道主分区、扩展分区和逻辑分区等概念。这样才能合理分配空间,以及创建时指定分区类型。
在整个流程的把握上,挂载是以下步骤:

  • 创建分区fdisk xxx
  • 格式化分区mkfs -t xxx xxx
  • 挂载(手动+自动)分区mount xxx xxx

另外,在操作过程中,如果出现错误,应该确认是否存在错误操作。特别是通过fdisk时,当意识到不正确时,可以直接通过选项q结束设置。