Linux文件系统和逻辑卷管理命令(二)

配置分区大小

根据前面介绍的分区命令就可以创建分区了,不过需要注意,我们要为某些特定挂载点设置合适的分区大小。CentOS 7 (参考 Red Hat Ent erprise Linux 7 安装手册)至少需要为 /boot//homeswap 这四个挂载点配置分区。下面是这四个挂载点分区大小建议:

  • /boot :建议大小至少有 500 MB。挂载到 /boot 的分区含有操作系统内核,它可让系统引导 CentOS,并提供引导过程中要使用的文件。/boot 在日常系统运行中并不需要,只在启动和内核升级的时候用到。多数情况下, 500 MB 的 /boot 分区就足够了。
  • / :建议大小至少为 10 GB。/ 分区(或叫根分区)是最重要而且必需的,需要最先挂载。/ 目录(或叫根目录)是目录树的顶层,所有文件和目录都在 / 目录中显示,即使它们实际上存储在其他的物理设备上(不要将 / 目录/root 目录混淆。/root 目录root 用户的主目录)。根文件系统中的内容应该足以启动、恢复、修复系统。因此 / 目录下的特定目录是不能作为独立分区的。默认情况下所有文件都写入这个分区,除非要写入的路径挂载到了不同分区,比如 /home 分区。虽然 5 GB root 分区满足最低安装条件,但还是建议至少分配 10 GB 分区以便可以尽可能安装想要的软件包。
  • /home :其分区大小取决于本地保存数据量、用户数量等等。/home 目录包含用户定义的配置文件、缓存、应用程序数据和媒体文件。该分区的存在可以让你在不删除用户数据文件的情况下进行升级或者重装 CentOS。如果存储空间超过 50 GB,则会在创建其他分区的同时自动创建 /home 分区。考虑为所有可能包含敏感数据的分区加密。考虑为所有可能包含敏感数据的分区加密。加密可防止对这些分区中数据的未授权访问,即使他们可以访问物理存储设备。在大多数情况下,应该至少对 /home 分区加密。
  • swap :swap 分区支持虚拟内存。当没有足够的 RAM 保存系统处理的数据时会将数据写入 swap 分区。当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。配置过多 swap 空间会造成存储设备处于分配状态而闲置,这是浪费资源。过多 swap 空间还会掩盖内存泄露。内存小于 4G 时设置该分区大小为内存的 2 倍 ,内存大于 4G 时设置该分区的大小和内存大小一致即可 。下表根据系统中的 RAM 容量以及是否需要足够的内存以便系统休眠来提供推荐的 swap 分区大小。
系统 RAM 容量 建议 swap 空间大小 允许休眠的建议 swap 空间大小
低于 2 GB RAM 容量的两倍 RAM 容量的三倍
2 GB - 8 GB 与 RAM 容量相等 RAM 容量的两倍
8 GB - 64 GB 4 GB 到 RAM 容量的 0.5 倍 RAM 容量的 1.5 倍
超过 64 GB 独立负载(至少 4GB) 不建议使用休眠功能

下面是可选的挂载点分区:

  • /var :/var 分配 8-12 GB 对于桌面系统来说是比较合适的取值,具体取值取决于安装的软件数量。/var 目录中包含大量的应用程序变量数据,例如 spool 目录和文件,管理和登录数据,pacman 的缓存,ABS 树,Apache 网页服务器,临时下载的更新软件包(PackageKit 更新软件默认将更新的软件包下载到 /var/cache/yum/)等等。它通常被用作缓存或者日志记录,因此读写频繁。将它独立出来可以避免由于大量日志写入造成的磁盘空间耗尽等问题。确定挂载在 /var 的分区中有足够空间可用于保存下载的更新以及其他内容。如果要为 /var 生成独立分 区,请确定 /var/cache/yum/ 大小至少在 3.0 GB 以上以便保存下载的软件包更新。

  • /usr :/user 目录中包含 CentOS 系统中大部分软件内容。要安装默认软件组需要分配至少 5 GB 空间。如果将该系统作为软件开发工作站使用,则至少需要分配 10GB。如果 /usr 或 /var 是在剩余 root 卷之外进行分区,引导过程会变得非常复杂,因为这些目录包含对引导极为重要的组件。在某些情况下,比如这些目录位于 iSCSI 驱动器或 FCoE 位置, 系统可能无法引导,或 者在关机或重启时挂起,并给出 Device is busy 出错信息。这些限制仅适用于 /usr 或 /var,不会对以下目录产生影响。例如:/var/www 的独立分区可正常工作,没有任何问题。

    考虑在 LVM 卷组中保留部分未分配空间。如果空间需要更改,但不希望删除其他分区中的数据来重新分配存储,这个未分配空间就提供了一些机动性。还可以为该分区选择精简配置设备类型,以便该卷可以自动处理未使用的空间。如果将子目录分成分区,就可以在决定使用当前安装 CentOS 新版时保留那些子目录中的内容。例如:如果要在 /var/lib/mysql 中运行 MySQL 数据库,请将那个目录放在单独的分区中,以备之后需要重新安装。

  • /boot/efi :如果使用 UEFI 引导方式,则还需要 /boot/efi 分区,该分区应至少应有 50 MB,建议使用 200 MB。我们可以根据需要(比如安装 Weblogic 和 Oracle 时)创建额外的分区。在使用 GPT(GUID 分区表)的引导装载程序的 BIOS 系统中,需要生成大小为 1 MB 的 biosboot 分区。

  • /data:可以为需要多用户共享的文件建立一个 data (其他名称也可以)分区,比如 Oracle 的数据库实例可以放在该目录下。

为各挂载目录创建好分区之后,就可以为其创建文件系统了。

创建文件系统

