Wie erstelle und formatiere ich eine Partition mit einem Bash-Skript?

62

Gibt es eine Möglichkeit, eine Partition mithilfe eines Bash-Skripts zu erstellen und zu formatieren?

Ich denke, es kann mit fdisk gemacht werden, aber ich weiß nicht, wie man Befehle aus dem Bash-Skript in die fdisk-Shell einspeist und dann die fdisk-Shell verlässt.

Ich möchte eine Partition erstellen und sie dann in bash in ntfs formatieren.

GlassGhost
quelle

Antworten:

70

Ähnlich wie bei den vorherigen Vorschlägen zum Weiterleiten von Befehlen an fidsk habe ich diesen Ansatz als nützlich empfunden, um Details für nachfolgende Betreuer zu hinterlassen. Die sed-Bits entfernen alle Kommentare, bevor fdisk die Eingabe erhält.

# 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
quelle
3
Ich stimme vollkommen zu. Dokumentieren Sie Ihre Arbeit, damit andere sie lesen können.
Eric Duncan
1
Beachten Sie, dass Sie in jeder Zeile einen führenden Tabulator haben müssen.
Stu
2
Würde es Ihnen etwas ausmachen, eine große Warnung zu platzieren, dass in jeder Befehlszeile ein Tabulator erforderlich ist, wie von @Stu erwähnt? Ich musste für eine Weile debuggen, nur weil beim Kopieren und Einfügen Tabulatoren ignoriert und durch Leerzeichen ersetzt werden. Daher stimmt Regex nicht mit Befehlszeilen überein.
Zeremonie am
9
Anstelle einer Warnung zu Tabulatoren habe ich das sed so geändert, dass führende Leerzeichen (nicht nur Tabulatoren) verworfen werden und nach den fdisk-Befehlen keine Tabulatoren mehr erwartet werden. Dies sollte besser ausschneiden und einfügen. @ceremcem - gutes Feedback und es tut mir leid, dass Sie Zeit zum Debuggen hatten.
user2070305
3
sfdiskist automatisierungsfreundlicher alsfdisk
spuder
65

sfdisk

sfdisk ist eine gescriptete Version von fdisk

Es ist Teil vonutil-linux , genau wie fdisk, daher sollte die Verfügbarkeit gleich sein.

Eine Partitionstabelle mit einer einzelnen Partition, die die gesamte Festplatte belegt, kann erstellt werden mit:

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

und komplexere Partitionstabellen werden unten erläutert.

Um ein Beispielskript zu generieren, rufen Sie das Setup einer Ihrer Festplatten ab:

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

Beispielausgabe auf meinem 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

Sobald Sie das Skript in einer Datei gespeichert haben, können Sie es anwenden sdXmit:

sudo sfdisk /dev/sdX < sda.sfdisk

Bei der sfdiskEingabe können Sie einfach die Gerätenamen weglassen und Zeilen vom Typ verwenden:

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

Sie werden nur ignoriert, wenn vorhanden, und der Gerätename wird aus dem Befehlszeilenargument übernommen.

Einige Erklärungen:

  • Kopfzeilen: alle optional:
  • Trennlinien:

    • start: Versatz innerhalb der Festplatte, an der die Partition beginnt.

      start hat sehr gute Standardeinstellungen und kann oft weggelassen werden:

      • In der ersten Zeile startsteht 2048, dh 1 MB (2048 + 512). Dies ist eine vernünftige Standardeinstellung für die Plattenkompatibilität
      • Weitere startStandardeinstellung ist die erste nicht zugewiesene Position
    • size: man sfdiskSagt: The default value of size indicates "as much as possible". So füllen Sie die Festplatte mit einer einzelnen Partition:/dev/sda : start=2048, type=83

    • type: magisches Byte, das im Bootsektor für jeden Partitionseintrag gespeichert ist . Mögliche Werte: https://en.wikipedia.org/wiki/Partition_type In diesem Beispiel beobachten wir:
      • 7( sda1, 2und 3): Dateisysteme, die Windows unterstützt. Vorinstallierte Windows- und Lenovo-Wiederherstellungspartitionen. sudo blkidEtiketten helfen, sie zu identifizieren.
      • 5( sda4): Erweiterte primäre Partition, die andere logische Partitionen enthält (da wir nur 4 primäre Partitionen mit MBR haben können)
      • 83( sda5, 7Und 8): Partitionen , die Linux unterstützt. Für mich ein homeund zwei Roots mit unterschiedlichen Ubuntu-Versionen
      • 82( sd6): tauschen

fdiskSie können sfdiskSkripte auch mit dem IBefehl lesen , der sie während einer interaktiven fdiskSitzung als "Quelle" verwendet. Auf diese Weise können Sie weitere Anpassungen vornehmen, bevor Sie die Partition schreiben.

Getestet unter Ubuntu 16.04, sfdisk2.27.1.

Formatieren und füllen Sie die Partitionen einer Image-Datei ohne sudo

