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


62

Est-il possible de créer et de formater une partition à l'aide d'un script bash?

Je pense que cela peut être fait avec fdisk mais je ne sais pas comment introduire des 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:


70

Semblable aux suggestions précédentes, les commandes de tuyauterie à fidsk, j'ai trouvé cette approche utile pour laisser des détails aux mainteneurs suivants. Les bits sed suppriment 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

3
Je suis complètement d'accord. Documentez votre travail pour que les autres lisent.
Eric Duncan

1
Notez que vous devez avoir un onglet principal sur chaque ligne.
Stu

2
Souhaitez-vous placer un gros avertissement selon lequel un onglet est requis sur chaque ligne de caractère de commande, comme indiqué par @Stu? J'ai dû déboguer pendant un certain temps, simplement parce que le copier-coller ignore les tabulations et les remplace par des espaces. Par conséquent, l'expression rationnelle ne correspond pas aux lignes de commande.
ceremcem

9
Au lieu d'un avertissement concernant les onglets, j'ai modifié sed pour qu'il supprime les espaces (non seulement les onglets) et n'attend pas un onglet après les commandes fdisk. Cela devrait couper et coller mieux. @ceremcem - bons commentaires et désolé de vous avoir causé du temps de débogage.
user2070305

3
sfdiskest plus facile à automatiser quefdisk
spuder

65

sfdisk

sfdisk est une version scriptée de fdisk

Cela fait partieutil-linux , comme fdisksi, 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 exemple de script, obtenez la configuration de l’un de vos disques:

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

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

Une fois le script enregistré dans un fichier, vous pouvez l'appliquer sdXavec:

sudo sfdisk /dev/sdX < sda.sfdisk

Pour la sfdisksaisie, vous pouvez simplement omettre les noms de périphériques et utiliser des 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 extrait de l'argument de la ligne de commande.

Quelques explications:

  • lignes d'en-tête: toutes facultatives:
  • lignes de partition:

    • start: offset à l'intérieur du disque où la partition démarre.

      start a de très bons défauts, et peut souvent être omis:

      • sur la première ligne, startcorrespond à 2048, soit 1 Mo (2048 + 512), ce qui est un paramètre normal pour la compatibilité des disques
      • autre startdéfaut sur la première position non allouée
    • size: man sfdiskDit: 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 de démarrage pour chaque entrée de partition . Valeurs possibles: https://en.wikipedia.org/wiki/Partition_type Sur cet exemple, nous observons:
      • 7( sda1, 2et 3): systèmes de fichiers pris en charge par Windows. Matériel Windows préinstallé et partitions de récupération Lenovo. sudo blkidles étiquettes aident à les identifier.
      • 5( sda4): partition primaire étendue, qui contiendra d'autres partitions logiques (car nous ne pouvons avoir que 4 partitions primaires avec MBR)
      • 83( sda5, 7et 8): partitions supportées par Linux. Pour moi, une homeet deux racines avec différentes versions d'Ubuntu
      • 82( sd6): échange

fdiskpeut également lire des sfdiskscripts avec la Icommande, qui les "source" lors d'une fdisksession interactive , vous permettant une personnalisation plus poussée avant l'écriture de la partition.

Testé sur Ubuntu 16.04, sfdisk2.27.1.

Formater et peupler les partitions d’un fichier image sans sudo

Il s'agit d'un bon moyen d'apprendre à utiliser sfdisksans faire exploser vos disques durs: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- privilèges / 52850819 # 52850819


4
OMG c'est incroyable. J'ai déjà utilisé fdisk, mais si vous atterrissez accidentellement exactement là où il y a déjà une partition, il demandera à l'utilisateur de vérifier qu'il ne nécessite généralement pas de partition, ce qui est nul. sfdisk est magnifique, merci!
TaborKelly

3
Cela devrait être la réponse acceptée
mousqueton

55

fdisklit à partir de stdin donc vous avez juste besoin de lui donner les commandes appropriées. Par exemple, ce qui suit efface la table de partition, s’il en existe 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 afin de pouvoir la reproduire.


4
Bien que les commandes echo soient un peu plus verbeuses que la réponse acceptée, cela semble beaucoup moins magique et obscurci.
Henry Heikkinen

1
Personnellement, je suggérerais d'utiliser printfplutôt echoque d'avoir l'habitude d'utiliser quelque chose qui se comporte de manière cohérente sur tous les systèmes.
vastlysuperiorman

37

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

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

Ceci est plus concis que les autres, mais semble malheureusement ne fonctionner qu'avec bash.
bk138

Cela fonctionne aussi avec ash / busybox.
kikeenrique

2
Un autre est-il \nnécessaire après le w?
Qian Chen

6
Cela fonctionne, mais c'est horrible :-)
Ciro Santilli a rejoint le groupe

2
@ElgsQianChen: non, car echotermine automatiquement la ligne avec une nouvelle ligne (sauf si l' -noption est utilisée)
Udo G

5

Vous pouvez écrire un script 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


Réponse élégante!
Gangadhar Jannu

5

Les commandes de tuyauterie vers fdisk fonctionnent bien comme expliqué par d’autres personnes, mais de cette façon un peu plus élégantes et lisibles:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

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

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

Celui-ci obtient mon vote. C'est propre et n'est pas pollué par un commentaire en cours.
David Betz

5

Créez un nouveau type de label gpt:

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

Partitionnez le disque:

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


Merci, c’est la seule solution propre pour moi car elle n’inclut pas une sorte de "space opera.docx" vers fdisk.
Benibr

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

2
Une erreur courante que commettent les nouveaux utilisateurs est de répondre sans donner de détails sur la manière de résoudre réellement le problème. Les réponses doivent être détaillées et inclure des références, au besoin. Veuillez prendre quelques minutes pour modifier votre réponse afin d’inclure des détails sur les raisons de sa validité. Si vous avez besoin d'aide, lisez Comment puis-je écrire une bonne réponse? . Veuillez également vous rendre compte que vous avez posté une réponse à une très vieille question qui a une réponse acceptée. Bien que vous fassiez le nécessaire pour le faire, il se peut que vous ne receviez pas de réponse du PO
CharlieRB


0

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

Modifiez les éléments suivants dans le script:

NUM_PARTITIONS = 5

PARTITION_SIZE = "+ 10G"

Un 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]*\).*/\1/' << EOF | fdisk ${TGTDEV}
  $SED_STRING
EOF

courir avec:

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 

Vous pouvez utiliser ce script. Assurez-vous simplement de définir vos propres partitions là où elles hddsont définies. Il y a 2 espaces vides entre 1et w; ils doivent être là pour prendre les valeurs par défaut.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.