在 Centos Stream 8 上扩展 /var 分区

在 Centos Stream 8 上扩展 /var 分区

在安装我的 centos stream 8 OS 期间,我给 /var 分配了 10GB 的大小,认为这足够了,但是在我开始使用 docker 之后,我发现它在 /var 分区上占用了太多空间,如 df 命令所示:

[root@compute-07 ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs              28G     0   28G   0% /dev
tmpfs                 28G     0   28G   0% /dev/shm
tmpfs                 28G  179M   28G   1% /run
tmpfs                 28G     0   28G   0% /sys/fs/cgroup
/dev/mapper/cs-root  371G  8.2G  363G   3% /
/dev/mapper/cs-home  100G  2.0G   98G   2% /home
/dev/mapper/cs-var    10G  9.0G  1.1G  90% /var
/dev/sda2            2.0G  412M  1.6G  21% /boot
/dev/sda1            2.0G  7.3M  2.0G   1% /boot/efi
/dev/mapper/cs-tmp    10G  105M  9.9G   2% /tmp
tmpfs                5.5G   16K  5.5G   1% /run/user/42
overlay               10G  9.0G  1.1G  90% 

/var/lib/docker/overlay2/77f74478297ca61595f0003d35c7323ec627adb44d94cef92c2b4a3c97319a66/merged
overlay               10G  9.0G  1.1G  90% /var/lib/docker/overlay2/5eeb399ce4a3c0d8065d63123985269a359fa66f4d20a8486326e466a48a0128/merged
overlay               10G  9.0G  1.1G  90% /var/lib/docker/overlay2/08d42ca66e3a5974bc305b502bca2aa4d22aa7ddcab6ea14c6af300b3abb3a70/merged
overlay               10G  9.0G  1.1G  90% /var/lib/docker/overlay2/1a45cb32b127fdf8f5c1483385139a865fdc69260ec20f3dcd4c56ad6890f909/merged
overlay               10G  9.0G  1.1G  90% /var/lib/docker/overlay2/ebb9af8edee824a4013dcd526e33e22272283bdee508fd43208fade557def728/merged
overlay               10G  9.0G  1.1G  90% /var/lib/docker/overlay2/41d55822108d04c85f348dc134fe6929b0e67f6b3bd7e0af147633bfd3a252c1/merged
overlay               10G  9.0G  1.1G  90% /var/lib/docker/overlay2/5cf3e8e06e9b4c2e6ed65164d91aed19f63d55e91524d6563e9f16b6709d29be/merged
overlay               10G  9.0G  1.1G  90% /var/lib/docker/overlay2/1d1eda94e68596b00d0cabcc75a7c91999a1c845ebd02c733bb9f00ac66a26f0/merged
overlay               10G  9.0G  1.1G  90% /var/lib/docker/overlay2/bc9e9a28c6761ad89a9457110642156ebd2b4d77de841f2a3ac9ffbaa90e4b63/merged

tmpfs                5.5G     0  5.5G   0% /run/user/0

这是 lsblk 命令的输出,因为 /var 与 / 和 /home 位于不同的分区,所以我无法找到调整其大小或创建另一个分区然后将其链接到 /var 的方法

[root@compute-07 ~]# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 558.4G  0 disk 
├─sda1        8:1    0     2G  0 part /boot/efi
├─sda2        8:2    0     2G  0 part /boot
└─sda3        8:3    0 554.4G  0 part 
  ├─cs-root 253:0    0 370.4G  0 lvm  /
  ├─cs-swap 253:1    0    64G  0 lvm  [SWAP]
  ├─cs-tmp  253:2    0    10G  0 lvm  /tmp
  ├─cs-home 253:3    0   100G  0 lvm  /home
  └─cs-var  253:4    0    10G  0 lvm  /var
sr0          11:0    1  1024M  0 rom  

有什么方法可以调整此分区的大小而不丢失任何数据。

答案1

不。实际上,系统中的大部分空间总是被/var通常变量数据存在于数据库、Docker、日志等中,而 Linux/很少当系统管理得当时,将使用超过 10 GiB 的空间。

不仅您的 LVM 不是最理想的:我会将整个 Debian 安装和一些服务放入您在 ESP 中浪费的空间中/boot。 (我习惯于为系统分配 4GiB 来创建虚拟机。绰绰有余。)

那么,最好的解决方案就是缩小超大的根文件系统,但这无法在线完成。您需要启动一些救援媒体,激活 VG,然后缩小文件系统和逻辑卷,考虑到分区的大小,这可能会耗费大量时间。还可能会把事情搞得一团糟。如果您很着急,您可以做点改变:在根目录中创建一些目录,将 Docker 数据移入其中,然后将其绑定挂载回 Docker 数据所在的 var 中。您需要暂时停止 Docker 和所有容器。类似这样的操作:

systemctl stop docker.service
mkdir /var-lib-docker
mv /var/lib/docker/* /var-lib-docker
mount --bind /var-lib-docker /var/lib/docker
systemctl start docker.service

这样,Docker 将使用超大根文件系统上的空间,同时在通常的位置可用。/etc/fstab您需要添加以下条目,以便此配置在重启后仍然存在:

/var-lib-docker /var/lib/docker none bind 0 0

但请记住,这是一个相当丑陋的黑客,它可以为您赢得一些时间,但也会带来一些问题,因此请寻找机会从根目录回收空间并进行/var适当的分配。

教训是:永远不要从一开始就分配所有可用空间。留下一些(大部分)未分配的空间。您始终可以轻松添加空间并在线执行此操作,而回收空间非常困难、耗时且容易出错,并且需要停机。最好管理好空间,这样您就永远不需要回收它了。

答案2

作为替代方案这个答案

您的系统正在使用 LVM 逻辑卷。

卷组中可能还剩有一些未使用的空间,您可以分配这些空间来扩展 var。

如果没有剩余未使用的空间,或者空间太小,您可以减少或删除交换 LVM并利用由此释放的空间来扩展 /var。

这将使您的系统保持完好,并且通常甚至可以在线完成。

该方法类似于(命令未经测试,因此不要直接复制它们,但原理应该是合理的)

  • 当您将交换分区脱机时,在超大的根文件系统上创建临时或永久的交换文件作为替代。

    • dd if=/dev/zero of=/swap-file count=65536 bs=1M
    • mkswap /swap-file
    • swapon /swap-file
  • swapoff /dev/mapper/cs-swap 禁用交换分区

  • lvreducecs-swap,然后使用以下命令再次格式化剩余的 LVM 交换分区,mkswap并重新激活较小的交换空间swapon

  • 或者直接删除lvremove

使用新创建的空闲LVM空间来扩展/var LVM卷,并扩展文件系统系统

lvextend -l +100%FREE --resizefs /dev/mapper/cs-var

答案3

您的dflsblk不告诉我们它们的文件系统是什么。要缩小卷(分区或 LV),必须先缩小其上的文件系统。根文件系统的常见选择是 ext4,可以离线缩小。但是,CentOS(和类似 RHEL 的发行版)的默认文件系统选择是 XFS,目前无法缩小。

正如其他人在回答中指出的那样,备份 rootfs 使用量 8.2 GB 并不困难。因此,根据您的 rootfs 文件系统类型,您有以下选择:

如果是 ext4,您可以就地缩小它:

  • 重新启动到另一个系统,例如 ArchISO,因为 ext4 只能离线缩小。

  • 确保lvs显示你的分区,然后e2fsck -f /dev/mapper/cs-root

  • resize2fs -M -p /dev/mapper/cs-root

    • 或者,如果您知道所需的 rootfs 大小,则可以指定它,而不是使用-M

      resize2fs -p /dev/mapper/cs-root 15G

      请注意,最好留出一些空间来缩小底层卷。

  • 从 LV 回收空间lvreduce -L 16G cs/root

  • 将文件系统的大小调整回卷大小:resize2fs -p /dev/mapper/cs-root

  • 现在,可以将免费空间分配给/varlvextend -l +100%FREE cs/var

然而,如果是 XFS,那么最好的办法是备份你的 rootfs 并重新创建它:

  • 像上面一样启动 ArchISO。
  • rsync -avHAXx /your-rootfs /somewhere(确保/somewhere位于另一个卷上 - 很容易找到 8.2 GB 的备用空间 - 您的交换卷很可能过大)
  • lvremove根卷并重新创建适当大小的卷。我建议这次格式化为 ext4。
  • rsync -avHAXx /somewhere /your-rootfs把东西复制回去。
  • 如果需要,请更新您的 GRUB 配置 - AFAICT LV ID 通常会作为提示写入grub.cfg,但我不熟悉 CentOS(在 Debian 上它很简单update-grub)。
  • 按照上述方法分配 VG 中的可用空间。

我想指出的其他要点:

  • 您的 EFI 系统分区 (ESP) 太大。对于典型的 Linux 服务器,256 MB 应该足够了(我在 Ubuntu 服务器上使用了 128 MB)。它只需要保存 GRUB 二进制文件和一个非常基本的版本grub.cfg
  • /boot不必驻留在其自己的卷上。GRUB 可以很好地读取 LVM 和您的 rootfs 文件系统。
  • 根据您的服务器设计,您的/root空间也可能过大(我的 Proxmox VE 服务器使用了 16 GB - 我不打算将数据放在主机上)。
  • 您真的需要 64 GB 的交换空间吗?通常 8 GB 就够了。

相关内容