Enlarge your storage with LVM

:fr: French version in the second post :fr:

Hello YunoHost users.

There is a page in the official documentation on adding external storage to your server. This tutorial, aimed at intermediate users, presents an alternative using logical volumes (LVM).

Prerequisite
You need to know how to ssh to your server and do basic command line operations. Your spare disk is empty.

Concept
The data directory of each storage intensive app is in its own partition. The main avantage is that such app can’t eat all the storage space of the server. A positive side effect is that everything stays where it is supposed to, ensuring that future app upgrades won’t be affected. The negative side effect is that you have to monitor the storage space for each partition.

Foreword
For the purpose of this tutorial, everything is shown on a VM with a fresh yunohost image installed, upgraded to the last stable version (4.3). In your case, host name, devices names will be different. Adjust commands accordingly. I use the case of an additional disk.
If you installed yunohost over Debian, you might have to install LVM.

One disk scenario

If you intend to do this with only one disk, you have to install yunohost in expert mode to use a custom partitioning scheme (create a big empty partition beside the system partition). The choice of using LVM for other parts of the system is outside the scope of this tutorial (but it is what the yunohost image does).

:warning:Warning:warning:
If you’re not doing this on a fresh install, backup your whole server, unless you know what you are doing with your partitions (backing up app data might suffice).

Quick introduction on LVM

Read this if you don't know LVM

For the purpose of this tutorial, you can imagine Volume Groups (VG) as virtual disks and Logical Volumes (LV) as virtual partitions. VG are built on Physical Volumes (PV). PV can be disks or partitions (or anything that pretends to be a disk).
In this tutorial, feel free to use pvs, vgs and lvs at any time to inspect the state of LVM, it will help you understand what is happening.

Initial Setup
SSH to your server and become root.

ssh admin@yuno4
sudo su -

If your additional disk is not already plugged-in, it is a good time to have a look at your block devices.

lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom  
vda             254:0    0   20G  0 disk 
├─vda1          254:1    0  243M  0 part /boot
├─vda2          254:2    0    1K  0 part 
└─vda5          254:5    0 19.8G  0 part 
  ├─system-root 253:0    0 18.8G  0 lvm  /
  └─system-swap 253:1    0  976M  0 lvm  [SWAP]

Plug your disk (be it USB enclosure, SATA drive, optional storage for your vps…) and come back.

lsblk

Your new disk is the one that wasn’t here before, in my case vdb.

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom  
vda             254:0    0   20G  0 disk 
├─vda1          254:1    0  243M  0 part /boot
├─vda2          254:2    0    1K  0 part 
└─vda5          254:5    0 19.8G  0 part 
  ├─system-root 253:0    0 18.8G  0 lvm  /
  └─system-swap 253:1    0  976M  0 lvm  [SWAP]
vdb             254:16   0  200G  0 disk
One disk scenario

Your target is a big unmounted partition, in my case it would be vdaX. Use that partition name instead of vdb in the next step.

Now, we prepare the disk for LVM. :warning: Be sure to use the right device or you will lose your yunohost instance (system+data) :warning:
:zap: If your new disk is not empty, this is where you lost all data :zap:

pvcreate /dev/vdb
pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/vda5  system lvm2 a--  <19.76g      0 
  /dev/vdb          lvm2 ---  200.00g 200.00g

You can see two physical volumes (PV), /dev/vda5 that was created at installation and /dev/vdb. Add your new PV to the VG.

vgextend system /dev/vdb
In case LVM is not used on your system

Create the VG instead of extending it:

vgcreate system /dev/vdb

At this point, you are ready to install your apps. I will demonstrate with nextcloud, adapt the path for any other app. For apps that don’t need much space, skip this step and install the usual way.

App installation
First, we create a LV for the app data. You can be very conservative, since the purpose of all this is to be able to expand it when needed. We format the LV and mount it where the nextcloud data directory will be.

lvcreate -n nextcloud -L 5G system
mkfs.ext4 /dev/system/nextcloud
mkdir -p /home/yunohost.app/nextcloud/data
mount /dev/system/nextcloud /home/yunohost.app/nextcloud/data

