Disco de partición mediante programación

10

Estoy intentando crear un script bash que creará una nueva partición con un sistema de archivos en un disco con particiones existentes.

Parece que es fácil crear particiones programáticamente con parted, sin embargo, requiere que sepa dónde comenzar y detener la nueva partición, y aquí es donde tengo problemas.

No quiero confiar en que el disco tenga particiones en una posición / tamaño particular. Es decir, quiero crear una nueva partición comenzando inmediatamente después de la última existente. Quiero poder crear la partición de un tamaño fijo o llenar el espacio restante.

En Bash, ¿hay una forma confiable de determinar

a) la posición final de la última partición, y
b) el espacio no particionado restante después de la última partición?

Alex
fuente
1
Incluso si puedes hacerlo, yo no lo haría. Imagina el tipo de daño que un error tipográfico puede hacer aquí ...
Joseph R.
Mejor no. Los instaladores de algunas distribuciones tienen reparticionadores y no es realmente una tarea simple escribir uno. Demasiados casos de esquina, demasiadas cosas que puede arruinar. No lo hagas Si lo hace, deje que produzca la configuración sugerida, que debe ser aprobada por el operador.
Peter
Estoy de acuerdo en que esto es peligroso. Sin embargo, este es un script que comenzará borrando todas las particiones en el disco, por lo que estropear las particiones después no es gran cosa. El único riesgo es que el usuario especifique el disco incorrecto, lo cual es igual de fácil con cualquier herramienta de partición.
Alex

Respuestas:

4

partedPuede imprimir espacio libre. Ejemplo (elegí uno complicado a propósito):

# 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

Como puede ver, esto le proporciona directamente la posición y el tamaño de la partición que puede crear, es decir, la última línea que dice Free Space. Puede crear una partición que comience en 31115264s y termine en 31116287s.

¡Si no fuera por la trampa, la partición extendida no es lo suficientemente grande!

Pero tal vez ya usa GPT donde no sufre tales complicaciones.

Agarrar los números debería ser bastante fácil.

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 algo similar. (Naturalmente, querrás hacer más controles de cordura aquí).

@swisscheese hizo un buen comentario en la otra respuesta, no sabía que partedofrecía resultados amigables para analizar. Puede optar por usar eso en su lugar. Ejemplo para agarrar el último libre más grande:

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

Si eso es aplicable a su situación (en mi ejemplo, tampoco podría crear una partición allí, ya está llena) es algo que debe descubrir por sí mismo. :)

Frostschutz
fuente
¡Gracias! Como referencia, utilicé su función make_partition pero con argumentos ligeramente diferentes: make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex
-1

Es fácil, mkpartedtiene una --listopción, necesita usar awk y --listrecuperar la última partición y luego usar mkpart part-type [fs-type] start end,

Pero tu respuesta:

Al principio debes obtener todas las particiones y con:

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

Notas:

  1. Debes convertir GBa MG.
  2. Debe usar el último valor de cada variable
  3. Debe usar -sen su parted commandscript final.

Si tengo tiempo, complete este script, perdón por no tener tiempo.

Golfo pérsico
fuente
Hola, ¿has ejecutado realmente las secuencias de comandos que sugieres? No creo que hagan lo que esperas que hagan ... :(
swisscheese
He actualizado, vuelva a leer.
PersianGulf
la opción 2 también se cambió.
PersianGulf
2
Hola, lo que quise decir fue que 'parted --list | awk' {print $ 2} '¡está ciegamente conectado a awk! NO obtiene lo que quieres. Debe usar la opción -m para separar, que ofrece una salida "amigable para el análisis".
swisscheese
1
Nada más que decir, la mejor de las suertes.
swisscheese