[Azure] VM Debian, élargir la capacité de la partition principale

Lorsque que l’on crée une machine virtuelle sur Azure, le disque dur virtuel contenant la partition principale peut être plus ou moins grand, selon la taille de la machine choisie. Cependant, il se peut que pour certaines raisons, il soit nécessaire d’augmenter la taille de cette partition.

Cela peut se faire facilement de façon graphique, via le portail d’administration de notre compte Azure ou bien en ligne de commande, avec Azure PowerShell (des cmdlets utilisables en PowerShell). J’ai choisi ici de passer par PowerShell car cela permet de donner une bonne petite introduction pratique de ce qu’il est possible de faire avec cet outil sur Azure. Il est à noter qu’il existe deux types de machines virtuelles sur cette plateforme : les dites “classiques” et les nouvelles basée sur le modèle “Resource Manager”. Microsoft conseille de passer par ce dernier qui est le plus récent et qui offre la plus grande souplesse d’utilisation. C’est donc ce modèle que j’appliquerai ici.

Prérequis

1. Se connecter au compte Azure

Dans cette partie, le but sera de se connecter à Azure, accéder à notre machine virtuelle, récupérer la taille du disque contenant l’OS (Debian 8 dans mon cas) et modifier celle-ci. Il faudra ensuite sauvegarder cette nouvelle configuration sur Azure.

La première étape consiste donc à ouvrir PowerShell en mode administrateur et à installer les packages contenant les cmdlets permettant de manipuler notre compte Azure et ses ressources. Pour faire cela, voici les deux commandes à taper, successivement :

Note : N’hésitez pas à aller consulter mon article sur l'autocomplétion dans Powershell car ça va être assez pratique pour la suite de ce guide 😊

1
2
3
4
5
# Installe les modules pour Azure Resource Manager (= RM) depuis la galerie PowerShell
PS C:\WINDOWS\System32> Install-Module AzureRM

# Installe le module de gestion des services Azure depuis la même galerie
PS C:\WINDOWS\System32> Install-Module Azure

PowerShell vous avertira que ces modules proviennent d’un dépôt non certifié et demandera une confirmation d’installation. Étant donné que ces deux modules sont ceux conseillés par le MSDN, je pense que l’on peut leur accorder notre confiance. Maintenant que les modules sont installés, on va pouvoir se connecter sur Azure et commencer à opérer sur notre machine… Le cmdlet de connexion est le suivant :

1
PS C:\WINDOWS\System32> Login-AzureRmAccount

Une popup s’ouvrira et vous demandera de vous identifier. Il faut donc entrer notre compte Microsoft gérant l’abonnement du serveur que l’on veut modifier. Une fois connecté, le cmdlet affichera quelques informations utiles :

Au cas où vous auriez plusieurs abonnements Azure reliés à votre compte Microsoft, il est nécessaire d’indiquer lequel nous allons utiliser pour la suite des opérations. Surlignez puis copiez le “SubscriptionId” de l’abonnement à utiliser (celui sur lequel se trouve votre VM) en appuyant sur la touchée “Entrée” et, enfin, entrez la commande suivante :

1
PS C:\WINDOWS\System32> Get-AzureRmSubscription -SubscriptionId "votre SubscriptionID" | Select-AzureRmSubscription

Si vous n’avez qu’un seul abonnement, inutile de spécifier l’identifiant à utiliser, entrez la commande sans l’attribut “SubscriptionId”.

Note : l’opérateur de pipeline “|” permet d’utiliser la sortie (le résultat) de la première commande comme entrée de la seconde (comme des arguments)

2. Récupérer la VM

Maintenant, l’environnement de cette session PowerShell est configuré pour utiliser le bon abonnement Azure. Désormais, il faut pouvoir cibler la VM sur laquelle nous allons travailler… On peut lister toutes les VM existantes sur notre compte en entrant la commande suivante :

1
PS C:\WINDOWS\System32> Get-AzureRmVM

Illustration du résultat :

Le résultat de cette commande est un objet possédant beaucoup de propriétés dont nous n’avons pas besoin, nous pouvons filtrer et ne sélectionner que les attributs intéressants. La commande “Get-AzureRmVm” peut renvoyer une seule VM si on lui donne le ResourceGroupName et le Name de celle-ci. La commande avec le filtre donnera donc ceci :

1
PS C:\WINDOWS\System32> Get-AzureRmVM | Select ResourceGroupName, Name

Et le résultat est bien plus clair, surtout si nous avons plus d’une VM :

Ici, je vais sélectionner ma VM Debian et l’enregistrer dans une variable Powershell que je vais nommer “vm”. La syntaxe est très simple :

1
PS C:\WINDOWS\System32> $vm = Get-AzureRmVM -ResourceGroupName "DEBIANTESTRG" -Name "DebianTest"; echo $vm