在 Windows 环境下,格式化的操作相对简单。通常的操作步骤是:先打开资源管理器,接着在希望被执行格式化的盘符图标上右击,然后选择“格式化”,再按照提示操作即可。也可以选择“快速格式化”,但要求分区没有坏道。需要注意的是:对硬盘执行格式化操作时,用户需要拥有系统管理员权限(仅限于 Windows Vista 以及此后推出的作业系统)。在 Windows 环境中,除了可以使用图形化的操作界面执行格式化操作之外,也可以在命令提示字符中使用 Diskpart 指令(仅限于 Windows 2000 及以后的作业系统,包含 Windows PE)进行操作。

在 Unix/Linux 环境下,通常使用命令工具执行格式化操作。需要注意的是:对硬盘执行格式化操作时,用户需要拥有超级用户权限。创建文件系统的常用命令如下:

  • mkfs:创建一个 ext 文件系统;
  • mke2fs:创建一个 ext2 文件系统;
  • mkfs.ext2:创建一个 ext2 文件系统;
  • mkfs.ext3:创建一个 ext3 文件系统;
  • mkfs.ext4:创建一个 ext4 文件系统;
  • mkfs.xfs:创建一个 XFS 文件系统;
  • xfs_mkfile:创建一个 XFS t文件系统;
  • mkfs.cramfs:创建一个 cramfs 文件系统;
  • mkfs.btrfs:创建一个 Btrfs 文件系统;
  • mkswap:创建一个 swap 文件系统;
  • jfs_mkfs:创建一个 JFS 文件系统。

并非所有文件系统的命令工具都已经默认安装了。要想知道某个文件系统的命令工具是否可用,可以使用 type 命令。

[root@localhost ~]# type mkfs
mkfs is /usr/sbin/mkfs
[root@localhost ~]# type mke2fs
mke2fs is /usr/sbin/mke2fs
[root@localhost ~]# type mkfs.ext2
mkfs.ext2 is /usr/sbin/mkfs.ext2
[root@localhost ~]# type mkfs.ext3
mkfs.ext3 is /usr/sbin/mkfs.ext3
[root@localhost ~]# type mkfs.ext4
mkfs.ext4 is /usr/sbin/mkfs.ext4
[root@localhost ~]# type mkfs.xfs
mkfs.xfs is /usr/sbin/mkfs.xfs
[root@localhost ~]# type mkfs.cramfs
mkfs.cramfs is /usr/sbin/mkfs.cramfs
[root@localhost ~]# type mkfs.btrfs
mkfs.btrfs is /usr/sbin/mkfs.btrfs
[root@localhost ~]# type xfs_mkfile
xfs_mkfile is /usr/sbin/xfs_mkfile
[root@localhost ~]# type mkswap
mkswap is /usr/sbin/mkswap
[root@localhost ~]# type jfs_mkfs
-bash: type: jfs_mkfs: not found

每个文件系统命令都有很多命令行选项,允许你定制如何在分区上创建文件系统。要查看所有可用的命令行选项,可用 man 命令来显示该文件系统命令的手册页面。所有的文件系统命令都允许通过不带选项的简单命令来创建一个默认的文件系统。

[root@localhost ~]# parted
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) select /dev/sdb
Using /dev/sdb
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  2149MB  2147MB  primary  ext4
 2      2149MB  4296MB  2147MB  primary
 3      4296MB  5370MB  1074MB  primary

(parted) q                                                                
[root@localhost ~]# mkfs.ext3 /dev/sdb2
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 524288 blocks
26214 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

[root@localhost ~]# parted
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) select /dev/sdb                                                  
sdb   sdb1  sdb2  sdb3  
(parted) select /dev/sdb
Using /dev/sdb
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  2149MB  2147MB  primary  ext4
 2      2149MB  4296MB  2147MB  primary  ext3
 3      4296MB  5370MB  1074MB  primary

(parted) q
[root@localhost ~]# 

为分区创建了文件系统之后,下一步是将它挂载到虚拟目录下的某个挂载点,这样就可以将数据存储在新文件系统中了。你可以将新文件系统通过 mount 命令挂载到虚拟目录中需要额外空间的任何位置。

[root@localhost ~]# mkdir /data
[root@localhost ~]# cd /
[root@localhost /]# ll
total 70
lrwxrwxrwx.   1 root root     7 May  4 06:32 bin -> usr/bin
dr-xr-xr-x.   5 root root  1024 May  8 21:44 boot
drwxr-xr-x.   2 root root  4096 May 13 20:47 data
drwxr-xr-x.  20 root root  3400 May 13 20:43 dev
drwxr-xr-x. 139 root root 12288 May 13 20:25 etc
drwxr-xr-x.   4 root root  4096 May  4 06:46 home
lrwxrwxrwx.   1 root root     7 May  4 06:32 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 May  4 06:32 lib64 -> usr/lib64
drwx------.   2 root root 16384 May  4 06:32 lost+found
drwxr-xr-x.   2 root root  4096 Nov  5  2016 media
drwxr-xr-x.   3 root root  4096 May  8 21:41 mnt
drwxr-xr-x.   3 root root  4096 May  4 06:42 opt
dr-xr-xr-x. 182 root root     0 May  8 07:35 proc
dr-xr-x---.   5 root root  4096 May 13 20:19 root
drwxr-xr-x.  41 root root  1200 May 13 11:23 run
lrwxrwxrwx.   1 root root     8 May  4 06:32 sbin -> usr/sbin
drwxr-xr-x.   2 root root  4096 Nov  5  2016 srv
dr-xr-xr-x.  13 root root     0 May  8 07:35 sys
drwxrwxrwt.  20 root root  4096 May 13 20:42 tmp
drwxr-xr-x.  13 root root  4096 May  4 06:32 usr
drwxr-xr-x.  22 root root  4096 May  8 07:35 var
[root@localhost /]# mount -t ext4 /dev/sdb1 /data
[root@localhost /]# ls -al /data
total 24
drwxr-xr-x.  3 root root  4096 May 13 20:39 .
dr-xr-xr-x. 19 root root  4096 May 13 20:47 ..
drwx------.  2 root root 16384 May 13 20:39 lost+found
[root@localhost /]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root  9.8G  4.6G  4.7G  50% /
devtmpfs             474M     0  474M   0% /dev
tmpfs                489M  156K  489M   1% /dev/shm
tmpfs                489M   14M  476M   3% /run
tmpfs                489M     0  489M   0% /sys/fs/cgroup
/dev/sda1            477M  142M  307M  32% /boot
/dev/mapper/cl-home  5.8G  276M  5.2G   5% /home
tmpfs                 98M   24K   98M   1% /run/user/1000
tmpfs                 98M     0   98M   0% /run/user/0
/dev/sdb1            2.0G  6.0M  1.8G   1% /data
[root@localhost /]# 

