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


20

长话短说,我需要在启动(嵌入式系统)时自动执行所有操作。

我们的工程师会将图像刷新到生产设备。这些图像将包含一个小的分区表。在启动时,我需要自动扩展最后一个分区(#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

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

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


不要指望不用尝试就可以收到准备就绪的脚本!那么,您能否向我们展示到目前为止您尝试了什么?另一件事是您要调整大小的分区一定不能在操作过程中安装....
Luciano Andress Martini

我已经尝试过resizepart命令,它可以工作,但是需要一个确切的大小。我需要它是动态的。
Paul Knopf

resize2fs可能正是我想要的。linux.die.net/man/8/resize2fs
Paul Knopf

Answers:


22

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


旧版本parted有一个resize,将同时调整分区和文件系统一气呵成命令,它甚至工作了vfat

在Kobo ereader修改中,我使用此方法将内部存储器的第3个分区调整为最大大小:(它盲目地假设没有第4个分区和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

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


这正是我想要的。谢谢你的帮助!
Paul Knopf

附带的问题,最后的8个字节是什么?
Paul Knopf

避免按单个扇区调整大小...您必须将其更改为-40左右(磁盘末端的GPT备份头)。
弗罗斯特沙茨

难道parted不支持通过命令行自动扩展?因为,它确实以交互方式支持它。如果以交互方式运行,它将询问您是否要修复GPT分区表以使其与磁盘大小(类型fix)匹配,然后可以运行resizepart 3 -1。我一直在尝试找出如何从命令行执行此操作。
哈维

不太快:在parted 3.0中已删除了resize命令。尝试sfdisk或gparted。
GregD

16

无法正确编写脚本脚本(它要求进行确认,因为已安装了分区,并且与我发现的其他答案不符-1s100%),我只是找到完全可以做到这一点的growpart工具

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

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


1
这是我现在可以找到的最方便的方法。效果很好。
SebiF

这是我的解决方案-parted不喜欢ext4作为文件系统,而且似乎没有办法避免它尝试调整文件系统的大小...
Antti Haapala

不适用于Ubuntu 18.04
DreamFlasher

@DreamFlasher我不知道为什么它对您不起作用。据我所知,您只能安装cloud-guest-utils软件包,并且由于这是growpart提供的唯一功能,因此除非有错误,错误使用或无法控制的错误,否则它应该可以工作。请注意,最后一个参数(示例中为3)是要调整大小的分区(从1开始),并且在分区之后需要有足够的空间以便能够以此方式调整大小。
伊沃·史密斯

7

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

parted /dev/sda resize 3 100%

1
过时的,不能在Ubuntu 18.04及更高版本上使用
DreamFlasher

分开的版本3稍微增加了resize命令,现在您必须使用resizepart命令,然后分别调整基础文件系统或PV的大小(如果使用的是该大小)。对于ext4,命令是resize2fs,对于XFS,命令是xfs_growfs。通常,这两种操作都是在挂载文件系统时完成的,在两种情况下,参数都是挂载点。
乔纳森·巴扎德

0

在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

调整大小前,可能无需挂载。我这样做是为了抑制来自resize2fs的用户输入查询。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.