本篇讲述磁盘管理相关的命令。计算机中需要持久化存储的数据一般是保存在硬盘等辅助存储器中。硬盘一般容量较大,为了便于管理和使用,可以将硬盘分成一到多个逻辑磁盘,称为分区;为使分区中的文件组织成操作系统能够处理的形式,需要对分区进行格式化 (创建文件系统);在 linux 中,对于格式化后的分区,还必须经过挂载(可简单理解为将分区关联至 linux 目录树中某个已知目录) 之后才能使用。
1、df 显示文件系统磁盘空间使用量
|
|
选项 -h 作用是转换数字的显示单位 (默认为 KB)。
显示信息文件系统列下面带 tmpfs 字样的是虚拟内存文件系统 (此处不做展开)。
文件系统 /dev/mapper/centos-root 的挂载点是 /(根目录),即通常所说的根分区 (或根文件系统);/dev/sda1(boot 分区) 中保存了内核映像和一些启动时需要的辅助文件;另外,还对用户家目录单独做了分区(/dev/mapper/centos-home)。
在 linux 中还可以做一个特殊的分区:swap 分区 (交换分区)。作用是:当系统的物理内存不够用时,会将物理内存中一部分暂时不使用的数据交换至 swap 分区中,当需要使用这些数据时,再从 swap 空间交换回内存空间。swap 在功能上突破了物理内存的限制,使程序可以操纵大于实际物理内存的空间。但由于硬盘的速度远远低于内存,使 swap 只能作为物理内存的辅助。通常 swap 空间的大小是实际物理内存大小的 1 到 2 倍。使用命令 free 可以查看 swap 空间的大小。
选项 -i 显示 inode 信息
|
|
这里显示的数字是该文件系统中 inode 数量的使用情况。
2、fdisk 磁盘分区工具
|
|
选项 -l 表示列出分区表
|
|
当前机械硬盘中包含一到多个固定在主轴 (spindle) 上的盘片(platter),盘片由硬质磁性合金材料构成。每张盘片有上下两个表面,每个表面都包含数量巨大的扇区(sector),扇区是大小为 512 byte 的区块,这些区块均匀的分布于盘片的同心圆上,这些同心圆被称为磁道(track)。上千个磁道的宽度相当于人类头发的直径。
硬盘中使用固定于磁臂 (disk arm) 顶端的磁头 (disk head 上下两面均有) 读写盘面中的数据。硬盘不工作时,磁头停留在启停区(盘片上靠近主轴的区域);启停区外是数据区,盘片最外围磁道称为 0 磁道;硬盘启动后,盘片会围绕主轴高速旋转,盘片旋转产生的气流相当强,足以使磁头托起,并与盘面保持一个微小的距离(大概相当于人类头发直径的千分之一)。磁臂摆动,可以将磁头移动至任意磁道上方。
单一磁道示意图:
当前硬盘转速大概在 7200 转 / 分钟到 15000 转 / 分钟左右。假设硬盘转速是 10000 转 / 分钟,则意味着,转一圈需要的时间是 6ms。
所有盘面上的同一磁道构成一个圆柱,通常称做柱面 (Cylinder),系统将数据存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最上方 0 磁头最外围 0 磁道第一个扇区开始写入,写满一个磁道之后,接着在同一柱面的下一个磁头继续写入。同一个柱面都写满之后才推进到内层的下一个柱面。
fdisk 命令中 device 通常是 /dev/hda、/dev/hdb….(IDE 接口类型的硬盘设备名) 或 /dev/sda、/dev/sdb….(SCSI 接口类型硬盘设备名),表示整个硬盘,如果硬盘被分区,则在设备名后追加一个数字表示此设备的第几个分区。如上例中的 /dev/sda1 和 /dev/sda2
硬盘磁头存取数据是以扇区 (512bytes) 为单位的 (上例中 Start 和 End 列),但操作系统存取数据是以块(Block) 为单位的 (注意:这里说的 Block 的大小不同于 fdisk 命令输出中的 Blocks 列,fdisk 命令输出中 Blocks 列的大小为 1024 bytes);扇区是硬件级别的,Block 是文件系统级别的,也就是说在创建文件系统(格式化) 的时候才决定一个 block 的大小、数量。一个块的大小是一个扇区大小 2 的 n 次方倍,本例文件系统 Block 的默认大小为 4096 bytes(格式化时可以指定为其他值)。
我们在 252 这台机器上新添加三块硬盘 (每块 200GB)
|
|
下面使用 fdisk 命令对新磁盘进行分区
|
|
在提示符后输入 m 获取帮助信息(列出了在提示符后可使用的命令及其解释)
|
|
命令 n 表示创建一个新分区
|
|
此处可选项有两个,p 表示主分区 (primary),e 表示扩展分区 (extended),默认为主分区。
每块硬盘分区后,位于 0 磁头 0 柱面 1 扇区的是一个特殊区域,称为 MBR(Main Boot Record 主引导记录区),其中前 446 字节是 Bootloader(引导加载程序),之后的 64 字节是 DPT(Disk Partition Table 硬盘分区表),最后两个字节的 Magic Number(硬盘有效标志)。
DPT 中记录了此块硬盘有哪些分区,由于其大小的限制,使得分区表只能包含 4 条记录,可以是一到四个主分区或一个扩展分区和一到三个主分区。其中扩展分区可以再分区,称为逻辑分区。
我们选择默认的主分区:
|
|
每一步骤都有相应提示,可以被使用的扇区从 2048 号开始 (前面的扇区包括 MBR 用做其他用途),分区结束扇区的指定可以是扇区号,也可以是 + size 这样的格式。这里我们指定分区大小为 100G
使用 p 命令打印分区信息:
|
|
注意这里的显示的不同,Boot 列如果有 * 标志,表示此分区为 boot 分区。Id 列表示分区类型,可以使用命令 l 列出所有支持的类型,其中 82 表示 linux swap,83 表示 linux 默认分区类型,8e 表示 linux lvm(后述)。
然后我们将信息保存:
|
|
3、mkfs 创建文件系统
选项 -t 可以指定文件系统类型 (包括 ext3 ext4 btrfs xfs reiserfs 等)
|
|
这样,我们就把刚刚分的区格式化成了 ext4 文件系统,输出信息中显示了 inode 和 block 数量等信息。
4、mount 挂载文件系统
将格式化好的文件系统挂载至 /root/temp/tmp
|
|
可以看到新分区已经可以使用了,在格式化时,系统会将磁盘上一定空间 (此处是 5%) 保留做其他用途,可以使用命令 dumpe2fs /dev/sdb1 2>/dev/null|grep ‘Reserved block count’查看保留块数量。
这样挂载的分区只是临时有效,当系统重启时,并不会自动挂载该分区。如需要永久生效,可以将分区信息写入分区配置文件 /etc/fstab
|
|
此文件中记录了原有分区及其挂载信息,# 开头的行为注释行,其余行被分为 6 列:
- 第一列表示文件系统
- 第二列是挂载点
- 第三列为文件系统类型
- 第四列为选项
- 第五列表示是否对该文件系统使用 dump 工具备份,0 表示不备份
- 第六列表示是否使用 fsck 工具对该文件系统做定时检查,0 表示不检查
在文件中追加如下信息后,系统重启时新分区也会被自动挂载:
|
|
在使用 mount 命令挂载时,可以使用选项 -o options 指定挂载选项 (/etc/fstab 中第四列)
如对已挂载的新分区重新以只读方式挂载:
|
|
此时再在目录 /root/temp/tmp 中创建文件时显示报错:只读文件系统
|
|
配置文件中的 defaults 指的是选项:rw, suid, dev, exec, auto, nouser, 和 async. 它们的意思请查看 mount 的 man 手册
选项 -a 表示读取配置文件中所有记录并重新挂载
选项 -B 或 –bind 可以使一个目录挂载至另一个目录
|
|
这样挂载的目录使用 df 命令并不能查看到,可以使用 mount 命令查看
|
|
选项 -t 表示指定文件系统类型,如挂载光盘:
|
|
5、umount 卸载文件系统
卸载时既可以指定设备名也可以指定挂载点,当文件系统内有进程正在使用某文件时,卸载会报错:
|
|
此时可使用 lsof 或 fuser 找出进程 (见这里),停止该进程之后再卸载即可。
如果是卸载光盘还可以用 eject 命令
|
|
6、fsck 检查并修复文件系统
可以使用 fsck 命令检查分区是否正常,需要在卸载的状态检查
|
|
直接执行命令时,如果检测到受损,会有交互式提示询问是否进行修复坏块
- 选项 -a 表示不询问直接修复
- 选项 -y 表示总是对交互式询问输入 yes
7、mkswap 创建 swap 分区
linux 的 swap 分区可以用磁盘分区做,也可以用文件做,当前系统的 swap 使用的是分区。下面举一个使用文件创建 swap 分区的例子
首先使用命令 dd 生成一个大小为 8G 的文件
|
|
创建 swap 分区
|
|
8、swapon/swapoff 启用 / 停用 swap 文件或设备
|
|
9、parted 磁盘分区工具
前面所述的 MBR 中的分区表不支持大于 2TB 以上的分区,为了解决这一限制和 MBR 的其它不足,出现了 GTP(全局唯一标识分区表 GUID Partition Table),是一种磁盘的分区表的结构布局的标准,属于 UEFI(统一可扩展固件接口) 标准的一部分。需要使用命令 parted 划分支持 GTP 的分区 (可兼容 MBR 分区)。
直接使用命令 parted 时会进入交互界面
|
|
可以在提示符后输入 help 显示可用命令列表 (命令可简写)
命令 print(简写 p) 表示打印分区表
|
|
命令 quit 表示退出交互界面
选项 -s 表示非交互模式,此时命令写在后面
|
|
Partition Table 后的 msdos 表示为 MBR 分区,之所以两个命令中 sdb1 分区大小显示为 107G 而不是 100G 是因为在进行计算时使用 1000 bytes 作为 1KB 计数。
不能在已经做 MBR 分区的硬盘上做 GTP 分区,重做会导致原有分区被格式化。
这里在新磁盘 /dev/sdc 上做 GTP 分区:
|
|
注意交互模式与 fdisk 命令不同,parted 的命令一旦按回车确认,命令就马上执行,对磁盘的更改就立即生效。
命令 mklabel 指定分区格式 (msdos 或 gtp),如果格式未知,使用 print 命令时会报错:错误: /dev/sdc: unrecognised disk label
|
|
命令 mkpart 表示创建新分区,后面接分区类型 (主分区还是扩展分区)、文件系统类型 (ext4 等,可省略)、起始点、结束点。
|
|
命令 rm 表示删除分区,后面接分区号
|
|
下面使用非交互模式继续
|
|
这里使用 1000 bytes 作为 1KB 计数格式化并挂载 (部分输出略)
|
|
最后再用 parted 做一个 MBR 扩展分区,命令如下:
|
|
结果显示为:
|
|
格式化及挂载 (省略部分输出)
|
|
这些新分区都可以写入配置文件 /etc/fstab 中实现重启后自动挂载
LVM 逻辑卷管理
LVM 是 linux 环境下对磁盘分区进行管理的一种机制,能够使系统管理员更方便的为应用与用户分配存储空间。
术语
- 物理存储介质 (The physical media):指的是系统的存储设备,如上面制作的分区 /dev/sdb1、/dev/sdc1、/dev/sdd5
- 物理卷 (PV: Physical Volume):相当于物理存储介质,但添加了与 LVM 相关的管理参数。
- 卷组 (VG: Volume Group):由一个或多个物理卷组成。
- 逻辑卷 (LV: Logical Volume):在卷组的基础上划分的逻辑分区 (文件系统)。
- PE(physical extent):每一个物理卷被划分为称为 PE 的基本单元,具有唯一编号的 PE 是可以被 LVM 寻址的最小单元。PE 的大小是可配置的,默认为 4MB。
- LE(logical extent):逻辑卷也被划分为被称为 LE 的可被寻址的基本单位。在同一个卷组中,LE 的大小和 PE 是相同的,并且一一对应。
步骤
1、创建分区
可以使用 fdisk 或 parted 进行分区,和前面举例中的区别仅仅是分区类型要选 8e。这里将三块新硬盘的剩余空间做成 LVM 分区,parted 方式 (仅举一例,其余略):
|
|
2、创建 PV
|
|
3、创建 VG
|
|
4、创建 LV
|
|
5、格式化及挂载
|
|
这里文件系统之所以显示为 /dev/mapper/…. 是因为内核利用 Mapper Device 机制将设备做了映射:
|
|
实际上 /dev/test_lvm/test_1 和 /dev/mapper/test_lvm-test_1 指向了同一个设备 /dev/dm-3(在配置文件 /etc/fstab 中写任意一种都可以),这里就不对映射机制做详细展开了。
命令
前面举例中说到了几个创建和查看命令,除此之外,LVM 还有一系列的命令,它们都以 pv/vg/lv 开头,所起的作用大多是增加、删除、扩充、缩减、查看、改变等等。
创建命令
|
|
查看命令分三类,显示信息侧重或详细程度不同:
|
|
改变属性 (分别改变本层次上对象的属性)
|
|
扩容
|
|
扩容 LV 举例 (注意内核可能不支持对某些文件系统的在线扩容,此时需要先将文件系统卸载):
|
|
ext 系列的文件系统扩容时需要使用命令 resize2fs 进行在线扩容
缩减 (慎用)
|
|
改名
|
|
还有一些其他命令这里就不再列出了,关于它们的用法请查看相关手册
本文简要介绍了磁盘和LVM相关的管理命令,另外,还有一个介于物理磁盘和磁盘分区的中间层:RAID(独立冗余磁盘阵列),它提供磁盘级别的数据冗余能力。当前服务器上一般都有RAID卡(硬件),关于它的设置以及原理就不在此叙述了,请搜索相关文档。