LPIC201/202 あずき本 ch5 高度なストレージ管理 (2/3)

LPIC201勉強メモ資格勉強

出典: 

5.2 LVM

参考: Archwiki https://wiki.archlinux.jp/index.php/LVM

LVM: Logical Volume Management(論理ボリューム管理)

論理ボリューム: 仮想的なパーティション

パーティションの下記の制約を回避する

  • パーティションのサイズ変更ができない
  • 別のディスクにパーティションを移動させることができない
  • ディスクのサイズを超える大きさのパーティションは作成できない

5.2.1 LVMの仕組み

  • PV: Physical Volume (物理ボリューム)

    • 1台のハードディスクや1つのパーティション
  • PE: Physical Extent (物理エクステント)

    • 物理ボリュームを構成する一定サイズ
  • VG: Volume Group (ボリュームグループ)

    • 1つ以上の物理ボリュームを束ねたもの
    • 仮想的なディスクといえる
  • LV: Logical Volume (論理ボリューム)

    • ボリュームグループ内で物理エクステントから論理ボリュームが構成される
    • 仮想的なパーティションといえる

5.2.2 LVMの作成

dd if=/dev/zero of=~/fs/loop0 bs=1M count=2048
sudo losetup /dev/loop0 ~/fs/loop0

LVM用のパーティションの準備

パーティションのタイプをLinux LVMにしておく必要がある

sudo gdisk /dev/loop0
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): h
b	back up GPT data to a file
c	change a partition's name
d	delete a partition
i	show detailed information on a partition
l	list known partition types
n	add a new partition
o	create a new empty GUID partition table (GPT)
p	print the partition table
q	quit without saving changes
r	recovery and transformation options (experts only)
s	sort partitions
t	change a partition's type code
v	verify disk
w	write table to disk and exit
x	extra functionality (experts only)
?	print this menu

Command (? for help): l
0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE          
3000 ONIE boot             3001 ONIE config           4100 PowerPC PReP boot   
4200 Windows LDM data      4201 Windows LDM metadata  7501 IBM GPFS            
7f00 ChromeOS kernel       7f01 ChromeOS root         7f02 ChromeOS reserved   
8200 Linux swap            8300 Linux filesystem      8301 Linux reserved      
8302 Linux /home           8400 Intel Rapid Start     8e00 Linux LVM           
a500 FreeBSD disklabel     a501 FreeBSD boot          a502 FreeBSD swap        
a503 FreeBSD UFS           a504 FreeBSD ZFS           a505 FreeBSD Vinum/RAID  
a580 Midnight BSD data     a581 Midnight BSD boot     a582 Midnight BSD swap   
a583 Midnight BSD UFS      a584 Midnight BSD ZFS      a585 Midnight BSD Vinum  
a800 Apple UFS             a901 NetBSD swap           a902 NetBSD FFS          
a903 NetBSD LFS            a904 NetBSD concatenated   a905 NetBSD encrypted    
a906 NetBSD RAID           ab00 Apple boot            af00 Apple HFS/HFS+      
af01 Apple RAID            af02 Apple RAID offline    af03 Apple label         
af04 AppleTV recovery      af05 Apple Core Storage    be00 Solaris boot        
bf00 Solaris root          bf01 Solaris /usr & Mac Z  bf02 Solaris swap        
bf03 Solaris backup        bf04 Solaris /var          bf05 Solaris /home       
bf06 Solaris alternate se  bf07 Solaris Reserved 1    bf08 Solaris Reserved 2  
bf09 Solaris Reserved 3    bf0a Solaris Reserved 4    bf0b Solaris Reserved 5  
c001 HP-UX data            c002 HP-UX service         ea00 Freedesktop $BOOT   
eb00 Haiku BFS             ed00 Sony system partitio  ed01 Lenovo system partit
ef00 EFI System            ef01 MBR partition scheme  ef02 BIOS boot partition 
fb00 VMWare VMFS           fb01 VMWare reserved       fc00 VMWare kcore crash p
fd00 Linux RAID            

Command (? for help): 

これ

8e00 Linux LVM           
sudo parted /dev/loop0
GNU Parted 3.1
Using /dev/loop0
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) 
(parted) mklabel gpt
(parted) 
(parted) mkpart "Linux LVM" 0% 50%
(parted) mkpart "Linux LVM" 50% 100%
(parted) 
(parted) p
Model: Loopback device (loopback)
Disk /dev/loop0: 2147MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name       Flags
 1      1049kB  1074MB  1073MB               Linux LVM
 2      1074MB  2146MB  1073MB               Linux LVM

