Disco di partizionamento programmatico


10

Sto tentando di creare uno script bash che creerà una nuova partizione con un file system su un disco con partizioni esistenti.

Sembra che sia facile creare partizioni a livello di codice con parted, tuttavia richiede di sapere da dove iniziare e arrestare la nuova partizione, ed è qui che ho problemi.

Non voglio fare affidamento sul fatto che il disco abbia partizioni in una posizione / dimensione particolare. Cioè, voglio creare una nuova partizione a partire immediatamente dopo l'ultima esistente. Voglio poter quindi creare la partizione di dimensioni fisse o riempire lo spazio rimanente.

In Bash, esiste un modo affidabile per determinare

a) la posizione finale dell'ultima partizione
eb) lo spazio rimanente non partizionato dopo l'ultima partizione?


1
Anche se ci riuscissi, non lo farei. Immagina il tipo di danno che un errore di battitura può fare qui ...
Joseph R.

Meglio di no. Gli installatori di alcune distribuzioni hanno ripartizionatori e non è davvero semplice scriverne uno. Troppi casi angolari, troppe cose che puoi rovinare. Non farlo Se lo fai, lascia che produca la configurazione suggerita, che deve essere approvata dall'operatore.
peterph,

Sono d'accordo che questo è pericoloso. Tuttavia, questo è uno script che inizierà cancellando tutte le partizioni sul disco, quindi confondere le partizioni in seguito non è un grosso problema. L'unico rischio è che l'utente specifichi il disco sbagliato, il che è altrettanto facile con qualsiasi strumento di partizione.
Alex,

Risposte:


4

partedpuò stampare spazio libero. Esempio (ne ho scelto uno complicato di proposito):

# parted /dev/sda unit s print free
[...]
Number  Start      End        Size       Type      File system  Flags
        63s        2047s      1985s                Free Space
 1      2048s      4196351s   4194304s   primary   fat32        lba
        4196352s   4198399s   2048s                Free Space
 2      4198400s   6295551s   2097152s   primary   ext2         boot
        6295552s   6297599s   2048s                Free Space
 3      6297600s   27269119s  20971520s  primary   ext2
        27269120s  27271167s  2048s                Free Space
 4      27271168s  31115263s  3844096s   extended               lba
 5      27273216s  29192191s  1918976s   logical   ext2
 6      29194240s  31115263s  1921024s   logical   ext2
        31115264s  31116287s  1024s                Free Space

Come puoi vedere, ti dà direttamente la posizione e le dimensioni della partizione che potresti essere in grado di creare, ovvero l'ultima riga che dice Free Space. È possibile creare una partizione che inizia a 31115264 e termina a 31116287s.

Se non fosse per la trappola che la partizione estesa non è abbastanza grande!

Ma forse usi già GPT dove non soffri di tali complicazioni.

Afferrare i numeri dovrebbe essere abbastanza facile.

function make_partition
{
    parted -s "$1" unit s mkpart primary "$2" "$3"
}

make_partition /dev/sda `parted /dev/sda unit s print free | grep 'Free Space' | tail -n 1`

O qualcosa di simile. (Naturalmente vorresti fare qualche altro controllo di integrità qui.)

@swisscheese ha fatto un buon commento nell'altra risposta, non sapevo che partedoffrisse un output di analisi amichevole. Puoi scegliere di usarlo invece. Esempio per ottenere l'ultimo più grande gratuito:

# parted -m /dev/sda unit s print free | grep 'free;' | sort -t : -k 4n -k 2n | tail -n 1
1:27269120s:27271167s:2048s:free;

Se questo è applicabile per la tua situazione (nel mio esempio, non puoi nemmeno creare una partizione lì, è già davvero pieno) è qualcosa che devi capire da solo. :)


Grazie! Per riferimento, ho usato la tua funzione make_partition ma con argomenti leggermente diversi: make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex

-1

È facile, mkpartedha --listun'opzione, è necessario utilizzare awk e --listrecuperare l'ultima partizione e quindi utilizzare mkpart part-type [fs-type] start end,

Ma la tua risposta:

All'inizio dovresti ottenere tutte le partizioni e con:

mystartgroup=`parted --list |awk {'print $2'}`
myendgroup=`parted --list |awk {'print $3'}`

Appunti:

  1. Dovresti convertirlo GBin MG.
  2. Dovresti usare l'ultimo valore di ciascuno variable
  3. Dovresti usarlo -snel tuo parted commandscript finale.

Se ho tempo, completa questo script per cui non ho tempo.


Ciao, hai effettivamente eseguito le sequenze di comandi che suggerisci? Non credo che facciano quello che ti aspetti che facciano .. :(
swisscheese

ho aggiornato, per favore rileggi.
Golfo Persico,

anche l'opzione 2 è stata cambiata.
Golfo Persico,

2
Ciao, quello che volevo dire era "parted --list | awk" {print $ 2} "è solo ciecamente convocare per awk! NON ottiene quello che vuoi. Dovresti usare l'opzione -m per parted, che offre un output "parse-friendly".
swisscheese,

1
Nient'altro da dire, buona fortuna.
swisscheese,
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.