以编程方式对磁盘进行分区

以编程方式对磁盘进行分区

我正在尝试创建一个 bash 脚本,该脚本将在具有现有分区的磁盘上创建一个带有文件系统的新分区。

看起来使用parted以编程方式创建分区很容易,但是它要求您知道在哪里启动和停止新分区,这就是我遇到麻烦的地方。

我不想依赖具有特定位置/大小分区的磁盘。也就是说,我想在最后一个现有分区之后立即开始创建一个新分区。我希望能够创建固定大小的分区,或者填充剩余空间。

在 Bash 中,有没有可靠的方法来确定

a) 最后一个分区的结束位置,
b) 最后一个分区之后剩余的未分区空间?

答案1

parted可以打印可用空间。示例(我故意选择了一个复杂的):

# parted /dev/sda unit s print free
[...]
Number  Start      End        Size       Type      File system  Flags
        63s        2047s      1985s                Free Space
 1      2048s      4196351s   4194304s   primary   fat32        lba
        4196352s   4198399s   2048s                Free Space
 2      4198400s   6295551s   2097152s   primary   ext2         boot
        6295552s   6297599s   2048s                Free Space
 3      6297600s   27269119s  20971520s  primary   ext2
        27269120s  27271167s  2048s                Free Space
 4      27271168s  31115263s  3844096s   extended               lba
 5      27273216s  29192191s  1918976s   logical   ext2
 6      29194240s  31115263s  1921024s   logical   ext2
        31115264s  31116287s  1024s                Free Space

正如您所看到的,这直接为您提供了您可以创建的分区的位置和大小,即最后一行显示Free Space。您可以创建一个以 31115264s 开始并以 31116287s 结束的分区。

要不是扩展分区不够大这个坑!

但也许您已经使用 GPT,而不会遭受此类并发症的困扰。

获取数字应该很容易。

function make_partition
{
    parted -s "$1" unit s mkpart primary "$2" "$3"
}

make_partition /dev/sda `parted /dev/sda unit s print free | grep 'Free Space' | tail -n 1`

或者类似的东西。 (当然,您希望在这里进行更多的健全性检查。)

@swisscheese 在另一个答案中做了很好的评论,我不知道parted提供了解析友好的输出。您可能会选择使用它。获取最后一个最大的空闲的示例:

# parted -m /dev/sda unit s print free | grep 'free;' | sort -t : -k 4n -k 2n | tail -n 1
1:27269120s:27271167s:2048s:free;

这是否适用于您的情况(在我的示例中,您也无法在那里创建分区,它实际上已经满了)是您必须自己弄清楚的事情。 :)

答案2

这很简单,mkparted有一个 --list选项,您需要使用awk--list检索最后一个分区,然后使用mkpart part-type [fs-type] start end

但你的答案是:

首先,您应该获得所有分区并使用:

mystartgroup=`parted --list |awk {'print $2'}`
myendgroup=`parted --list |awk {'print $3'}`

笔记:

  1. 您应该转换GBMG.
  2. 您应该使用每个值的最后一个值variable
  3. 您应该在最终脚本-s中使用parted command

如果我有时间,请完成这个脚本,抱歉没有时间。

相关内容