Linux LVM2

2023-10 add pysical volume to vg
2018-09-19 when umount, device busy!
2018-06-23 mount 명령
{: history-right}

LVM2 를 사용해 물리 disk를 논리 disk로 분할/합병/관리 하는 과정을 조금 정리한 것이다.

LVM2

SBC보드인 Odorid C2에 USB Memory를 사용해서 리눅스의 LVM을 이용하고 있다. 여기서는 LVM 설정에 대해서만 다루고 있다.

Single board computer 종류의 보드는 주 디스크로 SD Card, eMMC 를 사용하고, USB 메모리 등은 디바이스 장치로 /dev/sd* 이름으로 접근할 수 있다.


디스크 파티션

시스템에 사용할 디스크 파티션을 생성한다. 그리고 사용할 디스크 파티션 종류 LVM으로 해야 한다. parted 혹은 fdisk 를 사용해서 디스크 볼륨을 생성하고 사용한다.

parted

대상 디스크 목록을 통해 디스크의 크기 정보를 확인한다.

1
sudo parted -l

parted로 lvm 볼륨 잡기

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo parted /dev/sdb
(parted) mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? y

(parted) unit GB
(parted) mkpart primary 0 32.0GB #디스크 크기 입력
(parted) set 1 lvm on

(parted) print
Number Start End Size File system Name Flags
1 0.00GB 32.0GB 32.0GB primary lvm

fdisk 사용

대상 디스크 목록을 통해 디스크의 크기 정보를 확인한다.

1
sudo fdisk -l

fdisk로 파티션을 시작한다.

1
2
3
4
5
6
7
8
9
# fdisk /dev/sda
Command (m for help): p
Command (m for help): g
Command (m for help): n
Last sector, +sectors or +size{K,M,G,T,P} (2048-125042654, default 125042654): +4G
Command (m for help): t
Hex code (type L to list all codes): 30
Changed type of partition 'Linux filesystem' to 'Linux LVM'.
Command (m for help): w

이제 새로운 파티션 ‘/dev/sda1’ 이 생성됐다.


LVM 생성하기

  1. LVM 종류로 파티션한 볼륨으로 Pysical volume 을 생성한다.
  2. Pysical volume을 Volume Group으로 등록한다.
  3. 실제 사용할 크기 만큼 Logical Volume으로 나눠 생성한다.
  4. 파일 시스템을 생성하고 마운트 한다.

시스템에 lvm2 를 설치한다.

1
$ sudo apt install lvm2

Pysical Volume 만들기

파티션을 Pysical volume으로 만든다.

1
2
3
4
5
$ sudo -s
# pvcreate /dev/sda1
/run/lvm/lvmetad.socket: connect failed: No such file or directory
WARNING: Failed to connect to lvmetad. Falling back to internal scanning.
Physical volume "/dev/sda1" successfully created

이제 물리볼륨을 로지컬 볼륨 그룹으로 나누고

1
2
3
4
# vgcreate vg_usb /dev/sdb1
Volume group "vg_usb" successfully created

# vgdisplay

볼륨그룹 지우기

1
2
# vgremove vg_usb
Volume group "vg_usb" successfully removed

Logical Volume 만들기

로지컬 볼륨을 만든다. 용량은 -L 과 -l 옵션을 사용

  • -L [GB/KB/B..] 단위 용량
  • -l PE PE 용량 단위 - vgdisplay 에 표시되는 PE 개수

여기서 두개의 로지컬 볼륨을 만든다고 가정한다.

1
2
3
4
# lvcreate -L +20G -n dbvol vg_usb
Logical volume "dbvol" created.
# lvcreate -L +9GB -n workvol vg_usb
Logical volume "workvol" created.

생성한 로지컬보륨은 lvdisplay로 자세한 정보를 확인할 수 있다.

로지컬 볼륨을 지우려면 lvremove로 볼륨그룹 밑에 있는 로지컬보륨을 삭제한다.

1
# lvremove /dev/vg_usb/dbvol

이제 로지컬볼륨이 준비됐고, 실제 파일 시스템을 생성한다.

파일시스템 생성

mkfs 명령으로 파일 시스템을 생성한다.

1
2
# mkfs.ext4 /dev/vg_usb/dbvol
# mkfs.ext4 /dev/vg_usb/workvol

부팅시 항상 마운트하기 위해서 fstab에 등록해야 하는데, fstab에 아운트 지점을 지정하는 방법은 디바이스 드라이브의 경로 혹은 UUID를 명시하는 것이다. LVM도 다르지 않는데 먼저 fstab에 등록해서 마운트 하기 위해서 lvdisplay 명령으로 LV path 를 확인한다.

