Linux LVM2

LVM2

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

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

디스크 파티션

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

parted

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

sudo parted -l

parted로 lvm 볼륨 잡기

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 사용

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

sudo fdisk -l

fdisk로 파티션을 시작한다.

# 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 를 설치한다.

$ sudo apt install lvm2

Pysical Volume 만들기

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

$ 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

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

# vgcreate vg_usb /dev/sdb1
 Volume group "vg_usb" successfully created

# vgdisplay

볼륨그룹 지우기

# vgremove vg_usb
  Volume group "vg_usb" successfully removed

Logical Volume 만들기

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

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

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

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

# lvremove /dev/vg_usb/dbvol

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

파일시스템 생성

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

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

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

# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg_usb/dbvol

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

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

/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 경로를 보면

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

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

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

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

UUID=a7bb8085-0e50-845a-b65b-a6b7e8c86dc9 /data ext4 defaults 0 0

LVM 사이즈 키우기

# lvextend -L +10M /dev/um_vg/xfs_lv -r

LVM 을 새 시스템에 장착하기

LVM으로 생성한 볼륨그룹을 다른 시스템에서 사용하려면 Volume group을 이용한다.

  1. volume group 비활성화
  2. volume group 추출
  3. 새 시스템에서 volume group 가져오기
  4. 새 시스템에서 volume group 활성화
  5. 새 시스템에서 마운트
1. vgscan으로 확인
# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg_usb" using metadata type lvm2
2. vg 추출
# vgexport vg_usb
  Volume group "vg_usb" successfully exported

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

3. 파티션 확인

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

# 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을 가져온다.

# vgimport vg_usb
  Volume group "vg_usb" successfully imported
4. 활성화
# vgchange -ay vg_usb
  1 logical volume(s) in volume group "vg_usb" now active

마운트 하기 위해서 lvdisplay 명령으로 LV path 를 확인한다.

# 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를 마운트 한다.

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

마운트한 경로를 /etc/fstab에 추가한다.

LVM error

기존 LVM 디스크를 사용하던 OS에 새 OS를 설치하고 기존 LVM을 사용하려는데 다음 같이 lvmetad 에러가 난다.

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

If you are using lvm and systemd do:

systemctl enable lvm2-lvmetad.service
systemctl enable lvm2-lvmetad.socket
systemctl start lvm2-lvmetad.service
systemctl start lvm2-lvmetad.socket

xfs 파일시스템을 생성하기 위해

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

# apt install xfsprogs

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

# mkfs.xfs /dev/usb64_vg/db_xfs

참조