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.

GlassGhost
fonte

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
user2070305
fonte
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

Ciro Santilli adicionou uma nova foto
fonte
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

fdiskstdin, 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.

e40
fonte
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
kikeenrique
fonte
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

Ron
fonte
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
Raio
fonte
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

Bruce Davis
fonte
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
Diego Roberto Dos Santos
fonte
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
1
É diferente de: superuser.com/a/739586/128124 ?
Ciro Santilli # 8/16
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

Paul Justin
fonte
-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.

Shailesh Sutar
fonte