现在你可以在新分区中保存新文件和目录了! 这种挂载文件系统的方法只能临时挂载文件系统。当重启 Linux 系统时,文件系统并不会自动挂载。要强制 Linux 在启动时自动挂载新的文件系统,可以将其添加到 /etc/fstab 文件。

逻辑卷管理(LVM)

如果用标准分区在硬盘上创建了文件系统,为已有文件系统添加额外的空间多少是一种痛苦的体验。你只能在同一个物理硬盘的可用空间范围内调整分区大小。如果硬盘上没有地方了,你就必须弄一个更大的硬盘,然后手动将已有的文件系统移动到新的硬盘上。这时候就可以通过将另外一个硬盘上的分区加入已有文件系统,动态地添加存储空间。 Linux 逻辑卷管理器(logical volume manager, LVM)软件包正好可以用来做这个。它可以让你在无需重建整个文件系统的情况下,轻松地管理磁盘空间。

逻辑卷管理布局

逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理的世界里,硬盘称作物理卷(physical volume, PV)。每个物理卷都会映射到硬盘上特定的物理分区。多个物理卷集中在一起可以形成一个卷组(volume group, VG)。逻辑卷管理系统将卷组视为一个物理硬盘,但事实上卷组可能是由分布在多个物理硬盘上的多个物理分区组成的。卷组提供了一个创建逻辑分区的平台,而这些逻辑分区则包含了文件系统。 整个结构中的最后一层是逻辑卷(logical volume, LV)逻辑卷为 Linux 提供了创建文件系统的分区环境,作用类似于到目前为止我们一直在探讨的 Linux 中的物理硬盘分区。Linux 系统将逻辑卷视为物理分区。 每个逻辑卷可以被格式化成某种文件系统,然后挂载到虚拟目录中某个特定位置。逻辑卷由 PE (physical extents,即物理区段)组成,PE 为硬盘可供指派给逻辑卷的最小单位(通常为4MB)。

Linux文件系统和逻辑卷管理命令(二)_第1张图片
lvm01.png

注意,上图中的第三个物理硬盘有一个未使用的分区。通过逻辑卷管理,你随后可以轻松地将这个未使用分区分配到已有卷组:要么用它创建一个新的逻辑卷,要么在需要更多空间时用它来扩展已有的逻辑卷。 类似地,如果你给系统添加了一块硬盘,逻辑卷管理系统允许你将它添加到已有卷组,为某个已有的卷组创建更多空间,或是创建一个可用来挂载的新逻辑卷。这种扩展文件系统的方法要好用得多!

Linux文件系统和逻辑卷管理命令(二)_第2张图片
1024px-LVM1.svg.png

优点

比起正常的硬盘分区管理,LVM 更富于弹性:

  • 使用卷组(VG),使众多硬盘空间看起来像一个大硬盘。
  • 使用逻辑卷(LV),可以创建跨越众多硬盘空间的分区。
  • 可以创建小的逻辑卷(LV),在空间不足时再动态调整它的大小。
  • 在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间。
  • 可以在线(online)对逻辑卷(LV)和卷组(VG)进行创建、删除、调整大小等操作。LVM 上的文件系统也需要重新调整大小,某些文件系统也支持这样的在线操作。
  • 无需重新启动服务,就可以将服务中用到的逻辑卷(LV)在线(online)/动态(live)迁移至别的硬盘上。
  • 允许创建快照,可以保存文件系统的备份,同时使服务的下线时间(downtime)降低到最小。

这些优点使得 LVM 对服务器的管理非常有用,对于桌面系统管理的帮助则没有那么显著,你需要根据实际情况进行取舍。

缺点

  • 在系统设置时需要更复杂的额外步骤。

Linux LVM

Linux LVM 是由 Heinz Mauelshagen 开发的,于 1998年 发布到了 Linux 社区。它允许你在 Linux 上用简单的命令行命令管理一个完整的逻辑卷管理环境。 Linux LVM 有两个可用的版本。

  • LVM1:最初的 LVM 包于 1998 年发布,只能用于 Linux 内核 2.4 版本。它仅提供了基本的逻 辑卷管理功能。
  • LVM2: LVM 的更新版本,可用于 Linux 内核 2.6 版本。它在标准的 LVM1 功能外提供了额外的功能。

