2011-09-05 21:38:11 +0000 2011-09-05 21:38:11 +0000
67
67

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

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

Penso que pode ser feito com o fdisk mas não sei como alimentar comandos a partir do script bash para a shell do fdisk e depois sair da shell do fdisk.

Quero criar uma partição e depois formatá-la para ntfs a partir de dentro da bash.

Respostas (10)

72
72
72
2015-10-10 03:03:55 +0000

À semelhança das sugestões anteriores, comandos de canalização para fidsk, considerei esta abordagem útil para deixar detalhes para os mantenedores subsequentes. Os sed bits tiram todos os comentários antes do fdisk receber 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]*\).*//' << 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
68
68
68
2016-10-08 17:30:51 +0000

sfdisk*

sfdisk é uma versão Scripted de fdisk Faz parte de util-linux , tal como fdisk, pelo que a disponibilidade deve ser a mesma.

Uma tabela de partição com uma única partição que leva 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 dos seus discos:

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

Amostra de saída no meu Lenovo T430 Windows 7 / Ubuntu dual boot:

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

Uma vez que tenha o script guardado num ficheiro, pode aplicá-lo a sdX com:

sudo sfdisk /dev/sdX < sda.sfdisk

Para sfdisk input, pode simplesmente omitir os nomes dos dispositivos, e utilizar linhas de tipo:

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

São simplesmente ignorados se presentes, e o nome do dispositivo é retirado do argumento da linha de comando.

Algumas explicações:

fdisk também pode ler sfdisk scripts com o comando I, que os “fontes” durante uma sessão fdisk interactiva, permitindo-lhe uma maior personalização antes de escrever a partição.

Testado em Ubuntu 16.04, sfdisk 2.27.1.

Formatar e povoar as partições um ficheiro de imagem sem sudo

Esta é uma boa maneira de aprender a usar sfdisk sem rebentar com os seus discos rígidos: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root-privileges/52850819#52850819

56
56
56
2011-09-06 03:34:53 +0000

fdisk lê de stdin por isso só precisa de o alimentar com os comandos apropriados. Por exemplo, o seguinte limpa a tabela de partições, se houver uma, e faz uma nova que tem uma única partição que é 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

Recomendo que faça a tarefa que deseja, gravando o que escrever para que possa reproduzi-la.

37
37
37
2014-04-09 12:53:18 +0000

Pode fazê-lo com apenas alguns comandos, usar intros \n* em vez de múltiplos ecos.

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
5
5
5
2015-02-25 15:44:20 +0000

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

fdisk /dev/sdc <<EOF
n
p
1

w
EOF

Piping a partir de um ficheiro (temporário) também funciona:

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

0x1&

5
5
5
2012-06-08 15:42:12 +0000

Pode escrever fdisk.

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

Que cria uma partição de 200 MB em /dev/sdc.

5
5
5
2017-10-06 19:03:35 +0000

Criar um novo gpt do tipo disklabel:

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

Particionar o disco:

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

1
1
1
2016-03-23 19:29:01 +0000
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda
0
0
0
2017-07-14 12:07:51 +0000

O guião utiliza fdisk* para criar partitons baseados em respostas de outras pessoas.

Alterar o seguinte no guião:

NUM_PARTITIONS* =5

PARTITION_SIZE =“+10G”

O exemplo de utilização é 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]*\).*//' << EOF | fdisk ${TGTDEV}
  $SED_STRING
EOF

correr com:

sudo sh mk_partition.sh /dev/sdxxx*

-2
-2
-2
2016-07-15 12:49:49 +0000
#!/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

Pode utilizar este guião. Certifique-se apenas de definir as suas próprias partições onde hdd é definido. Existem 2 espaços em branco entre 1 e w; eles precisam de estar lá para tomar valores por defeito.