87 votes

Comment créer et formater une partition en utilisant un bash script ?

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

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

Je veux créer une partition puis la formater en ntfs depuis bash.

101voto

sfdisk

sfdisk est une version scriptée de fdisk

Il fait partie de util-linux tout comme fdisk La disponibilité devrait donc être la même.

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

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

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

Pour générer un exemple de script, récupérez 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 le script enregistré dans un fichier, vous pouvez l'appliquer à sdX avec :

sudo sfdisk /dev/sdX < sda.sfdisk

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

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

Ils sont simplement ignorés s'ils sont présents, et le nom du périphérique est pris dans l'argument de la ligne de commande.

Quelques explications :

  • lignes d'en-tête : toutes facultatives :
  • les lignes de séparation :

    • start : décalage à l'intérieur du disque auquel la partition commence.

      start a de très bonnes valeurs par défaut, et peut souvent être omis :

      • sur la première ligne, start est de 2048, soit 1Mb (2048 + 512), ce qui est une valeur par défaut raisonnable pour la compatibilité des disques.
      • plus loin start par défaut à la première position non allouée
    • size : man sfdisk dit : The default value of size indicates "as much as possible" . Donc pour remplir le disque avec une seule partition, utilisez : /dev/sda : start=2048, type=83

    • type : octet magique stocké sur le secteur d'amorçage pour chaque entrée de cloison . Valeurs possibles : https://en.wikipedia.org/wiki/Partition_type Sur cet exemple, nous observons :

      • 7 ( sda1 , 2 y 3 ) : systèmes de fichiers pris en charge par Windows. Les partitions préinstallées de Windows et les partitions de récupération Lenovo. sudo blkid Les étiquettes aident à les identifier.
      • 5 ( sda4 ) : partition primaire étendue, qui contiendra d'autres partitions logiques (parce que nous ne pouvons avoir que 4 partitions primaires avec MBR).
      • 83 ( sda5 , 7 y 8 ) : partitions que Linux supporte. Pour moi, une home et deux racines avec des versions différentes d'Ubuntu
      • 82 ( sd6 ) : échange

fdisk peut également lire sfdisk scripts avec la fonction I qui les "source" au cours d'un processus interactif. fdisk ce qui vous permet de personnaliser davantage la partition avant de l'écrire.

Testé sur Ubuntu 16.04, sfdisk 2.27.1.

Formatage et remplissage des partitions d'un fichier image sans sudo

C'est une bonne façon 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

84voto

dobs Points 719

Tout comme les suggestions précédentes, le piping des commandes vers fidsk, j'ai trouvé cette approche utile pour laisser les détails aux mainteneurs suivants. Les bits sed enlèvent tous les commentaires avant que fdisk ne reçoive l'entrée.

# 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

71voto

Xeningem Points 370

fdisk lit de stdin donc vous devez juste lui donner les commandes appropriées. Par exemple, la commande suivante efface la table de partition, s'il y en a une, et en crée une nouvelle avec 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.

43voto

lingceng Points 109

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

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

13voto

Bruce Davis Points 131

Créez un nouveau disklabel de type gpt :

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

Partitionnez le disque :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X