Dies ist eine gute Möglichkeit, die Verwendung zu erlernen, sfdiskohne die Festplatten in die Luft zu jagen: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- Privilegien / 52850819 # 52850819

Ciro Santilli ist ein Schauspieler
quelle
4
OMG das ist erstaunlich. Ich habe fdisk schon einmal benutzt, aber wenn Sie versehentlich genau dort landen, wo es bereits eine Partition gibt, wird der Benutzer überprüfen müssen, ob dies normalerweise nicht erforderlich ist. sfdisk ist wunderbar, danke!
TaborKelly
3
Dies sollte die akzeptierte Antwort sein
Spitzmaus
55

fdiskliest von stdin, so dass Sie nur die entsprechenden Befehle eingeben müssen. Der folgende Befehl löscht beispielsweise die Partitionstabelle (falls vorhanden) und erstellt eine neue, die eine einzelne Partition hat, die die ist. gesamte Festplatte:

(
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

Ich empfehle Ihnen, die gewünschte Aufgabe zu erledigen und aufzuzeichnen, was Sie eingeben, damit Sie es reproduzieren können.

e40
quelle
4
Während die Echobefehle etwas ausführlicher sind als die akzeptierte Antwort, wirkt dies weniger magisch und verschleiert.
Henry Heikkinen
1
Ich persönlich würde die Verwendung von printfanstelle echoder Gewohnheit vorschlagen , etwas zu verwenden, das sich systemübergreifend konsistent verhält.
Sehr Superiorman
37

Sie können es mit nur ein paar Befehlen tun, verwenden Sie intros \ n anstelle von mehreren Echos.

echo -e "o\nn\np\n1\n\n\nw" | fdisk /dev/sda
kikeenrique
quelle
Das ist knapper als die anderen, scheint aber leider nur mit bash zu funktionieren.
bk138
Es funktioniert auch mit Asche / Busybox.
kikeenrique
2
Wird \nnach dem ein weiterer benötigt w?
Qian Chen
6
Dies funktioniert, ist aber schrecklich :-)
Ciro Santilli 新疆 事件 中心 法轮功 六四 六四
2
@ElgsQianChen: nein, da echodie Zeile automatisch mit einem Zeilenumbruch beendet wird (sofern nicht die -nOption verwendet wird)
Udo G
5

Sie können ein Skript erstellen fdisk.

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

Das schafft eine 200 MB Partition weiter /dev/sdc

Ron
quelle
Elegante Antwort!
Gangadhar Jannu
5

Piping-Befehle an fdisk funktionieren gut, wie von anderen erklärt, sind aber etwas eleganter und lesbarer:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

Das Weiterleiten aus einer (temporären) Datei funktioniert auch:

fdisk /dev/sdc < /tmp/fdisk.cmds
Strahl
quelle
Dieser bekommt meine Stimme. Es ist sauber und nicht mit einem laufenden Kommentar verschmutzt.
David Betz
5

Erstellen Sie einen neuen Disklabel-Typ "gpt":

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

Partitionieren Sie die Festplatte:

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

Bruce Davis
quelle
Vielen Dank, dies ist die einzige saubere Lösung für mich, da sie nicht die Weiterleitung einer Art "space opera.docx" an fdisk beinhaltet.
Benibr
1
printf 'o\nn\np\n1\n\n\nw' | fdisk /dev/sda
Diego Roberto Dos Santos
quelle
2
Ein häufiger Fehler, den neue Benutzer machen, ist die Beantwortung ohne Angabe von Einzelheiten zur tatsächlichen Behebung des Problems. Die Antworten sollten detailliert sein und gegebenenfalls Verweise enthalten. Bitte nehmen Sie sich ein paar Minuten Zeit, um Ihre Antwort zu bearbeiten und zu erläutern, warum Ihre Antwort gültig ist. Wenn Sie Hilfe benötigen, lesen Sie Wie schreibe ich eine gute Antwort? . Beachten Sie auch, dass Sie eine Antwort auf sehr alte Fragen gepostet haben, die eine akzeptierte Antwort haben. Obwohl dies nicht der Fall ist, erhalten Sie möglicherweise keine Antwort vom OP.
CharlieRB
1
Unterscheidet sich das von: superuser.com/a/739586/128124 ?
Ciro Santilli am
0

Das Skript verwendet fdisk , um Partitionen basierend auf den Antworten anderer Personen zu erstellen.

Ändern Sie im Skript Folgendes:

NUM_PARTITIONS = 5

PARTITION_SIZE = "+ 10G"

Die Beispielverwendung ist nach dem Skript angegeben.

#!/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

lauf mit:

sudo sh mk_partition.sh / dev / sdxxx

Paul Justin
quelle
-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 

Sie können dieses Skript verwenden. Stellen Sie einfach sicher, dass Sie Ihre eigenen Partitionen hdddefinieren, in denen sie definiert sind. Es gibt 2 Leerzeichen zwischen 1und w; Sie müssen vorhanden sein, um Standardwerte zu übernehmen.

Shailesh Sutar
quelle