parted
pode imprimir espaço livre. Exemplo (eu 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 fornece diretamente a posição e o tamanho da partição que você pode criar, ou seja, a última linha que diz Free Space
. Você pode 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 dessas complicações.
Agarrar os números deve ser fácil.
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 parecido. (Naturalmente, você gostaria de fazer mais 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 à análise. Você pode optar por usá-lo. Exemplo para obter o último maior grátis:
# 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ê também não pode criar uma partição, ela já está cheia), é algo que você precisa descobrir por si mesmo. :)