parted
pode imprimir espaço livre. Exemplo (escolhi um complicado de propósito):
# 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
Como você pode ver, isso lhe dá diretamente a posição e o tamanho da partição que você pode criar, ou seja, a última linha que diz Free Space
. Você poderia criar uma partição que começa em 31115264s e termina em 31116287s.
Se não fosse pela armadilha que a partição estendida não é grande o suficiente!
Mas talvez você já use o GPT onde não sofre de tais complicações.
Agarrar os números deve ser fácil o suficiente.
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'
Ou algo similar. (Naturalmente você gostaria de fazer mais algumas verificações de sanidade aqui.)
@swisscheese fez um bom comentário na outra resposta, eu não sabia que parted
oferecia uma saída amigável. Você pode optar por usar isso em vez disso. Exemplo para pegar o último maior livre:
# parted -m /dev/sda unit s print free | grep 'free;' | sort -t : -k 4n -k 2n | tail -n 1
1:27269120s:27271167s:2048s:free;
Se isso é aplicável à sua situação (no meu exemplo, você não pode criar uma partição lá, ela já está cheia) é algo que você precisa descobrir por si mesmo. :)