You need to add the following line to /etc/fstab so the mount is persistent.

/dev/system/nextcloud /home/yunohost.app/nextcloud/data ext4 defaults 0 2

Now you can install nextcloud.

In case you are on an already running nextcloud instance

You have to:

  1. mount the partition to a temporary location (/mnt will do)
  2. stop your app
  3. move everything from /home/yunohost.app/nextcloud/data to /mnt
  4. umount /mnt
  5. mount /dev/system/nextcloud /home/yunohost.app/nextcloud/data
  6. start your app

Maintenance
You now have several apps filling-up their own dedicated partition.
When one of your apps needs more space, you just extend its partition to give it more room:

lvextend -L+5G --resizefs system/nextcloud

The day the VG is full, just plug another disk and add it to the VG:

pvcreate /dev/vdc
vgextend system /dev/vdc
The lazy way

Now that you know what you are doing, you can skip the pvcreate commands, vgextend will take care of it for you.

If all this is too complicated, you can skip the whole dedicated partition part and just extend the root partition, but you lose the ability to prevent the root partition to be clogged by the apps.

2 Likes

:australia: :us: English version in the first post :uk: :canada:

Salut les YunoHosteur·euses.

La documentation officielle décrit comment ajouter un stockage externe à son serveur. Ce tutoriel, destiné à des utilisateurs confirmés, présente une méthode alternative basée sur des volumes logiques (LVM).

Prérequis
Vous avez besoin de savoir vous connecter à votre serveur par ssh, de connaître les bases de la ligne de commande et d’un disque vide.

Concept
Le répertoire de données de chaque application grosse consommatrice d’espace de stockage est dans sa propre partition. Le principal avantage est ces application ne peuvent plus remplir tout l’espace du serveur. Le bénéfice secondaire est que chaque répertoire reste là où il est censé être, ce qui garantit que les mises-à-jour suivantes ne seront pas perturbées. L’inconvénient est qu’il faut monitorer plus de partitions.

Avant-propos
Pour les besoins de ce tutoriel, tout se passe sur une VM fraîchement installée avec une image yunohost, upgradée à la version stable la plus récente {4.3). Dans votre cas, les noms seront différents et il faudra modifier les commandes en conséquence. Dans d’autres environnements, il peut être nécessaire d’installer LVM.

Scenario Ă  un disque

Pour obtenir le même résulat avec un seul disque, il faut installer yunohost en mode expert pour modifier le schema de partitionnement (en créant une grosse partition vide). Le choix d’utiliser ou non LVM pour le reste du système est hors sujet (c’est le choix de yunohost).

:warning:Attention danger !:warning:
Si vous n’êtes pas sur un système tout neuf, faites une sauvegarde complète, à moins d’être vraiment sur de vous (auquel cas sauvegarder les données peut suffire).

Rapide introduction Ă  LVM

Lisez ceci si vous ne connaissez pas LVM

Dans le cadre de ce tutoriel, vous pouvez assimiler les Volume Groups (VG) à des disques virtuels, et les Logical Volumes (LV) à des partitions virtuelles. Les VG sont construits avec des Physical Volumes (PV). Ces PV sont des disques ou des partitions (ou autre entité se faisant passer pour un disque). Au cours du tutoriel, n’hésitez pas à utiliser les commandes pvs, vgs et lvs, elles vous aideront à comprendre ce qu’il se passe.

Mise en place
Connectez vous au serveur et devenez root.

ssh admin@yuno4
sudo su -

Si le disque supplémentaire n’est pas encore connecté, c’est le bon moment pour inspecter les périphériques de bloc.

lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom  
vda             254:0    0   20G  0 disk 
├─vda1          254:1    0  243M  0 part /boot
├─vda2          254:2    0    1K  0 part 
└─vda5          254:5    0 19.8G  0 part 
  ├─system-root 253:0    0 18.8G  0 lvm  /
  └─system-swap 253:1    0  976M  0 lvm  [SWAP]

