Come creare e formattare una partizione usando uno script bash?


62

C'è un modo per creare e formattare una partizione usando uno script bash?

Penso che possa essere fatto con fdisk ma non so come inserire i comandi dallo script bash nella shell fdisk e quindi uscire dalla shell fdisk.

Voglio creare una partizione e formattarla in NTFS da Bash.

Risposte:


70

Simile ai precedenti suggerimenti, i comandi di piping a fidsk, ho trovato questo approccio utile per lasciare dettagli per i manutentori successivi. I bit sed rimuovono tutti i commenti prima che fdisk ottenga l'input.

# 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
Sono completamente d'accordo. Documenta il tuo lavoro affinché altri possano leggerlo.
Eric Duncan,

1
Nota che devi avere una scheda iniziale su ogni riga.
Stu

2
Ti dispiacerebbe mettere un grande avvertimento che è richiesta una scheda su ogni riga di caratteri di comando come menzionato da @Stu? Ho dovuto eseguire il debug per un po 'solo perché copia e incolla ignora le schede e le sostituisce con spazi, quindi regex non corrisponde alle linee di comando.
ceremcem,

9
Invece di un avvertimento sulle schede, ho modificato sed per scartare i principali spazi bianchi (non solo le schede) e non aspettarmi una scheda dopo i comandi fdisk. Questo dovrebbe tagliare e incollare meglio. @ceremcem - buon feedback e mi dispiace di averti causato alcun tempo di debug.
user2070305

3
sfdiskè più automatizzato rispetto afdisk
spuder

65

sfdisk

sfdisk è una versione di script di fdisk

Fa parte diutil-linux , proprio come fdisk, quindi la disponibilità dovrebbe essere la stessa.

Una tabella delle partizioni con una singola partizione che occupa l'intero disco può essere creata con:

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

e le tabelle di partizione più complesse sono spiegate di seguito.

Per generare uno script di esempio, ottieni l'installazione di uno dei tuoi dischi:

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

Esempio di output sul mio 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

Dopo aver salvato lo script in un file, è possibile applicarlo sdXcon:

sudo sfdisk /dev/sdX < sda.sfdisk

Per l' sfdiskinput, puoi semplicemente omettere i nomi dei dispositivi e utilizzare le righe di tipo:

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

Vengono semplicemente ignorati se presenti e il nome del dispositivo viene preso dall'argomento della riga di comando.

Alcune spiegazioni:

  • righe di intestazione: tutte facoltative:
  • linee di partizione:

    • start: offset all'interno del disco in corrispondenza del quale inizia la partizione.

      start ha impostazioni predefinite molto buone e può spesso essere ommited:

      • sulla prima riga, startè 2048, ovvero 1 Mb (2048 + 512), che è un valore predefinito ragionevole per la compatibilità del disco
      • ulteriore startimpostazione predefinita alla prima posizione non allocata
    • size: man sfdiskDice: The default value of size indicates "as much as possible". Quindi per riempire il disco con una singola partizione usare:/dev/sda : start=2048, type=83

    • type: byte magico memorizzato nel settore di avvio per ciascuna voce della partizione . Valori possibili: https://en.wikipedia.org/wiki/Partition_type In questo esempio osserviamo:
      • 7( sda1, 2E 3): file system che supporta Windows. Roba preinstallata di Windows e partizioni di ripristino Lenovo. sudo blkidle etichette aiutano a identificarle.
      • 5( sda4): partizione primaria estesa, che conterrà altre partizioni logiche (perché possiamo avere solo 4 partizioni primarie con MBR)
      • 83( sda5,, 7and 8): partizioni supportate da Linux. Per me uno homee due radici con diverse versioni di Ubuntu
      • 82( sd6): scambio

fdiskpuò anche leggere gli sfdiskscript con il Icomando, che li "fonte" durante una fdisksessione interattiva , consentendo di personalizzare ulteriormente prima di scrivere la partizione.

Testato su Ubuntu 16.04, sfdisk2.27.1.

Formatta e popola le partizioni senza un file immagine sudo

Questo è un buon modo per imparare a usare sfdisksenza far esplodere i dischi rigidi: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-disk-image-without-root- privilegi / 52850819 # 52850819


4
OMG, questo è fantastico. Ho usato fdisk prima, ma se atterri accidentalmente esattamente dove c'è già una partizione, vorrà una verifica da parte dell'utente che di solito non richiede, il che fa schifo. sfdisk è meraviglioso, grazie!
TaborKelly,

3
Questa dovrebbe essere la risposta accettata
shrewmouse il

55

fdisklegge da stdin quindi devi solo dargli i comandi appropriati. Ad esempio, quanto segue cancella la tabella delle partizioni, se presente, e ne crea una nuova con un'unica partizione che è la; intero disco:

(
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

Ti consiglio di svolgere l'attività desiderata, registrando ciò che scrivi in ​​modo da poterlo riprodurre.


4
Mentre un po 'più dettagliato con i comandi echo rispetto alla risposta accettata, questo sembra molto meno magico e offuscato.
Henry Heikkinen,

1
Personalmente suggerirei l'uso di printfanziché echosemplicemente l'abitudine di usare qualcosa che si comporta in modo coerente tra i sistemi.
vastlysuperiorman,

37

Puoi farlo con solo un paio di comandi, usa intros \ n invece di più echi.

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

Questo è più conciso rispetto agli altri, ma sfortunatamente sembra funzionare solo con bash.
bk138,

Funziona anche con ash / busybox.
Kikeenrique,

2
Ne è \nnecessario un altro dopo il w?
Qian Chen,


2
@ElgsQianChen: no, perché echotermina automaticamente la riga con una nuova riga (a meno che non -nvenga utilizzata l'opzione)
Udo G

5

Puoi scrivere fdisk.

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

Ciò crea una partizione di 200 MB su /dev/sdc


Risposta elegante!
Gangadhar Jannu,

5

I comandi di piping su fdisk funzionano bene come spiegato da altre persone, ma in questo modo un po 'più elegante e leggibile:

fdisk /dev/sdc <<EOF
n
p
1


w
EOF

Il piping da un file (temporaneo) funziona anche:

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

Questo ottiene il mio voto. È pulito e non inquinato da commenti in corso.
David Betz,

5

Crea un nuovo tipo di etichetta del disco gpt:

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

Partizionare il disco:

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


Grazie, questa è l'unica soluzione pulita per me perché non include il piping di una sorta di "space opera.docx" su fdisk.
Benibr

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

2
Un errore comune che i nuovi utenti fanno è rispondere senza dettagli su come risolvere effettivamente il problema. Le risposte devono essere dettagliate e includere riferimenti, se necessario. Ti preghiamo di dedicare qualche minuto a modificare la tua risposta per includere i dettagli del motivo per cui la tua risposta è valida. Se hai bisogno di aiuto, leggi Come posso scrivere una buona risposta? . Inoltre, tieni presente che hai pubblicato una risposta a domande molto vecchie che hanno una risposta accettata. Sebbene non ci sia nulla di sbagliato nel farlo, è possibile che non si ottenga una risposta dall'OP.
CharlieRB,


0

Lo script utilizza fdisk per creare partizioni in base alle risposte di altre persone.

Modificare quanto segue nello script:

NUM_PARTITIONS = 5

PARTITION_SIZE = "+ 10G"

Esempio di utilizzo viene fornito dopo lo 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

Corri con:

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 

Puoi usare questo script. Assicurati solo di definire le tue partizioni dove hddè definito. Ci sono 2 spazi vuoti tra 1e w; devono essere lì per assumere valori predefiniti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.