Como criar e formatar uma partição usando um script bash?


62

Existe alguma maneira de criar e formatar uma partição usando um script bash?

Eu acho que isso pode ser feito com o fdisk, mas não sei como alimentar comandos do script bash no shell do fdisk e sair do shell do fdisk.

Eu estou querendo criar uma partição, em seguida, formatá-lo para NTFS de dentro do bash.

Respostas:


70

Semelhante às sugestões anteriores, comandos de canalização para o fidsk, achei esta abordagem útil para deixar detalhes para os mantenedores subsequentes. Os bits sed retiram todos os comentários antes que o fdisk obtenha a entrada.

# to create the partitions programatically (rather than manually)
# we're going to simulate the manual input to fdisk
# The sed script strips off all the comments so that we can 
# document what we're doing in-line with the actual commands
# Note that a blank line (commented as "defualt" will send a empty
# line terminated with a newline to take the fdisk default.
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
  o # clear the in memory partition table
  n # new partition
  p # primary partition
  1 # partition number 1
    # default - start at beginning of disk 
  +100M # 100 MB boot parttion
  n # new partition
  p # primary partition
  2 # partion number 2
    # default, start immediately after preceding partition
    # default, extend partition to end of disk
  a # make a partition bootable
  1 # bootable partition is partition 1 -- /dev/sda1
  p # print the in-memory partition table
  w # write the partition table
  q # and we're done
EOF

3
Eu concordo completamente. Documente seu trabalho para que outras pessoas leiam.
— Eric Duncan

1
Observe que você precisa ter uma guia à esquerda em cada linha.
— Stu

2
Você se importaria de colocar um grande aviso de que uma guia é necessária em cada linha de caractere de comando como o @Stu mencionado? Eu tive que depurar por um tempo apenas porque copiar e colar ignora guias e as substitui por espaços, portanto, o regex não corresponde às linhas de comando.
— ceremcem 27/03

9
Em vez de um aviso sobre guias, modifiquei o sed para descartar espaços em branco à esquerda (não apenas guias) e não esperar uma guia após os comandos fdisk. Isso deve cortar e colar melhor. @ceremcem - bom feedback e desculpe por causar algum tempo de depuração.
— usar o seguinte comando

3
sfdiské mais amigável à automação do quefdisk
— spuder

65

sfdisk

sfdisk é uma versão com script de fdisk

Faz parteutil-linux , assim como fdisk, portanto, a disponibilidade deve ser a mesma.

Uma tabela de partição com uma única partição que ocupa o disco inteiro pode ser criada com:

echo 'type=83' | sudo sfdisk /dev/sdX

e tabelas de partição mais complexas são explicadas abaixo.

Para gerar um script de exemplo, obtenha a configuração de um de seus discos:

sudo sfdisk -d /dev/sda > sda.sfdisk

Exemplo de saída na inicialização dupla do Lenovo T430 Windows 7 / Ubuntu:

label: dos
label-id: 0x7ddcbf7d
device: /dev/sda
unit: sectors

/dev/sda1 : start=        2048, size=     3072000, type=7, bootable
/dev/sda2 : start=     3074048, size=   195430105, type=7
/dev/sda3 : start=   948099072, size=    28672000, type=7
/dev/sda4 : start=   198504446, size=   749594626, type=5
/dev/sda5 : start=   198504448, size=   618891264, type=83
/dev/sda6 : start=   940277760, size=     7821312, type=82
/dev/sda7 : start=   817397760, size=    61437952, type=83
/dev/sda8 : start=   878837760, size=    61437500, type=83

Depois de salvar o script em um arquivo, você pode aplicá-lo sdXcom:

sudo sfdisk /dev/sdX < sda.sfdisk

Para sfdiskentrada, você pode simplesmente omitir os nomes dos dispositivos e usar linhas do tipo:

start=        2048, size=     3072000, type=7, bootable

Eles são ignorados apenas se presentes, e o nome do dispositivo é obtido no argumento da linha de comando.

Algumas explicações:

  • linhas de cabeçalho: todas opcionais:
  • linhas de partição:

    • start: deslocamento dentro do disco em que a partição é iniciada.

      start tem padrões muito bons e geralmente pode ser omitido:

      • na primeira linha, starté 2048, ou seja, 1Mb (2048 + 512), que é um padrão sensato para compatibilidade de disco
      • startpadrão adicional para a primeira posição não alocada
    • size: man sfdiskDiz: The default value of size indicates "as much as possible". Portanto, para preencher o disco com uma única partição, use:/dev/sda : start=2048, type=83

    • type: byte mágico armazenado no setor de inicialização para cada entrada da partição . Valores possíveis: https://en.wikipedia.org/wiki/Partition_type Neste exemplo, observamos:
      • 7( sda1, 2e 3): sistemas de arquivos que o Windows suporta. Material pré-instalado do Windows e partições de recuperação da Lenovo. sudo blkidos rótulos ajudam a identificá-los.
      • 5( sda4): partição primária estendida, que conterá outras partições lógicas (porque só podemos ter 4 partições primárias com MBR)
      • 83( sda5,, 7e 8): partições suportadas pelo Linux. Para mim home, uma e duas raízes com diferentes versões do Ubuntu
      • 82( sd6): swap

fdisktambém pode ler sfdiskscripts com o Icomando, que os "origina" durante uma fdisksessão interativa , permitindo maior personalização antes de gravar a partição.

