Separe parta a próxima partição depois da anterior - automaticamente?

0

Eu herdei um script de shell que canaliza uma lista de caracteres 'aleatórios' para fdisk . O que está fazendo é particionar um disco da seguinte forma:

Configure o disco em branco, a tabela de partições, etc. Crie o primeiro tamanho de partição A Crie a segunda partição, tamanho Y, imediatamente após a primeira. Crie uma terceira partição, tamanho X, imediatamente após a segunda. E para adicionar ao 'divertimento', A, Y e X são calculados e podem mudar dependendo do tamanho do novo disco disponível.

O Fdisk solicitará a posição inicial com base nas posições existentes e o 'código' apenas 'acerta o retorno' e aceita isso.

Este código é extremamente opaco e eu gostaria de substituí-lo por chamadas para ' parted --script... ' em vez de fdisk , mas não consigo ver que o parted tem uma maneira de dizer 'iniciar imediatamente após a última partição'. Parece que eu teria que continuar calculando a posição inicial.

Estou correto e, em caso afirmativo, alguém tem uma solução sensata para isso?

    
por Paul D Smith 19.02.2018 / 11:14

1 resposta

0

Você não precisa escrever uma cópia exata de tudo que foi feito por um script incorreto. Reescrever é uma oportunidade para corrigir a lógica, assim como o código. Comece decifrando o que o código original faz e depois transforme-o em algo sensato.

A resposta à sua pergunta direta é "Não. Você precisará fornecer início e fim por si mesmo". Felizmente, isso não é muito difícil.

O comando de parted mkpart recebe um argumento start e e end (o valor padrão das unidades é megabytes). Você só precisa especificá-los quando criar as partições. por exemplo. usando um arquivo de imagem de disco:

$ cat partition.sh 
#!/bin/sh

truncate -s 1G disk.img # create a 1G disk image file

parted -s disk.img mklabel msdos    # create the partition table

# make some partitions
parted -s disk.img mkpart primary 1 100
parted -s disk.img mkpart primary 101 200
parted -s disk.img mkpart primary 201 800
parted -s disk.img mkpart primary 801 1000

parted -s disk.img print

Como alternativa, execute parted apenas uma vez:

#!bin/sh

truncate -s 1G disk.img # create a 1G disk image file

parted -s disk.img mklabel msdos \
  mkpart primary 1 100 \
  mkpart primary 101 200 \
  mkpart primary 201 800 \
  mkpart primary 801 1000 \
  print
$ ./partition.sh 
Model:  (file)
Disk /home/cas/stack-exchange/2018-01-03/pauldsmith/disk.img: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  99.6MB  98.6MB  primary
 2      101MB   200MB   99.6MB  primary
 3      201MB   800MB   599MB   primary
 4      801MB   1000MB  199MB   primary

A parte difícil é calcular os valores exatos de início e fim das suas partições para que elas sejam alinhadas corretamente para o tamanho do setor. A primeira partição é fácil - 1MB se alinha aos setores de 512 bytes e 4K. Qualquer partição que comece com um múltiplo exato de 1MB também será alinhada corretamente (todas as partições criadas no exemplo acima estão alinhadas corretamente).

Você pode usar variáveis shell para qualquer um dos valores iniciais e finais da partição, o que permite usar a aritmética do shell para calculá-los (mas lembre-se que a aritmética do shell é somente inteiro - use bc ou dc se precisar fazer cálculos de ponto flutuante ou porcentagem).

BTW, você pode verificar o alinhamento com o comando parted ' align-check '. por exemplo,

$ parted disk.img align-check optimal 1
WARNING: You are not superuser.  Watch out for permissions.
1 aligned

Se align-check for usado com a opção de modo de script parted -s , ele não produzirá nenhuma saída. Em vez disso, sai com status 1 se não estiver alinhado. Caso contrário, continua com o restante do script.

parted não tem capacidade se / então, portanto, se você quiser automatizar a verificação de alinhamento ea criação de partições, use a primeira versão do script acima para poder inserir um comando check-align em entre cada mkpart e responda apropriadamente se o código de saída for diferente de zero.

    
por 20.02.2018 / 05:22