大部分采用 2.6 或更高内核版本的现代 Linux 发行版都提供对 LVM2 的支持。除了标准的逻辑卷管理功能外, LVM2 还提供了另外一些好用的功能。

  1. 快照

    最初的 Linux LVM 允许你在逻辑卷在线的状态下将其复制到另一个设备。这个功能叫作快照(snapshot )。在备份由于高可靠性需求而无法锁定的重要数据时,快照功能非常给力。传统的备份方法在将文件复制到备份媒体上时通常要将文件锁定。快照允许你在复制的同时,保证运行关键任务的 Web 服务器或数据库服务器继续工作。遗憾的是, LVM1 只允许你创建只读快照。一旦创建了快照,就不能再写入东西了。 LVM2 允许你创建在线逻辑卷的可读写快照。有了可读写的快照,就可以删除原先的逻辑卷, 然后将快照作为替代挂载上。这个功能对快速故障转移或涉及修改数据的程序试验(如果失败, 需要恢复修改过的数据)非常有用

  2. 条带化

    LVM2 提供的另一个引人注目的功能是条带化(striping)。有了条带化,可跨多个物理硬盘创建逻辑卷。当 Linux LVM 将文件写入逻辑卷时,文件中的数据块会被分散到多个硬盘上。每个后继数据块会被写到下一个硬盘上。条带化有助于提高硬盘的性能,因为 Linux 可以将一个文件的多个数据块同时写入多个硬盘, 而无需等待单个硬盘移动读写磁头到多个不同位置。这个改进同样适用于读取顺序访问的文件, 因为 LVM 可同时从多个硬盘读取数据。LVM 条带化不同于 RAID 条带化。 LVM 条带化不提供用来创建容错环境的校验信息。事实上,LVM 条带化会增加文件因硬盘故障而丢失的概率。单个硬盘故障可能会造成多个逻辑卷无法访问

  3. 镜像

    通过 LVM 安装文件系统并不意味着文件系统就不会再出问题。和物理分区一样, LVM 逻辑卷也容易受到断电和磁盘故障的影响。一旦文件系统损坏,就有可能再也无法恢复。 LVM 快照功能提供了一些安慰,你可以随时创建逻辑卷的备份副本,但对有些环境来说可能还不够。对于涉及大量数据变动的系统,比如数据库服务器,自上次快照之后可能要存储成百上千条记录。 这个问题的一个解决办法就是 LVM 镜像。镜像是一个实时更新的逻辑卷的完整副本。当你创建镜像逻辑卷时, LVM 会将原始逻辑卷同步到镜像副本中。根据原始逻辑卷的大小,这可能需要一些时间才能完成。 一旦原始同步完成, LVM 会为文件系统的每次写操作执行两次写入——一次写入到主逻辑卷,一次写入到镜像副本。可以想到,这个过程会降低系统的写入性能。就算原始逻辑卷因为某些原因损坏了,你手头也已经有了一个完整的最新副本!

使用 Linux LVM

