最近 Docker を使っているとHDD を鬼のように使用します。
HDDが足りなくなってから マウント ということを繰り返していたのですが
もっと便利にやる方法はないだろうか。

と思っていたところ、 LVM2 いいよ という天の声が。
同時にとても良い資料を紹介されたのでこの資料を基にLVM2 を導入してみることに。
株式会社ネットマイスター LPICレベル1技術解説無料セミナー

P26 あたりから LVM2 についての解説がある。
抜粋をキャプチャしてみる。

ほうほう。なるほど。
PV を GV でまとめて LV を払い出しマウントするんだな。/dev/sdc
なんのこっちゃ。

とりあえずやってみることにしよう。
用意したのは Ubuntu14.04 ミニマムインストールイメージ。
以下にバージョン情報を。

root@ubuntu:~# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.10
DISTRIB_CODENAME=utopic
DISTRIB_DESCRIPTION="Ubuntu 14.10"

root@ubuntu:~# uname -a
Linux ubuntu 3.16.0-41-generic #57-Ubuntu SMP Thu Jun 18 08:44:16 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux


■前準備

さっそく LVM2 をインストール
LVM2 の 2 はバージョン情報なのかな?

root@ubuntu:~# apt-get install -y lvm2

root@ubuntu:~# lvm version
  LVM version:     2.02.98(2) (2012-10-15)
  Library version: 1.02.77 (2012-10-15)
  Driver version:  4.27.0


lvm の元になるディスクを準備。
とりあえず 2G のディスクを2本作ってみました。

fdisk で 認識されていることを確認します

root@ubuntu:~# fdisk -l

Disk /dev/sda: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8976d1f2

Device     Boot    Start      End  Sectors Size Id Type
/dev/sda1  *        2048 10485759 10483712   5G 83 Linux
/dev/sda2       10487806 16775167  6287362   3G  5 Extended
/dev/sda5       10487808 16775167  6287360   3G 82 Linux swap / Solaris

Disk /dev/sdb: 2 GiB, 2147483648 bytes, 4194304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sdc: 2 GiB, 2147483648 bytes, 4194304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

/dev/sdb
/dev/sdc が認識されています。


■PVを作る

資料通り PV を作ります
PV とは Physical Volume の略らしく 物理ボリュームのことを指すそうです。
パーティション切っても切らなくても良いようです。
どうせ 後述の VG にまとめてしまうので切らないことにします。

# PVの作成
root@ubuntu:~# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created
root@ubuntu:~# pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created

# 作成されたPVリストを確認
root@ubuntu:~# pvscan
  PV /dev/sdb                      lvm2 [2.00 GiB]
  PV /dev/sdc                      lvm2 [2.00 GiB]
  Total: 2 [4.00 GiB] / in use: 0 [0   ] / in no VG: 2 [4.00 GiB]

これで 2G の PV が 2つできました。

■VG を作る
次はVGを作ります。
VG は Volume Group の略。
いくつかのPVをまとめて VG を作っていきます。

# group1.vg という名前の VG を作ります
root@ubuntu:~# vgcreate group1.vg /dev/sdb
  Volume group "group1.vg" successfully created

# group1.vg に PV を追加
root@ubuntu:~# vgextend group1.vg /dev/sdc
  Volume group "group1.vg" successfully extended

# 作成されたVGリストを確認します
root@ubuntu:~# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "group1.vg" using metadata type lvm2

# PVリストを確認すると PV がどのVGに属しているかわかります。
root@ubuntu:~# pvscan
  PV /dev/sdb   VG group1.vg   lvm2 [2.00 GiB / 2.00 GiB free]
  PV /dev/sdc   VG group1.vg   lvm2 [2.00 GiB / 2.00 GiB free]
  Total: 2 [3.99 GiB] / in use: 2 [3.99 GiB] / in no VG: 0 [0   ]


■ LV を切り出す
次は VG から LV を切りだします
LV とは Logical Volume の略だそうです。
VG に追加した容量内であれば 小出しにしてLVを作ることができます。

とりあえず 2G * 2 = 4G の group1.vg がありますので
1G だけ切り出してみたいと思います。

# 1G 切り出し
root@ubuntu:~# lvcreate -L 1G -n /dev/group1.vg/lv1.data
  Logical volume "lv1.data" created