Branchez votre disque (boîtier USB, disque SATA, espace supplémentaire pour votre vps…) et reprenons :

lsblk

Le nouveau disque est celui qui n’était pas visible tout-à-l’heure, dans mon cas vdb.

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom  
vda             254:0    0   20G  0 disk 
├─vda1          254:1    0  243M  0 part /boot
├─vda2          254:2    0    1K  0 part 
└─vda5          254:5    0 19.8G  0 part 
  ├─system-root 253:0    0 18.8G  0 lvm  /
  └─system-swap 253:1    0  976M  0 lvm  [SWAP]
vdb             254:16   0  200G  0 disk
Scenario Ă  un disque

On recherche une grosse partition non montée, dans mon cas vdaX. Utilisez cette partition à la place de vdb à la prochaine étape.

Préparons le disque pour LVM. :warning: Si vous vous trompez, vous perdez votre instance yunohost (système et données) :warning:
:zap: Si le nouveau disque n’est pas vide, vous perdez tout ce qui s’y trouve :zap:

pvcreate /dev/vdb
pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/vda5  system lvm2 a--  <19.76g      0 
  /dev/vdb          lvm2 ---  200.00g 200.00g

Vous pouvez voir deux PV, /dev/vda5 créé à l’installation et /dev/vdb. Ajoutez votre nouveau PV au VG.

vgextend system /dev/vdb
Si LVM n'est pas utilisé sur votre système

Créez le VG au lieu de l’agrandir :

vgcreate system /dev/vdb

Vous êtes maintenant prêts à installer les applications. Je vais faire la démonstration pour nextcloud, adaptez le chemin à chaque application. Pour les applications qui n’ont pas vocation à consommer plus d’espace au fil du temps, sautez l’étape et installez normalement.

Installation d’une application
Avant tout, on crée un LV pour les données de l’application. C’est le moment d’être radin, le principe étant d’augmenter la taille plus tard si nécessaire. On formate le LV et on monte le système de fichier là ou nextcloud va stocker les fichiers des utilisateurs.

lvcreate -n nextcloud -L 5G system
mkfs.ext4 /dev/system/nextcloud
mkdir -p /home/yunohost.app/nextcloud/data
mount /dev/system/nextcloud /home/yunohost.app/nextcloud/data

On ajuste /etc/fstab pour que le point de montage soit persistant.

/dev/system/nextcloud /home/yunohost.app/nextcloud/data ext4 defaults 0 2

C’est le moment d’installer nextcloud.

Si vous êtes dans le cas où nextcloud tourne déjà

Il faut :

  1. monter la partition dans un répertoire provisoire (/mnt ici)
  2. stopper l’application
  3. déplacer tous les fichiers de /home/yunohost.app/nextcloud/data vers /mnt
  4. umount /mnt
  5. mount /dev/system/nextcloud /home/yunohost.app/nextcloud/data
  6. relancer l’application

Maintenance
Vous avez maintenant quelques applications qui remplissent tranquillement leur partition dédiée. Quand l’une d’entre-elles est à l’étroit, il suffit d’agrandir sa partition :

lvextend -L+5G --resizefs system/nextcloud

Si le VG est plein, on branche un nouveau disque :

pvcreate /dev/vdc
vgextend system /dev/vdc
La neige est trop molle

Si c’est trop compliqué, on peut oublier l’étape de la partition dédiée et se contenter d’agrandir la partition root, mais on perd la protection contre l’envahissement de cette partition.

2 Likes

J’ai une petite question sur un setup LVM, à savoir comment sauvegarder la configuration (si on doit changer le disque système par exemple), ou comment manipuler les backups, j’avoue que j’ai fait quelques recherches, mais je ne trouve pas ça toujours très clair.

Pour la config, je suis dans un cas ou je change justement mon disque système (il comportait des erreurs de block), je vais faire un clone depuis le précédent, mais une réinstallation me parait le plus simple à mettre en place, et pas envie de perdre les configurations du LVM.

