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

Comment créer et formater une partition à l'aide d'un script bash ?

Existe-t-il un moyen de créer et de formater une partition en utilisant un script bash ?

Je pense que cela peut être fait avec fdisk mais je ne sais pas comment envoyer les commandes du script bash dans le shell fdisk puis quitter le shell fdisk.

Je veux créer une partition puis la formater en ntfs à partir de bash.

Réponses (10)

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

Comme pour les suggestions précédentes, qui consistent à transmettre les commandes à fidsk, j'ai trouvé cette approche utile pour laisser les détails aux responsables ultérieurs. Les bits sed suppriment tous les commentaires avant que fdisk ne reçoive les données.

# 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 est une version scriptée de fdisk Il fait partie de util-linux , tout comme fdisk, donc la disponibilité devrait être la même.

Une table de partition avec une seule partition qui prend tout le disque peut être créée avec :

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

et des tables de partition plus complexes sont expliquées ci-dessous.

Pour générer un script d'exemple, obtenez la configuration d'un de vos disques :

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

Exemple de sortie sur mon 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

Une fois que vous avez enregistré le script dans un fichier, vous pouvez l'appliquer à sdX avec :

sudo sfdisk /dev/sdX < sda.sfdisk

Pour la saisie sfdisk, vous pouvez simplement omettre les noms de périphériques, et utiliser des lignes de type :

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

Elles sont simplement ignorées si elles sont présentes, et le nom du périphérique est pris dans l'argument de la ligne de commande.

Quelques explications :

fdisk peut également lire les scripts sfdisk avec la commande I, qui les “source” pendant une session interactive fdisk, vous permettant de les personnaliser davantage avant d'écrire la partition.

Testé sur Ubuntu 16.04, sfdisk 2.27.1.

Formatez et remplissez les partitions d'un fichier image sans sudo

C'est un bon moyen d'apprendre à utiliser sfdisk sans faire exploser vos disques durs : 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 lit à partir de stdin donc vous devez juste lui donner les commandes appropriées. Par exemple, ce qui suit efface la table des partitions, s'il y en a une, et en crée une nouvelle qui a une seule partition qui est le disque ; entier :

(
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

Je vous recommande de faire la tâche que vous voulez, en enregistrant ce que vous tapez pour pouvoir le reproduire.

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

Vous pouvez le faire avec seulement quelques commandes, utilisez les intros \n au lieu de multiples échos.

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

La transmission des commandes à fdisk fonctionne bien, comme l'ont expliqué d'autres personnes, mais de cette façon, elle est un peu plus élégante et plus lisible :

fdisk /dev/sdc <<EOF
n
p
1

w
EOF

Piping à partir d'un fichier (temporaire) fonctionne également :

fdisk /dev/sdc < /tmp/fdisk.cmds
5
5
5
2012-06-08 15:42:12 +0000

Vous pouvez scénariser fdisk.

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

Cela crée une partition de 200 Mo sur /dev/sdc

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

Créer un nouveau disklabel de type gpt :

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

Partitionner le disque :

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

Le script utilise fdisk pour créer des partitons basés sur les réponses d'autres personnes.

Modifiez ce qui suit dans le script :

NUM_PARTITIONS =5

PARTITION_SIZE = “+10G”

L'exemple d'utilisation est donné après le 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

run with :

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

Vous pouvez utiliser ce script. Veillez simplement à définir vos propres partitions où hdd est défini. Il y a 2 espaces vides entre 1 et w ; ils doivent être là pour prendre les valeurs par défaut.