非 LVM 管理的 Linux 系统盘扩容案例

LVM 简介

LVM 是 Linux 系统上一个磁盘映射工具,为 Linux 内核提供虚拟卷宗管理, 原理如图所示,LVM 主要的一个优势就是可以将多个物理磁盘(或分区)合并为一个超大逻辑分区,以满足类似超大数据库文件等存储需求。

非 LVM 管理的 Linux 系统盘扩容案例

LVM 有个局限性就是在将磁盘(或分区)纳入 LVM 管理的时候需要对磁盘或分区进行格式化操作, 这就导致我们无法直接将已经存储了数据的磁盘纳入 LVM 管理。

本案例系统版本

Ubuntu 22.04.3 LTS

具体问题

系统盘上装了 Docker ,Docker 目录迅速膨胀,导致系统磁盘空间不足,购买一块新硬盘安装后发现无法将新增硬盘空间添加到系统盘所在的卷宗,由于安装系统时没有使用 LVM 管理系统盘。

解决方案

  1. 将新增硬盘使用 LVM 管理,并创建逻辑卷宗

  2. 将原系统文件全部 copy 到 LVM 管理的逻辑卷宗

  3. 引导系统从 LVM 逻辑卷宗启动

  4. 确认新卷宗启动正常

  5. 将原系统所在硬盘格式

  6. 将原系统盘纳入 LVM 管理

  7. 使用 LVM 对系统逻辑卷宗扩容

非 LVM 管理的 Linux 系统盘扩容案例

方案难点

该方案难点是迁移系统,Linux 系统虽然是基于文件的系统,但是文件中涉及到文件软硬链接, mount 目录, 虚拟目录,socket 文件等,并不是简单的 copy 操作; 还有就是迁移后的系统的启动引导流程需要处理,在处理的过程中要格外小心,稍有不慎就可能导致系统无法启动、文件丢失等严重后果。

方案操作过程

该方案是从虚拟机上多次尝试最终验证成功所得;

在操作时务必确认清楚当前命令在做什么,命令参数需要根据实际情况调整

一. 新磁盘操作

  1. 添加磁盘

  2. fdisk -l

查看新增磁盘名称 如果新磁盘为 “/dev/nvme1n1”

  1. fdisk /dev/nvme1n1

fdisk 命令进入操作模式按 m 键可以展示协助说明

新建 gpt 分区表, 然后 new 两个分区,一个 EFI ,另一个 linux 系统分区

使用 fdisk -l 查看新分区,如果为 /dev/nvme1n1p1 和 /dev/nvme1n1p2

  1. apt install lvm2

安装 lvm2 工具套件

  1. pvcreate /dev/nvme1n1p2

将新磁盘的第二分区使用 lvm 管理,使用 pvdisplay 命令查看新增的物理磁盘名(一般与原名一样 /dev/nvme1n1p2), pvs 命令也可以查看

  1. vgcreate vg0 /dev/nvme1n1p2

创建 volume group (名称vg0) 可以使用 vgs 或 vgdisplay 命令查看创建结果

  1. lvcreate -n lv0 -L 15G vg0

创建 logic volume (名称 lv0, 大小 15G 按需指定)之后使用 lvs 或 lvdisplay 命令可以查看创建的逻辑分区

  1. fdisk -l

查看新建的逻辑卷 id (如果新逻辑卷为 /dev/mapper/vg0-lv0 )

  1. mkfs.ext4 /dev/mapper/vg0-lv0

设置文件格式为 ext4

  1. mkfs.fat -F32 /dev/nvme1n1p1

给 EFI 系统分区设置文件格式 fat32

二. 迁移系统

  1. mkdir /root2

创建分区挂载点

  1. mount /dev/mapper/vg0-lv0 /root2

挂载新分区

  1. tar -cf - --one-file-system / | tar -xf - -C /root2

copy 系统文件到目标 新分区, 提示删除开头的 / 是安全警告可以忽略,提示忽略套接字也正常

  1. mount /dev/nvme1n1p1 /root2/boot/efi

将新的 EFI 引导分区挂载到新系统的 /boot/efi 目录

  1. mount 必要节点


sudo mount --bind /dev /root2/dev

sudo mount --bind /proc /root2/proc

sudo mount --bind /sys /root2/sys

  1. chroot /root2

切换到新系统盘

  1. 修改 mount 映射


vi /etc/fstab

修改 / 对应的 uuid 为 /dev/mapper/vg0-lv0 分区的 id,

修改 boot/efi 的 uuid 为 /dev/nvme1n1p1 EFI 分区的 id,

blkid 命令可以查看 id

  1. grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu

安装引导程序,并创建系统引导配置 ubuntu (ubuntu 名称不可随意指定)

可能会弹出警告: 提示 EFI 变量无法设置在当前系统,需要手动完成 GRUB 设置, 可忽略

  1. grub-mkconfig -o /boot/grub/grub.cfg

更新新系统下的 grub 配置

  1. grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck --removable

重新安装引导程序,并创建系统引导配置

  1. grub-mkconfig -o /boot/grub/grub.cfg

再次更新新系统下的 grub 配置

21 . 重启系统到固件,选择启动磁盘为新增磁盘

三. 处理旧的系统盘

  1. pvcreate /dev/nvme0n1

整个磁盘创建lvm物理盘

  1. vgextend vg0 /dev/nvme0n1

将新物理盘符添加到磁盘组 vg0

  1. lvextend -l +100%FREE /dev/mapper/vg0-lv0

将逻辑盘扩容到 vg0 的最大可用空间

  1. resize2fs /dev/mapper/vg0-lv0

将文件系统扩容到逻辑盘符的最大空间

操作失误遇到的问题

如果磁盘 已经被 lvm 管理, 然后你又手动的对磁盘进行分区操作,那么对应的 lvm 逻辑分区不会自动消失, 导致 /dev/mapper/ 下有个 lv 的映射一直 lvremove 删不掉

可使用 dmsetup ls 查看映射信息,然后使用 dmsetup remove 删除对应的逻辑映射。

设置面板无法打开

过了几天发现系统设置面板无法打开,不确定是不是由于系统扩容引起的,解决办法如下

apt install gnome-control-center 按转完即可。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容