+++
title = "Redimensionner un disque OpenBSD"
date = 2021-01-11
[taxonomies]
tags = [ "système", "openbsd" ]
+++

Le sujet étant assez peu ou mal documenté, je me suis dit que ce serait intéressant de te faire partager mes notes.

<!-- more -->

# La base

Pour l’expérience (et surtout parce que c’était à peu près mon cas d’usage), j’ai donc installé un OpenBSD 6.8 tout frais avec un disque dur de 16Gio et le partitionnement par défaut. Ce dernier met la partition `/home` en dernier sur le disque. C’est la seule que tu pourras facilement redimensionner (ça tombe bien, c’est ce que je comptais faire).

Bref, donc on ne peut pas redimensionner n’importe quelle partition, seulement la dernière du disque en gros (un peu comme du partitionnement plus classique pour Linux, mais ça fait quelques années que je n’en ai pas fait).

La situation initiale ressemble donc à cela :
```
# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/wd0a      413M   64.5M    328M    16%    /
/dev/wd0k      2.6G    2.0K    2.4G     0%    /home
/dev/wd0d      546M    6.0K    518M     0%    /tmp
/dev/wd0f      1.9G    1.1G    787M    58%    /usr
/dev/wd0g      530M    2.0K    504M     0%    /usr/X11R6
/dev/wd0h      1.8G    216K    1.7G     0%    /usr/local
/dev/wd0j      5.1G    2.0K    4.8G     0%    /usr/obj
/dev/wd0i      1.3G    2.0K    1.3G     0%    /usr/src
/dev/wd0e      782M    5.6M    737M     1%    /var
```

Et c’est donc surtout le `/home` qui va nous intéresser.

# Arrêt, redémarrage, toussa

Première étape donc, arrêter la machine et redimensionner le disque sous-jacent. Je l’ai passé à 64G pour les besoins de la démonstration, mais évidemment, ça pourrait fonctionner avec n’importe quelle valeur (enfin presque, je suppose que si on met un trillion de péta-octets, ça va ptet moins bien passer…).

Au redémarrage, à l’invite de boot, il faut préciser `bsd.rd`. Il s’agit du disque de secours qui est inclus à l’installation (sauf si tu l’as enlevé mais je pars du principe que tu n’es pas un sauvage à ce point-là) :

```
>> OpenBSD/amd64 BOOT 3.52
boot> bsd.rd
```
Une fois démarré, choisis l’option `(S)hell` pour tomber sur un shell standard (`/bin/sh`). À ce stade, le `/dev` de notre OpenBSD n’est pas encore peuplé, il va donc au moins falloir y mettre le disque en question. Si c’est un disque SATA, ce sera `sd0` si c’est un disque IDE, ce sera `wd0` (sur une VM, il y a de bonnes chances que ce soit `wd0` du coup) :

```
# cd /dev
# sh MAKEDEV wd
```

# Je suis venu pour redimensionner des partitions et botter des culs

On va pouvoir vérifier les partitions MBR du disque :
```
# fdisk wd0
Disk: wd0	geometry: 8354/255/63 [134217728 Sectors]
Offset: 0	Signature: 0xAA55
            Starting         Ending         LBA Info:
 #: id      C   H   S -      C   H   S [       start:        size ]
-------------------------------------------------------------------------------
 0: 00      0   0   0 -      0   0   0 [           0:           0 ] unused      
 1: 00      0   0   0 -      0   0   0 [           0:           0 ] unused      
 2: 00      0   0   0 -      0   0   0 [           0:           0 ] unused      
*3: A6      0   1   2 -   2087 254  63 [          64:    33543656 ] OpenBSD     
```

Comme tu peux le constater la géométrie du disque est déjà à la bonne dimension en nombre de secteur. Mais la partition 3 (la partition OpenBSD) n’est pas encore tout-à-fait à jour. On va donc forcer `fdisk` à faire ce qu’il faut :

