<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DRBD on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/drbd/</link><description>Recent content in DRBD on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 11 May 2020 06:35:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/drbd/index.xml" rel="self" type="application/rss+xml"/><item><title>Stockage distribué et répliqué avec DRBD</title><link>https://blog.zwindler.fr/2020/05/11/stockage-distribue-et-replique-avec-drbd/</link><pubDate>Mon, 11 May 2020 06:35:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/05/11/stockage-distribue-et-replique-avec-drbd/</guid><description>&lt;img src="https://blog.zwindler.fr/2020/04/drbd_infra-2.webp" alt="Featured image of post Stockage distribué et répliqué avec DRBD" /&gt;&lt;h2 id="drbd"&gt;DRBD
&lt;/h2&gt;&lt;p&gt;En 2015, j’avais voulu essayer la solution de stockage distribué DRBD. Et oui, 2015. C’est mon plus vieux brouillon sur le blog que je sors enfin. Vous vous en doutez, j’ai du repasser dessus pour ne pas vous donner de versions antédiluvienne ;-)&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.linbit.com/drbd/" target="_blank" rel="noopener"
&gt;DRBD (pour Distributed Replicated Block Device)&lt;/a&gt; est donc un logiciel disponible sous Linux et Windows qui permet de gérer des périphériques de stockages virtuels utilisables dans des infrastructures.&lt;/p&gt;
&lt;p&gt;Ces périphériques ont la particularité de pouvoir être « distribués » sur plusieurs serveurs sur un réseau de façon synchrone ou asynchrone et disposant de plusieurs méthodes de resynchronisation en cas de perte de lien ou d’incohérences.&lt;/p&gt;
&lt;p&gt;L’avantage de cette solution est qu’elle est robuste (fiabilité éprouvée) et qu’elle permet de répondre à des problématiques de haute disponibilité et de performance que n’offrent pas forcément toutes les solutions de stockage.&lt;/p&gt;
&lt;p&gt;Si cette solution peut paraître de prime abord un peu datée à l’époque des containers et de Kubernetes, sachez que Linbit a fait un effort assez conséquent justement sur cette partie, en essayant de se positionner comme un des acteurs du stockage distribué pour les architectures containerisées et/ou &amp;ldquo;cloud native&amp;rdquo; (surtout trusté par &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ceph" &gt;Ceph/CephFS&lt;/a&gt;, voire &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=gluster" &gt;Gluster&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/linstor.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour tester DRBD, vous l’aurez compris, il va nous falloir au minimum deux serveurs. Pour faire simple, je vais utiliser des machines virtuelles (mais évidemment ça fonctionnera mieux sur un serveur physique) sur lesquelles j’ai installé une image Ubuntu 18.04.&lt;/p&gt;
&lt;p&gt;Dans mon cas, j’ai rajouté des disques virtuels de 16Go, pour simuler des disques physiques à synchroniser. De même, j’ai également rajouté des interfaces réseaux supplémentaires pour simuler un réseau dédié « stockage ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/drbd_infra-2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="installation-du-logiciel"&gt;Installation du logiciel
&lt;/h2&gt;&lt;p&gt;La société LINBIT qui distribue le logiciel DRBD propose des packages précompilés pour la plupart des distributions Linux classiques. L’ensemble des packages des différentes versions de DRBD sont disponibles sur le site de &lt;a class="link" href="https://www.linbit.com/drbd/" target="_blank" rel="noopener"
&gt;Linbit&lt;/a&gt;. Cependant, ces packages « officiels » précompilés nécessitent d’avoir payé le support.&lt;/p&gt;
&lt;p&gt;Note : Si les packages officiels sont réservés aux personnes qui payent le support, les sources, elles, sont bien entendu disponibles &lt;a class="link" href="https://www.linbit.com/linbit-software-download-page-for-linstor-and-drbd-linux-driver/" target="_blank" rel="noopener"
&gt;sur le site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Heureusement, il est possible d’utiliser tout simplement les packages précompilés de votre distribution.&lt;/p&gt;
&lt;p&gt;A la base, quand j’avais écrit le tutoriel en 2015, j’avais des soucis de compatibilité entre la version du kernel et drbd de ma distribution CentOS (6.3 à l’époque&amp;hellip;). Ma version, 2.6.32-279 alors que les versions 8.3 et 8.4 de DRBD nécessitent le kernel 2.6.32-431. Mais rien ne vous empêche d’installer le kernel demandé pour résoudre ce problème.&lt;/p&gt;
&lt;p&gt;Pour ce tuto, voici les commandes que j’ai dû utiliser pour installer DRBD 9 (la dernière stable même si la 10 arrive bientôt) sur mes Ubuntu 18.04.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt update
sudo apt upgrade
sudo apt install software-properties-common
sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
sudo apt-get update
sudo apt install drbd-utils python-drbdmanage drbd-dkms
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que c’est installé, testez que tout fonctionne avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo modprobe drbd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si tout se passe bien, elle ne devrait remonter aucune erreur. En revanche, si vous n’avez pas un kernel avec une version compatible, vous devriez avoir une erreur du type &amp;ldquo;file not found&amp;rdquo;. Dans ce cas-là, il faudra compiler DRBD à la main.&lt;/p&gt;
&lt;h2 id="préparation-des-machines"&gt;Préparation des machines
&lt;/h2&gt;&lt;p&gt;Les serveurs doivent évidemment pouvoir se joindre et se résoudre. Le mieux étant bien sûr un DNS correct, on pourra se rabattre dans le cadre d’un test sur &lt;em&gt;a minima&lt;/em&gt; un fichier /etc/hosts contenant les informations nécessaires :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;192.168.100.11 drbd1 drbd1.example.org
192.168.100.12 drbd2 drbd2.example.org
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, j’ai créé, sur chaque serveur, deux partitions de 8 Go chacun sur le disque de 16. La première sera de type Linux, la seconde sera de type LVM.&lt;/p&gt;
&lt;p&gt;On oublie pas de créer les objets LVM pour pouvoir les utiliser plus tard.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvcreate /dev/sdb2
vgcreate vg_drbd /dev/sdb2
lvcreate -n lv_drbd -l 2047 vg_drbd
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Le fichier de configuration global de DRBD est &lt;em&gt;/etc/drbd.conf&lt;/em&gt;. Il définit les fichiers unitaires qui doivent être modifiés. Le fichier &lt;em&gt;/etc/drbd.conf&lt;/em&gt; en lui-même ne doit donc pas être modifié directement ; sauf dans le cas où on souhaite changer les fichiers de configuration inclus de répertoire.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/drbd.conf
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include &amp;#34;drbd.d/global_common.conf&amp;#34;;
include &amp;#34;drbd.d/*.res&amp;#34;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le fichier suivant doit contenir les paramètres et les commandes qui sont globaux à toutes les ressources DRBD.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/drbd.d/global_common.conf
# DRBD is the result of over a decade of development by LINBIT.
# In case you need professional services for DRBD or have
# feature requests visit http://www.linbit.com
global {
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="template-de-ressource"&gt;Template de ressource
&lt;/h3&gt;&lt;p&gt;Pour rendre la configuration lisible, on sépare les fichiers de configuration de manière à faire un fichier texte par ressource, nommé avec la convention r[nombre].res. Ici on prendra l’exemple le plus simple d’une synchronisation synchrone (protocole C, par défaut) dans un modèle actif/passif.
Pour vous aider à créer vos premières ressources, DRBD met à disposition, dans &lt;strong&gt;/etc/drbd.d/drbdctrl.res_template&lt;/strong&gt; un template dans lequel vous n’aurez qu’à modifier les valeurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;resource .drbdctrl {
net {
cram-hmac-alg sha1;
shared-secret &amp;#34;&amp;lt;your-shared-secret&amp;gt;&amp;#34;;
}
volume 0 {
device /dev/drbd0 minor 0;
disk /dev/mapper/&amp;lt;vgname&amp;gt;-.drbdctrl;
meta-disk internal;
}
on &amp;lt;node_1&amp;gt; {
node-id 0;
address &amp;lt;ipaddress&amp;gt;:&amp;lt;port&amp;gt;;
}
on &amp;lt;node_n&amp;gt; {
node-id &amp;lt;n&amp;gt;;
address &amp;lt;ipaddress&amp;gt;:&amp;lt;port&amp;gt;;
}
connection-mesh {
hosts &amp;lt;node_1&amp;gt; &amp;lt;node_2&amp;gt; ... &amp;lt;node_n&amp;gt;;
net {
protocol C;
}
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="ressource-pour-un-disque-simple"&gt;Ressource pour un disque &amp;ldquo;simple&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Ici, c’est l’exemple le plus simple. On va indiquer que notre ressource est distribuée sur 2 serveurs sur un bête partition Linux. Les metadata, elles, sont stockées en local (ce qui n’est pas forcément le mieux, mais pour commencer ça suffira).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/drbd.d/r0.res
resource r0 {
on drbd1 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.100.11:7789;
meta-disk internal;
}
on drbd2 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.100.12:7789;
meta-disk internal;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note : si le protocole de synchronisation n’est pas spécifié, on est en synchronisation synchrone par défaut.&lt;/p&gt;
&lt;p&gt;Attention : chaque ressource déclarée réserve le port TCP pour la communication de la ressource. Il faut donc incrémenter le numéro du device drbd ET incrémenter le numéro de port à chaque nouvelle ressource (et aussi s’assurer que le port est libre&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Pour mes tests, j’ai également utilisé la possibilité offerte par DRBD d’utiliser des volumes LVM plutôt que des partitions brutes. La configuration est la même à ceci près qu’on pointe sur le LV plutôt que sur une partition.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/drbd.d/r1.res
resource r1 {
on drbd1 {
device /dev/drbd2;
disk /dev/vg_drbd/lv_drbd;
address 192.168.100.11:7790;
meta-disk internal;
}
on drbd2 {
device /dev/drbd2;
disk /dev/vg_drbd/lv_drbd;
address 192.168.100.12:7790;
meta-disk internal;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="initialisation"&gt;Initialisation
&lt;/h2&gt;&lt;p&gt;Maintenant que tout est configuré, on va pouvoir déclencher l’étape d’initialisation des metadata et des ressources nouvellement créées.
Lancez les commandes suivantes sur les deux nœuds :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdadm create-md r0
drbdadm create-md r1
drbdadm up r0
drbdadm up r1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que les commandes sont lancées, on peut afficher les informations sur l’initialisation des disques (état normal) avec &lt;strong&gt;drbdmon&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/drbdmon1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Actuellement, les nœuds sont &lt;strong&gt;Inconsistants&lt;/strong&gt; et en Secondaire/Secondaire, car nous n’avons pas encore désigné le nœud principal. Nous allons &amp;ldquo;forcer&amp;rdquo; le sens dans lequel le disque doit être synchronisé.&lt;/p&gt;
&lt;p&gt;Sélectionner un des nœuds, qu’on va désigner comme &amp;ldquo;serveur primaire&amp;rdquo; et exécuter les commandes suivantes (uniquement sur lui) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@drbd1:~# drbdadm primary --force r0
root@drbd2:~# drbdadm primary --force r1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ATTENTION : dans le cas d’un disque déjà créé, il faut bien ne pas se tromper de sens, au risque d’écraser le disque qui contiendrait les données.&lt;/p&gt;
&lt;p&gt;Une fois la synchronisation terminée, on peut utiliser le disque /dev/drbdX.&lt;/p&gt;
&lt;h2 id="cest-fini-"&gt;C’est fini ?
&lt;/h2&gt;&lt;p&gt;En fait, pas tout à fait. On ne va pas pouvoir utiliser nos disques exactement comme des disques classiques. Si vous formattez ce disque en ext4/xfs/whatever et que vous essayez de le monter sur vos deux serveurs drbd1 et drbd2, vous allez avoir une drôle de surprise.&lt;/p&gt;
&lt;p&gt;En effet, ces filesystems ne savent pas gérer les accès concurrents provenant de deux machines simultanées. On va donc devoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soit utiliser un filesystem capable de gérer les accès concurrents (&lt;a class="link" href="https://en.wikipedia.org/wiki/Clustered_file_system" target="_blank" rel="noopener"
&gt;page Wikipedia listant quelques clustered filesystems&lt;/a&gt;) comme OCFS2 ou GFS2. Si vous publiez les disques DRBD en iSCSI pour votre cluster VMware, vous n’aurez pas de problème non plus car le VMFS le gère très bien aussi.&lt;/li&gt;
&lt;li&gt;soit s’assurer à tout moment que le disque n’est monté que sur un seul serveur à la fois.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Évidemment la 2ème option est à proscrire si vous êtes dans un contexte de production. Cependant, cela reste possible si vous montez un cluster Pacemaker ou &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=RHCS" &gt;RHCS&lt;/a&gt; par exemple, qui va s’assurer que les bascules de stockage se font de manière propre.&lt;/p&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;
&lt;h2 id="bonus--quelques-commandes-utiles"&gt;Bonus : quelques commandes utiles
&lt;/h2&gt;&lt;p&gt;Pour une ressource donnée, afficher le rôle du serveur local&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@drbd1:~# drbdadm role r0
Primary
root@drbd1:~# drbdadm role r1
Secondary
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Afficher de manière concise l’état d’une ressource sur les nœuds&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@drbd1:~# drbdadm dstate r0
UpToDate/UpToDate
root@drbd1:~# drbdadm dstate r1
Inconsistent/UpToDate
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Afficher plus de détails sur une ressource avec &lt;code&gt;drbdadmin&lt;/code&gt; pour un résultat simple ou &lt;code&gt;drbdsetup&lt;/code&gt; pour avoir plus de détails :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/drbd_state.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdsetup status r1 --verbose --statistics
r1 node-id:1 role:Secondary suspended:no
write-ordering:flush
volume:0 minor:2 disk:Inconsistent quorum:yes
size:8384220 read:0 written:1972628 al-writes:0 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:no
drbd2 node-id:0 connection:Connected role:Primary congested:no ap-in-flight:0 rs-in-flight:0
volume:0 replication:SyncTarget peer-disk:UpToDate done:23.53 resync-suspended:no
received:1972628 sent:0 out-of-sync:6411740 pending:3 unacked:12 dbdt1:92.39 eta:68
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En temps normal, toutes les ressources sont actives par défaut. Cependant, on peut les activer ou les désactiver à la main :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdadm up r0
drbdadm down r1
# utiliser le mot clé « all » pour désigner toutes les ressources
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si on modifie les fichiers de configuration global ou un fichier de ressource, il est nécessaire de mettre à jour la configuration sur les deux nœuds. Il est possible de reconfigurer les ressources même si elles sont opérationnelles grâce à la méthode suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drdbadm adjust r0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Changer le statut du nœud courant (pour le passer en primary s’il est secondary par exemple)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdadm primary r1
drbdadm secondary r0
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.linbit.com/drbd-user-guide/drbd-guide-9_0-en/" target="_blank" rel="noopener"
&gt;User Guide DRBD 9.0 (Anglais)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[IRL] RedHat virtualisé et haute dispo, RHCS+VMDK partagés vs vSphere Replication</title><link>https://blog.zwindler.fr/2015/02/11/irl-redhat-virtualise-et-haute-dispo-rhcs-vmdk-partage-vs-vsphere-replication/</link><pubDate>Wed, 11 Feb 2015 14:58:49 +0000</pubDate><guid>https://blog.zwindler.fr/2015/02/11/irl-redhat-virtualise-et-haute-dispo-rhcs-vmdk-partage-vs-vsphere-replication/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/02/rhcs.webp" alt="Featured image of post [IRL] RedHat virtualisé et haute dispo, RHCS+VMDK partagés vs vSphere Replication" /&gt;&lt;h2 id="contexte"&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Dans un contexte professionnel, il arrive que des décisions soient prises et qu’il faille s’y tenir coute que coute. Même si on se rend compte plus tard que ce n’était pas forcément le chemin le plus facile. La facilité, c’est le côté obscur, on le sait bien ;-).&lt;/p&gt;
&lt;p&gt;Pour un client, on m’a donc demandé de concevoir une plateforme RedHat 5.X virtualisée hautement disponible, avec une durée d’interruption de service maximale de 30 minutes en toute circonstance (jusque là tout va bien), &lt;strong&gt;ET&lt;/strong&gt; la possibilité de restaurer les disques des OS virtuels avec plusieurs points de restaurations par palliers de 30 minutes (RPO/RTO). &lt;em&gt;Aie!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Tel le Mac Giver des temps modernes, je dispose des outils suivants pour y parvenir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 licence vSphere Essential Plus&lt;/li&gt;
&lt;li&gt;2 serveurs physiques, installés en ESXi 5.5 et reliés en SAN&lt;/li&gt;
&lt;li&gt;2 baies de disques EMC² VNX5200&lt;/li&gt;
&lt;li&gt;2 souscriptions RedHat Datacenter - pour disposer d’autant de VMs RHEL qu’on le souhaite sur nos deux nœuds physiques&lt;/li&gt;
&lt;li&gt;2 souscriptions RedHat High Availability (anciennement RedHat Cluster Suite) en mode Datacenter - pour disposer d’autant de clusters RedHat qu’on le souhaite sur nos deux nœuds physiques&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="clusters-rhcs-et-vmdk-partagés-ou-rdm"&gt;Clusters RHCS et VMDK partagés ou RDM
&lt;/h2&gt;&lt;p&gt;Comme vous pouvez le deviner avec la dernière ligne, on m’a demandé d’utiliser les licences qui avaient été achetées. Donc de déployer du cluster RHCS à tour de bras, pour faire des paires de VMs et simuler ce que l’on fait habituellement sur des paires de machines physiques.&lt;/p&gt;
&lt;p&gt;Sauf qu’à tenter de faire des clusters RHCS sur des machines virtuelles VMware, on trouve vite toute sortes de petits désagréments.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt; : Je vous demanderai de bien vouloir faire abstraction du fait que c’est vraiment « bourrin » de doubler des VMs lorsqu’on dispose d’un cluster vSphere. En fait, si j’en suis arrivé là, c’est parce qu’un simple cluster VMware HA ne répond pas à l’ensemble des besoins énoncés plus haut. C’est possible, bien sûr, mais il faut aller creuser peu plus loin (cf la fin de l’article).&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="prérequis"&gt;Prérequis
&lt;/h3&gt;&lt;p&gt;VMware et RedHat supportent l’utilisation de cluster RHCS dans sur des machines virtuelles avec les obligations suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support de vSphere 5.1 uniquement à partir de RHEL 5u9 ou 6u4&lt;/li&gt;
&lt;li&gt;Support de vSphere 5.5 uniquement à partir de RHEL 5u11, 6u6 ou 7&lt;/li&gt;
&lt;li&gt;Support du partage de disques via RDM à partir RHEL 5u7&lt;/li&gt;
&lt;li&gt;Support du partage de VMDK à partir de RHEL 5u9&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Voir &lt;a class="link" href="https://access.redhat.com/articles/29440" target="_blank" rel="noopener"
&gt;ici pour plus d’infos&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Idéalement, il faut donc disposer de machines virtuelles RHEL 5u11 et de vSphere en version 5.5 (version la plus à jour si on met de côté la 6 qui va sortir), mais on peut se « contenter » d’une version RHEL 5u9 en installant une version plus ancienne de vSphere (5.1).&lt;/p&gt;
&lt;p&gt;Le cas le plus défavorable est l’utilisation de vSphere 5.0 avec un RHEL 5u7 ou 5u8. Dans ce cas, seul le partage de disques via RDM est possible et un bug connu dans la version 5.0 de vSphere empêche le fonctionnement opérationnel du cluster (au niveau du fencing).&lt;/p&gt;
&lt;p&gt;Au-delà, ce n’est pas supporté.&lt;/p&gt;
&lt;h3 id="architecture"&gt;Architecture
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/02/rhcs.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="cas-de-pannes"&gt;Cas de panneS
&lt;/h3&gt;&lt;p&gt;Les disques OS sont installés en RAID 1 MDADM avec 2 VMDKs situés sur les deux baies.&lt;/p&gt;
&lt;p&gt;Si ce n’est pas le cas, en cas de la perte de la baie de disques hébergeant l’OS du nœud maitre, le serveur deviendra instable mais ne pourra pas se saborder d’elle-même correctement, plantant le cluster et l’application.&lt;/p&gt;
&lt;p&gt;Pire, s’il s’agit de la baie de disques qui héberge le &lt;strong&gt;quorum disk&lt;/strong&gt;, le cluster ne disposera plus d’assez de votes pour fonctionner et le redémarrage devra être forcé à la main.&lt;/p&gt;
&lt;p&gt;En cas de corruption du disque OS du nœud actif, les packages basculeront sur l’autre VM.&lt;/p&gt;
&lt;p&gt;En cas de panne de l’ESXi, les packages actifs pourront basculer sur le nœud présent sur l’autre serveur.&lt;/p&gt;
&lt;p&gt;En cas de perte de la baie de disques, les données seront toujours accessibles par les deux VMs grâce à l’autre membre du miroir.&lt;/p&gt;
&lt;p&gt;Même si la baie hébergeant le quorum tombe en panne, on disposera toujours de deux votes (les deux nœuds du cluster).&lt;/p&gt;
&lt;h3 id="limitations-et-problématiques-de-la-solution"&gt;Limitations et problématiques de la solution
&lt;/h3&gt;&lt;h4 id="vmware-et-contrôleur-physique"&gt;VMware et Contrôleur Physique
&lt;/h4&gt;&lt;p&gt;Pour partager des disques durs virtuels (RDM ou VMDK), il faut ajouter à la machine virtuelle un « contrôleur de disques SCSI » en « compatibilité physique ». Ceci a pour conséquence de limiter les fonctionnalités disponibles dans VMware :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pas de live vMotion (bascule de VM à chaud)&lt;/li&gt;
&lt;li&gt;Pas de snapshots&lt;/li&gt;
&lt;li&gt;Pas de sauvegarde via l’API VMware (sauvegarde des VMs via l’ESXi « clientless » et sauvegarde granulaire)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="rhcs-et-nombre-de-votes"&gt;RHCS et nombre de votes
&lt;/h4&gt;&lt;p&gt;La salle primaire héberge le quorum disk qui permet de favoriser la salle primaire en cas de « split brain » (voir mon article sur &lt;a class="link" href="https://blog.zwindler.fr/2013/07/07/demarrage-force-avec-moins-de-la-moitie-des-votes-sur-redhat-cluster-suite-split-brain-my-love/" &gt;le démarrage forcé sous RHCS&lt;/a&gt;). Ce mécanisme de sécurité permet d’empêcher d’avoir 2 salles autonomes en même temps ce qui aura pour conséquence de corrompre les données du SI.&lt;/p&gt;
&lt;p&gt;Le cas défavorable de la perte de la salle primaire complète induit un problème important qui ne peut pas être adressé simplement. Dans ce cas de figure, il n’y a plus assez de votes pour que le cluster fonctionne, et l’application s’éteint.&lt;/p&gt;
&lt;p&gt;Il est donc nécessaire de redémarrer manuellement les clusters. Dans l’absolu, ce n’est qu’une commande à passer, mais dans mon cas, j’ai un nombre important de clusters à gérer. La personne d’astreinte ne pourra jamais tenir les SLA de 30 minutes d’indisponibilité.&lt;/p&gt;
&lt;p&gt;Il me parait impossible d’automatiser proprement cette relance du cluster, car c’est un mécanisme trop sensible et les risques de corruption de données sont trop important.&lt;/p&gt;
&lt;h4 id="lvm-vs-mdadm"&gt;LVM vs MDADM
&lt;/h4&gt;&lt;p&gt;Dans la structure pour laquelle je travaille, l’utilisation du mirroring LVM est un choix technique historique héritée de nos clusters MCSG sous HP-UX.&lt;/p&gt;
&lt;p&gt;Sous RHEL 5.X, la gestion des miroirs LVM est complexe et peu adaptée :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l’agrandissement des volumes nécessite une suppression du miroir, rendant les données temporairement non redondée et réduisant les performances.&lt;/li&gt;
&lt;li&gt;la perte de l’interconnexion - même temporaire - a des effets de bords qui nécessitent également de tout reconstruire et de tout resynchroniser entièrement (membres de miroirs perdus mais pas tous remontés comme tels).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A l’inverse, l’agrandissement d’un disque via MDADM peut se faire à chaud (on agrandi un VMDK, puis l’autre), et la perte temporaire d’un membre ne nécessite pas de le reconstruire complètement.&lt;/p&gt;
&lt;p&gt;Une dernière option - idéale techniquement - est l’utilisation de la réplication de « blocs devices » par &lt;a class="link" href="http://drbd.linbit.com/" target="_blank" rel="noopener"
&gt;DRBD (société LinBIT)&lt;/a&gt;. Elle a été rejetée pour cause d’absence de support de la part de RedHat mais permet de faire exactement ce que l’on souhaite : répliquer des disques au niveau bloc entre deux VMs.&lt;/p&gt;
&lt;h2 id="réplication-des-vmdk-via-vsphere-replication"&gt;Réplication des VMDK via vSphere Replication
&lt;/h2&gt;&lt;p&gt;Et voilà la solution que j’aurai aimé étudier. La facilité. &lt;strong&gt;Le côté obscur donc&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="prérequis-1"&gt;Prérequis
&lt;/h3&gt;&lt;p&gt;Pour utiliser la fonctionnalité vSphere Réplication, il faut disposer d’une licence vSphere Essential Plus (ou mieux), d’un vCenter et de deux datastores distincts.&lt;/p&gt;
&lt;h3 id="architecture-1"&gt;Architecture
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/02/vsphere_replication.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="réplication-du-disque-os-de-la-vm"&gt;Réplication du disque OS de la VM
&lt;/h3&gt;&lt;p&gt;Avec la licence vSphere Essential Plus, il est possible de réaliser un « pseudo PRA » à l’aide de la fonctionnalité vSphere Replication.&lt;/p&gt;
&lt;p&gt;La machine virtuelle n’est pas doublée comme dans l’architecture précédente. Ici VMware réplique son VMDK en fil de l’eau vers un Datastore secondaire.&lt;/p&gt;
&lt;p&gt;En cas de panne quelconque sur la salle primaire, on bascule la VM sur le serveur ESXi secondaire et on la redémarre sur le disque répliqué (opération manuelle).&lt;/p&gt;
&lt;p&gt;En cas de corruption des filesystems sur le disque OS, on dispose de plusieurs points de restauration dans le temps nous permettant de revenir à un état précédent fonctionnel.&lt;/p&gt;
&lt;h3 id="limitations-et-problématiques-de-la-solution-1"&gt;Limitations et problématiques de la solution
&lt;/h3&gt;&lt;p&gt;Malheureusement je n’ai pas eu l’occasion de le tester, la solution choisie n’étant pas cette solution. Cependant, au vu des besoins énoncés et des ressources à ma disposition, cette solution me parait être celle qui répond à tous les besoins et toutes les problématiques.&lt;/p&gt;</description></item><item><title>Partage de VMDK entre plusieurs VMs</title><link>https://blog.zwindler.fr/2015/01/07/partage-de-vmdk-entre-plusieurs-vms/</link><pubDate>Wed, 07 Jan 2015 16:05:17 +0000</pubDate><guid>https://blog.zwindler.fr/2015/01/07/partage-de-vmdk-entre-plusieurs-vms/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/07/vmware2.webp" alt="Featured image of post Partage de VMDK entre plusieurs VMs" /&gt;&lt;p&gt;Si vous déjà voulu faire un POC de cluster Linux sur des machines virtuelles VMware, vous vous êtes déjà demandé comment vous alliez faire pour partager entre deux serveurs un espace de stockage commun à ces deux machines.&lt;/p&gt;
&lt;p&gt;Une façon de faire consiste à rajouter une couche d’abstraction du stockage au dessus de l’OS (via GlusterFS ou DRBD par exemple), mais dans le cas d’un POC pour valider un cluster connecté au SAN, ce n’est pas forcément la première solution qui vient à l’esprit. Personnellement, la plupart des clusters que je construis sont encore dans un schéma plus simple à base de LUNs  iSCSI ou FC partagés sur un SAN en actif/actif ou actif/passif.&lt;/p&gt;
&lt;p&gt;Cependant, pour simuler ce fonctionnement sur vos VMs, il va falloir bidouiller un peu.&lt;/p&gt;
&lt;p&gt;En effet, pour éviter toute erreur malencontreuse (et même désastreuse), VMware interdit par défaut le démarrage de toute machine virtuelle qui aurait un disque en cours d’utilisation par une autre machine virtuelle. Aïe&amp;hellip;&lt;/p&gt;
&lt;p&gt;Voici un petit mode opératoire pour s’en sortir ;-)&lt;/p&gt;
&lt;p&gt;Dans ce mode opératoire, les disques qu’on souhaite partager entre les deux serveurs sont des disques LVM en miroir, hébergés sur les baies de disques qui sont accessibles depuis les deux serveurs ESXi.&lt;/p&gt;
&lt;p&gt;Cet exemple permet de valider la fiabilité de la méthode dans le cadre d’un cluster Linux virtuel de type RedHat Cluster Suite. Le principe reste tout de même valide pour une utilisation en dehors de RedHat Cluster Suite, certaines opérations ne seront juste pas nécessaires (qui peut le plus peut le moins).&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour les besoins de la documentation, deux machines virtuelles &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt; et &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt; ont été créés. Elles disposent des caractéristiques techniques suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;hébergée sur ESXi1&lt;/li&gt;
&lt;li&gt;RedHat Entreprise Linux 5.8&lt;/li&gt;
&lt;li&gt;2 vCPU, 1 Go de RAM&lt;/li&gt;
&lt;li&gt;50 Go de disque interne sur un espace partagé&lt;/li&gt;
&lt;li&gt;IP 192.168.111.1/24 sur un réseau virtuel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;hébergée sur ESXi2&lt;/li&gt;
&lt;li&gt;RedHat Entreprise Linux 5.8&lt;/li&gt;
&lt;li&gt;2 vCPU, 1 Go de RAM&lt;/li&gt;
&lt;li&gt;50 Go de disque interne sur un espace partagé&lt;/li&gt;
&lt;li&gt;IP 192.168.111.2/24 sur un réseau virtuel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="création-des-disques-virtuels"&gt;Création des disques virtuels
&lt;/h2&gt;&lt;p&gt;Les machines &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt; et &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt; doivent être éteintes avant de réaliser les modifications.&lt;/p&gt;
&lt;p&gt;Ouvrir les paramètres de la machine virtuelle &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt;, et ajouter un nouveau périphérique (Disque dur).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le provisionnement du disque doit impérativement être « statique immédiatement mis à zéro ». De plus, il doit aussi être hébergé sur un datastore commun aux deux machines physiques ESXi.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage31.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Créer le disque et l’affecter à un &lt;em&gt;Nœud périphérique virtuel&lt;/em&gt; qui n’est pas encore utilisé.&lt;/p&gt;
&lt;p&gt;Ici, le disque interne est stocké sur l’adresse SCSI (0:0). &lt;strong&gt;Par défaut&lt;/strong&gt; VMware propose de créer le disque à la suite en SCSI (**0:**1).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Il faut impérativement&lt;/strong&gt; dérouler la liste pour affecter le disque à l’adresse SCSI (**1:**0) qui représente un nouveau contrôleur SCSI.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage4.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;De plus, pour permettre l’usage des snapshots sur la partie disque dur interne, les disques doivent être créés en Mode Indépendant/Persistant. &lt;em&gt;Dans le cas contraire, les snapshots seront impossibles sur la machine virtuelle&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Une fois le disque créé, un nouveau contrôleur SCSI est également créé. Avant de valider la création du disque et du contrôleur SCSI, il faut modifier le paramètre de Partage de bus de SCSI en mode « Physique ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage5.avif"
loading="lazy"
&gt;[4]Le second disque dur devra être créé de la même manière, et affecté au même contrôleur SCSI (on prendra l’adresse &lt;strong&gt;1:1&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Remettre &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt; sous tension.&lt;/p&gt;
&lt;h2 id="ajout-des-disques-virtuels-sur-la-deuxième-machine-virtuelle"&gt;Ajout des disques virtuels sur la deuxième machine virtuelle
&lt;/h2&gt;&lt;p&gt;Ouvrir les paramètres de la machine virtuelle &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;, ajouter un nouveau périphérique (Disque dur) puis sélectionner « Utiliser un disque virtuel déjà configuré ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage6.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Sélectionner le premier disque créé précédemment.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;De la même manière que précédemment, on doit créer un disque dur virtuel sur un nouveau contrôleur SCSI et en mode &lt;strong&gt;Indépendant-Persistant&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage8.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Modifier le nouveau contrôleur SCSI comme précédemment :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage9.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ajouter enfin le second disque de la même manière à l’adresse SCSI (1:1).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/01/vmdk_partage101.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Valider et mettre la machine virtuelle sous tension. Si elle boot correctement c’est que le partage fonctionne.&lt;/p&gt;
&lt;h2 id="créer-le-miroir-lvm-partagé"&gt;Créer le miroir LVM partagé
&lt;/h2&gt;&lt;p&gt;Sur &lt;strong&gt;les deux&lt;/strong&gt; serveurs, exécuter les commandes suivantes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;chkconfig acpid off #seulement pour RHCS
service acpid stop #seulement pour RHCS
vi /etc/lvm/lvm.conf
     filter = [ &amp;#34;a/.*/&amp;#34; ]
   #filter = [ &amp;#34;a|/dev/cciss/.*|&amp;#34;, &amp;#34;a|/dev/mpath.*|&amp;#34;, &amp;#34;r|.*|&amp;#34; ] #utiliser cette ligne en cas d’utilisation de multipath et de disques locaux présentés en tant que /dev/cciss. A adapter au contexte
[…]
volume_list = [ &amp;#34;vg01&amp;#34; , &amp;#34;@[TAG]&amp;#34; ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cas de RedHat Cluster Suite, remplacer &lt;em&gt;[TAG]&lt;/em&gt; par le nom de la machine tel qu’il est définit dans le fichier /etc/cluster/cluster.conf.&lt;/p&gt;
&lt;p&gt;En dehors du cas d’un traitement automatisé par cluster, n’importe quel tag convient du moment qu’il est unique à la machine. Dans le cas présent, les tags choisis sont respectivement tag_vm1 et tag_vm2.&lt;/p&gt;
&lt;p&gt;Quelques précisions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;filter&lt;/strong&gt; permet de traiter les cas où on doit ignorer certains disques. C’est typiquement nécessaire lorsque l’on utilise LVM avec multipath ou powerpath, car l’OS voit plusieurs « disques » sda ,sdb, &amp;hellip; pour un même disque mpath (1 sdX pour chaque chemin vers mpathY).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;volume_list&lt;/strong&gt; indique à LVM que seul le vg01 (interne) et les VG explicitement taggués avec le nom de la machine qui peuvent être utilisés. Cela permet de s’assurer qu’il n’y a qu’une seule machine qui peut activer le VG du moment qu’on n’ajoute jamais plus d’un tag au VG.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Même si les modifications du fichier lvm.conf sont prises en compte immédiatement, RedHat Cluster Suite impose une recompilation de l’initrd. Dans le cas d’un cluster RHCS, il faut donc lancer la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkinitrd -f /boot/initrd-$(uname -r).img $(uname -r)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sur un seul nœud (le premier) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvcreate /dev/sdb
pvcreate /dev/sdc
vgcreate -c n vg_mirror /dev/sdb /dev/sdc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tagger le VG pour pouvoir travailler dessus sur ce nœud.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vgchange --addtag tag_vm1 -ay vg_mirror
lvcreate -n lv_mirror -m1 -l 5116 /dev/vg_mirror
Logical volume &amp;#34;lv_mirror&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le journal des écritures doit lui aussi être en miroir&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lvconvert --mirrorlog mirrored /dev/vg_mirror/lv_mirror
Logical volume lv_mirror converted.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Il est enfin possible de formater le disque, et de le monter sur le &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkfs.ext3 /dev/vg_mirror/lv_mirror
mount /dev/vg_mirror/lv_mirror /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="tester-la-bascule"&gt;Tester la bascule
&lt;/h2&gt;&lt;p&gt;Scanner les VGs pour vérifier que le nouveau VG est bien disponible sur le &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vgscan
vgs
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Même s’il le VG est visible, il n’est pas possible de le monter car il n’a pas le bon tag (tel que spécifié dans le lvm.conf). Cela permet de vérifier que l’on ne pourra pas écrire sur les disques sur les deux nœuds en même temps.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Not activating vg_mirror/lv_mirror since it does not pass activation filter.
0 logical volume(s) in volume group “vg_mirror” now active
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut démonter le FS, désactiver le vg et enlever le tag sur le serveur &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt; et vérifier qu’on peut bien le monter et écrire dessus sur le &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ce comportement est automatique sous RedHat Cluster Suite, qui gère lui même les tags lors de la bascule d’un VG/LV.&lt;/p&gt;
&lt;p&gt;Sur &lt;strong&gt;test_partage_vmdk_1&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;umount /mnt
vgchange --deltag tag_vm1 -an vg_mirror
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sur &lt;strong&gt;test_partage_vmdk_2&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vgchange --addtag tag_vm1 -ay vg_mirror
mount /dev/vg_mirror/lv_mirror /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Have fun&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>