(parted) q
Information: You may need to update /etc/fstab.
lsblk
NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda         8:0    0   20G  0 disk 
|-sda1      8:1    0  200M  0 part /boot/efi
`-sda2      8:2    0 19.8G  0 part /
loop0       7:0    0    2G  0 loop 
|-loop0p1 259:0    0 1023M  0 loop 
`-loop0p2 259:1    0 1023M  0 loop 

物理ボリュームの初期化

sudo pvcreate /dev/loop0p1 /dev/loop0p2
sudo: pvcreate: command not found

無いので入れる

yum provides pvcreate
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
7:lvm2-2.02.187-6.el7.x86_64 : Userland logical volume management tools
Repo        : base
Matched from:
Filename    : /usr/sbin/pvcreate
sudo yum install -y lvm2

sudo pvcreate /dev/loop0p1 /dev/loop0p2
  Physical volume "/dev/loop0p1" successfully created.
  Physical volume "/dev/loop0p2" successfully created.

ボリュームグループの作成

sudo vgcreate sample_vg /dev/loop0p1 /dev/loop0p2
  Volume group "sample_vg" successfully created

論理ボリュームの作成

sudo lvcreate -L 500M -n lv01 sample_vg
  Logical volume "lv01" created.

論理ボリュームの状態確認

sudo lvscan 
  ACTIVE            '/dev/sample_vg/lv01' [500.00 MiB] inherit

ファイルシステムの作成とマウント

sudo mkfs.ext4 /dev/sample_vg/lv01

sudo mkdir /mnt/lv01
sudo mount /dev/sample_vg/lv01 /mnt/lv01

grep -e lv /proc/mounts
/dev/mapper/sample_vg-lv01 /mnt/lv01 ext4 rw,seclabel,relatime,data=ordered 0 0

device mapper

ls -l /dev/mapper/sample_vg-lv01
lrwxrwxrwx. 1 root root 7 Dec 16 14:25 /dev/mapper/sample_vg-lv01 -> ../dm-0
  • /dev/${VG名}/${LV名}/dev/mapper/${VG名}-${LV名}にマッピングされる
  • /dev/mapper/sample_vg-lv01/dev/dm-0へのsymlink

5.2.3 LVMの管理

物理ボリュームの情報表示

pvdisplay: 詳細

sudo pvdisplay /dev/loop0p1
  --- Physical volume ---
  PV Name               /dev/loop0p1
  VG Name               sample_vg
  PV Size               1023.00 MiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              255
  Free PE               130
  Allocated PE          125
  PV UUID               Wp1PwK-KKQS-Haim-qkmQ-1bS4-mdlW-cL3s7a
  • どのVGを構成しているか
  • Physical Extentのサイズ
  • etc.

pvscan: 簡潔な一覧

sudo pvscan 
  PV /dev/loop0p1   VG sample_vg       lvm2 [1020.00 MiB / 520.00 MiB free]
  PV /dev/loop0p2   VG sample_vg       lvm2 [1020.00 MiB / 1020.00 MiB free]
  Total: 2 [1.99 GiB] / in use: 2 [1.99 GiB] / in no VG: 0 [0   ]

ボリュームグループの拡張

dd if=/dev/zero of=~/fs/loop1 bs=1M count=512
sudo losetup /dev/loop1 ~/fs/loop1

sudo vgextend sample_vg /dev/loop1
  Volume group "sample_vg" successfully extended

物理ボリュームの移動

sudo pvmove /dev/loop0p1 /dev/loop1
  /dev/loop0p1: Moved: 4.00%
  /dev/loop0p1: Moved: 100.00%

ボリュームグループの縮小

sudo vgreduce sample_vg /dev/loop0p1
  Removed "/dev/loop0p1" from volume group "sample_vg"
sudo pvscan
  PV /dev/loop0p2   VG sample_vg       lvm2 [1020.00 MiB / 1020.00 MiB free]
  PV /dev/loop1     VG sample_vg       lvm2 [508.00 MiB / 8.00 MiB free]
  PV /dev/loop0p1                      lvm2 [1023.00 MiB]
  Total: 3 [2.49 GiB] / in use: 2 [1.49 GiB] / in no VG: 1 [1023.00 MiB]

ボリュームグループの情報表示

sudo vgdisplay
  --- Volume group ---
  VG Name               sample_vg
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  7
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.49 GiB
  PE Size               4.00 MiB
  Total PE              382
  Alloc PE / Size       125 / 500.00 MiB
  Free  PE / Size       257 / 1.00 GiB
  VG UUID               ofkWLQ-lHLm-4jxz-BQuk-LK1A-eESK-Z8NoUQ

