在安装我的 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
禁用交换分区lvreduce
cs-swap,然后使用以下命令再次格式化剩余的 LVM 交换分区,mkswap
并重新激活较小的交换空间swapon
或者直接删除
lvremove
使用新创建的空闲LVM空间来扩展/var LVM卷,并扩展文件系统系统
lvextend -l +100%FREE --resizefs /dev/mapper/cs-var
答案3
您的df
和lsblk
不告诉我们它们的文件系统是什么。要缩小卷(分区或 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
现在,可以将免费空间分配给
/var
:lvextend -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 就够了。