Particionar programaticamente o disco

10

Eu estou tentando criar um script bash que criará uma nova partição com um sistema de arquivos em um disco com partição (ões) existente (s).

Parece fácil criar partições programaticamente com o parted, no entanto, é necessário que você saiba por onde começar e parar a nova partição, e é aí que estou tendo problemas.

Eu não quero contar com o disco tendo partições em particular posição / tamanho. Ou seja, eu quero criar uma nova partição começando imediatamente após a última existente. Eu quero poder criar a partição de tamanho fixo ou preencher o espaço restante.

No Bash, existe uma maneira confiável de determinar

a) a posição final da última partição e a b) o espaço restante não particionado após a última partição?

    
por Alex 25.09.2013 / 09:44

2 respostas

4

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. :)

    
por 25.09.2013 / 13:35
-1

É fácil, mkparted tem uma opção --list , você precisa usar awk e --list para recuperar a última partição e usar mkpart part-type [fs-type] start end

Mas sua resposta:

Primeiramente, você deve obter todas as partições e:

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

Notas:

  1. Você deve converter GB em MG .
  2. Você deve usar o último valor de cada variable
  3. Você deve usar -s no seu parted command no script final.

Se eu tiver tempo, complete este script desculpe por não ter tempo.

    
por 25.09.2013 / 10:00