GNU/Linux >> Linux Esercitazione >  >> Linux

LVM e multipathing:stringhe di filtri LVM di esempio

Il post è destinato agli amministratori di sistema Linux che cercano di configurare inizialmente o ottimizzare ulteriormente i sistemi configurati LVM esistenti. Discute:

  • la necessità di una specifica configurazione della stringa di filtro LVM per il particolare tipo di storage in uso.
  • fornire stringhe di filtro LVM di esempio per una varietà di dispositivi di archiviazione comuni

Configurazione LVM – parametro filtro

Il file di configurazione principale di LVM è /etc/lvm/lvm.conf . Il file è costituito da una serie di sezioni, ciascuna contenente vari parametri/valori. Questo articolo si concentra specificamente sul parametro del filtro all'interno della sezione dei dispositivi.

Di seguito è riportato un esempio di file 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"
}

Per impostazione predefinita, all'avvio del sistema, LVM esegue la scansione dei dispositivi definiti dal parametro filter per rilevare i dispositivi LVM. Utilizzando la stringa di filtro predefinita sopra (filter =[ “a/.*/” ] ), LVM esegue la scansione di tutti i dispositivi disponibili sul sistema. Quando i PV vengono scoperti, i VG vengono assemblati, i LV attivati, quindi i filesystem (se esistenti) successivamente montati.

Per i sistemi con un numero considerevole di dispositivi di archiviazione (LUN) collegati, potrebbe non essere desiderabile o necessario che LVM esegua la scansione di tutti i dispositivi disponibili. In tal caso, la stringa del filtro LVM può essere modificata (ottimizzata) per eseguire la scansione di un insieme di dispositivi specificato dall'utente.

LVM e multipathing

Oltre allo storage locale, gli utenti creano comunemente dispositivi LVM su storage SAN. Inoltre, l'accesso allo storage SAN è spesso multipath, ovvero sul sistema esistono più percorsi per la stessa SAN LUN. Nel caso di device-mapper-multipath, la soluzione multipath nativa di Oracle Linux, potrebbero esistere i seguenti dispositivi che fanno tutti riferimento alla stessa SAN LUN:

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

Le implementazioni multipath differiscono:nel caso di EMC PowerPath, potrebbero esistere i seguenti dispositivi che fanno riferimento tutti alla stessa SAN LUN:

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

Come affermato in precedenza, il valore predefinito della stringa del filtro lvm.conf indica a LVM di eseguire la scansione di tutti i dispositivi collegati/disponibili. Sfortunatamente, questo potrebbe essere problematico quando si utilizza LVM insieme al multipathing. A seconda dell'ordine di rilevamento del dispositivo (percorso), LVM può infine utilizzare dispositivi a percorso singolo, ad es. /dev/sd[a,b] per costruire VG invece di utilizzare il dispositivo multipath previsto, ad es. /dev/mapper/mpath1. Se ciò si verifica, al dispositivo LVM non vengono offerti i vantaggi del multipathing, ovvero ridondanza della perdita di percorso, disponibilità elevata, ecc. Lo stesso problema si applica in modo simile ai sistemi configurati con l'avvio da SAN.

Messaggi come i seguenti vengono in genere osservati quando i sistemi LVM che utilizzano multipath non sono configurati in modo ottimale per escludere i dispositivi a percorso singolo:

# 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

Sopra, LVM usa erroneamente il dispositivo a percorso singolo /dev/sdb invece del dispositivo a percorso multiplo /dev/mapper/mpath1. Per garantire che LVM utilizzi i dispositivi/percorsi di archiviazione previsti, personalizzare la stringa del filtro LVM in modo da includere e/o escludere specificamente i dispositivi desiderati e/o indesiderati. A causa della gamma e della varietà di storage locale e SAN disponibili, nessuna configurazione di file LVM si adatta necessariamente a ogni possibile implementazione. Pertanto, la stringa del filtro LVM deve essere personalizzata per singole combinazioni di sistema/storage.

Stringhe di filtro LVM di esempio