Linux LVM 包只提供了命令行程序来创建和管理逻辑卷管理系统中所有组件。有些 Linux 发行版则包含了命令行命令对应的图形化前端,但为了完全控制你的 LVM 环境,最好习惯直接使用这些命令。

  1. 定义物理卷

    创建过程的第一步就是将硬盘上的物理分区转换成 Linux LVM 使用的物理卷区段。fdisk 命令可以帮忙。在创建了基本的 Linux 分区之后,你需要通过 t 命令改变分区类型。

    # 查看新添加新硬盘后新建分区的系统 id,发现为默认的 Linxu
    [root@localhost ~]# fdisk -l /dev/sdb*
    
    Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x000391ab
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048     4196351     2097152   83  Linux
    /dev/sdb2         4196352     8390655     2097152   83  Linux
    /dev/sdb3         8390656    10487807     1048576   83  Linux
    
    Disk /dev/sdb1: 2147 MB, 2147483648 bytes, 4194304 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/sdb2: 2147 MB, 2147483648 bytes, 4194304 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/sdb3: 1073 MB, 1073741824 bytes, 2097152 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    # 修改新建分区的系统 id
    [root@localhost ~]# fdisk /dev/sdb
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    Command (m for help): p
    
    Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x000391ab
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048     4196351     2097152   83  Linux
    /dev/sdb2         4196352     8390655     2097152   83  Linux
    /dev/sdb3         8390656    10487807     1048576   83  Linux
    
    Command (m for help): l
    
     0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
     1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
     2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
     3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
     4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
     5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
     6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
     7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
     8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
     9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
     a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
     b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
     c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs        
     e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT            
     f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
    10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
    11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor      
    12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor      
    14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary  
    16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS    
    17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
    18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
    1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep        
    1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT            
    1e  Hidden W95 FAT1 80  Old Minix      
    
    Command (m for help): t
    Partition number (1-3, default 3): 1
    Hex code (type L to list all codes): 8e
    Changed type of partition 'Linux' to 'Linux LVM'
    
    Command (m for help): t
    Partition number (1-3, default 3): 2
    Hex code (type L to list all codes): 8e
    Changed type of partition 'Linux' to 'Linux LVM'
    
    Command (m for help): t
    Partition number (1-3, default 3): 3
    Hex code (type L to list all codes): 8e
    Changed type of partition 'Linux' to 'Linux LVM'
    
    Command (m for help): p
    
    Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x000391ab
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048     4196351     2097152   8e  Linux LVM
    /dev/sdb2         4196352     8390655     2097152   8e  Linux LVM
    /dev/sdb3         8390656    10487807     1048576   8e  Linux LVM
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    Syncing disks.
    
    # 再次查看新建分区的系统 id,发现已经变成了 Linux LVM
    [root@localhost ~]# fdisk -l /dev/sdb*
    
    Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x000391ab
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048     4196351     2097152   8e  Linux LVM
    /dev/sdb2         4196352     8390655     2097152   8e  Linux LVM
    /dev/sdb3         8390656    10487807     1048576   8e  Linux LVM
    
    Disk /dev/sdb1: 2147 MB, 2147483648 bytes, 4194304 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/sdb2: 2147 MB, 2147483648 bytes, 4194304 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/sdb3: 1073 MB, 1073741824 bytes, 2097152 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    [root@localhost ~]# 
    

    分区类型 8e 表示这个分区将会被用作 Linux LVM 系统的一部分,而不是一个直接的文件系统。

    下一步是用物理分区来创建物理卷。这可以通过 pvcreate 命令来完成。pvcreate DEVICE 定义了用于物理卷的物理分区 DEVICE。它只是简单地将物理分区标记成 Linux LVM 系统中的分区而已。如果 pvcreate 命令不能正常工作,很可能是因为 LVM2 软件包没有默认安装,可参考软件包的安装部分的介绍来安装 LVM2。

    # 如果物理分区已存在签名标签,创建物理卷时需要擦除该签名
    [root@localhost ~]# pvcreate /dev/sdb1
    WARNING: ext4 signature detected on /dev/sdb1 at offset 1080. Wipe it? [y/n]: y
      Wiping ext4 signature on /dev/sdb1.
      Physical volume "/dev/sdb1" successfully created.
    # 如果物理分区已被挂载,那么在创建物理卷之前需要先将其卸载
    [root@localhost ~]# pvcreate /dev/sdb2
      Can't open /dev/sdb2 exclusively.  Mounted filesystem?
    [root@localhost ~]# umount /dev/sdb2
    [root@localhost ~]# pvcreate /dev/sdb2
    WARNING: ext3 signature detected on /dev/sdb2 at offset 1080. Wipe it? [y/n]: y
      Wiping ext3 signature on /dev/sdb2.
      Physical volume "/dev/sdb2" successfully created.
    [root@localhost ~]# pvcreate /dev/sdb3
      dev_is_mpath: failed to get device for 8:17
      Physical volume "/dev/sdb3" successfully created.
    [root@localhost ~]# 
    

    别被吓人的消息 dev_is_mpath: failed to get device for 8:17 或类似的消息唬住了。只要看到了 successfully created 就没问题。 pvcreate 命令会检查分区是否为多路(multi-path, mpath)设备。如果不是的话,就会发出上面那段消息。

    如果你想查看创建进度的话,可以使用 pvdisplay 命令来显示已创建的物理卷列表。

    [root@localhost ~]# pvdisplay /dev/sdb*
      "/dev/sdb2" is a new physical volume of "2.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdb2
      VG Name               
      PV Size               2.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               xKDxtk-6Bgp-CmEL-Lp14-X18Q-67l7-xr1jvn
       
      "/dev/sdb1" is a new physical volume of "2.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdb1
      VG Name               
      PV Size               2.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               dS6C30-O5rh-k3bx-eG1O-8WkX-9KxU-ruerYU
       
      "/dev/sdb3" is a new physical volume of "1.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdb3
      VG Name               
      PV Size               1.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               LXuFvo-7eDX-RdAm-9c1x-f4eZ-0N3g-UTdEAf
       
      Failed to find physical volume "/dev/sdb".
    [root@localhost ~]# 
    

    pvdisplay 命令显示出 /dev/sdb1/dev/sdb2/dev/sdb3 现在已经被标记为物理卷。注意,输出中的 VG Name 内容为空,因为物理卷还不属于某个卷组。由于我们并没有为 /dev/sdb 上的剩余空间创建分区和物理卷,所以命令最后输出 Failed to find physical volume "/dev/sdb"

  2. 创建卷组

    下一步是从物理卷中创建一个或多个卷组(VG)。究竟要为系统创建多少卷组并没有既定的规则,你可以将所有的可用物理卷加到一个卷组,也可以结合不同的物理卷创建多个卷组。要从命令行创建卷组,需要使用 vgcreate 命令。vgcreate 命令需要指定要创建的卷组名以及用来创建卷组的若干物理卷名。

    [root@localhost ~]# vgcreate VG01 /dev/sdb1
      Volume group "VG01" successfully created
    [root@localhost ~]#
    

    输出结果平淡无奇。如果你想看看新创建的卷组的细节,可用 vgdisplay 命令。

    [root@localhost ~]# vgdisplay VG01
      --- Volume group ---
      VG Name               VG01
      System ID             
      Format                lvm2
      Metadata Areas        1
      Metadata Sequence No  1
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                0
      Open LV               0
      Max PV                0
      Cur PV                1
      Act PV                1
      VG Size               2.00 GiB
      PE Size               4.00 MiB
      Total PE              511
      Alloc PE / Size       0 / 0   
      Free  PE / Size       511 / 2.00 GiB
      VG UUID               WaAcyp-fQfL-YzUJ-N27b-RZFW-41aY-R1pxaH
       
    [root@localhost ~]# 
    

    这个例子使用 /dev/sdb1 分区上创建的物理卷,创建了一个名为 VG01 的卷组。Cur PV(当前物理卷数)Act PV(实际物理卷数) 表示当前卷组由几个物理卷组成。

    使用 vgextend 命令可以为已存在的卷组添加新的物理卷。

    [root@localhost ~]# vgextend VG01 /dev/sdb2 /dev/sdb3
      Volume group "VG01" successfully extended
    [root@localhost ~]# vgdisplay VG01 
      --- Volume group ---
      VG Name               VG01
      System ID             
      Format                lvm2
      Metadata Areas        3
      Metadata Sequence No  2
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                0
      Open LV               0
      Max PV                0
      Cur PV                3
      Act PV                3
      VG Size               4.99 GiB
      PE Size               4.00 MiB
      Total PE              1277
      Alloc PE / Size       0 / 0   
      Free  PE / Size       1277 / 4.99 GiB
      VG UUID               6aYut8-yFel-eniy-CWiO-dMi8-cRH5-uWKWrW
       
    [root@localhost ~]# 
    

    使用 vgreduce 命令可以为已存在的卷组去除某些物理卷。仅有一个物理卷的卷组不允许再去除仅剩的物理卷。

    [root@localhost ~]# vgreduce VG01 /dev/sdb2 /dev/sdb3
      Removed "/dev/sdb2" from volume group "VG01"
      Removed "/dev/sdb3" from volume group "VG01"
    [root@localhost ~]# vgreduce VG01 /dev/sdb1
      Can't remove final physical volume "/dev/sdb1" from volume group "VG01"
    [root@localhost ~]# vgdisplay VG01 
      --- Volume group ---
      VG Name               VG01
      System ID             
      Format                lvm2
      Metadata Areas        1
      Metadata Sequence No  7
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                0
      Open LV               0
      Max PV                0
      Cur PV                1
      Act PV                1
      VG Size               2.00 GiB
      PE Size               4.00 MiB
      Total PE              511
      Alloc PE / Size       0 / 0   
      Free  PE / Size       511 / 2.00 GiB
      VG UUID               6aYut8-yFel-eniy-CWiO-dMi8-cRH5-uWKWrW
       
    [root@localhost ~]# 
    

    使用 vgremove 命令可以删除已存在的整个卷组。

    [root@localhost ~]# vgremove VG01 
      Volume group "VG01" successfully removed
    [root@localhost ~]# vgdisplay VG01
      Volume group "VG01" not found
      Cannot process volume group VG01
    [root@localhost ~]# 
    

    在创建卷组时可以一次性指定多个物理卷。

    [root@localhost ~]# vgcreate VG01 /dev/sdb1 /dev/sdb2 /dev/sdb3
      Volume group "VG01" successfully created
    [root@localhost ~]# vgdisplay VG01
      --- Volume group ---
      VG Name               VG01
      System ID             
      Format                lvm2
      Metadata Areas        3
      Metadata Sequence No  1
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                0
      Open LV               0
      Max PV                0
      Cur PV                3
      Act PV                3
      VG Size               4.99 GiB
      PE Size               4.00 MiB
      Total PE              1277
      Alloc PE / Size       0 / 0   
      Free  PE / Size       1277 / 4.99 GiB
      VG UUID               4pOIcr-z8iP-IK3S-funj-8NI9-49Pd-klWHC0
       
    [root@localhost ~]# 
    

    创建一个或多个卷组后,就可以创建逻辑卷了。

  3. 创建逻辑卷

    Linux 系统使用逻辑卷来模拟物理分区,并在其中保存文件系统。 Linux 系统会像处理物理分区一样处理逻辑卷,允许你定义逻辑卷中的文件系统,然后将文件系统挂载到虚拟目录上。 要创建逻辑卷,使用 lvcreate 命令。lvcreate 命令通过指定卷组剩余的逻辑区段数来指定逻辑卷的大小。如果当前卷组没有足够的逻辑区段,则可以将向该卷组添加额外的物理卷,或者通过 lvreduce 命令来减少现有逻辑卷的大小。

    虽然通常不需要在其他 Linux LVM 命令中使用命令行选项,但 lvcreate 命令要求至少输入一些选项。

    -c,  --chunksize ChunkSize[b|B|s|S|k|K|m|M|g|G]:指定快照、缓存池、薄池逻辑卷(thin pool logical volumes)的块单位大小,默认为 KB。对于快照来说,该值必须是 4KiB 到 512KiB 之间 2 的次方,默认为 4KiB。对于缓存池来说,该值必须是32KiB and 1GiB之间 32KiB 的整数倍,默认为 64KiB。当通过逻辑缓存来指定大小,该值可能不小于缓存池的创建块大小。对于薄池,该值必须是 64KiB 到 1GiB 之间 64 KiB 的整数倍。如果没有指定池的元数据大小的话,默认值从 64 KiB 增长到适应池的元数据大小(在 128 MiB范围内);
    -C,  --contiguous {y|n}:设置或重置逻辑卷的连续分配策略,默认不连续分配;
    -i,--stripes Stripes:指定条带数。该值等于分散逻辑卷数据的逻辑卷数量。在创建 RAID 4/5/6 逻辑卷时,额外分区对于内部解释来说同样必要。
    -I --stripesize:指定每个条带的大小;
    -l --extents:指定分配给新逻辑卷的逻辑区段数,或者要用的逻辑区段的百分比;
    -L --size:指定分配给新逻辑卷的硬盘大小;
    --minor:指定设备的次设备号;
    -m --mirrors:创建逻辑卷镜像;
    -M --persistent:让次设备号一直有效;
    -n --name:指定新逻辑卷的名称;
    -p --permission:为逻辑卷设置读/写权限;
    -r --readahead:设置预读扇区数;
    -R --regionsize:指定将镜像分成多大的区;
    -s snapshot:创建快照逻辑卷;
    -Z --zero:将新逻辑卷的前 1 KB 数据设置为零。
    

    大多数情况下用到的只是少数几个选项。比如使用 lvcreate -L -n 指定新逻辑卷的大小、所在的卷组、名称后即可创建新的逻辑卷。-L 选项用于为要创建的逻辑卷指定空间大小,而 -n 选项用于为逻辑卷指定名称。

    [root@localhost ~]# lvcreate -L 2G VG01 -n lv01    
      Logical volume "lv01" created.
    [root@localhost ~]#
    

    也可以使用 -l 选项按照卷组空间的百分比来指定要创建逻辑卷的大小,比如 lvcreate -l 50%FREE VG01 -n lv02 命令将使用卷组剩余空间的 50% 来创建一个名为 lv02 的逻辑卷。如果想查看你创建的逻辑卷的详细情况,可用 lvdisplay 命令。

    [root@localhost ~]# lvcreate -l 50%FREE VG01 -n lv02
      Logical volume "lv02" created.
    [root@localhost ~]# lvdisplay VG01                  
      --- Logical volume ---
      LV Path                /dev/VG01/lv01
      LV Name                lv01
      VG Name                VG01
      LV UUID                OoyXAQ-6Jkh-isGh-Ak5N-vvZ3-qatN-o4Q6yP
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2018-05-29 23:41:42 +0800
      LV Status              available
      # open                 0
      LV Size                2.00 GiB
      Current LE             512
      Segments               2
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           253:3
       
      --- Logical volume ---
      LV Path                /dev/VG01/lv02
      LV Name                lv02
      VG Name                VG01
      LV UUID                Axe12D-fgnA-pCbv-Qq4F-nhC0-XT7l-MlGpKV
      LV Write Access        read/write
      LV Creation host, time localhost.localdomain, 2018-05-29 23:47:05 +0800
      LV Status              available
      # open                 0
      LV Size                1.49 GiB
      Current LE             382
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     8192
      Block device           253:4
       
    [root@localhost ~]#
    
  4. 创建文件系统

    运行完 lvcreate 命令之后,逻辑卷就已经产生了,但它还没有文件系统。你必须使用相应的命令行程序来创建所需要的文件系统。

    [root@localhost ~]# mkfs.ext4 /dev/VG01/lv01
    mke2fs 1.42.9 (28-Dec-2013)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    131072 inodes, 524288 blocks
    26214 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=536870912
    16 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
            32768, 98304, 163840, 229376, 294912
    
    Allocating group tables: done                            
    Writing inode tables: done                            
    Creating journal (16384 blocks): done
    Writing superblocks and filesystem accounting information: done 
    
    [root@localhost ~]# mkfs.ext3 /dev/VG01/lv02
    mke2fs 1.42.9 (28-Dec-2013)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    97920 inodes, 391168 blocks
    19558 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=402653184
    12 block groups
    32768 blocks per group, 32768 fragments per group
    8160 inodes per group
    Superblock backups stored on blocks: 
            32768, 98304, 163840, 229376, 294912
    
    Allocating group tables: done                            
    Writing inode tables: done                            
    Creating journal (8192 blocks): done
    Writing superblocks and filesystem accounting information: done 
    
    [root@localhost ~]# fdisk -l /dev/VG01/lv*
    
    Disk /dev/VG01/lv01: 2147 MB, 2147483648 bytes, 4194304 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    
    Disk /dev/VG01/lv02: 1602 MB, 1602224128 bytes, 3129344 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    [root@localhost ~]# 
    

    在创建了新的文件系统之后,可以用标准 mount 命令将这个卷挂载到虚拟目录中,就跟它是物理分区一样。唯一的不同是你需要用特殊的路径来标识逻辑卷。

    [root@localhost ~]# mount /dev/VG01/lv01 /appData
    [root@localhost appData]# ll -a /appData
    total 24
    drwxr-xr-x.  3 root root  4096 May 30 00:00 .
    dr-xr-xr-x. 20 root root  4096 May 26 10:51 ..
    drwx------.  2 root root 16384 May 30 00:00 lost+found
    [root@localhost appData]# 
    

    注意,mkfs.ext4mount 命令中用到的路径都有点奇怪。路径中使用了卷组名和逻辑卷名,而不是物理分区路径。文件系统被挂载之后,就可以访问虚拟目录中的这块新区域了。