Testado no Ubuntu 16.04, sfdisk2.27.1.

Formate e preencha as partições de um arquivo de imagem sem sudo

Esta é uma boa maneira de aprender a usar sfdisksem explodir seus discos rígidos: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- privilégios / 52850819 # 52850819


4
OMG isso é incrível. Eu usei o fdisk antes, mas se você acidentalmente pousar exatamente onde já existe uma partição, ele precisará de uma verificação do usuário que geralmente não é necessária, o que é uma droga. sfdisk é maravilhoso, obrigado!
— TaborKelly

3
Esta deve ser a resposta aceita
— shrewmouse 04/02

55

fdisklê stdin, então você só precisa alimentar os comandos apropriados. Por exemplo, o seguinte limpa a tabela de partição, se houver, e cria uma nova que possui uma única partição; disco inteiro:

(
echo o # Create a new empty DOS partition table
echo n # Add a new partition
echo p # Primary partition
echo 1 # Partition number
echo   # First sector (Accept default: 1)
echo   # Last sector (Accept default: varies)
echo w # Write changes
) | sudo fdisk

Eu recomendo que você faça a tarefa que deseja, registrando o que digita para poder reproduzi-la.


4
Embora um pouco mais detalhado com os comandos de eco do que a resposta aceita, isso parece muito menos mágico e ofuscado.
— Henry Heikkinen

1
Eu, pessoalmente, sugeriria o uso de, em printfvez de echoapenas, o hábito de usar algo que se comporta de maneira consistente nos sistemas.
— 22817

37

Você pode fazer isso com apenas alguns comandos, use introduções \ n em vez de vários ecos.

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda

Isso é mais conciso que os outros, mas infelizmente parece funcionar apenas com o bash.
— bk138

Também está trabalhando com ash / busybox.
— Kikeenrique

2
É \nnecessário outro após o w?
— Qian Chen

6
Isso funciona, mas é horrível :-)
— Ciro Santilli escreveu

2
@ElgsQianChen: nenhum, porque echotermina automaticamente a linha com uma nova linha (a menos que -nopção é utilizada)
— Udo L

5

Você pode escrever fdisk.

(echo n; echo p; echo 1; echo 1; echo 200; echo w) | fdisk /dev/sdc

Isso cria uma partição de 200 MB no /dev/sdc


Resposta elegante!
— Gangadhar Jannu

5

Os comandos de canalização para o fdisk funcionam bem como explicado por outras pessoas, mas desta maneira um pouco mais elegante e legível:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

A tubulação de um arquivo (temporário) também funciona:

fdisk /dev/sdc < /tmp/fdisk.cmds

Este recebe meu voto. É limpo e não é poluído com um comentário em execução.
— David Betz

5

Crie um novo tipo de rótulo de disco gpt:

sudo /sbin/parted /dev/xvdf mklabel gpt --script

Particione o disco:

sudo /sbin/parted /dev/xvdf mkpart primary 0% 100% --script


Obrigado, esta é a única solução limpa para mim, pois ela não inclui canalização de algum tipo de "space opera.docx" para o fdisk.
— 21718 Benibr

1
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda

2
Um erro comum que os novos usuários cometem é responder sem detalhes de como realmente resolver o problema. As respostas devem ser detalhadas e incluir referências, conforme necessário. Reserve alguns minutos para editar sua resposta e incluir detalhes de por que ela é válida. Se precisar de ajuda, leia Como escrevo uma boa resposta? . Além disso, saiba que você postou uma resposta para perguntas muito antigas que têm uma resposta aceita. Embora exista algo errado nisso, você pode não receber uma resposta do OP.
— 21716 CharlieRB


0

O script usa o fdisk para criar partições com base nas respostas de outras pessoas.

Altere o seguinte no script:

NUM_PARTITIONS = 5

PARTITION_SIZE = "+ 10G"

Exemplo de uso é dado após o script.

#!/bin/bash
if [ $# -eq 0 ]
then
  echo "input the device"
  exit
fi

NUM_PARTITIONS=5
PARTITION_SIZE="+10G"    

SED_STRING="o"
TAIL="p
w
q
"

NEW_LINE="
"
LETTER_n="n"
EXTENDED_PART_NUM=4
TGTDEV=$1

SED_STRING="$SED_STRING$NEW_LINE"
for i in $(seq $NUM_PARTITIONS)
do
  if [ $i -lt $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
  if [ $i -eq $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$NEW_LINE$NEW_LINE"
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
  if [ $i -gt $EXTENDED_PART_NUM ]
  then
    SED_STRING="$SED_STRING$LETTER_n$NEW_LINE$NEW_LINE$PARTITION_SIZE$NEW_LINE"
  fi
done
SED_STRING="$SED_STRING$TAIL"

sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk ${TGTDEV}
  $SED_STRING
EOF

correr com:

sudo sh mk_partition.sh / dev / sdxxx


-2
#!/bin/sh
hdd="/dev/hda /dev/hdb /dev/hdc"
for i in $hdd;do
echo "n
p
1


w
"|fdisk $i;mkfs.ext3 "$i1";done 

Você pode usar esse script. Apenas certifique-se de definir suas próprias partições onde hddestá definido. Existem 2 espaços em branco entre 1e w; eles precisam estar lá para obter valores padrão.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.