J’ai enchaîné deux commandes ici, grâce au point-virgule. Une fois que la VM a été récupérée et enregistrée dans la variable $vm, la commande “echo” va afficher le contenu de cette variable. Ainsi, on peut facilement vérifier si on a bien pris la bonne VM :

Nous avons désormais une représentation de la VM dans l’objet $vm.

3. Augmenter la taille du disque de la partition principale

Avant de modifier la taille du disque, il faut s’assurer que la VM ne soit plus en activité. Une commande permet de l’éteindre facilement :

1
PS C:\WINDOWS\System32> $vm | Stop-AzureRmVM

Il faudra une dizaine de secondes après avoir confirmé vouloir éteindre la machine avant que cela ne prenne effet. La console sera en attente, il faut juste un peu de patience et attendre le message qui indiquera si la requête de fermeture a été accomplie avec succès ou non.

Pour modifier la taille du disque, on va passer par la variable vm** récupérée plus haut et en modifier les propriétés. Ensuite, nous utiliserons une autre commande permettant de mettre à jour la VM sur Azure en utilisant les propriétés de l'objet **vm que nous avons créé.

L’attribut qui nous intéressera ici est “DiskSizeGB” qui se trouve dans l’attribut “OsDisk” qui lui-même se trouve dans “StorageProfile”. Comme son nom l’indique, il représente la taille du disque, en Go. Pour modifier la taille, il suffit de lui attribuer une nouvelle valeur comme nous le ferions avec un objet dans n’importe quel langage de programmation orienté objet. J’ai choisi d’attribuer 300go d’espace disque pour tripler l’espace dont je disposais à la base.

1
PS C:\WINDOWS\System32> $vm.StorageProfile.OsDisk.DiskSizeGB = 300

Note : il faut évidemment mieux éviter de réduire la taille du disque, au risque de perdre des données.

Il ne reste plus qu’à mettre à jour la VM du côté d’Azure en utilisant les paramètres de notre objet $vm :

1
2
3
4
5
PS C:\WINDOWS\System32> $vm | Update-AzureRmVM

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
True OK OK

Après quelques instants, le résultat de l’opération est affiché. Et si tout s’est passé correctement, il est temps de relancer la VM :

1
2
3
4
5
6
7
PS C:\WINDOWS\System32> $vm | Start-AzureRmVM

OperationId :
Status : Succeeded
StartTime : 04-08-16 23:57:00
EndTime : 04-08-16 23:57:58
Error :

À nouveau, passé un certain délai, on voit apparaître le résultat de la requête envoyée. Si elle est réussi, la taille du disque a bien été augmentée ! … Il ne reste plus qu’à s’approprier l’espace libre ainsi gagné en étendant la partition principale. Et pour cela, il va falloir se connecter en SSH sur notre VM.

4. Étendre la taille de la partition principale

/!\ Les commandes suivantes sont risquées. Une mauvaise manipulation pourrait détruire le boot de l’OS et/ou vos données. Soyez précautionneux-se et attentif-ve ! (et ne me tenez pas pour responsable si quelque chose arrive, je l’ai fait plusieurs fois, ça fonctionne mais comme toujours le risque 0 n’existe pas et je n’ai pas testé tous les environnements/cas d’utilisation possibles).

Une fois connecté-e, la première chose à vérifier est de constater si oui ou non le disque a bien été redimensionné. Vous pouvez le faire en entrant la commande suivante :

1
2
3
4
5
6
7
8
DebianTest@DebianTest:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 300G 0 disk
|-sda1 8:1 0 95G 0 part /
`-sda2 8:2 0 5G 0 part
sdb 8:16 0 40G 0 disk
`-sdb1 8:17 0 40G 0 part /mnt/resource

On peut constater que le disque sda possède bien une capacité de 300Go. Ce que je souhaite faire étant d’étendre la partition système, il va falloir attribuer à sda1 l’espace libre non utilisé. L’utilitaire fdisk a été prévu pour cela, on va donc l’utiliser :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
DebianTest@DebianTest:~$ sudo fdisk /dev/sda
[sudo] password for DebianTest:

Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): m

Help:

DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag

Generic
d delete a partition
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table

Misc
m print this menu
u change display/entry units
x extra functionality (experts only)

Save & Exit
w write table to disk and exit
q quit without saving changes

Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table

Ici, c’est l’aide de fdisk. Il fonctionne de la manière suivante : on entre une lettre qui sera interprétée comme une commande et ensuite fdisk nous demandera sur quelle partition agir, quels paramètres appliquer, etc. Toutes les opérations que nous allons faire n’auront aucun effet sur l’état réel du disque tant que nous ne validons pas nos modifications. Si vous voulez quitter fdisk, la combinaison de touches CTRLC le permet. Ou bien la commande “q”, également. Les commandes que nous allons utiliser ici sont les suivantes :

1
2
3
4
5
6
a   toggle a bootable flag
d delete a partition
n add a new partition
p print the partition table
t change a partition type
w write table to disk and exit

a. Supprimer les partitions existantes

