Partitionner le disque par programmation


10

J'essaie de créer un script bash qui créera une nouvelle partition avec un système de fichiers sur un disque avec des partitions existantes.

Il semble qu'il soit facile de créer des partitions par programme avec parted, mais cela vous oblige à savoir par où commencer et arrêter la nouvelle partition, et c'est là que j'ai des problèmes.

Je ne veux pas compter sur le disque ayant des partitions dans une position / taille particulière. Autrement dit, je veux créer une nouvelle partition commençant immédiatement après la dernière partition existante. Je veux pouvoir ensuite créer la partition d'une taille fixe ou remplir l'espace restant.

Dans Bash, existe-t-il un moyen fiable de déterminer

a) la position finale de la dernière partition, et
b) l'espace non partitionné restant après la dernière partition?


1
Même si vous pouvez le faire, je ne le ferais pas. Imaginez le genre de dégâts qu'une faute de frappe peut faire ici ...
Joseph R.

Mieux vaut ne pas. Les installateurs de certaines distributions ont des répartiteurs et ce n'est pas vraiment une tâche simple d'en écrire un. Trop de cas d'angle, trop de choses que vous pouvez gâcher. Ne le fais pas. Si vous le faites, laissez-le produire une configuration suggérée, qui doit être approuvée par l'opérateur.
peterph

Je suis d'accord que c'est dangereux. Cependant, il s'agit d'un script qui commencera par effacer toutes les partitions sur le disque, donc gâcher les partitions par la suite n'est pas grave. Le seul risque est que l'utilisateur spécifie le mauvais disque, ce qui est tout aussi simple avec n'importe quel outil de partition.
Alex

Réponses:


4

partedpeut imprimer de l'espace libre. Exemple (j'en ai choisi un compliqué exprès):

# 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

Comme vous pouvez le voir, cela vous donne directement la position et la taille de la partition que vous pouvez créer, c'est-à-dire la toute dernière ligne qui dit Free Space. Vous pouvez créer une partition qui commence à 31115264s et se termine à 31116287s.

Sans le piège, la partition étendue n'est pas assez grande!

Mais peut-être que vous utilisez déjà le GPT où vous ne souffrez pas de telles complications.

Saisir les chiffres devrait être assez 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`

Ou quelque chose de similaire. (Naturellement, vous voudriez faire d'autres vérifications de santé mentale ici.)

@swisscheese a fait un bon commentaire dans l'autre réponse, je ne savais pas qu'il partedoffrait une sortie conviviale pour l'analyse. Vous pouvez choisir de l'utiliser à la place. Exemple pour saisir le dernier plus grand gratuit:

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

Que ce soit applicable à votre situation (dans mon exemple, vous ne pouvez pas créer une partition là-bas non plus, elle est déjà vraiment pleine) est quelque chose que vous devez déterminer par vous-même. :)


Merci! Pour référence, j'ai utilisé votre fonction make_partition mais avec des arguments légèrement différents: make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex

-1

C'est facile, mkparteda une --listoption, vous devez utiliser awk et --listrécupérer la dernière partition, puis utiliser mkpart part-type [fs-type] start end,

Mais votre réponse:

Au début, vous devriez obtenir toutes les partitions et avec:

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

Remarques:

  1. Vous devez convertir GBen MG.
  2. Vous devez utiliser la dernière valeur de chaque variable
  3. Vous devez utiliser -sdans votre parted commandscript final.

Si j'ai le temps, complétez ce script désolé car je n'ai pas le temps.


Salut, avez-vous réellement exécuté les séquences de commandes que vous proposez? Je ne pense pas qu'ils fassent ce que vous attendez d'eux .. :(
swisscheese

j'ai mis à jour, veuillez relire.
PersianGulf

l'option 2 a également été modifiée.
PersianGulf

2
Salut, ce que je voulais dire était, 'parted --list | awk' {print $ 2} 'est juste un tuyau aveugle vers awk! Il n'obtient PAS ce que vous voulez. Vous devez utiliser l'option -m pour séparer, qui offre une sortie "conviviale pour l'analyse".
swisscheese

1
Rien de plus à dire, bonne chance.
swisscheese
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.