```
# fdisk -iy wd0
Writing MBR at offset 0.
# fdisk wd0
Disk: wd0	geometry: 8354/255/63 [134217728 Sectors]
Offset: 0	Signature: 0xAA55
            Starting         Ending         LBA Info:
 #: id      C   H   S -      C   H   S [       start:        size ]
-------------------------------------------------------------------------------
 0: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
 1: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
 2: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
*3: A6      0   1   2 -   8353 254  63 [          64:   134206946 ] OpenBSD
```
La quantité de secteur du disque a doublé : nous avons bien alloué de l’espace supplémentaire à la partition OpenBSD. En toute logique, `disklabel` devrait être capable de retrouver rapidement ces petits :

```
# disklabel wd0
# /dev/rwd0c:
type: ESDI
disk: ESDI/IDE disk
label: VBOX HARDDISK
duid: 71abc1c5e7522ff0
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 255
sectors/cylinder: 16065
cylinders: 2088
total sectors: 134217728
boundstart: 64
boundend: 33543720
drivedata: 0
```

Donc là, techniquement, on a la bonne taille de disque, mais pas encore la bonne taille de partition (regarde bien le champs `boundend` pour t’en rendre compte).

On va donc donner les indications nécessaires à `disklabel` pour mettre la frontière au bon endroit et agrandir la dernière partition du disque :

```
# disklabel -E wd0
Label editor (enter '?' for help at any prompt)
wd0> b
Starting sector: [64]
Size ('*' for entire disk): [33543656] *
wd0*> c k
Partition k is currently 5535936 sectors in size, and can have a maximum
size of 106209952 sectors.
size: [5535936] *
wd0*> p
OpenBSD area: 64-134217728; size: 134217664; free: 30
#                size           offset  fstype [fsize bsize   cpg]
  a:           880288               64  4.2BSD   2048 16384  6822
  b:          1310050           880352    swap
  c:        134217728                0  unused
  d:          1162688          2190432  4.2BSD   2048 16384  9011
  e:          1653888          3353120  4.2BSD   2048 16384 12921
  f:          4218208          5007008  4.2BSD   2048 16384 12960
  g:          1130272          9225216  4.2BSD   2048 16384  8760
  h:          3816448         10355488  4.2BSD   2048 16384 12960
  i:          2891616         14171936  4.2BSD   2048 16384 12960
  j:         10944224         17063552  4.2BSD   2048 16384 12960
  k:        106209952         28007776  4.2BSD   2048 16384 12960
wd0*> w
wd0> q
No label changes.
```

Pour le détail : on commence par changer la taille du disque (histoire de lui faire reconnaître ce qu’il y a en plus), puis on change la taille de la partition `k` (qui correspond donc au `/home` mais surtout qui est la dernière partition, la seule que l’on peut redimensionner). À partir de là, il ne reste plus qu’à faire grandir le système de fichiers correspondant :

```
# growfs /dev/rwd0k
We strongly recommend you to make a backup before growing the Filesystem

 Did you backup your data (Yes/No) ? Yes
new filesystem size is: 26552488 frags
Warning: 41632 sector(s) cannot be allocated.
growfs: 51840.0MB (106168320 sectors) block size 16384, fragment size 2048
	using 256 cylinder groups of 202.50MB, 12960 blks, 25920 inodes.
super-block backups (for fsck -b #) at:
 5806240, 6220960, 6635680, 7050400, 7465120, 7879840, 8294560, 8709280,
[…]
 105339040, 105753760
```
Dernière étape avant de valider que tout est bon : faire un petit `fsck` des familles histoire de vérifier que tout est correct.

```
# fdisk /dev/rwd0k
```

# Conclusage

Au démarrage suivant, on constate bien qu’on a récupéré de l’espace disque en plus :

```
# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/wd0a      413M   84.4M    308M    22%    /
/dev/wd0k     49.0G    2.0K   46.6G     0%    /home
[…]
```
Bon évidemment, si on doit redimensionner autre chose que la dernière partition (`/var` au pif), ça va être nettement moins simple et j’aurais tendance à dire que t’auras plus vite fait de tout réinstaller. Néanmoins, le partition automatique étant pas trop mal foutu, il s’arrange pour avoir suffisamment de place partout et garder la partition qui va probablement satûrer le plus vite à la fin.

C’est loin d’être une science exacte mais jusqu’à présent, je l’ai plutôt bien vérifié dans la pratique.
