GNU/Linux >> Tutoriels Linux >  >> Linux

LVM et multipathing - exemples de chaînes de filtre LVM

Le poste est destiné aux administrateurs système Linux cherchant à configurer initialement ou à optimiser davantage les systèmes configurés LVM existants. Il traite :

  • le besoin d'une configuration de chaîne de filtre LVM spécifique pour le type de stockage particulier utilisé.
  • fournir des exemples de chaînes de filtre LVM pour une variété de périphériques de stockage courants

Configuration LVM - paramètre de filtre

Le fichier de configuration LVM principal est /etc/lvm/lvm.conf . Le fichier se compose d'un certain nombre de sections contenant chacune différents paramètres/valeurs. Cet article se concentre spécifiquement sur le paramètre de filtre dans la section des appareils.

Voici un exemple de fichier lvm.conf :

devices {
    dir = "/dev"
    scan = [ "/dev" ]
    obtain_device_list_from_udev = 1
    preferred_names = [ ]
    filter = [ "a/.*/" ]
    cache_dir = "/etc/lvm/cache"
    cache_file_prefix = ""
    write_cache_state = 1
    sysfs_scan = 1
    multipath_component_detection = 1
    md_component_detection = 1
    md_chunk_alignment = 1
    default_data_alignment = 0
    data_alignment_detection = 1
    data_alignment = 0
    data_alignment_offset_detection = 1
    ignore_suspended_devices = 0
    disable_after_error_count = 0
    require_restorefile_with_uuid = 1
    pv_min_size = 2048
    issue_discards = 0
}
log {
    verbose = 0
    syslog = 1
    overwrite = 0
    level = 0
    indent = 1
    command_names = 0
    prefix = "  "
}
backup {
    backup = 1
    backup_dir = "/etc/lvm/backup"
    archive = 1
    archive_dir = "/etc/lvm/archive"
    retain_min = 10
    retain_days = 30
}
shell {
    history_size = 100
}
global {
    umask = 077
    test = 0
    units = "h"
    si_unit_consistency = 0
    activation = 1
    proc = "/proc"
    locking_type = 1
    wait_for_locks = 1
    fallback_to_clustered_locking = 1
    fallback_to_local_locking = 1
    locking_dir = "/var/lock/lvm"
    prioritise_write_locks = 1
    abort_on_internal_errors = 0
    detect_internal_vg_cache_corruption = 0
    metadata_read_only = 0
}
activation {
    checks = 0
    udev_sync = 1
    udev_rules = 1
    verify_udev_operations = 0
    missing_stripe_filler = "error"
    reserved_stack = 256
    reserved_memory = 8192
    process_priority = -18
    mirror_region_size = 512
    readahead = "auto"
    mirror_log_fault_policy = "allocate"
    mirror_image_fault_policy = "remove"
    snapshot_autoextend_threshold = 100
    snapshot_autoextend_percent = 20
    use_mlockall = 0
    monitoring = 1
    polling_interval = 15
}
dmeventd {
    mirror_library = "libdevmapper-event-lvm2mirror.so"
    snapshot_library = "libdevmapper-event-lvm2snapshot.so"
}

