以编程方式分区磁盘


10

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

看起来很容易以分区方式通过编程创建分区,但是它要求您知道从哪里开始和停止新分区,这就是我遇到的麻烦。

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

在Bash中,是否有确定的可靠方法

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


1
即使您能做到,我也不会。想象一下错字在这里可能造成的伤害……
Joseph R.

最好不要。有些发行版的安装程序带有重新分区程序,编写一个分区程序并不是一件容易的事。太多的极端情况,太多的事情可能会搞砸。不要这样 如果这样做,则让其产生建议的配置,该配置必须得到操作员的批准。
彼得

我同意这很危险。但是,这是一个脚本,该脚本将首先擦除磁盘上的所有分区,因此之后将这些分区弄乱就没什么大不了的。唯一的风险是用户指定了错误的磁盘,使用任何分区工具都一样容易。
亚历克斯

Answers:


4

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;

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


谢谢!作为参考,我使用了您的make_partition函数,但参数稍有不同:make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex

-1

这很简单,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. 你应该用-sparted command的最终脚本。

如果我有时间,请填写此脚本,抱歉,没有时间。


嗨,您是否实际运行了建议的命令序列?我不认为他们会按照您的期望做。.
::

我更新了,请重读。
PersianGulf

选项2也已更改。
PersianGulf

2
嗨,我的意思是,'parted --list | awk'{print $ 2}'只是盲目地传送到awk!它没有得到您想要的。您应该使用-m选项进行分隔,该选项提供“易于分析”的输出。
swisscheese 2013年

1
没什么好说的了,祝你好运。
swisscheese 2013年
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.