ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

Oracle Linux / CentOS スワップ領域の拡張方法と周辺知識

目的

Oracle Linux 6.5 のスワップ領域を拡張します。その際、理解しておくべき周辺知識もまとめました。
CentOS 7.0 でも確認しましたが、ほぼ同様の手順・内容でした。
インストールはほぼデフォルトで行いました(パーティションのカスタマイズ無し)。

エントリ中の引用元及びリンク先も参考になりますので、ぜひご参照ください。

LVM (logical volume manager)

概要

LVM(logical volume manager)とは,複数のハード・ディスクやパーティションにまたがった記憶領域を一つの論理的なディスクとして扱うことのできるディスク管理機能。LinuxをはじめとしたUNIX系OS上で利用できる。

LVM | 日経 xTECH(クロステック)

引用先の図を見ていただけると、イメージしやすいかと思います。

対象システムを以下の観点で確認します。
・ハードディスク
・物理ボリューム(PV)
・ボリューム・グループ(VG)
・論理ボリューム(LV)
・論理ボリュームのマウント

ハードディスク

第 1 SCSI ディスク (SCSI ID アドレスによる) は /dev/sda と名付けられる。

各ディスクのパーティションは、ディスク名に十進数を付け加えることで表します。例えば sda1 と sda2 は、それぞれシステムの第 1 SCSI ディスクドライブの第 1、第 2 パーティションを表します。
(抜粋して引用)

C.4. Linux におけるデバイス名
[root@node1 /]# fdisk -l

ディスク /dev/sda: 17.2 GB, 17179869184 バイト
ヘッド 255, セクタ 63, シリンダ 2088
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00023de7

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *           1          64      512000   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2              64        2089    16264192   8e  Linux LVM

ディスク /dev/mapper/vg_node1-lv_root: 14.9 GB, 14935916544 バイト
ヘッド 255, セクタ 63, シリンダ 1815
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000


ディスク /dev/mapper/vg_node1-lv_swap: 1715 MB, 1715470336 バイト
ヘッド 255, セクタ 63, シリンダ 208
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

ディスク"/dev/sda"があります。命名法より、SCSIディスクが1台認識されているとわかります。
ディスク"/dev/sda"はパーティションが分割されており、"/dev/sda1"、"/dev/sda2"となっています。"/dev/sda2"をLVMで管理しています。
"/dev/mapper/*"はdevice-mapperのシンボリックリンクです(詳細は後述)。物理的なディスクではありません。

物理ボリューム(PV)