Questa sezione offre una gamma incompleta di valori di stringa di filtro LVM di esempio. Si noti che LVM accetta varie combinazioni di sintassi delle espressioni regolari per i valori delle stringhe di filtro. I seguenti campioni denotano una di queste variazioni, tuttavia sono accettate altre variazioni/combinazioni. Tuttavia, LVM si lamenterà prontamente in presenza di gravi errori di sintassi.

Accetta(a) Filtri

Filtro Significato
filtro =[ “a/.*/” ] Tutti i dispositivi
filtro =[ “a|^/dev/sd*|” ] Solo tutti i dispositivi SCSI
filtro =[ “a|^/dev/sda|” ] Dispositivo SCSI /dev/sda
filtro =[ “a|^/dev/sda[1-9]$|” ] Solo tutte le partizioni sul dispositivo SCSI /dev/sda
filtro =[ “a|^/dev/cciss/*|” ] Solo dispositivi controllati HP SmartArray (cciss)
filtro =[ “a|^/dev/loop*|” ] Tutti i dispositivi loop – /dev/loop*
filtro =[ “a|^/dev/loop1[0-2]$|” ] Esegui il loop solo dei dispositivi 10, 11, 12 – /dev/loop1[0-2]
filtro =[ “a|^/dev/hda1$|” ] Partizione 1 su dispositivo IDE /dev/hda
filtro =[ “a|^/dev/mapper/*|” ] dispositivi di mappatura dispositivi multipath
filtro =[ “a|^/dev/emcpower*|” ] Tutti i dispositivi EMC PowerPath
filtro =[ “a|^/dev/vpath[a-z]*|” ] Tutti i dispositivi IBM Subsystem Device Driver (SDD)
filtro =[ “a|^/dev/sddlm*|” ] Tutti i dispositivi Hitachi Dynamic Link Manager (HDLM)

Filtri Rifiuta(r)

Filtro Significato
filtro =[ “r|^/dev/*|” ] Tutti i dispositivi
filtro =[ “r|^/dev/cdrom|” ] Dispositivo CD/DVD /dev/cdrom
filtro =[ “r|^/dev/hdc|” ] Solo dispositivo IDE /dev/hdc

Le stringhe di filtri LVM possono essere specificate individualmente o più valori utilizzati insieme come richiesto. Per evitare ambiguità o scansione/utilizzo non intenzionale del dispositivo, tutti i dispositivi previsti (a) devono essere definiti, quindi essere immediatamente seguiti da una stringa di esclusione esplicita (r) per impedire la scansione/l'utilizzo di altri dispositivi.

Esempi operativi di stringhe di filtri LVM

Un sistema con dispositivi LVM su storage SCSI locale e storage SAN device-mapper-multipath potrebbe definire:

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

Un sistema HP con dispositivi LVM su storage Smart Array locale e storage SAN EMC PowerPath remoto potrebbe definire:

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

Un sistema con dispositivi LVM su storage SCSI locale e storage SAN IBM Subsystem Device Driver potrebbe definire:

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

Convalida delle stringhe di filtri LVM candidate

Durante la progettazione e il test delle stringhe di filtro LVM, assicurarsi che LVM scopra/utilizza tutti (e solo) i dispositivi previsti e che altri dispositivi non previsti non vengano scansionati/utilizzati. Il processo di convalida dovrebbe includere elementi del calibro di:

  • esegui il backup del file originale /etc/lvm/lvm.conf
  • facoltativamente, esegui un lvmpdump per eseguire il backup dell'intera configurazione LVM
  • personalizzare la stringa del filtro LVM come richiesto, ad esempio /etc/lvm/lvm.conf:filter =[…]
  • rimuovere il file della cache LVM ad es. # /bin/rm /etc/lvm/cache/.cache
  • esegui nuovamente la scansione per i dispositivi LVM, ad es. # /sbin/pvscan -vv

I dispositivi elencati nella sezione "Percorrere tutti i volumi fisici" dell'output di pvscan indica quali dispositivi sono stati scansionati da LVM. La sezione finale dell'output pvscan elenca tutti i dispositivi FV rilevati. Tieni presente che una stringa di filtro LVM non corretta o configurata in modo non ottimale può comportare:

  • uso di dispositivi non intenzionali, ad es. singlepath invece di multipath
  • scansione del dispositivo LVM non necessaria, con conseguente avvio del sistema prolungato
  • Mancato rilevamento dei dispositivi LVM previsti, con conseguente indisponibilità del dispositivo/filesystem
  • Mancato avvio del sistema, ad esempio kernel panic, ecc.

Il seguente output della console di sistema indica i tipici messaggi di avvio quando un sistema non è in grado di trovare il dispositivo LVM contenente il filesystem di root:

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!

Implementazione delle modifiche alla configurazione di LVM

Una copia del file lvm.conf è memorizzata all'interno del file del disco ram iniziale del sistema (initrd) utilizzato durante l'avvio del sistema. Pertanto, la modifica della configurazione di LVM garantisce la ricostruzione di initrd affinché le modifiche siano efficaci al momento dell'avvio. Una volta definito/convalidato un filtro LVM appropriato, eseguire le seguenti azioni:

1. Rimuovere il file della cache LVM, ad es.

# rm /etc/lvm/cache/.cache

2. Ricostruisci il ramdisk iniziale (initrd) come segue

Si noti che la ricostruzione del file initrd con un filtro LVM configurato in modo errato può causare un errore di avvio completo del sistema. Di conseguenza, vengono forniti i seguenti approcci alternativi per aiutare a prevenire tale errore.

Opzione 1 (consigliata)

Questa opzione implica la definizione di una nuova voce di avvio del kernel GRUB per testare le modifiche LVM senza sovrascrivere l'attuale initrd.

# 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

Quindi, rivedi il file di configurazione di GRUB /boot/grub/grub.conf. Le voci di avvio del kernel di GRUB, che iniziano con il titolo, sono elencate una dopo l'altra. Il valore del parametro predefinito definisce il kernel di avvio predefinito corrente. La numerazione delle voci di avvio di GRUB inizia da zero (0), quindi:

– default=0 si riferisce alla prima voce di avvio del kernel GRUB elencata.
– default=3 si riferisce alla quarta voce di avvio del kernel GRUB elencata.

Copia tutte le righe della voce di avvio del kernel predefinita sotto di sé. Modificare la riga initrd della nuova voce di avvio del kernel per riflettere il nome del file initrd appena creato. Modificare il valore del parametro predefinito per riflettere la voce di avvio del kernel GRUB appena creata. Se il valore del parametro predefinito originale era 0 e la nuova voce GRUB è stata creata immediatamente sotto di esso, modifica il valore del parametro predefinito su 1, ad esempio:

# 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
...

Al riavvio, il sistema si avvierà utilizzando la voce di avvio di GRUB appena creata, incluso il nuovo initrd. In caso di problemi, riavvia il sistema, interrompi il processo di avvio per accedere al menu di GRUB e seleziona per avviare il sistema utilizzando la voce di avvio originale.

Opzione 2 (esperto)

Questa opzione implica la sovrascrittura della voce di avvio del kernel GRUB predefinita esistente e la sovrascrittura dell'initrd corrente.

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

Al riavvio, il sistema si avvierà utilizzando l'avvio di GRUB esistente ma utilizzerà initrd appena ricostruito.

3. Dopo il riavvio, verificare che tutti i dispositivi LVM (PV, VG, LV) esistano e utilizzino dispositivi fisici e/o multipath previsti. Ripetere le azioni di cui sopra per qualsiasi ulteriore ottimizzazione della configurazione del filtro LVM o ogni volta che ulteriori modifiche/riorganizzazioni di LVM/storage richiedono una riconfigurazione.


Linux
  1. Esempio di configurazione e risoluzione dei problemi di logrotate

  2. Filtra e ottimizza le richieste di file statici con NGINX su Ubuntu 18.04

  3. Istantanea LVM:backup e ripristino della partizione LVM in Linux

  4. I comandi LVM falliscono con "Impossibile caricare il file di configurazione /etc/lvm/lvm.conf"

  5. LVM e multipathing:stringhe di filtri LVM di esempio

Crea ed estendi il filesystem XFS basato su LVM

Come visualizzare e filtrare i log in Plesk

Come Grep per più stringhe e pattern

Come usare bash if -z e if -n per testare le stringhe in Linux

DNS RPZ:un firewall DNS per filtrare siti e utenti

Backup e ripristino di snapshot LVM su Linux