长话短说,我需要在启动(嵌入式系统)时自动执行这一切。
我们的工程师会将图像闪存到生产设备。这些图像将包含一个小的分区表。在启动时,我需要自动扩展最后一个分区 (#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。
fro*_*utz 34
在当前版本的parted
,resizepart
应该适用于分区(parted
理解100%
或类似-1s
的东西,后者也需要--
停止解析 cmdline 上的选项)。要确定您可以使用的确切值unit s
,print free
。resize2fs
之后是文件系统。
旧版本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
增加分区,以及您的文件系统提供的任何工具来增加分区,例如resize2fs
for ext*
.
小智 12
正确的方法是使用 parted 具有百分比概念的事实。所以
parted /dev/sda resize 3 100%
Run Code Online (Sandbox Code Playgroud)
小智 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 的博客文章。