[root@node1 ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               vg_node1
  PV Size               15.51 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              3970
  Free PE               0
  Allocated PE          3970
  PV UUID               Qtlekc-lawA-jUM3-R7Zj-A56o-ZlO3-NOEr97

物理ボリューム"/dev/sda2"があります。
物理ボリューム"/dev/sda2"はボリューム・グループ"vg_node1"に含まれます。

ボリューム・グループ(VG)

[root@node1 ~]# vgdisplay
  --- Volume group ---
  VG Name               vg_node1
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               15.51 GiB
  PE Size               4.00 MiB
  Total PE              3970
  Alloc PE / Size       3970 / 15.51 GiB
  Free  PE / Size       0 / 0
  VG UUID               QBpWWJ-bhdh-E9Xp-Xhh7-ni0U-frtx-9cgtBn

ボリューム・グループ"vg_node1"があります。
"Free PE / Size"からボリューム・グループに空きがないことがわかります。

CentOS 7.0の場合は"VG Name"が"centos"でした。

論理ボリューム(LV)

[root@node1 ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg_node1/lv_root
  LV Name                lv_root
  VG Name                vg_node1
  LV UUID                adNNG4-xDa7-K70g-Xz0I-pv5q-gKL6-W8nph1
  LV Write Access        read/write
  LV Creation host, time node1.oracle12c.jp, 2014-08-09 10:09:13 +0900
  LV Status              available
  # open                 1
  LV Size                13.91 GiB
  Current LE             3561
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

  --- Logical volume ---
  LV Path                /dev/vg_node1/lv_swap
  LV Name                lv_swap
  VG Name                vg_node1
  LV UUID                X99LXu-lbzL-8eDN-5cDk-RWlt-zaMP-iNt3ro
  LV Write Access        read/write
  LV Creation host, time node1.oracle12c.jp, 2014-08-09 10:09:15 +0900
  LV Status              available
  # open                 2
  LV Size                1.60 GiB
  Current LE             409
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1

論理ボリューム "lv_root", "lv_swap" があります。
共にボリューム・グループ"vg_node1"に含まれます。

CentOS 7.0の場合は "LV Name" が "root", "swap" でした。

論理ボリュームのマウント

[root@node1 /]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sat Aug  9 10:11:10 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/vg_node1-lv_root /                       ext4    defaults        1 1
UUID=8a00f86c-e555-47b7-a0e6-aafe2cb1f978 /boot                   ext4    defaults        1 2
/dev/mapper/vg_node1-lv_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

/dev/mapper/{ボリュームグループ名}-{論理ボリューム名}
となっています。

LVM構成のまとめ

対象システムのLVM構成をまとめると、以下のようになります。
f:id:pato_taityo:20140809164450p:plain

device-mapper

概要

  • device-mapper は、2.6 カーネルから取り込まれた Linux のブロックデバイスドライバおよびそれをサポートするライブラリ群 ("dm", "DM" と略される)
  • ブロックデバイスの共通部分にプラグインし、ブロックの読み書き要求に対して様々な変換を加えることができる
http://lc.linux.or.jp/lc2009/slide/T-02-slide.pdf

DMデバイス一覧

[root@node1 dm]# dmsetup ls
vg_node1-lv_swap        (252:1)
vg_node1-lv_root        (252:0)

lvdisplayの"Block device"と付き合わせることで、以下の対応が得られます。

マップ名 ボリュームグループ名 論理ボリューム名
vg_node1-lv_root vg_node1 lv_root
vg_node1-lv_swap vg_node1 lv_swap

シンボリックリンク

  • /dev/mapper/<マップ名> を使うことが推奨される
  • /dev/dm-<番号> はカーネル内でのブロックデバイス共通の名前管理のための便宜的なもの。マップを作成する順番により変動するので、通常使うべきではない。
    • sysfs 上では dm-<番号> を参照せざるを得ないが、/sys/block/dm-<番号>/dm/name に <マップ名> が格納されている
  • DMアプリケーションによって他の名前(通常 /dev/mapper/.. へのシンボリックリンク)が用意されることもある
    • multipath: /dev/mpath/<デバイス名>
    • LVM2: /dev/<ボリュームグループ名>/<ボリューム名>
http://lc.linux.or.jp/lc2009/slide/T-02-slide.pdf

対象システムでは以下のようなシンボリックリンクが設定されていました。
/dev/vg_node1/lv_root -> /dev/dm-0
/dev/vg_node1/lv_swap -> /dev/dm-1
/dev/mapper/vg_node1-lv_root -> /dev/dm-0
/dev/mapper/vg_node1-lv_swap -> /dev/dm-1

CentOS 7.0 の場合はdm-<番号>が逆になっていました。

スワップ設定

現状のスワップ設定の確認

[root@node1 ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       1675260 0       -1

対象システムにおいて、"/dev/dm-1"は"vg_node1-lv_swap"のことです。

スワップ設定変更の検討

仮にスワップ領域を400MB拡張したいとします。
ボリューム・グループ"vg_node1"に空きはありません。そのため、このままではスワップ領域を拡張することは出来ません。
ボリューム・グループの空き領域を広げるためにはルートディレクトリ領域を狭めなければいけません。ルートディレクトリのサイズ拡縮を行うにはルートディレクトリのアンマウントが必要ですが、システム稼働中にはできません。
そこで、スワップ領域の調整ではなく、スワップファイルを追加することでスワップサイズを拡大することにします。

スワップ設定の変更

スワップ領域の作成及び利用の手順は以下を参照ください。
資料:linux スワップ(swap)領域の作成

例)スワップ領域を400MB拡張する。

[root@node1 ~]# dd if=/dev/zero of=/swapfile bs=1M count=400
400+0 records in
400+0 records out
419430400 bytes (419 MB) copied, 0.893626 s, 469 MB/s

[root@node1 ~]# chmod 600 /swapfile

[root@node1 ~]# mkswap /swapfile
mkswap: /swapfile: warning: don't erase bootbits sectors
        on whole disk. Use -f to force.
スワップ空間バージョン1を設定します、サイズ = 409596 KiB
ラベルはありません, UUID=99e867ba-a594-4c68-bbdb-9026a55382a5

[root@node1 ~]# swapon /swapfile

[root@node1 ~]# swapon -s
Filename                                Type            Size    Used    Priority
/dev/dm-1                               partition       1675260 0       -1
/swapfile                               file            409596  0       -2

[root@node1 ~]# vi /etc/fstab
以下を追記
/swapfile  swap   swap    defaults   0 0