En premier lieu, on vérifie les partitions existantes sur /dev/sda (donc le disque sur lequel on travaille) :

1
2
3
4
5
6
7
8
9
10
11
Command (m for help): p
Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 199231487 199229440 95G 83 Linux
/dev/sda2 199231488 209715199 10483712 5G 82 Linux swap / Solaris

On peut voir ici que le disque a bien 300 Go de capacité et qu’il y a deux partitions présentes dessus : sda1 qui contient l’OS et qui a une taille de 95Go ainsi que sda2 qui a une taille de 5Go et qui est utilisé en tant que swap. Étant donné que l’espace non-alloué se situe après sda2 et que je veux en profiter sur sda1, il va falloir supprimer les deux partitions. La commande à utiliser est “d”, à deux reprises :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Command (m for help): d
Partition number (1,2, default 2): 2

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): p
Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

En listant la table des partitions, on peut constater que plus rien n’existe. On peut donc maintenant recréer les partitions.

b. Recréer les partitions

J’ai donc ici 300Go d’espace à allouer, je vais en donner 295 à sda1 et le reste (5go) à sda2 pour le swap ; ces tailles sont bien sûr totalement arbitraires. La commande à utiliser ici sera “n” :

1
2
3
4
5
6
7
8
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-629145599, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-629145599, default 629145599): +295G

On peut remarquer ici deux choses : c’est une partition primaire (leur nombre est limité sur un disque dur, au contraire des partitions étendues) et on peut indiquer directement en Go la taille que l’on souhaite lui attribuer, d’où le “+295G” (le “+” fait partie de la syntaxe).

Maintenant on peut recréer une deuxième partition primaire pour le swap (les valeurs par défaut suffiront dans ce cas) et on vérifie ensuite si tout est comme on le souhaite avec la commande “p”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2):
First sector (618661888-629145599, default 618661888):
Last sector, +sectors or +size{K,M,G,T,P} (618661888-629145599, default 629145599):

Created a new partition 2 of type 'Linux' and of size 5 GiB.

Command (m for help): p
Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 618661887 618659840 295G 83 Linux
/dev/sda2 618661888 629145599 10483712 5G 83 Linux

sda2 est pour le moment une partition classique, il faut changer son type pour indiquer à Debian de l’utiliser en tant que swap. On utilise donc la commande “t” :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): L

0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
1e Hidden W95 FAT1 80 Old Minix
Hex code (type L to list all codes): 82

Changed type of partition 'Linux' to 'Linux swap / Solaris'.

Command (m for help): p
Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 618661887 618659840 295G 83 Linux
/dev/sda2 618661888 629145599 10483712 5G 82 Linux swap / Solaris

Et voilà ! On a bien nos partitions à la bonne taille et du bon type. Mais attention, en l’état le système n’est toujours pas bootable. Il faut marquer quelle partition est celle à utiliser pour l’amorçage de l’OS.

c. Ajouter le flag de boot

C’est la dernière commande à entrer pour continuer à avoir un système fonctionner et, forcément, on marquera la partition contenant le système : sda1.. Sur fdisk, ajouter le flag de boot se fait avec la commande “a” :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Command (m for help): a
Partition number (1,2, default 2): 1

The bootable flag on partition 1 is enabled now.

Command (m for help): p
Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 618661887 618659840 295G 83 Linux
/dev/sda2 618661888 629145599 10483712 5G 82 Linux swap / Solaris

On peut vérifier la partition à utiliser lors de l’amorçage en regardant laquelle possède l’étoile dans la colonne “boot”. On voit donc clairement ici que ce sera bien sda1, comme nous l’avions demandé. Il n’y a plus qu’à valider les changements ! Et comme ceux-ci se sont fait sur la partition en cours d’utilisation, les changements seront appliqués lors du prochain redémarrage. La commande à utiliser pour enregistrer la nouvelle table des partitions est “w” :

1
2
3
4
5
6
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: Device or resource busy

The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).

On redémarre…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DebianTest@DebianTest:~$ sudo reboot
──────────────────────────────────────

Session stopped
\- Press <return> to exit tab
\- Press R to restart session
\- Press S to save terminal output to file

Server unexpectedly closed network connection

──────────────────────────────────────

DebianTest@DebianTest:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 300G 0 disk
|-sda1 8:1 0 295G 0 part /
`-sda2 8:2 0 5G 0 part
sdb 8:16 0 40G 0 disk
`-sdb1 8:17 0 40G 0 part /mnt/resource
DebianTest@DebianTest:~$

Et c’est fini ! Libre à vous d’utiliser le nouvel espace ainsi acquis comme bon vous semble. Attention, je ne dis pas qu’étendre la partition primaire (contenant l’OS) est forcément une bonne idée ou même une bonne pratique, je ne fais qu’expliquer un cas d’utilisation. Il existe une quantité de guides sur Internet expliquant comment bien partitionner votre OS, ce n’est pas du tout le but de ce guide.

Liens supplémentaires