自动扩展最后一个分区以使用所有未分配的空间,在批处理模式下使用 parted

Pau*_*opf 32 parted

长话短说,我需要在启动(嵌入式系统)时自动执行这一切。

我们的工程师会将图像闪存到生产设备。这些图像将包含一个小的分区表。在启动时,我需要自动扩展最后一个分区 (#3) 以使用磁盘上的所有可用空间。

这是我查看磁盘上的可用空间时得到的结果。

> parted /dev/sda print free
Model: Lexar JumpDrive (scsi)
Disk /dev/sda: 32.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  25.3MB  24.2MB  fat16        primary  legacy_boot
        25.3MB  26.2MB  922kB   Free Space
 2      26.2MB  475MB   449MB   ext4         primary
 3      475MB   1549MB  1074MB  ext4         primary
        1549MB  32.0GB  30.5GB  Free Space
Run Code Online (Sandbox Code Playgroud)

我需要将分区 3 扩展 N (30.5GB) 字节数

如何在没有提示的情况下自动执行此步骤?这需要在第三个分区之后使用动态大小的可用空间。

小智 36

由于无法正确编写脚本分离(它要求确认,因为分区已安装,并且与我发现的其他答案不理解-1s或相反100%),我刚刚找到了执行此操作的增长部分工具

用法很简单:(growpart /dev/sda 3然后是resize2fs /dev/sda3,或其他适用于所用文件系统类型的适当命令)。

在 Debian 和 Ubuntu 中,它被打包为cloud-guest-utils

  • 这是我现在能找到的最方便的方法。它工作得非常好。 (3认同)

fro*_*utz 34

在当前版本的parted,resizepart应该适用于分区(parted理解100%或类似-1s的东西,后者也需要--停止解析 cmdline 上的选项)。要确定您可以使用的确切值unit sprint freeresize2fs之后是文件系统。


旧版本parted有一个resize命令可以一次性调整分区和文件系统的大小,它甚至适用于vfat.

在 Kobo 电子阅读器的修改中,我用它来将内存的第三个分区调整到最大:(它盲目地假设没有第四个分区和 msdos 表和东西)

start=$(cat /sys/block/mmcblk0/mmcblk0p3/start)
end=$(($start+$(cat /sys/block/mmcblk0/mmcblk0p3/size)))
newend=$(($(cat /sys/block/mmcblk0/size)-8))

if [ "$newend" -gt "$end" ]
then
    parted -s /dev/mmcblk0 unit s resize 3 $start $newend
fi
Run Code Online (Sandbox Code Playgroud)

因此,/sys/block/.../如果内核支持,您也可以从中获取值。但是parted删除了该resize命令,因此您现在必须执行两个步骤,resizepart增加分区,以及您的文件系统提供的任何工具来增加分区,例如resize2fsfor ext*.

  • 对于那些寻找实际 `resizepart` 命令的人,我认为这就是 OP 的想法:`sudo parted /dev/mmcblk0 resizepart 3 100%` 其中 `/dev/mmcblk0` 是驱动器,而 `3` 是划分。 (5认同)

小智 12

正确的方法是使用 parted 具有百分比概念的事实。所以

parted /dev/sda resize 3 100%
Run Code Online (Sandbox Code Playgroud)

  • 过时,不适用于 Ubuntu 18.04 及更高版本 (5认同)
  • `parted /dev/sda resizepart 3 100%` 效果很好 (2认同)

小智 6

在 Ubuntu 18.04 中,我可以使用以下内容调整大小以填充脚本中的未分配空间:

sudo parted -s /dev/sdb "resizepart 2 -1" quit
sudo mount -av
sudo umount /dev/sdb2
sudo mount /dev/sdb2 /mnt
sudo resize2fs /dev/sdb2
Run Code Online (Sandbox Code Playgroud)

在调整大小之前可能不需要安装。我这样做是为了禁止从 resize2fs 查询用户输入。


小智 5

或者,您可以使用以下命令制作单行sfdisk

echo ", +" | sfdisk -N 3 /dev/sda
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅Karel Zak 的博客文章