此外,还可以使用以下命令来操作逻辑卷:

  • vgchange:激活和禁用卷组;
  • vgscan:搜索所有卷组;
  • pvresize:修改物理卷大小;
  • lvresize:修改逻辑卷大小;
  • lvscan:列出所有卷组中的所有逻辑卷;
  • lvs:显示逻辑卷信息;
  • lsblk:显示所有块信息;
  • lvremove:移除逻辑卷。

在手动增加或减小逻辑卷的大小时,要特别小心。逻辑卷中的文件系统需要手动修整来处理大小上的改变。大多数文件系统都包含了能够重新格式化文件系统的命令行程序,比如用于 ext2、 ext3 和 ext4 文件系统的 resize2fs 程序。

动态调整逻辑卷大小

LV 扩容:

第一种方法:直接增大5G,写“+5G”

  1. lv 扩容 5G
lvresize -L +5G /dev/mapper/vg_linuxidc-lv_root
  1. 文件系统大小变更
resize2fs /dev/mapper/vg_linuxidc-lv_root

第二种方法:原来是10G,增大5G就是“15G”

  1. lv扩容到15G
lvresize -L 15G /dev/mapper/vg_linuxidc-lv_u01
  1. 文件系统大小变更
resize2fs  /dev/mapper/vg_linuxidc-lv_u01

