使用虚拟机上的 ssh 连接调整 ext4 /boot 分区的大小

使用虚拟机上的 ssh 连接调整 ext4 /boot 分区的大小

我有一台 Ubuntu 19.04 虚拟机,我通过 ssh 连接到它。

我必须调整启动分区的大小。

# fdisk -l
Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc59d8598

Device     Boot  Start       End   Sectors   Size Id Type
/dev/sda1  *      2048    487423    485376   237M 83 Linux
/dev/sda2       487424 629143551 628656128 299.8G 83 Linux

我喜欢将 sda1 的大小调整为 1024M,并且无法使用 live cd。
在我的 VM 上我是 root 用户。

我想我必须调整根分区 sda2 的大小并将其向前移动,然后调整 sda1 的大小。

需要一点帮助来完成这个操作。

我没有发现任何像我这样的问题:只有一个根分区(sda2)上的示例,并且无需通过腾出空间来移动它到启动分区(sda1)

你能帮我吗?

致以最诚挚的问候,
莱昂纳多

PS 我没有丢失分区上的数据:-)

更新

我发现我的提供商允许我启动系统救援光盘在我的虚拟机上,所以我已经卸载了所有虚拟机分区,但我在命令行中。

我现在可以做这份工作吗?

答案1

我已成功使用 ssh 连接调整 /boot 分区的大小并扩大它,并缩小虚拟机上的根分区。

我有 /dev/sda1 (/boot)
和 /dev/sda2 (/) 根

首先需要启动一些类似 Live CD 的东西。我的提供商让我使用系统救援光盘启动系统。因此,在我的提供商 vps 控制面板上,我有一个选项可以启动系统救援光盘完成后,我就可以通过 ssh 从我的 vps 的同一 ip 连接到它。

在我的主机上执行此操作之前,我会执行以下操作:
$ mv /home/<username>/.ssh/known_hosts /home/<username>/.ssh/known_hosts.bak
为了避免我的系统尝试使用 rsa 证书连接到远程主机。

在最后的工作中我会$ mv /home/<username>/.ssh/known_hosts.bak /home/<username>/.ssh/known_hosts
恢复以前的行为。

  1. 我通过 ssh 连接到系统救援光盘
  2. 我检查我的分区没有被
    # umonunt /dev/sda1
    # umonunt /dev/sda2
    系统挂载,告诉我它们没有被挂载。
  3. # e2fsck -f /dev/sda2检查 fs
  4. 我的 sda2 最多有 300GB 可用。我将其调整为 200GB:(
    # resize2fs /dev/sda2 200G缩小)
  5. 上一个命令的输出类似于... The filesystem on /dev/sda2 is now xxxxx (4k) blocks long. ...xxxxx 是一个数字。您必须将 xxxxx * 4 相乘才能得到 yyyyy 的新大小(以 k 为单位),并且记住它
  6. 现在我必须设置分区表:
    1. # fdisk /dev/sda(类型求助)
    2. 积极的d命令(删除分区)
    3. 选择2分割
    4. 积极的n命令(创建分区)
    5. 选择(主分区)
    6. 选择第一个扇区:选择默认(与之前相同)
    7. 选择最后一个扇区:+yyyyyk(如果 yyyyy 是 3746596,请选择 +3746596k)注意+
    8. 然后它会问你: Partition #2 contains a ext4 signature Do you want to remove the signature? [Y]es/[N]o:
      选择n(否则我想它会删除你的所有数据)
    9. 启用在磁盘上写入新分区的命令

现在您必须将根分区向右移动。

您需要定义一个new_start_sector来移动。
# fdisk -l
并获取 /dev/sda1(/boot 分区)的最后一个扇区,假设数字 zzz
为 1024*1024*1024/512 并获取扇区中的 1 GB 并将其添加到 zzz 以获得new_start_sector(zzz+(1024*1024*1024/512))

编写如下 Bash 脚本:

#!/bin/sh
partition=/dev/sda2
disk=/dev/sda
sector_size=512
new_start_sector=2584575
exit 1 # drop this line exit 1 after you have change 2584575 using zzz calculate before by you
# opos is right after the new partition and given in bytes
opos=$(($new_start_sector * $sector_size + `blockdev --getsize64 $partition`))
echo "doing dd_rescue -v -r -S $opos $partition $disk"
dd_rescue -v -r -S $opos $partition $disk

现在您已经移动根分区,但必须设置正确的分区表。

  1. # fdisk /dev/sda(类型求助)
    1. 积极的d命令(删除分区)
    2. 选择2分割
    3. 积极的n命令(创建分区)
    4. 选择(主分区)
    5. 选择第一个扇区:选择new_start_sector之前定义的
    6. 选择最后一个扇区:选择默认(最后一个可用)
    7. 然后它会问你: Partition #2 contains a ext4 signature Do you want to remove the signature? [Y]es/[N]o:
      选择n(否则我想它会删除你的所有数据)
    8. 启用在磁盘上写入新分区的命令

现在调整根分区的大小:
# e2fsck -f /dev/sda2检查 fs
# resize2fs /dev/sda2

现在删除启动分区并使其更大:

  1. # fdisk /dev/sda(类型求助)
    1. 积极的d命令(删除分区)
    2. 选择1分割
    3. 积极的n命令(创建分区)
    4. 选择(主分区)
    5. 选择第一个扇区:选择默认
    6. 选择最后一个扇区:选择new_start_sector- 1
    7. 然后它会问你: Partition #1 contains a ext4 signature Do you want to remove the signature? [Y]es/[N]o:
      选择n(否则我想它会删除你的所有数据)
    8. 选择A命令(使分区 1 可启动)
    9. 选择1分割
    10. 启用在磁盘上写入新分区的命令

现在调整启动分区的大小:
# e2fsck -f /dev/sda1检查 fs
# resize2fs /dev/sda1

我重新启动后一切正常。
我执行此命令系统救援光盘重新启动时所有历史记录都消失了,所以我试着记住所有要写入的内容。
请仔细计算我的示例中使用的扇区和字节。

本示例全部通过谷歌搜索各种解决方案完成



和更多 ...

记住
$ mv /home/<username>/.ssh/known_hosts.bak /home/<username>/.ssh/known_hosts

致以最诚挚的问候,
莱昂纳多

相关内容