Particionar programaticamente o disco

10

Estou tentando criar um script bash que criará uma nova partição com um sistema de arquivos em um disco com as partições existentes.

Parece fácil criar partições programaticamente com o parted, no entanto, é necessário saber por onde iniciar e parar a nova partição, e é aqui que estou tendo problemas.

Eu não quero confiar no disco que possui partições em determinada posição / tamanho. Ou seja, quero criar uma nova partição iniciando imediatamente após a última existente. 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
eb) o espaço não particionado restante após a última partição?

Alex
fonte
1
Mesmo se você puder, eu não faria. Imagine o tipo de dano que um erro de digitação pode fazer aqui ...
Joseph R.
Melhor não. Os instaladores de algumas distribuições têm reparticionadores e não é realmente uma tarefa simples escrever uma. Muitos casos de canto, muitas coisas que você pode estragar. Não faça isso. Se o fizer, deixe-o produzir uma configuração sugerida, que deve ser aprovada pelo operador.
Peterph
Eu concordo que isso é perigoso. No entanto, este é um script que começará apagando todas as partições do disco, portanto, desarrumar as partições depois não é grande coisa. O único risco é que o usuário especifique o disco errado, o que é igualmente fácil com qualquer ferramenta de partição.
Alex

Respostas:

4

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

frostschutz
fonte
Obrigado! Para referência, eu usei a função make_partition mas com um pouco diferentes argumentos: make_partition $ discoparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex
-1

É fácil, mkpartedtem uma --listopção, você precisa usar awk e --listrecuperar a última partição e, em seguida mkpart part-type [fs-type] start end, usar ,

Mas sua resposta:

No começo, você deve obter todas as partições e com:

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

Notas:

  1. Você deve converter GBpara MG.
  2. Você deve usar o último valor de cada variable
  3. Você deve usar -sno seu parted commandscript final.

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

PersianGulf
fonte
Oi, você realmente executou as seqüências de comando sugeridas? Eu não acho que eles fazem o que você espera que eles façam .. :(
swisscheese
Eu atualizei, por favor, releia.
PersianGulf 25/09
a opção 2 também foi alterada.
PersianGulf 25/09
2
Olá, o que eu quis dizer foi: 'parted --list | awk' {print $ 2} 'está apenas cegamente indo para o awk! NÃO consegue o que deseja. Você deve usar a opção -m para parted, que oferece saída "amigável para análise".
swisscheese
1
Nada mais a dizer, boa sorte.
swisscheese