Pour sauver la configuration, il faut utiliser la commande vgcfgbackup -f /path/to/backupfile [vgname]. Ça te permet de restaurer les métadonnée de LVM via la commande jumelle vgcfgrestore. backupfile est un fichier texte.

Dans un cas de changement de disque, il est possible de migrer les LV hors du vieux disque avec la commande pvmove vieuxPV. Si c’est un disque système, il faut bien sûr migrer le boot avant (LVM n’intervient pas à ce niveau).

Ok superbe, je pense que c’est assez clair, merci beaucoup !

Bonjour,

Je cherche à augmenter de 3GO la taille de la partition root de l’instance YNH car c’est trop petit, mais je bloque et je n’arrive pas à comprendre ce qui se passe. Votre aide serait précieuse pour y arriver.

Voici quelques résultats de commandes:

$ lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0    2T  0 disk 
`-sda1            8:1    0    2T  0 part /home
sdb               8:16   0   35G  0 disk 
|-sdb1            8:17   0  243M  0 part /boot
|-sdb2            8:18   0    1K  0 part 
`-sdb5            8:21   0 34.8G  0 part 
  |-system-swap 254:0    0  976M  0 lvm  [SWAP]
  `-system-root 254:1    0 30.8G  0 lvm  /
$ sudo parted /dev/sdb print free
Model: QEMU QEMU HARDDISK (scsi)
Disk /dev/sdb: 37.6GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type      File system  Flags
        1024B   1049kB  1048kB            Free Space
 1      1049kB  256MB   255MB   primary   ext4         boot
        256MB   257MB   1048kB            Free Space
 2      257MB   37.6GB  37.3GB  extended
 5      257MB   37.6GB  37.3GB  logical                lvm
$ sudo pvdisplay
  --- Physical volume ---
  PV Name               /dev/sdb5
  VG Name               system
  PV Size               <31.76 GiB / not usable 0   
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              8130
  Free PE               0
  Allocated PE          8130
  PV UUID               ZZd32h-IPKn-xmE1-mEG7-u2Ci-bHs0-mcIHff
$ sudo vgdisplay
  --- Volume group ---
  VG Name               system
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <31.76 GiB
  PE Size               4.00 MiB
  Total PE              8130
  Alloc PE / Size       8130 / <31.76 GiB
  Free  PE / Size       0 / 0   
  VG UUID               9wjFPX-EFeY-2oeS-uqVb-LBF7-FWle-0s9k5b
sudo lvdisplay
  --- Logical volume ---
  LV Path                /dev/system/swap
  LV Name                swap
  VG Name                system
  LV UUID                ewSLkt-y1k0-mfN3-iifF-Pnz4-jYV1-v0XqA1
  LV Write Access        read/write
  LV Creation host, time yunohost, 2022-09-20 15:10:09 +0200
  LV Status              available
  # open                 2
  LV Size                976.00 MiB
  Current LE             244
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0
   
  --- Logical volume ---
  LV Path                /dev/system/root
  LV Name                root
  VG Name                system
  LV UUID                GAwizc-r2Xn-YDNi-IZFg-j6R3-pPNF-WQjuf5
  LV Write Access        read/write
  LV Creation host, time yunohost, 2022-09-20 15:10:09 +0200
  LV Status              available
  # open                 1
  LV Size                30.80 GiB
  Current LE             7886
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1

Voilà, je ne comprends par trop ce qui se passe, j’ai réussi à augmenter la taille de la partition de 32 à 35GO, mais les LVM ne suivent pas. Merci.

Il te reste deux Ă©tapes:

  • utiliser pvresize pour augmenter la taille de ton volume physique : pvresize /dev/sdb5
  • utiliser lvextend pour augmenter la taille de ton volume logique system/root : lvresize -l +100%FREE --resizefs system/root
1 Like

Salut @Tagada,

Merci beaucoup, ce qui me manquait Ă©tait la commande pvresize.
Du coup, c’est passé avec les deux commandes que tu m’as donné, nickel. :smiley:
Au top !

1 Like