注:以上的lvresize 命令操作也可以通过 lvextend 命令实现。

LV 缩减
  1. 需要先卸载目录
umount /u01
  1. 这一步是否有根据执行下一步的执行返回决定,看下面的例子
e2fsck -f /dev/mapper/vg_linuxidc-lv_u01
  1. 文件系统大小变更
resize2fs  /dev/mapper/vg_linuxidc-lv_u01 10G
  1. lv 缩减
lvresize -L 10G /dev/mapper/vg_linuxidc-lv_u01
  1. 挂载所有 /etc/fstab 中记录的目录
mount -a

动态扩容示例:

# 比如发现某个目录锁挂在的逻辑卷大小不够用了,可以动态扩容(当然也可以动态减小)
# 新建一个5G大小的新分区 /dev/sda3 后查看 sda 硬盘的现有分区情况
[root@localhost gitlab_rpms]# fdisk -l /dev/sda*

Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000d5723

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    38780927    18877440   8e  Linux LVM
/dev/sda3        38780928    49266687     5242880   8e  Linux LVM

Disk /dev/sda1: 524 MB, 524288000 bytes, 1024000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sda2: 19.3 GB, 19330498560 bytes, 37754880 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

# 但是查看 sda 硬盘的实际生成的分区情况时发现刚刚创建的 /dev/sda3 并未创建
[root@localhost gitlab_rpms]# ll /dev/sda*
brw-rw----. 1 root disk 8, 0 Dec 16 16:45 /dev/sda
brw-rw----. 1 root disk 8, 1 Dec 16 16:45 /dev/sda1
brw-rw----. 1 root disk 8, 2 Dec 16 16:45 /dev/sda2
# partprobe 命令重读分区表即可显示新建分区。
# 当出现删除文件后出现仍然占用空间,或新建分区看不到新建分区时可以使用 partprobe 命令在不重启的情况下重读分区
[root@localhost gitlab_rpms]# partprobe
[root@localhost gitlab_rpms]# ll /dev/sda*
brw-rw----. 1 root disk 8, 0 Dec 16 16:52 /dev/sda
brw-rw----. 1 root disk 8, 1 Dec 16 16:52 /dev/sda1
brw-rw----. 1 root disk 8, 2 Dec 16 16:52 /dev/sda2
brw-rw----. 1 root disk 8, 3 Dec 16 16:52 /dev/sda3
[root@localhost gitlab_rpms]# fdisk -l /dev/sda3

Disk /dev/sda3: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

# 为新建分 /dev/sda3 分区创建同名的物理卷
[root@localhost gitlab_rpms]# pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created.
# 查看 sda 硬盘上的所有物理卷。
# /dev/sda2 和 /dev/sda3 都位于 cl 卷组,/dev/sda 和 /dev/sda1 并未创建物理卷所以无法查看
[root@localhost gitlab_rpms]# pvdisplay /dev/sda*
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               18.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4608
  Free PE               0
  Allocated PE          4608
  PV UUID               p6IMSf-lHv6-ZifS-cd0h-R7V7-2wom-gW3u2R
   
  "/dev/sda3" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda3
  VG Name               
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               rU9a3K-LuKe-P1nK-GRrd-ETgq-5a1l-aSwMcy
   
  Failed to find physical volume "/dev/sda".
  Failed to find physical volume "/dev/sda1".