Par défaut, au démarrage du système, LVM analyse les périphériques définis par le paramètre filter pour découvrir les périphériques LVM. Utilisation de la chaîne de filtre par défaut ci-dessus (filter =[ "a/.*/" ] ), LVM analyse tous les périphériques disponibles sur le système. Au fur et à mesure que les PV sont découverts, les VG sont assemblés, les LV activés, puis les systèmes de fichiers (s'ils existent) sont ensuite montés.

Pour les systèmes avec un nombre considérable de périphériques de stockage (LUN) connectés, il peut ne pas être souhaitable ou nécessaire que LVM analyse tous les périphériques disponibles. Dans ce cas, la chaîne de filtre LVM peut être modifiée (optimisée) pour analyser un ensemble d'appareils spécifié par l'utilisateur.

LVM et multipathing

Outre le stockage local, les utilisateurs créent généralement des périphériques LVM sur le stockage SAN. De plus, l'accès au stockage SAN est souvent à chemins multiples, c'est-à-dire qu'il existe plusieurs chemins vers le même LUN SAN sur le système. Dans le cas de device-mapper-multipath, la solution multipath native d'Oracle Linux, les périphériques suivants peuvent exister et référencer tous le même LUN SAN :

/dev/mapper/mpath1
/dev/dm-1
/dev/sda
/dev/sdb

Les implémentations multivoies diffèrent - dans le cas d'EMC PowerPath, les périphériques suivants peuvent exister et référencer tous le même LUN SAN :

/dev/emcpowera
/dev/sda
/dev/sdb

Comme indiqué précédemment, la valeur de chaîne de filtre lvm.conf par défaut indique à LVM d'analyser tous les périphériques connectés/disponibles. Malheureusement, cela peut être problématique lors de l'utilisation de LVM en conjonction avec le multipathing. En fonction de l'ordre de découverte des périphériques (chemins), LVM peut finalement utiliser des périphériques à chemin unique, par ex. /dev/sd[a,b] pour construire des VG au lieu d'utiliser le périphérique multichemin prévu, par ex. /dev/mapper/mpath1. Si cela se produit, le périphérique LVM ne bénéficie pas des avantages du multipathing, c'est-à-dire de la redondance des pertes de chemin, de la haute disponibilité, etc. Ce même problème s'applique également aux systèmes configurés avec un démarrage à partir du SAN.

Des messages tels que les suivants sont généralement observés lorsque les systèmes LVM utilisant plusieurs chemins ne sont pas configurés de manière optimale pour exclure les périphériques à chemin unique :

# pvs
  Found duplicate PV Yvq85ssLqAXeBvZpVtAqBIbm44KU8cd5: using /dev/dm-1 not /dev/sda
  Found duplicate PV Yvq85ssLqAXeBvZpVtAqBIbm44KU8cd5: using /dev/mapper/mpath1 not /dev/dm-1
  Found duplicate PV Yvq85ssLqAXeBvZpVtAqBIbm44KU8cd5: using /dev/sdb not /dev/mapper/mpath1
  PV                  VG         Fmt  Attr PSize  PFree
  /dev/sdb            VolGroup01 lvm2 a--   1.00G 1.00G
  /dev/cciss/c0d0p2   VolGroup00 lvm2 a--  48.81G    0

Ci-dessus, LVM utilise par erreur le périphérique à chemin unique /dev/sdb au lieu du périphérique multichemin /dev/mapper/mpath1. Pour vous assurer que LVM utilise les périphériques/chemins de stockage prévus, personnalisez la chaîne de filtre LVM pour inclure et/ou exclure spécifiquement les périphériques souhaités et/ou indésirables. En raison de la gamme et de la variété des stockages locaux et SAN disponibles, aucune configuration de fichier LVM unique ne conviendra nécessairement à tous les déploiements possibles. Par conséquent, la chaîne de filtre LVM doit être personnalisée pour les combinaisons système/stockage individuelles.

Exemples de chaînes de filtre LVM

Cette section propose une plage incomplète d'exemples de valeurs de chaîne de filtre LVM. Notez que LVM accepte diverses combinaisons de syntaxe d'expression régulière pour les valeurs de chaîne de filtre. Les exemples suivants indiquent une telle variation, cependant, d'autres variations/combinaisons sont acceptées. Cependant, LVM se plaindra facilement en présence d'erreurs de syntaxe majeures.

Accepter(a) les filtres

Filtrer Signification
filtre =[ "a/.*/" ] Tous les appareils
filtre =[ "a|^/dev/sd*|" ] Tous les périphériques SCSI uniquement
filter =[ "a|^/dev/sda|" ] Périphérique SCSI /dev/sda
filtre =[ "a|^/dev/sda[1-9]$|" ] Toutes les partitions sur le périphérique SCSI /dev/sda uniquement
filter =[ "a|^/dev/cciss/*|" ] Appareils contrôlés par HP SmartArray (cciss) uniquement
filtre =[ "a|^/dev/boucle*|" ] Tous les périphériques de boucle – /dev/loop*
filter =[ "a|^/dev/loop1[0-2]$|" ] Périphériques de boucle 10, 11, 12 uniquement - /dev/loop1[0-2]
filtre =[ "a|^/dev/hda1$|" ] Partition 1 sur le périphérique IDE /dev/hda
filter =[ "a|^/dev/mapper/*|" ] périphériques multivoies du mappeur de périphériques
filter =[ "a|^/dev/emcpower*|" ] Tous les appareils EMC PowerPath
filter =[ "a|^/dev/vpath[a-z]*|" ] Tous les périphériques IBM Subsystem Device Driver (SDD)
filtre =[ "a|^/dev/sddlm*|" ] Tous les appareils Hitachi Dynamic Link Manager (HDLM)

Filtres de rejet(r)

Filtrer Signification
filter =[ "r|^/dev/*|" ] Tous les appareils
filter =[ "r|^/dev/cdrom|" ] Périphérique CD/DVD /dev/cdrom
filter =[ "r|^/dev/hdc|" ] Périphérique IDE /dev/hdc uniquement

Les chaînes de filtre LVM peuvent être spécifiées individuellement ou plusieurs valeurs utilisées conjointement selon les besoins. Pour éviter toute ambiguïté ou analyse/utilisation involontaire de l'appareil, tout appareil prévu (a) doit être défini puis immédiatement suivi d'une chaîne d'exclusion explicite (r) pour empêcher l'analyse/l'utilisation de tout autre appareil.

Exemples de travail de chaînes de filtre LVM

Un système avec des périphériques LVM sur un stockage SCSI local et un stockage SAN à mappeur de périphérique multichemin peut définir :

filter = [ "a|^/dev/sda[1-9]$|", "a|^/dev/mapper/*|", "r|^/dev/*|" ]

Un système HP avec des périphériques LVM sur un stockage Smart Array local et un stockage EMC PowerPath SAN distant peut définir :

filter = [ "a|^/dev/cciss/*|", "a|^/dev/emcpower*|", "r|^/dev/*|" ]

Un système avec des périphériques LVM sur un stockage SCSI local et un stockage SAN IBM Subsystem Device Driver peut définir :

filter = [ "a|^/dev/sda[1-9]$|", "a|^/dev/vpath[a-z]*|", "r|^/dev/*|" ]

Validation des chaînes de filtre LVM candidates

Lors de la conception et du test des chaînes de filtre LVM, assurez-vous que LVM découvre/utilise tous (et uniquement) les périphériques prévus et que les autres périphériques non souhaités ne sont pas analysés/utilisés. Le processus de validation doit inclure les éléments suivants :

  • sauvegardez le fichier /etc/lvm/lvm.conf d'origine
  • effectuer éventuellement un lvmpdump pour sauvegarder l'intégralité de la configuration LVM
  • personnalisez la chaîne de filtre LVM selon vos besoins, c'est-à-dire /etc/lvm/lvm.conf :filter =[…]
  • supprimez le fichier de cache LVM, par ex. # /bin/rm /etc/lvm/cache/.cache
  • re-scanner pour les appareils LVM, par ex. # /sbin/pvscan -vv

Les périphériques répertoriés dans la section "Parcourir tous les volumes physiques" de la sortie pvscan indiquent quels périphériques ont été analysés par LVM. La section finale de la sortie pvscan répertorie tous les appareils PV découverts. Notez qu'une chaîne de filtre LVM incorrecte ou configurée de manière sous-optimale peut entraîner :

  • utilisation d'appareils non intentionnels, par ex. singlepath au lieu de multipath
  • analyse inutile des périphériques LVM, entraînant un démarrage prolongé du système
  • échec de la découverte des périphériques LVM prévus, entraînant l'indisponibilité du périphérique/du système de fichiers
  • échec de démarrage du système, c'est-à-dire panique du noyau, etc.

La sortie suivante de la console système indique les messages de démarrage typiques lorsqu'un système est incapable de trouver le périphérique LVM contenant le système de fichiers racine :

root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
kernel /vmlinuz-2.6.18-348.el5 ro root=/dev/VolGroup00/root 3 crashkernel=128@16M elevator=deadline
 [Linux-bzImage, setup=0x1e00, size=0x1fd6fc]
initrd /initrd-2.6.18-348.el5.img
 [Linux-initrd @ 0x37a7c000, 0x57396d bytes]

Warning: pci_mmcfg_init marking 256MB space uncacheable.
Red Hat nash version 5.1.19.6 starting.
lpfc 0000:06:00.0 0:1303 Link Up Event x1 received Data : x1 xf7 x10 x9 x0 x0 0
lpfc 0000:06:00.1 1:1303 Link Up Event x1 received Data : x1 xf7 x10 x9 x0 x0 0
Unable to access resume device (/dev/VolGroup00/swap)
mount: could not find filesystem '/dev/root'
setuproot: moving /dev failed: No such file or directory
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
switchroot: mount failed: No such file or directory
Kernel panic - not syncing: Attempted to kill init!

Implémentation des changements de configuration LVM

Une copie du fichier lvm.conf est stockée dans le fichier du disque virtuel initial du système (initrd) qui est utilisé lors du démarrage du système. Par conséquent, la modification de la configuration LVM justifie la reconstruction de l'initrd pour que les modifications soient effectives au démarrage. Une fois qu'un filtre LVM approprié a été défini/validé, effectuez les actions suivantes :

1. Supprimez le fichier cache LVM, par ex.

# rm /etc/lvm/cache/.cache

2. Reconstruisez le disque virtuel initial (initrd) comme suit

Notez que la reconstruction du fichier initrd avec un filtre LVM mal configuré peut entraîner un échec complet du démarrage du système. En conséquence, les approches alternatives suivantes sont fournies pour aider à prévenir un tel échec.

Option 1 (recommandée)

Cette option implique de définir une nouvelle entrée de démarrage du noyau GRUB afin de tester les modifications LVM sans écraser l'initrd actuel.

# cd /boot
# mkinitrd -v -f /boot/initrd-`uname -r`.LVM.img `uname -r`
Creating initramfs
...
# ls -lart
...
-rw-------  1 root root 3805700 Nov  1 16:40 initrd-2.6.18-348.el5.LVM.img

Ensuite, passez en revue le fichier de configuration GRUB /boot/grub/grub.conf. Les entrées de démarrage du noyau GRUB, commençant par le titre, sont répertoriées les unes après les autres. La valeur du paramètre default définit le noyau de démarrage par défaut actuel. La numérotation des entrées de démarrage GRUB commence à zéro (0), donc :

– default=0 fait référence à la première entrée de démarrage du noyau GRUB répertoriée.
– default=3 fait référence à la quatrième entrée de démarrage du noyau GRUB répertoriée.

Copiez toutes les lignes de l'entrée de démarrage du noyau par défaut sous elle-même. Modifiez la ligne initrd de la nouvelle entrée de démarrage du noyau pour refléter le nom du fichier initrd nouvellement créé. Modifiez la valeur du paramètre par défaut pour refléter l'entrée de démarrage du noyau GRUB nouvellement créée. Si la valeur du paramètre par défaut d'origine était 0 et que la nouvelle entrée GRUB a été créée immédiatement en dessous, modifiez la valeur du paramètre par défaut sur 1, par exemple :

# cat /etc/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/sda
#default=0
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Oracle Linux Server (2.6.18-348.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-348.el5 ro root=/dev/VolGroup00/LogVol00 crashkernel=128M@32 numa=off
        initrd /initrd-2.6.18-348.el5.img
title Oracle Linux Server (2.6.18-348.el5) LVM
        root (hd0,0)
        kernel /vmlinuz-2.6.18-348.el5 ro root=/dev/VolGroup00/LogVol00 crashkernel=128M@32 numa=off
        initrd /initrd-2.6.18-348.el5.LVM.img
...

Au redémarrage, le système démarrera à l'aide de l'entrée de démarrage GRUB nouvellement créée, y compris l'initrd nouvellement créé. En cas de problème, redémarrez le système, interrompez le processus de démarrage pour accéder au menu GRUB et sélectionnez pour démarrer le système à l'aide de l'entrée de démarrage d'origine.

Option 2 (expert)

Cette option implique d'écraser l'entrée de démarrage du noyau GRUB par défaut existante et d'écraser l'initrd actuel.

# cd /boot
# mv initrd-`uname -r`.img initrd-`uname -r`.img.orig
# mkinitrd -v -f /boot/initrd-`uname -r`.img `uname -r`
Creating initramfs
...

Au redémarrage, le système démarrera en utilisant le démarrage GRUB existant mais utilisera l'initrd nouvellement reconstruit.

3. Après le redémarrage, vérifiez que tous les périphériques LVM (PV, VG, LV) existent et utilisent les périphériques physiques et/ou multivoies prévus. Répétez les actions ci-dessus pour toute autre optimisation de la configuration du filtre LVM ou chaque fois que d'autres modifications/réorganisations de LVM/stockage justifient une reconfiguration.


Linux
  1. Comment comparer des nombres et des chaînes dans le script shell Linux

  2. Instantané LVM :sauvegarde et restauration de la partition LVM sous Linux

  3. LVM et clonage de disques durs

  4. Meilleur ordre de RAID, LVM et LUKS

  5. Dangers et mises en garde LVM

Créer et étendre un système de fichiers XFS basé sur LVM

Comment afficher et filtrer les journaux dans Plesk

Comment Grep pour plusieurs chaînes et modèles

Comment utiliser bash if -z et if -n pour tester des chaînes sous Linux

DNS RPZ :un pare-feu DNS pour filtrer les sites et les utilisateurs

Sauvegarde et restauration d'instantanés LVM sous Linux