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.