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

Wie erstellt und formatiert man eine Partition mit einem Bash-Skript?

Gibt es eine Möglichkeit, eine Partition mit einem Bash-Skript zu erstellen und zu formatieren?

Ich glaube, das kann man mit fdisk machen, aber ich weiß nicht, wie man Befehle aus dem Bash-Skript in die fdisk-Shell einspeist und dann die fdisk-Shell beendet.

Ich möchte eine Partition erstellen und sie dann aus der Bash heraus auf ntfs formatieren.

Antworten (10)

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

Ähnlich wie bei den vorherigen Vorschlägen, Befehle an fidsk zu leiten, 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]*\).*//' << 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 ist eine Scripted-Version von fdisk Es ist Teil von util-linux , genau wie fdisk, also sollte die Verfügbarkeit die gleiche sein.

Eine Partitionstabelle mit einer einzigen Partition, die die gesamte Festplatte einnimmt, kann mit erstellt werden:

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

und komplexere Partitionstabellen werden weiter unten erklärt.

Um ein Beispielskript zu erzeugen, holen Sie sich die Einstellungen einer Ihrer Festplatten:

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 auf sdX mit anwenden:

sudo sfdisk /dev/sdX < sda.sfdisk

Für die sfdisk-Eingabe können Sie einfach die Gerätenamen weglassen und Zeilen des Typs verwenden:

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

Sie werden einfach ignoriert, falls vorhanden, und der Gerätename wird aus dem Kommandozeilenargument übernommen.

Einige Erklärungen:

fdisk kann auch sfdisk-Skripte mit dem Befehl I lesen, der sie während einer interaktiven fdisk-Sitzung “ausliest”, was Ihnen weitere Anpassungen vor dem Schreiben der Partition ermöglicht.

Getestet auf Ubuntu 16.04, sfdisk 2.27.1.

Formatieren und Bestücken der Partitionen eine Image-Datei ohne sudo

Dies ist ein guter Weg, um den Umgang mit sfdisk zu lernen, ohne Ihre Festplatten zu sprengen: 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 liest von stdin, Sie müssen es also nur mit den entsprechenden Befehlen füttern. Das folgende Beispiel löscht die Partitionstabelle, falls es eine gibt, und erstellt eine neue, die eine einzige Partition hat, die die gesamte Festplatte ist:

(
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 auszuführen und dabei aufzuzeichnen, was Sie eingeben, damit Sie es reproduzieren können.

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

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

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

Das Piping von Befehlen an fdisk funktioniert gut, wie von anderen Leuten erklärt, aber dieser Weg ist ein bisschen eleganter und lesbarer:

fdisk /dev/sdc <<EOF
n
p
1

w
EOF

Piping aus einer (temporären) Datei funktioniert auch:

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

Sie können das Skript fdisk.

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

Das erzeugt eine 200 MB große Partition auf /dev/sdc.

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

Erstellen Sie ein neues Disklabel vom Typ gpt:

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

Partitionieren Sie die Platte:

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

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

Ändern Sie das Folgende im Skript:

NUM_PARTITIONS =5

PARTITION_SIZE =“+10G”

Ein Beispiel für die Verwendung wird 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]*\).*//' << EOF | fdisk ${TGTDEV}
  $SED_STRING
EOF

ausführen mit:

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

Sie können dieses Skript verwenden. Stellen Sie nur sicher, dass Sie Ihre eigenen Partitionen definieren, wo hdd definiert ist. Es gibt 2 Leerzeichen zwischen 1 und w; sie müssen dort sein, um Standardwerte zu übernehmen.