在没有物理访问权限的机器上缩小根分区

在没有物理访问权限的机器上缩小根分区

好吧,让我尝试尽可能彻底地解释它。因此,我使用变色龙云在裸机(〜远程计算机)上保留节点并通过 ssh 访问它们。这些节点运行 Ubuntu 20.04,而我有权访问的节点只有 1 个 SSD,这一点很重要,因为我所在的项目只需要 SSD。

root在ssd上的sda1上,sda1占据了整个ssd。

基本上我想缩小 sda1 (其中包含 root),在 SSD 上创建另一个分区并在其上安装我的项目的另一个文件系统(此文件系统将在整个项目过程中发生变化,btrfs,xfs 等)。因此,原始的 EXT4 文件系统将保留在 sda1 上,我需要一个带有另一个文件系统的额外分区。但由于这不是我可以物理访问的机器,我无法使用 U 盘或 CD 重新安装, ETC。

我知道这可能会令人困惑,可能不正确或不完整。这也可能不是一个新问题,但我找不到适合我的情况的令人满意的答案。我的项目负责人认为这是一个可以解决的问题。请随意询问更多详细信息(命令的屏幕截图或其他内容),纠正错误,帮助我,任何事情都欢迎。

我非常感谢您的时间和帮助。

答案1

我在 Amazon Lightsail vps 中执行了此操作,以便将其转换为使用 LVM。首先,您必须禁用 cloud-init 软件包在每次启动时自动增长分区。 IIRC,您需要注释掉或删除/etc/cloud/cloud.cfg 中引用growpart 和resizefs 的行。然后你可以添加这两个脚本:

#!/bin/sh

PREREQ=""

prereqs()
{
        echo "$PREREQ"
}

case "${1:-}" in
  prereqs)
    prereqs
    exit 0
    ;;
esac

. /usr/share/initramfs-tools/hook-functions

# copy the binary as early as possible
copy_exec /sbin/resize2fs /sbin
copy_exec /sbin/e2fsck /sbin

将其放入 /etc/initramfs-tools/hooks/resize-hook 中

#!/bin/sh

PREREQ=""

prereqs()
{
        echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
        prereqs
        exit 0
        ;;
esac

e2fsck -fy /dev/sda1
resize2fs /dev/sda1 9g

将 9g 更改为您希望 fs 缩小到的任何大小,并将其放入 /etc/initramfs-tools/scripts/local-premount/resize 中。不要忘记 chmod 这两个脚本 +x,并使用update-initramfs.

重新启动后,验证文件系统是否已收缩 ( df),使用 resizepart 命令来parted收缩分区。最好在分区中保留额外的 GB 左右,以确保您不会将分区缩小到小于文件系统,然后resize2fs稍后对其进行扩展以填充整个新分区的大小。

此外,在验证文件系统已收缩后,删除上述两个脚本并再次重建 initramfs。

答案2

普苏西的回答如果执行正确,将会起作用,但是一个小错误可能会导致系统无响应。如果发生这种情况,我相信您将丢失系统上已有的任何内容。所以如果你选择了这个选项你应该拍一张快照第一的!


读懂变色龙云,它是围绕图像的概念构建的。您配置服务器一段时间,为其部署映像,并在租约结束时小心拍摄服务器快照,否则可能会丢失服务器。关于变色龙有一些暗示最多图像是单个分区,推断一些也许不是。

如果是我,我不会就地编辑服务器。相反,我会将最新的快照下载到我的本地计算机(您可以访问的任何 Linux 或 Mac),对其进行编辑、上传,然后使用它。

根据文档这些图像是QCOW2 图像。下载后,可以将它们转换为原始图像qemu-image convert。用resize2fs/修改fdisk,用 qemu-image 重新打包并上传回来:

# Unpack
qemu-img convert -p -O raw base_image.qcow2 raw_image

# Repack
qemu-img convert -p -O qcow2 raw_image new_image.qcow_2

相关内容