論理ボリュームの情報表示

sudo lvdisplay 
  --- Logical volume ---
  LV Path                /dev/sample_vg/lv01
  LV Name                lv01
  VG Name                sample_vg
  LV UUID                O7UHNc-mDvg-bCvf-SBN8-UU2l-mypp-mJU2bL
  LV Write Access        read/write
  LV Creation host, time lpic2-study-1, 2020-12-16 14:44:42 +0000
  LV Status              available
  # open                 0
  LV Size                500.00 MiB
  Current LE             125
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

論理ボリュームの拡張

sudo lvextend -L +300M /dev/sample_vg/lv01
  Size of logical volume sample_vg/lv01 changed from 500.00 MiB (125 extents) to 800.00 MiB (200 extents).
  Logical volume sample_vg/lv01 successfully resized.

論理ボリュームは広がるがファイルシステムまで追従してくれるわけではない

ファイルシステムの整合性をチェックした後、resize2fsでリサイズする必要がある

sudo e2fsck -f /dev/sample_vg/lv01
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sample_vg/lv01: 11/128016 files (0.0% non-contiguous), 26684/512000 blocks
sudo resize2fs /dev/sample_vg/lv01
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/sample_vg/lv01 to 819200 (1k) blocks.
The filesystem on /dev/sample_vg/lv01 is now 819200 blocks long.

論理ボリュームの縮小

sudo lvreduce -L -300M /dev/sample_vg/lv01
  WARNING: Reducing active logical volume to 500.00 MiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce sample_vg/lv01? [y/n]: y
  Size of logical volume sample_vg/lv01 changed from 800.00 MiB (200 extents) to 500.00 MiB (125 extents).
  Logical volume sample_vg/lv01 successfully resized.

データはぶっ壊れる

論理ボリュームの拡張 — XFSの場合

sudo mkfs.xfs -f /dev/sample_vg/lv01
meta-data=/dev/sample_vg/lv01    isize=512    agcount=4, agsize=32000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=128000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
sudo lvextend -L +300M /dev/sample_vg/lv01
  Size of logical volume sample_vg/lv01 changed from 500.00 MiB (125 extents) to 800.00 MiB (200 extents).
  Logical volume sample_vg/lv01 successfully resized.
sudo xfs_repair /dev/sample_vg/lv01
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

XFSのサイズ拡張の場合、マウントしている必要があるよう

sudo xfs_growfs /dev/sample_vg/lv01
xfs_growfs: /dev/sample_vg/lv01 is not a mounted XFS filesystem
sudo mount /dev/sample_vg/lv01 /mnt/lv01
sudo xfs_growfs /dev/sample_vg/lv01
meta-data=/dev/mapper/sample_vg-lv01 isize=512    agcount=4, agsize=32000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=128000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 128000 to 204800data blocks changed from 128000 to 204800

スナップショットの作成

アンマウントせずにバックアップを取る技術

論理ボリュームの10%~20%くらい目安

sudo lvcreate -s -L 100M -n snap0 /dev/sample_vg/lv01
  Logical volume "snap0" created.
ls -l /dev/sample_vg/
total 0
lrwxrwxrwx. 1 root root 7 Dec 16 15:17 lv01 -> ../dm-0
lrwxrwxrwx. 1 root root 7 Dec 16 15:17 snap0 -> ../dm-3

スナップショット領域は丸コピーではない

ある時点での論理ボリュームの状態を起点として、変更時に変更前のものをcopy on writeする感じ

スナップショットをさらにdumpしてバックアップ完了

dump 0uf /dev/loop2 /dev/sample_vg/snap0

論理ボリュームの削除

sudo lvremove /dev/sample_vg/snap0
Do you really want to remove active logical volume sample_vg/snap0? [y/n]: y
  Logical volume "snap0" successfully removed
sudo umount /mnt/lv01
sudo lvremove /dev/sample_vg/lv01
Do you really want to remove active logical volume sample_vg/lv01? [y/n]: y
  Logical volume "lv01" successfully removed

ボリュームグループの削除

sudo vgremove sample_vg
  Volume group "sample_vg" successfully removed

物理ボリュームの削除

sudo pvremove /dev/loop0p1
  Labels on physical volume "/dev/loop0p1" successfully wiped.
sudo pvremove /dev/loop0p2
  Labels on physical volume "/dev/loop0p2" successfully wiped.
sudo pvremove /dev/loop2
  No PV found on device /dev/loop2.