Étendre automatiquement la dernière partition pour utiliser tout l'espace non alloué, en utilisant la séparation en mode batch

20

Pour faire court, je dois effectuer tout cela automatiquement au démarrage (système embarqué).

Nos ingénieurs feront clignoter les images sur les appareils de production. Ces images contiendront une petite table de partition. Au démarrage, j'ai besoin d'étendre automatiquement la dernière partition (# 3) pour utiliser tout l'espace disponible sur le disque.

Voici ce que j'obtiens quand je regarde l'espace libre sur mon disque.

> parted /dev/sda print free
Model: Lexar JumpDrive (scsi)
Disk /dev/sda: 32.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  25.3MB  24.2MB  fat16        primary  legacy_boot
        25.3MB  26.2MB  922kB   Free Space
 2      26.2MB  475MB   449MB   ext4         primary
 3      475MB   1549MB  1074MB  ext4         primary
        1549MB  32.0GB  30.5GB  Free Space

J'ai besoin d'étendre la partition 3 par N (30,5 Go) nombre d'octets

Comment effectuer cette étape automatiquement, sans invite? Cela doit fonctionner avec une taille dynamique d'espace disponible après la 3e partition.

Paul Knopf
la source
Ne vous attendez pas à recevoir un script prêt à l'emploi, sans essayer! Pouvez-vous nous montrer ce que vous avez essayé jusqu'à présent? Une autre chose que la partition que vous redimensionnez ne doit pas être montée pendant l'opération ....
Luciano Andress Martini
J'ai essayé la resizepartcommande, et cela fonctionne, mais cela nécessite une taille exacte. J'en ai besoin pour être dynamique.
Paul Knopf
resize2fspourrait être ce que je recherche. linux.die.net/man/8/resize2fs
Paul Knopf

Réponses:

21

Dans les versions actuelles de parted, resizepartdevrait fonctionner pour la partition ( partedcomprend 100%ou des choses comme -1s, cette dernière doit également --arrêter les options d'analyse sur la ligne de commande). Pour déterminer la valeur exacte que vous pouvez utiliser unit s, print free. resize2fsvient ensuite pour le système de fichiers.


Les anciennes versions de partedavaient une resizecommande qui redimensionnait à la fois la partition et le système de fichiers en une seule fois, cela fonctionnait même pour vfat.

Dans une modification de liseuse Kobo, j'ai utilisé cela pour redimensionner la 3e partition de la mémoire interne au maximum: (il suppose aveuglément qu'il n'y a pas de 4e partition et de table msdos et d'autres choses)

start=$(cat /sys/block/mmcblk0/mmcblk0p3/start)
end=$(($start+$(cat /sys/block/mmcblk0/mmcblk0p3/size)))
newend=$(($(cat /sys/block/mmcblk0/size)-8))

if [ "$newend" -gt "$end" ]
then
    parted -s /dev/mmcblk0 unit s resize 3 $start $newend
fi

Vous pouvez donc également obtenir les valeurs /sys/block/.../si le noyau le prend en charge. Mais partedla resizecommande a été supprimée , vous devez donc faire deux étapes maintenant, resizepartpour agrandir la partition, et quel que soit l'outil que votre système de fichiers fournit pour l'agrandir, comme resize2fspour ext*.

frostschutz
la source
Ceci est exactement ce que je cherchais. Merci de votre aide!
Paul Knopf
Question secondaire, qu'est-ce qu'il y a avec les 8 octets à la fin?
Paul Knopf
Évitez de redimensionner par un seul secteur ... vous devez changer cela en -40 ou quelque chose (en-tête de sauvegarde GPT à la fin du disque).
frostschutz
Ne prend partedpas en charge l'extension automatique à partir de la ligne de commande? Parce qu'il le prend en charge de manière interactive. S'il est exécuté de manière interactive, il vous demandera si vous souhaitez corriger la table de partition GPT pour correspondre à la taille du disque (type fix), puis vous pouvez exécuter resizepart 3 -1. J'ai essayé de comprendre comment le faire à partir de la ligne de commande.
Harvey
Pas si rapide: la commande resize a été supprimée dans parted 3.0. Essayez sfdisk ou gparted.
GregD
16

Étant incapable de séparer correctement le script (il a demandé une confirmation parce que la partition était montée et contrairement à d'autres réponses que j'ai trouvées ne comprenait pas -1sou 100%), je viens de trouver l'outil Growpart qui fait exactement cela.

L'utilisation est simple: growpart /dev/sda 3(puis resize2fs /dev/sda3, ou une autre commande appropriée pour le type de système de fichiers utilisé).

Dans Debian et Ubuntu, il est empaqueté comme cloud-guest-utils .

Ivo Smits
la source
1
C'est le moyen le plus pratique que j'ai pu trouver pour le moment. Cela a fonctionné à merveille.
SebiF
C'était la solution pour moi - parted n'aimait pas ext4 comme système de fichiers, et il ne semblait y avoir aucun moyen de l'éviter en essayant de redimensionner le système de fichiers ...
Antti Haapala
ne fonctionne pas pour Ubuntu 18.04
DreamFlasher
@DreamFlasher Je ne peux pas dire pourquoi cela n'a pas fonctionné pour vous. Pour autant que je sache, vous pouvez simplement installer le paquet cloud-guest-utils et comme c'est la seule fonction fournie par growpart, elle devrait fonctionner sauf s'il y a un bogue, elle est utilisée de manière incorrecte ou quelque chose hors de son contrôle va mal. Notez que le dernier argument (3 dans l'exemple) est la partition à redimensionner, en comptant à partir de 1, et qu'un espace suffisant doit être disponible juste après la partition pour pouvoir la redimensionner de cette façon.
Ivo Smits
7

La bonne façon de le faire est d'utiliser le fait que parted a la notion de pourcentages. Donc

parted /dev/sda resize 3 100%
Jonathan Buzzard
la source
1
obsolète, ne fonctionne pas avec Ubuntu 18.04 et
versions
La commande de redimensionnement a légèrement disparu avec la version 3 séparée, vous devez maintenant utiliser la commande resizepart puis redimensionner séparément le système de fichiers ou PV sous-jacent si c'est ce que vous utilisez. Pour ext4, la commande est resize2fs, ou pour XFS, c'est xfs_growfs. Les deux sont normalement effectués lorsque le système de fichiers est monté et l'argument est le point de montage dans les deux cas.
Jonathan Buzzard
0

Dans Ubuntu 18.04, je peux redimensionner pour remplir l'espace non alloué dans un script avec les éléments suivants:

sudo parted -s /dev/sdb "resizepart 2 -1" quit
sudo mount -av
sudo umount /dev/sdb2
sudo mount /dev/sdb2 /mnt
sudo resize2fs /dev/sdb2

Il peut ne pas être nécessaire de monter avant de redimensionner. Je l'ai fait pour supprimer une requête de resize2fs pour l'entrée utilisateur.

Nolan Zinn
la source