1
2
3
4
5
6
# lvdisplay
--- Logical volume ---
LV Path /dev/vg_usb/dbvol

--- Logical volume ---
LV Path /dev/vg_usb/workvol

/etc/fstab에 LV Path 경로를 추가 한다.

1
2
/dev/vg_usb/dbvol /data ext4 defaults 0 1
/dev/vg_usb/workvol /home/pi/work ext4 defaults 0 1

UUID를 사용하려면 위에 찾은 LV Path에 해당하는 UUID를 찾아야 한다.^1 먼저 LV path 경로를 보면

1
2
$ ll /dev/vg_usb/dbvol
lrwxrwxrwx 1 root root 7 May 2 18:18 /dev/vg_usb/dbvol -> ../dm-0

같이 링크로 나온다. 이 링크 파일의 UUID를 찾으면 된다.

1
2
$ ls -l /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 10 May 2 18:18 a7bb8085-0e50-845a-b65b-a6b7e8c86dc9 -> ../../dm-0

찾은 UUID를 fstab에 마운트 지점과 함께 기록한다.

1
2
# <file system> <dir> <type> <options> <dump> <pass>
UUID=a7bb8085-0e50-845a-b65b-a6b7e8c86dc9 /data ext4 defaults 0 0


LVM 관리

  1. VG에 물리 disk 추가
  2. VG의 LV 크기 변경

VG에 물리 disk 추가

기존 VG 에 PV 를 추가하면 디스크 용량이 확장된다. 다음은 현재 VG 상태이다. VG size가 118GB 이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# vgdisplay
--- Volume group ---
VG Name vg_usb
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size <118.24 GiB
PE Size 4.00 MiB
Total PE 30269
Alloc PE / Size 30239 / 118.12 GiB
Free PE / Size 30 / 120.00 MiB

어떤 물리 디스크 크기가 100GB인 dbf1 을 이 vg에 추가했다. 아래는 VG인 vg_usb 에 새 PV 파티션을 추가하고 있다.

1
# vgextend vg_usb /dev/sdf1

결과를 보면 VG Size가 100GB가 늘어난 304GB로 표시된 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
--- Volume group ---
VG Name vg_usb
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 304.69 GiB
PE Size 4.00 MiB
Total PE 78001
Alloc PE / Size 30239 / 118.12 GiB
Free PE / Size 47762 / 186.57 GiB
VG UUID Q8G6qN-Pgun-KdSw-EO9D-9m9X-sr66-Z3LAPB

이 VG의 크기 변경은 다음 같인 lvextend 로 변경하면 된다.


VG의 LV 크기 변경

VG의 크기 내에서 LV 의 크기를 변경할 수 있다. 이때 lvextend 명령을 사용한다.

먼저 LV 의 정보를 확인해서 경로를 파악한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# lvdisplay
--- Logical volume ---
LV Path /dev/vg_usb/dbvol
LV Name dbvol
VG Name vg_usb
LV UUID qkm1TB-99Rm-ssrN-4xux-iDfm-2n6m-ikL0VS
```

다음은 +100MB 를 VG 인 vg_usb 아래의 LV인 dbvol 에 추가하는 명령이다.

```sh
# lvextend -L +10G /dev/vg_usb/dbbol

# or
# lvextend -L10M /dev/vg_usb/dbbol
Size of logical volume ubuntu-vg/ubuntu-lv changed from 118.12 GiB (30239 extents) to 128.00 GiB
Logical volume ubuntu-vg/ubuntu-lv successfully resized.

다음은 VG인 vg_usb의 LV인 dbvol에서 -100MB를 감소시키는 명령이다.

1
# lvextend -L -10M /dev/vg_usb/dbbol

변경된 disk 크기 확인

df 명령은 물리 디스크에 대해서 표시를 한다. 그래서 LV 로 변경된 크기는 정확히 나타나지 않는다. 그래서 보통 lvm 사용시 fdisk 명령으로 확인하면 된다.

다음은 pv 명령으로 생성된 시스템 디바이스 dm-0 가 lvm 의 물리 디스크인다. 이 디스크의 정보를 fdisk 등으로 보면 VG 혹은 LV의 정확히 할당된 크기를 확인할 수 있다.

1
2
3
4
5
# fdisk -l /dev/dm-0
Disk /dev/dm-0: 304.69 GiB, 327159906304 bytes, 638984192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes



기존 LVM 을 새 시스템에 장착하기