# 查看卷组 cl 的情况
[root@localhost gitlab_rpms]# vgdisplay cl
  --- Volume group ---
  VG Name               cl
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               18.00 GiB
  PE Size               4.00 MiB
  Total PE              4608
  Alloc PE / Size       4608 / 18.00 GiB
  Free  PE / Size       0 / 0   
  VG UUID               w73gEP-ways-grKH-YtfK-0hee-uisC-DfW1Wz
# 将新建的物理卷 /dev/sda3 添加到卷组 cl 上
[root@localhost gitlab_rpms]# vgextend cl /dev/sda3
  Volume group "cl" successfully extended
# 再次查看卷组 cl 的情况,发现其大小已经由之前的 18G 增加到 23G,正是物理卷(即新建分区)/dev/sda3 的大小
[root@localhost gitlab_rpms]# vgdisplay cl 
  --- Volume group ---
  VG Name               cl
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               23.00 GiB
  PE Size               4.00 MiB
  Total PE              5887
  Alloc PE / Size       4608 / 18.00 GiB
  Free  PE / Size       1279 / 5.00 GiB
  VG UUID               w73gEP-ways-grKH-YtfK-0hee-uisC-DfW1Wz
# 使用 df 命令查看逻辑卷 /dev/mapper/cl-root 的大小
[root@localhost gitlab_rpms]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root  9.8G  7.7G  1.6G  84% /
devtmpfs             1.9G     0  1.9G   0% /dev
tmpfs                1.9G   84K  1.9G   1% /dev/shm
tmpfs                1.9G  9.1M  1.9G   1% /run
tmpfs                1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1            477M  142M  307M  32% /boot
/dev/mapper/cl-home  5.8G  1.3G  4.3G  23% /home
tmpfs                378M     0  378M   0% /run/user/1002
tmpfs                378M   16K  378M   1% /run/user/42
tmpfs                378M     0  378M   0% /run/user/0
# 使用 lvdisplay 命令查看逻辑卷 /dev/cl/root 的大小
[root@localhost gitlab_rpms]# lvdisplay /dev/cl/root
  --- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl
  LV UUID                fuabl5-TPRQ-Y3i5-QCM3-F6vG-9cfC-yUuvp9
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2018-05-04 06:32:32 +0800
  LV Status              available
  # open                 1
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
# 使用 vgdisplay 命令查看扩容后的 cl 卷组,发现有 5G 空闲空间
[root@localhost gitlab_rpms]# vgdisplay cl
  --- Volume group ---
  VG Name               cl
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               23.00 GiB
  PE Size               4.00 MiB
  Total PE              5887
  Alloc PE / Size       4608 / 18.00 GiB
  Free  PE / Size       1279 / 5.00 GiB
  VG UUID               w73gEP-ways-grKH-YtfK-0hee-uisC-DfW1Wz

# 使用 lvextend 命令来扩容 /dev/cl/root 逻辑卷(1279 就是 5 G 空间的 PE 数量)
[root@localhost gitlab_rpms]# lvextend -l +1279 /dev/cl/root
  Size of logical volume cl/root changed from 10.00 GiB (2560 extents) to 15.00 GiB (3839 extents).
  Logical volume cl/root successfully resized.
# 使用 lvdisplay 命令查看逻辑卷 /dev/cl/root 的大小已经改变
[root@localhost gitlab_rpms]# lvdisplay /dev/cl/root
  --- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl
  LV UUID                fuabl5-TPRQ-Y3i5-QCM3-F6vG-9cfC-yUuvp9
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2018-05-04 06:32:32 +0800
  LV Status              available
  # open                 1
  LV Size                15.00 GiB
  Current LE             3839
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
  
# 但使用 df 命令查看逻辑卷 /dev/mapper/cl-root 的大小仍为改变
[root@localhost gitlab_rpms]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root  9.8G  7.7G  1.6G  84% /
devtmpfs             1.9G     0  1.9G   0% /dev
tmpfs                1.9G   84K  1.9G   1% /dev/shm
tmpfs                1.9G  9.1M  1.9G   1% /run
tmpfs                1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1            477M  142M  307M  32% /boot
/dev/mapper/cl-home  5.8G  1.3G  4.3G  23% /home
tmpfs                378M     0  378M   0% /run/user/1002
tmpfs                378M   16K  378M   1% /run/user/42
tmpfs                378M     0  378M   0% /run/user/0
# 使用 resize2fs 命令来增大或者收缩文件系统的大小
[root@localhost gitlab_rpms]# resize2fs /dev/cl/root 
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/cl/root is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 2
The filesystem on /dev/cl/root is now 3931136 blocks long.
# 再次使用 df 命令查看逻辑卷 /dev/mapper/cl-root 的大小已经改变
[root@localhost gitlab_rpms]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   15G  7.7G  6.3G  56% /
devtmpfs             1.9G     0  1.9G   0% /dev
tmpfs                1.9G   84K  1.9G   1% /dev/shm
tmpfs                1.9G  9.1M  1.9G   1% /run
tmpfs                1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1            477M  142M  307M  32% /boot
/dev/mapper/cl-home  5.8G  1.3G  4.3G  23% /home
tmpfs                378M     0  378M   0% /run/user/1002
tmpfs                378M   16K  378M   1% /run/user/42
tmpfs                378M     0  378M   0% /run/user/0
[root@localhost gitlab_rpms]#

关于 LVM 的更详细用法可以参考:

  • https://wiki.gentoo.org/wiki/LVM/zh-cn#Usage
  • https://wiki.archlinux.org/index.php/LVM

你可能感兴趣的:(Linux文件系统和逻辑卷管理命令(二))