🦔

LVMによるLinuxディスク管理

に公開

目的

VirtualBox上のLinux仮想環境においてLVM(Logical Volume Manager)を用いた柔軟なディスク管理方法の解説である。

  • LVM...物理ストレージを抽象化し、柔軟なディスク運用を可能にするLinuxの機能
  • 仮想環境を使って安全に試すことができる

VirtualBox

  • VirtualBox...オラクルが提供する無料の仮想化ソフトウェア
  • 仮想マシン(VM)を作成し、他のOSをインストール・利用できる

機能

  • スナップショット
    仮想マシンの状態を保存し、あとでその状態に戻せる
  • シームレスモード
    ゲストOSをホストOS上のアプリのように扱える
  • 共有フォルダ/クリップボード共有
    ホストとの連携がスムーズにできる

VirtualBoxの使い方(仮想マシン作成)

仮想マシンの作成

  1. Oracle VM VirtualBoxマネージャーを起動
  2. 「新規」ボタンを押す
  3. 設定を入力:
    • 名前: debian-lvm など
    • タイプ: Linux
    • バージョン: Debian (64-bit)
    • メモリサイズ: 1024MB以上
  4. 仮想ハードディスクの作成
    • タイプ: VDI(可変サイズ or 固定サイズ)
    • 容量: 10GB以上推奨

LVM構成

概要:LVMの3層構造

+------------------+      +-----------------------+      +--------------------+
| /dev/sdX1, sdY1… | ===> |  ボリュームグループ VG   | ===> |  論理ボリューム LV   |
+------------------+      +-----------------------+      +--------------------+
     PV (物理ボリューム)         VG (グループ化)                 LV (用途に応じて分割)

コマンド群

パーティション作成(fdisk)

  • fdiskコマンドで実行されるシェル内で下記を行う
# デバイスの確認
sudo fdisk -l
# /dev/sdb にパーティションを作成
sudo fdisk /dev/sdb
# fdisk 内での操作手順(LVM用):
Command (m for help): n
Command (m for help): t
Hex code: 8e
Command (m for help): w

確認:

sudo fdisk -l /dev/sdb

物理ボリュームの作成

# 書式:pvcreate <パーティション...>
sudo pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

sudo pvdisplay

ボリュームグループの作成と管理

# 作成 書式:vgcreate <VG名> <PVパス...>
sudo vgcreate lvg-share /dev/sd{b,c,d,e}1
sudo vgdisplay
# スキャン 書式:vgscan(すべてのVGをスキャン)
sudo vgscan

# 名前変更 書式:vgrename <旧VG名> <新VG名>
sudo vgrename lvg-share lvg-data

# VG削除 書式:vgremove <VG名>
sudo vgremove lvg-data

論理ボリュームの作成と管理

# 論理ボリューム作成 書式:lvcreate --name <LV名> --size <サイズ> <VG名>
sudo lvcreate --name public --size 18G lvg-data
sudo lvdisplay

# 名前変更 書式:lvrename <VG名> <旧LV名> <新LV名>
sudo lvrename lvg-data public shared

# LV削除 
sudo lvremove /dev/lvg-data/shared

フォーマットとマウント

# 書式: mkfs.<fstype> <デバイスパス>
sudo mkfs.ext4 /dev/lvg-data/shared
sudo mkdir /mnt/shared
# 書式: mount <デバイスパス> <マウントポイント>
sudo mount /dev/lvg-data/shared /mnt/shared
df -h

永続化設定(/etc/fstab)

# 書式: blkid <デバイスパス>
sudo blkid /dev/lvg-data/shared
# 出力例: /dev/lvg-data/shared: UUID="a1b2c3d4-e5f6-7890-1234-56789abcdef0" TYPE="ext4"

/etc/fstab に追記:

UUID=a1b2c3d4-e5f6-7890-1234-56789abcdef0 /mnt/shared ext4 defaults 0 2

よく使う表示系コマンド

pvs
vgs
lvs

# 書式: lvdisplay <LVパス>、vgdisplay <VG名>、pvdisplay <PVパス>
pvdisplay /dev/sdb1
vgdisplay lvg-data
lvdisplay /dev/lvg-data/shared

付録:スナップショット・縮小・トラブル対処

スナップショット

# 作成 書式:lvcreate --size <サイズ> --snapshot --name <スナップショット名> <対象LVパス>
sudo lvcreate --size 1G --snapshot --name shared_snap /dev/lvg-data/shared

# 復元 書式:lvconvert --merge <スナップショットLVパス>
sudo lvconvert --merge /dev/lvg-data/shared_snap

# 削除 書式:lvremove <LVパス>
sudo lvremove /dev/lvg-data/shared_snap

論理ボリュームの拡張・縮小

# 拡張
##   書式:lvextend -L +<追加サイズ> <LVパス>
sudo lvextend -L +5G /dev/lvg-data/shared
##   書式:resize2fs <LVパス> または resize2fs <LVパス> <新サイズ>
sudo resize2fs /dev/lvg-data/shared
sudo resize2fs /dev/lvg-data/shared 10G

# 縮小
sudo umount /dev/lvg-data/shared
##   書式: resize2fs <LVパス> または resize2fs <LVパス> <新サイズ>
sudo e2fsck -f /dev/lvg-data/shared
sudo resize2fs /dev/lvg-data/shared 10G
##   書式:lvreduce -L <新サイズ> <LVパス>
sudo lvreduce -L 10G /dev/lvg-data/shared

マウント失敗時の対応

# VGをアクティブ化 書式: vgchange -ay
sudo vgchange -ay

必要に応じて:

echo "lvm2" | sudo tee /etc/initramfs-tools/modules
# initramfsを更新 書式: update-initramfs -u
sudo update-initramfs -u

自動化:LVM初期化スクリプト例

#!/bin/bash

for disk in sdb sdc sdd sde; do
  echo "Creating partition on /dev/$disk"
  echo -e "n
p
1


t
8e
w" | sudo fdisk /dev/$disk
  sudo partprobe /dev/$disk
  sudo pvcreate /dev/${disk}1
done

sudo vgcreate lvg-batch /dev/sd{b,c,d,e}1
sudo lvcreate -L 20G -n lvdata lvg-batch
sudo mkfs.ext4 /dev/lvg-batch/lvdata
sudo mkdir -p /mnt/lvdata
sudo mount /dev/lvg-batch/lvdata /mnt/lvdata

Discussion