LVM으로 사용하는 디스크를 다른 시스템에서 사용하려면 다음 단계를 거쳐서 새 Volume group 을 시스템에 등록해야 한다.

  1. volume group 비활성화
  2. volume group 추출
  3. 새 시스템에서 volume group 가져오기
  4. 새 시스템에서 volume group 활성화
  5. 새 시스템에서 마운트

1. vgscan으로 확인

1
2
3
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg_usb" using metadata type lvm2

2. vg 추출

1
2
# vgexport vg_usb
Volume group "vg_usb" successfully exported

이제 새 시스템에서 추출한 volume group을 활성화 한다.

3. PV 파티션 확인

pvscan으로 파티션을 확인한다. 비활성화하고 추출한 파티션을 확인할 수 있다.

1
2
3
# pvscan
PV /dev/sda2 is in exported VG vg_usb [55.62 GiB / 25.62 GiB free]
Total: 1 [55.62 GiB] / in use: 1 [55.62 GiB] / in no VG: 0 [0 ]

vbimport 로 volume group을 가져온다.

1
2
# vgimport vg_usb
Volume group "vg_usb" successfully imported

4. VG 활성화

1
2
# vgchange -ay vg_usb
1 logical volume(s) in volume group "vg_usb" now active

마운트 하기 위해서 볼륨그룹은 장치는 dev 밑에 보륨그룹 이름 /dev/vg_usb 같이 생성되므로 ls 명령으로 확인 가능

1
2
# ls /dev/vg_usb/
mongovol workvol

혹은 lvdisplay 명령으로 LV path 를 확인한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# lvdisplay
--- Logical volume ---
LV Path /dev/vg_usb/dbvol
LV Name dbvol
VG Name vg_usb
LV UUID hTnMaP-6rgM-ePOi-HXs4-X0Ia-h4mP-gpT1JM
LV Write Access read/write
LV Creation host, time odroid64, 2016-12-02 15:05:45 +0900
LV Status available
# open 0
LV Size 30.00 GiB
Current LE 7680
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0

mount 명령으로 LV path를 마운트 한다.

1
2
3
4
5
6
7
8
9
# mount /dev/vg_usb/dbvol mongodata/
...

재시동 후 마운트를 유지하기 위해 마운트한 경로를 /etc/fstab에 추가한다.
다음은 fstab에 옵션을 사용해서 마운트하는 예이다.

```conf
# fstab
/dev/mapper/vg_usb-dbvol on /data type ext4 (rw,relatime,data=ordered)

LVM error

기존 LVM 디스크를 사용하던 OS에 타 시스템에서 생성한 LVM을 옮겨와 사용하려면 다음 같이 lvmetad 에러가 난다.

1
> /run/lvm/lvmetad.socket: connect failed: No such file or directory

lvm2 서비스를 활성화하고 시작해 주면 된다.

1
2
3
4
sudo systemctl enable lvm2-lvmetad.service
sudo systemctl enable lvm2-lvmetad.socket
sudo systemctl start lvm2-lvmetad.service
sudo systemctl start lvm2-lvmetad.socket

Unmount - It’s busy

LVM 볼륨을 사용중 마운트를 해제하려고 할 때 다음 같은 경고가 난다.

1
2
3
4
sudo umount /data
umount: /data: target is busy
(In some cases useful info about processes that
use the device is found by lsof(8) or fuser(1).)

fuser 명령 lsof 명령으로 해당 디렉토리를 사용중인 파일, 프로세스를 확인할 수 있다.

1
2
3
4
$ sudo fuser -vm /data
USER PID ACCESS COMMAND
/data: root kernel swap /data/.swap4G
root kernel mount /data

lsof로 어떤 프로세스가 디렉토리를 사용하는지 출력해 볼 수 있다.

1
2
3
$ sudo lsof +D /data
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 23617 qkboo cwd DIR 179,1 4096 129793 .

xfs 파일시스템

주의: USB 메모리를 사용한 디스크에서 mongodb에 사용하기 위해서 시작했는데, 최신 mongodb의 storage engine인 WiredTiger는 xfs를 요구한다. 다만 Odroid C2 의 Ubuntu, Ambian 에서 xfsprogs 설치후 xfs 파일 시스템 생성시 문제가 있다.

1
# apt install xfsprogs

디스크 볼륨을 xfs file system 생성한다.

1
# mkfs.xfs /dev/usb64_vg/db_xfs


— 참조

Author

Gangtai Goh

Posted on

2017-04-03

Updated on

2023-10-14

Licensed under

댓글