在使用虚拟机作为开发环境时,特别是作为数据库服务器时,磁盘随着使用也逐渐紧张。为了解决这一问题,需要对磁盘进行扩容或者缩容。
当在网上找相关解决方案时,发现大部分内容不是纯理论,就是直接几条命令堆砌,也未说明每一条命令目的以及未预期的出错原因。
当然,在安装机器的时候,也应该考虑到合理分配磁盘空间。所以本篇内容将围绕以下模块进行描述:
另外,以下内容仅涉及容量2T以下的磁盘管理,这是因为2T以上的磁盘管理通过另外的命令实现。
而2T以上的磁盘管理由于没有现实条件,不进行叙述。
命令有 fdisk 和 parted。其中 fdisk 命令较为常用,但不支持大于 2TB 的分区;
如果需要支持大于 2TB 的分区,则需要使用 parted 命令,当然 parted 命令也能分配较小的分区。
Linux 磁盘管理 | 菜鸟教程 (runoob.com)
Linux文件系统管理 (biancheng.net)
MBR与GPT:磁盘分区方式 - 知乎 (zhihu.com)
文件系统类型(ext4、xfs、fat32、vfat、ntfs、…) - daduryi - 博客园 (cnblogs.com)
完成磁盘管理需要掌握以下命令:
fdisk命令的英文全称是“Partition table manipulator for Linux”,是实现磁盘的分区工具。
在 Linux 中分区中,有两种分区模式:MBR和GPT。而fdisk是一个基于MBR的分区工具。MBR只支持不超过2T的硬盘,超过2T的硬盘将只能用2T空间(有第三方解决方法)。
[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 <数字> 指定每个磁道的扇区数
[root@application01 ~]# man fdisk
NAME
fdisk - manipulate disk partition table # Linux分区表操作工具软件
...
# 列出所有分区表
[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
[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)
其中常用的选项如上注释
当完成分区的创建后,如果不进行格式化,是不能使用的。而命令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中,文件系统类型可以见以下链接:
文件系统类型(ext4、xfs、fat32、vfat、ntfs、…) - daduryi - 博客园 (cnblogs.com)
另外,在linux中,有mkfs的命令衍生,如mkfs.btrfs,mkfs.cramfs,mkfs.ext2,mkfs.ext3,mkfs.ext4,mkfs.minix和mkfs.xfs。
其实这些衍生命令相当于指定了相关类型,如
mkfs.ext2
=mkfs -t ext2
命令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 /dev/sdb1 /data01
以上命令可以将分区/dev/sdb1挂载到目录/data01,目录/data01必须存在;另外,这种挂载方式为手动挂载,机器重启后将失效。
所以,挂载不仅要手动挂载,也要修改/etc/fstab,实现自动挂载。
mount -a
以上命令可以挂载fstab中的所有文件系统
[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)
有挂载命令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新建虚拟机时,为了快速完成,都会选择自动分区。自动分区虽然可以不用进行复杂设置,显然这会让机器的分区不符合预期。所以需要在安装机器的时候应该合理分配
指定这一路径后,外部机器相关的文件路径下,会生成多个磁盘文件,如下:
以下是磁盘划分向导,默认是自动配置分区
由于想要获取预期分区,所以选择自定义
切分如下:
当磁盘空间不足时,有两种选择都可以实现扩容。在原磁盘增加容量,也可以新增磁盘。将分别进行笔记。
在vmware扩展磁盘容量至100GB
但使用df命令查看系统中各文件系统的硬盘使用情况。实际上与之前并没有变化。
# 查看系统中各文件系统的硬盘使用情况
df -h
# 查看分区信息
fdisk -l
- 磁盘/dev/sda已提升至107GB,但分区还是只有原来的3个分区(/dev/sda1,/dev/sda2,/dev/sda3),分区的容量大小没有发生变化,仍然为50GB
- 其中每个分区的容量可以通过Blocks获取,单位是KB,如分区/dev/sda1的容量是9764864KB≈9.3125GB
- 而Blocks的计算公式是:
B l o c k s = ( E n d − S t a r t ) ∗ t r a c k s Blocks = (End-Start)*tracks Blocks=(End−Start)∗tracks
所以Blocks=(19531775-2048) * 512 / 1000 = 19529727 * 512 / 1024 = 9999220224 / 1024 = 9764863.5KB ≈ 9764864KB
- 3个分区(/dev/sda1,/dev/sda2,/dev/sda3)是连续的,即start和end是连续的
使用fdisk对分区/dev/sda进行管理
fdisk /dev/sda
使用选项n增加分区
从上面可以发现,因为已经有3个主分区,而根据分区标准,只能有4个主分区(3个主分区+1个扩展分区),扩展分区下可以有多个逻辑分区。所以使用选项e创建扩展分区/dev/sda4
在扩展分区/dev/sda4下创建逻辑分区/dev/sda5
完成分区管理后,选择选项w进行保存
保存后获取/dev目录下是否成功创建目录sda5
ls /dev | grep sd
reboot
mkfs.ext4 /dev/sda5
其中mkfs.ext4命令是mkfs的扩展,可以指定分区的文件系统格式为ext4
将分区/dev/sda5挂载到目录/data01
mount /dev/sda5 /data01
为了实现自动挂载,需要将挂载动作记录到 /etc/fstab
/dev/sda5 /data01 ext4 defaults 0 0
系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘。
以下命令将 /etc/fstab 中定义的所有档案系统挂上
mount -a
在虚拟机上,可以像上面一样,在硬盘的基础上增加容量,即/dev/sda从50GB到100GB.
但如果没有使用虚拟机,就需要通过空闲的硬盘插口增加硬盘,即增加/dev/sdb,如下:
在vmware新增新硬盘,硬盘大小为20GB
使用fdisk -l
可以发现新增磁盘/dev/sdb
,但下面没有任何分区信息
fdisk -l
/dev/sdb
使用选项p查看分区/dev/sdb
新增主分区/dev/sdb1
保存后,通过fdisk -l,可以查看磁盘下/dev/sdb下有一分区/dev/sdb1
使用fdisk -l查看分区信息时,发现分区/dev/sdb1只有10GB,而磁盘/dev/sdb有20GB,还剩10GB未利用
当然,也可以修改分区/dev/sdb1,使sdb1使用全部空间
卸载分区/dev/sdb1,并修改/etc/fstab,注释相关挂载配置
篇幅虽然长,但实际上实现磁盘管理的命令并不多。主要是对磁盘相关认识和整个流程的把握。
在磁盘认识上,需要知道主分区、扩展分区和逻辑分区等概念。这样才能合理分配空间,以及创建时指定分区类型。
在整个流程的把握上,挂载是以下步骤:
fdisk xxx
mkfs -t xxx xxx
mount xxx xxx
另外,在操作过程中,如果出现错误,应该确认是否存在错误操作。特别是通过fdisk时,当意识到不正确时,可以直接通过选项q结束设置。