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

Hoe maak en formatteer je een partitie met een bash script?

Is er een manier om een partitie te maken en te formatteren met een bash script?

Ik denk dat het met fdisk kan, maar ik weet niet hoe ik commando’s van het bash script in de fdisk shell moet invoeren en dan de fdisk shell afsluiten.

Ik wil een partitie maken en die dan formatteren naar ntfs vanuit bash.

Antwoorden (10)

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

Vergelijkbaar met de vorige suggesties, het pipen van commando’s naar fidsk, heb ik deze aanpak nuttig gevonden om details achter te laten voor volgende beheerders. De sed bits strepen al het commentaar weg voordat fdisk de invoer krijgt.

# 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 is een Scripted versie van fdisk Het is een onderdeel van util-linux , net als fdisk, dus de beschikbaarheid zou hetzelfde moeten zijn.

Een partitietabel met een enkele partitie die de hele schijf in beslag neemt, kan aangemaakt worden met:

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

en complexere partitietabellen worden hieronder uitgelegd.

Om een voorbeeldscript te genereren, vraag je de setup van een van je schijven op:

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

Voorbeeld uitvoer op mijn 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

Zodra je het script hebt opgeslagen in een bestand, kun je het toepassen op sdX met:

sudo sfdisk /dev/sdX < sda.sfdisk

Voor sfdisk invoer, kun je gewoon de apparaatnamen weglaten, en regels gebruiken van het type:

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

Ze worden gewoon genegeerd als ze aanwezig zijn, en de apparaatnaam wordt overgenomen van het commandoregelargument.

Enkele verklaringen:

fdisk kan ook sfdisk scripts lezen met het I commando, die ze “bronnen” tijdens een interactieve fdisk sessie, zodat je ze verder kunt aanpassen voordat je de partitie schrijft.

Getest op Ubuntu 16.04, sfdisk 2.27.1.

Opmaak en vul de partities een image bestand zonder sudo

Dit is een goede manier om sfdisk te leren gebruiken zonder je harde schijven op te blazen: 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 leest van stdin dus je hoeft het alleen maar de juiste commando’s te geven. Bijvoorbeeld, het volgende wist de partitietabel, als die er is, en maakt een nieuwe die een enkele partitie heeft die de hele schijf is:

(
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

Ik raad je aan de gewenste opdracht uit te voeren en daarbij op te schrijven wat je typt, zodat je het kunt reproduceren.

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

Je kunt het met een paar commando’s doen, gebruik intro’s n in plaats van meerdere echos.

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

Commando’s pipen naar fdisk werkt goed zoals uitgelegd door andere mensen, maar op deze manier wat eleganter en leesbaarder:

fdisk /dev/sdc <<EOF
n
p
1

w
EOF

Piping vanuit een (tijdelijk) bestand werkt ook:

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

Je kunt fdisk scripten.

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

Dat creëert een 200 MB partitie op /dev/sdc

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

Maak een nieuw disklabel type gpt:

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

Partitioneer de schijf:

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

Het script gebruikt fdisk om partitons te maken gebaseerd op de antwoorden van anderen.

Verander het volgende in het script:

NUMUM_PARTITIONS =5

PARTITION_SIZE =“+10G”

Voorbeeldgebruik wordt gegeven na het 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

Je kunt dit script gebruiken. Zorg er alleen voor dat je je eigen partities definieert waar hdd is gedefinieerd. Er zijn 2 spaties tussen 1 en w; die moeten er zijn om de standaardwaarden te kunnen nemen.