今天来复习一下Linux的磁盘管理。注意此 Section 里, 所有命令都需要 sudo.
Linux中,一切皆文件
查看设备信息
用 uname
查看系统信息
-a
: 全部Info-m
: 硬件类型-n
: 网络节点的主机名-o
: OS名称-s
: (Default) 内核名称-r
: 内核版本
用 lspci
查看设备信息(安装 pciutils)
用 lsmod
查看系统模块 (list modules)
分区
硬盘分区:主分区,扩展分区,逻辑分区。这是属于 MBR (MasterBoot Record) 的分区方式。因为 MBR 最多只支持 4 个主分区,而对于想创建更多的分区,则必须创建一个扩展分区,再在扩展分区中创建逻辑分区。而扩展分区和主分区的数目加起来不能超过四个。
还有一种 GPT 的分区方式,可以创建多个分区,没有分区限制,解决了传统分区方式 MBR 的很多缺点。但是使用该方式会有很多限制。
MBR 分区演示
假设新添加的磁盘是 vdb, 查看磁盘:
1 | ls /dev | grep db |
用 fdisk 对磁盘进行分区:
1 | fdisk /dev/vdb |
输入 m
获取帮助,使用 n
创建分区,用 mkfs
建立 Linux 文件系统。将此分区格式化为 ext4
文件系统:
1 | mkfs.ext4 /dev/vdb1 |
用 mount
临时挂载此文件系统,格式如下:
1 | mount <-t 文件系统类型> <待挂载项> <挂载位置> |
在 Home 里创建 test 目录,作为挂载位置:
1 | mount /dev/vdb1 test |
对于当前挂载的 /dev/vdb1
而言,重启后分区不会消失,但并不会默认将其挂载到 test 中,即 mount 命令只是临时挂载。如果希望重启后能自动挂载,需要配置 /etc/fstab
文件,注意几个点:
Filesystem
Mount point
Options
Dump: 备份
Pass num:一般根目录设为 0
因此挂载的 /dev/vdb1
在 fstab
文件里可以写成:
1 | /dev/vdb1 /home/test ext4 defaults 0 2 |
LVM (Logical Volume Manager)
概述
LVM 是 Linux 管理磁盘分区的一种机制。
安装 Linux 操作系统时遇到的一个常见的难以决定的问题,就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。
随着 Linux 的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。下面介绍一下 LVM 相关概念:
PV(Physical Volume),物理卷处于 lvm 的最底层,是 lvm 的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与 LVM 相关的管理参数
VG(Volume Group),卷组一般由一个或多个物理卷组成,在卷组创建之后,可以扩展卷组空间
LV(Logical Volume) ,逻辑卷建立在卷组之上。在逻辑卷上可以建立文件系统,逻辑卷也可以动态地调整空间
PE(Physical Extent) 物理卷由物理区域组成。PE 的大小还可以在创建物理卷的时候指定。默认大小为 4MB
LE(Logical Extent) 逻辑区域是给逻辑卷中可用于分配的最小单元,一般 LE 的大小为 PE 的倍数,默认为 (1 : 1)
下面简单演示一下 LVM 的使用过程。
PV (Physical Volumn)
首先是 PV(apt 安装 lvm2)。
物理卷类似于磁盘分区,但却包含有 lvm 相关的管理参数。这里我们使用刚刚添加的新磁盘进行操作。卸载刚刚挂载的文件系统,并且删除 /dev/vdb 中的分区,即 /dev/vdb1。
1 | umount test |
接着创建四个主分区:
1 | fdisk /dev/vdb |
此时,我们已经建立了四个分区,但是此时只是普通的分区,我们需要将其修改为 lvm 类型。 输入 I
查看系统 id 对应的分区类型。Linux LVM 对应的id是 8e
,即把此四个分区 id 改为8e
。
接下来创建物理卷:
1 | pvcreate /dev/vdb1 |
查看物理卷信息:
1 | pvdisplay /dev/vdb1 |
如果要修改物理卷,则用 pvchange
.
VG (Volume Group)
卷组需要在物理卷的基础上进行创建,使用 vgcreate
命令,例如我们使用物理卷 /dev/vdb1
和 /dev/vdb2
创建 名为 vg1 的卷组:
1 | vgcreate vg1 /dev/vdb1 /dev/vdb2 |
同物理卷相关的命令类似,查看卷组信息的命令为 vgdisplay
,修改卷组的命令为 vgchange
。我们先查看卷组 vg1 的信息:
1 | vgdisplay vg1 |
再将默认的 PE 大小 (4MB) 修改为 8MB:
1 | vgchange -s 8MB vg1 |
接下来我们用 vgextend
扩展卷组 vg1 ,将剩余的两个物理卷添加到卷组中。
1 | vgextend vg1 /dev/vdb3 /dev/vdb4 |
LV (Logical Volume)
在创建卷组后,就可以从卷组中创建逻辑卷了,使用 lvcreate
命令。相关参数如下:
-n
: 指定逻辑卷的名称-l
: 通过指定 PE 的数量指定逻辑卷的大小-L
: 直接指定逻辑卷的大小,单位有bBsSkKmMgGtTpPeE
等-p
: 设置权限,可以设为 r 只读,或者 rw 读写
创建两个卷组 lv1, lv2。 一个使用 -l 参数,指定 100 个 PE ,即 100*8=800MB 的容量 (前面修改 PE 大小为 8MB):
1 | lvcreate -l 100 -n lv1 vg1 |
另一个通过 -L 参数,也指定为 800MB 大小:
1 | lvcreate -L 800M -n lv2 vg1 |
查看逻辑卷则通过 lvdisplay
命令实现,不同的是,这里查看的是卷组中的逻辑卷,所以需要指定卷组:
1 | lvdisplay vg1 |
创建 Lv 后,就可以通过 mkfs
建立文件系统,像使用普通的磁盘分区一样使用逻辑卷。此处需要说明的是,对于 lv1 和 lv2 而言,设备文件在 /dev
目录下的对应的卷组的子目录中,即 /dev/vg1/
。可使用 ls
查看:
1 | ls /dev/vg1 |
最后给创建的逻辑卷建立操作系统,创建对应的目录并挂载。
建立 ext4 文件系统:
1 | mkfs.ext4 /dev/vg1/lv1 |
建立逻辑卷 lv1 的挂载目录:
1 | mkdir /home/merikanto/lv1 |
挂载 lv1:
1 | mount /dev/vg1/lv1 /home/merikanto/lv1 |
SWAP
交换分区 SWAP 就是 Linux 下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间 (也就是 SWAP 分区) 虚拟成内存来使用。
首先,我们需要将刚刚挂载的逻辑卷删除:
1 | lvremove /dev/vg1/lv1 |
再通过 fdisk
命令将 /dev/vdb
分区表的内容删除:
1 | fdisk /dev/vdb |
通过下面指令创建 1G 的虚拟内存:
1 | # if & of |
创建交换文件:
1 | mkswap /swap/swap |
最后我们用 swapon
启动交换分区,对应的关闭命令为 swapoff
:
1 | swapon /swap/swap |
之后用 top
命令查看启动的 swap 分区。
跟 mount
一样,swapon
也只是临时启动交换分区,如果希望 swap 在下次重启后自动启动,需要配置 /etc/fstab
文件:
1 | echo "/swap/swap swap swap defaults 0 0" >> /etc/fstab |