# ext4 でフォーマット
root@ubuntu:~# mkfs.ext4 /dev/group1.vg/lv1.data
mke2fs 1.42.10 (18-May-2014)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: 8fc694fb-2117-4189-b780-f88396899a9d
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

■マウント、容量確認
作ってみた LV をマウントします。

# マウントするためディレクトリを作る
root@ubuntu:~# mkdir data

# LV をマウント
root@ubuntu:~# mount /dev/group1.vg/lv1.data data/

# マウントされたディスクを確認する
root@ubuntu:~# df -H
Filesystem                      Size  Used Avail Use% Mounted on
/dev/sda1                       5.2G  867M  4.0G  18% /
none                            4.1k     0  4.1k   0% /sys/fs/cgroup
udev                            1.6G  4.1k  1.6G   1% /dev
tmpfs                           316M  300k  316M   1% /run
none                            5.3M     0  5.3M   0% /run/lock
none                            1.6G     0  1.6G   0% /run/shm
none                            105M     0  105M   0% /run/user
/dev/mapper/group1.vg-lv1.data  1.1G  1.4M  952M   1% /root/data

簡単!
でもこれだけじゃないんです。

■ HDDが足りなくなった場合
LV の容量を増やすことができます。
しかもアンマウントしなくてよい。なおかつデータも残る!
凄い!

さて、やってみましょう。
1G の /dev/group1.vg/lv.data がもう一杯になって書き込みができない!
さあ、容量を増やしてみましょう。

# 1G 増やしてみる。
root@ubuntu:~# lvextend -L +1G /dev/group1.vg/lv1.data
  Extending logical volume lv1.data to 2.00 GiB
  Logical volume lv1.data successfully resized

# 確認
root@ubuntu:~# lvscan
  ACTIVE            '/dev/group1.vg/lv1.data' [2.00 GiB] inherit

# df で確認するとまだ増えていない。
root@ubuntu:~# df -H
Filesystem                      Size  Used Avail Use% Mounted on
/dev/sda1                       5.2G  867M  4.0G  18% /
none                            4.1k     0  4.1k   0% /sys/fs/cgroup
udev                            1.6G  4.1k  1.6G   1% /dev
tmpfs                           316M  300k  316M   1% /run
none                            5.3M     0  5.3M   0% /run/lock
none                            1.6G     0  1.6G   0% /run/shm
none                            105M     0  105M   0% /run/user
/dev/mapper/group1.vg-lv1.data  1.1G  1.4M  952M   1% /root/data

# おもむろに ディスクのファイルシステムを拡張します。
root@ubuntu:~# resize2fs /dev/group1.vg//lv1.data
resize2fs 1.42.10 (18-May-2014)
Filesystem at /dev/group1.vg//lv1.data is mounted on /root/data; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/group1.vg//lv1.data is now 524288 blocks long.

# 確認。拡張成功!
root@ubuntu:~# df -H
Filesystem                      Size  Used Avail Use% Mounted on
/dev/sda1                       5.2G  867M  4.0G  18% /
none                            4.1k     0  4.1k   0% /sys/fs/cgroup
udev                            1.6G  4.1k  1.6G   1% /dev
tmpfs                           316M  300k  316M   1% /run
none                            5.3M     0  5.3M   0% /run/lock
none                            1.6G     0  1.6G   0% /run/shm
none                            105M     0  105M   0% /run/user
/dev/mapper/group1.vg-lv1.data  2.1G  1.6M  2.0G   1% /root/data

■ボリュームを取り外したい!
異音等がしてボリュームを取り外さなくてはいけないシチュエーションが起きた場合。
そんな場合でも LVM は問題なくぼびゅーむをアンマウントする手段があります。

ここでは group1.vg 内の /dev/sdc が壊れてしまったことと仮定します。
まず、PV 内の状態を確認します

root@ubuntu:~# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sdb
  VG Name               group1.vg
  PV Size               2.00 GiB / not usable 4.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              511
  Free PE               0
  Allocated PE          511
  PV UUID               upglFx-3K5V-AIT5-6Emn-Mo2Z-QlBN-niXOHj

  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               group1.vg
  PV Size               2.00 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              511
  Free PE               510
  Allocated PE          1
  PV UUID               fffWoP-KQFL-dNqo-23ON-JEoO-Rlml-QDzvav

PE (Physical Extent) が実際にVGに提供している容量を表しているそうです。
/dev/sdc は 4.00MiB も VGに提供しているようです。
これを現在動いている他の PV に移動します。


※書き途中。。。