この投稿は、既存の LVM 構成システムを初期構成またはさらに最適化しようとしている Linux システム管理者を対象としています。以下について説明します:
- 使用中の特定のストレージ タイプに固有の LVM フィルタ文字列構成の必要性。
- さまざまな一般的なストレージ デバイスのサンプル LVM フィルタ文字列を提供する
LVM 構成 – フィルター パラメーター
プライマリ LVM 構成ファイルは /etc/lvm/lvm.conf です .このファイルは、さまざまなパラメータ/値を含むいくつかのセクションで構成されています。この記事では、特にデバイス セクション内のフィルター パラメーターに焦点を当てています。
以下はサンプルの 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" }
デフォルトでは、システムの起動時に、LVM は filter パラメータで定義されたデバイスをスキャンして、LVM デバイスを検出します。上記のデフォルトのフィルタ文字列を使用 (filter =[ “a/.*/” ] )、LVM はシステムで使用可能なすべてのデバイスをスキャンします。 PV が検出されると、VG がアセンブルされ、LV がアクティブ化され、続いてファイルシステム (存在する場合) がマウントされます。
かなりの数のストレージ デバイス (LUN) が接続されているシステムの場合、LVM が使用可能なすべてのデバイスをスキャンすることは望ましくないか、または必要ではない場合があります。その場合、LVM フィルター文字列を変更 (最適化) して、ユーザーが指定した一連のデバイスをスキャンすることができます。
LVM とマルチパス
ローカル ストレージ以外では、ユーザーは通常、SAN ストレージ上に LVM デバイスを作成します。さらに、SAN ストレージへのアクセスはマルチパス化されることがよくあります。つまり、同じ SAN LUN への複数のパスがシステム上に存在します。ネイティブの Oracle Linux マルチパス ソリューションである device-mapper-multipath の場合、すべて同じ SAN LUN を参照する次のデバイスが存在する可能性があります。
/dev/mapper/mpath1 /dev/dm-1 /dev/sda /dev/sdb
マルチパスの実装は異なります。EMC PowerPath の場合、すべてが同じ SAN LUN を参照する次のデバイスが存在する可能性があります:
/dev/emcpowera /dev/sda /dev/sdb
前述のように、デフォルトの lvm.conf フィルター文字列値は、接続されている/使用可能なすべてのデバイスをスキャンするよう LVM に指示します。残念ながら、マルチパスと組み合わせて LVM を使用する場合、これは問題になる可能性があります。デバイス (パス) の検出順序に応じて、LVM は最終的にシングルパス デバイスを使用する場合があります。 /dev/sd[a,b] 意図したマルチパス デバイスを使用する代わりに VG を構築します。 /dev/mapper/mpath1.これが発生した場合、LVM デバイスはマルチパスの利点 (パス損失の冗長性、高可用性など) を利用できなくなります。これと同じ問題が、SAN からの起動で構成されたシステムにも同様に当てはまります。
次のようなメッセージは通常、マルチパスを使用する LVM システムがシングルパス デバイスを除外するように最適に構成されていない場合に表示されます:
# 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
上記の LVM は、マルチパス デバイス /dev/mapper/mpath1 ではなく、シングルパス デバイス /dev/sdb を誤って使用します。 LVM が目的のストレージ デバイス/パスを使用するようにするには、LVM フィルター文字列をカスタマイズして、必要なデバイスや不要なデバイスを具体的に含めたり除外したりします。利用可能なローカルおよび SAN ストレージの範囲と多様性のため、単一の LVM ファイル構成がすべての可能な展開に必ずしも適合するわけではありません。したがって、LVM フィルター文字列は、個々のシステム/ストレージの組み合わせに対してカスタマイズする必要があります。
LVM フィルター文字列のサンプル
このセクションでは、サンプル LVM フィルター文字列値の不完全な範囲を示します。 LVM は、フィルター文字列値の正規表現構文のさまざまな組み合わせを受け入れることに注意してください。次のサンプルはそのようなバリエーションの 1 つを示していますが、他のバリエーション/組み合わせも受け入れられます。ただし、LVM は重大な構文エラーがあるとすぐに文句を言います。
フィルターを受け入れる
フィルタ | 意味 |
---|---|
filter =[ “a/.*/” ] | すべてのデバイス |
filter =[ “a|^/dev/sd*|” ] | すべての SCSI デバイスのみ |
filter =[ “a|^/dev/sda|” ] | SCSI デバイス /dev/sda |
filter =[ “a|^/dev/sda[1-9]$|” ] | SCSI デバイスのすべてのパーティション /dev/sda のみ |
filter =[ “a|^/dev/cciss/*|” ] | HP SmartArray 制御デバイス (cciss) のみ |
filter =[ “a|^/dev/loop*|” ] | すべてのループ デバイス – /dev/loop* |
filter =[ “a|^/dev/loop1[0-2]$|” ] | ループ デバイス 10、11、12 のみ – /dev/loop1[0-2] |
filter =[ “a|^/dev/hda1$|” ] | IDE デバイスのパーティション 1 /dev/hda |
filter =[ “a|^/dev/mapper/*|” ] | デバイス マッパー マルチパス デバイス |
filter =[ “a|^/dev/emcpower*|” ] | すべての EMC PowerPath デバイス |
filter =[ “a|^/dev/vpath[a-z]*|” ] | すべての IBM サブシステム デバイス ドライバー (SDD) デバイス |
filter =[ “a|^/dev/sddlm*|” ] | すべての Hitachi Dynamic Link Manager (HDLM) デバイス |
フィルタを拒否(r)
フィルタ | 意味 |
---|---|
filter =[ “r|^/dev/*|” ] | すべてのデバイス |
filter =[ “r|^/dev/cdrom|” ] | CD/DVD デバイス /dev/cdrom |
filter =[ “r|^/dev/hdc|” ] | IDE デバイス /dev/hdc のみ |
LVM フィルター文字列は、個別に指定することも、必要に応じて複数の値を組み合わせて使用することもできます。あいまいさや意図しないデバイスのスキャン/使用を避けるために、目的のデバイス (a) を定義し、その直後に明示的な除外文字列 (r) を指定して、他のデバイスがスキャン/使用されないようにする必要があります。
LVM フィルター文字列の実例
ローカル SCSI ストレージとデバイス マッパー マルチパス SAN ストレージ上に LVM デバイスがあるシステムでは、以下を定義できます:
filter = [ "a|^/dev/sda[1-9]$|", "a|^/dev/mapper/*|", "r|^/dev/*|" ]
ローカルの Smart アレイ ストレージとリモートの EMC PowerPath SAN ストレージに LVM デバイスを搭載した HP システムでは、以下を定義できます。
filter = [ "a|^/dev/cciss/*|", "a|^/dev/emcpower*|", "r|^/dev/*|" ]
ローカル SCSI ストレージと IBM サブシステム デバイス ドライバー SAN ストレージに LVM デバイスを備えたシステムでは、次のように定義できます。
filter = [ "a|^/dev/sda[1-9]$|", "a|^/dev/vpath[a-z]*|", "r|^/dev/*|" ]
候補の LVM フィルター文字列の検証
LVM フィルター文字列を考案してテストするときは、LVM がすべての (そして唯一の) 意図したデバイスを検出/使用し、その他の意図しないデバイスがスキャン/使用されていないことを確認してください。検証プロセスには、次のようなものを含める必要があります:
- 元の /etc/lvm/lvm.conf ファイルをバックアップします
- 必要に応じて lvmpdump を取得して、LVM 構成全体をバックアップします
- 必要に応じて LVM フィルター文字列をカスタマイズします。例:/etc/lvm/lvm.conf:filter =[…]
- LVM キャッシュ ファイルを削除します。 # /bin/rm /etc/lvm/cache/.cache
- LVM デバイスを再スキャンします。 # /sbin/pvscan -vv
pvscan 出力の「Walking through all physical volumes」セクションにリストされているデバイスは、どのデバイスが LVM によってスキャンされたかを示しています。 pvscan 出力の末尾のセクションには、検出されたすべての PV デバイスが一覧表示されます。 LVM フィルター文字列が正しく構成されていない、または構成が最適化されていない場合、次のような結果になる可能性があることに注意してください:
- 意図しないデバイスの使用。マルチパスではなくシングルパス
- 不必要な LVM デバイスのスキャンにより、システムの起動が長引く
- 目的の LVM デバイスを検出できず、デバイス/ファイル システムが利用できなくなる
- カーネル パニックなどによるシステムの起動の失敗
次のシステム コンソール出力は、システムがルート ファイルシステムを含む LVM デバイスを検出できない場合の典型的な起動時のメッセージを示しています:
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!
LVM 構成の変更の実装
lvm.conf ファイルのコピーは、システムの起動時に使用されるシステム初期 RAM ディスク (initrd) ファイル内に保存されます。したがって、LVM 構成の変更により、起動時に変更が有効になるように initrd を再構築することが保証されます。適切な LVM フィルターが定義/検証されたら、次のアクションを実行します:
1. LVM キャッシュ ファイルを削除します。
# rm /etc/lvm/cache/.cache
2. 次のように初期 RAM ディスク (initrd) を再構築します
正しく構成されていない LVM フィルタを使用して initrd ファイルを再構築すると、システムの起動が完全に失敗する可能性があることに注意してください。したがって、このような失敗を防ぐために、次の代替アプローチが提供されています。
オプション 1 (推奨)
このオプションには、現在の initrd を上書きせずに LVM の変更をテストするために、新しい GRUB カーネル ブート エントリを定義することが含まれます。
# 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
次に、GRUB 構成ファイル /boot/grub/grub.conf を確認します。 GRUB カーネル ブート エントリは、title で始まり、順番に表示されます。デフォルト パラメータの値は、現在のデフォルト ブート カーネルを定義します。 GRUB ブート エントリの番号付けはゼロ (0) から始まるため、
– default=0 は、最初にリストされた GRUB カーネル ブート エントリを参照します。
– default=3 は、リストされた 4 番目の GRUB カーネル ブート エントリを参照します。
デフォルトのカーネル ブート エントリのすべての行をそれ自体の下にコピーします。新しく作成された initrd ファイルの名前を反映するように、新しいカーネル ブート エントリの initrd 行を変更します。デフォルト パラメータの値を変更して、新しく作成された GRUB カーネル ブート エントリを反映させます。元のデフォルト パラメータ値が 0 で、新しい GRUB エントリがそのすぐ下に作成された場合、デフォルト パラメータ値を 1 に変更します。例:
# 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 ...
再起動すると、システムは、新しく作成された initrd を含む、新しく作成された GRUB ブート エントリを使用して起動します。問題が発生した場合は、システムを再起動し、起動プロセスを中断して GRUB メニューにアクセスし、元の起動エントリを使用してシステムを起動することを選択します。
オプション 2 (エキスパート)
このオプションには、既存のデフォルトの GRUB カーネル ブート エントリの上書きと、現在の initrd の上書きが含まれます。
# cd /boot # mv initrd-`uname -r`.img initrd-`uname -r`.img.orig # mkinitrd -v -f /boot/initrd-`uname -r`.img `uname -r` Creating initramfs ...
再起動すると、システムは既存の GRUB ブートを使用して起動しますが、新しく再構築された initrd を使用します。
3. 再起動後、すべての LVM デバイス (PV、VG、LV) が存在し、意図した物理デバイスやマルチパス デバイスを使用していることを確認します。さらに LVM フィルター構成を最適化する場合、またはさらに LVM/ストレージの変更/再編成によって再構成が必要になる場合は常に、上記のアクションを繰り返します。