본문 바로가기
정보보안/이론

[KITRI] Day11. LVM 구성과 Disk quota

by 민-Zero 2020. 5. 8.

LVM 구성하기

LVM(Logical volume manager) 란?

” Logical Volume을 효율적이고 유연하게 관리하기 위한 커널의 한 부분이자 프로그램” 이라고 할 수 있다.

기존방식이 파일시스템을 블록 장치에 직접 접근해서 읽고 쓰기를 했다면, LVM은 파일시스템이 만든 가상의 블록 장치에 읽고 쓰기를 하게 된다.

LVM은 물리적 디스크에 논리적인 레이어를 생성해서 논리적 저장공간(가상의 블록 장치)을 생성할 수 있게 한다. 직접 물리 디스크를 사용하는 것보다 다양한 측면에서 유연성을 제공하는데, 유연한 용량 조절, 크기 조정이 가능한 스토리지 풀(Pool), 편의에 따른 장치 이름 지정, 디스크 스트라이핑, 미러 볼륨 등을 제공한다.

RAID의 다. 서로다른 제조회사, 용량 등 다른 장치를 사용해서도 구성할 수 있다는 점이 장점으로 존재한다.
예를 들어 3개의 하드 디스크가 있다면 3개의 하드를 논리적으로 1개로 묶은 다음 필요한 만큼 2개로 나누어 사용하는등 유연하게 사용할 수 있다.


LVM에서 사용하는 용어

PV(Physical Volume) : 논리적으로 합치기 전의 HDD로 LVM을 사용하기 위해서는 PV로 초기화를 수행해야 한다. 디스크 전체 또는 파티션을 LVM에서 사용할 수 있도록 초기화 하는것이다.
VG(Volume Group) : 여러개의 HDD를 논리적으로 1개의 논리 그룹으로 만든것으로 LV를 할당할 수 있는 전용 디스크 공간을 생성한 것 이라고 생각하면 된다.
LV(Logical Volume) : VG를 사용자가 원하는 만큼 1개 이상으로 나눈것으로 최종적으로 사용하게 되는 논리적인 저장공간이다.

PE(Physical Extent) : PV를 구성하는 일정한 크기의 블록으로 LVM2에서의 기본크기는 4MB이다. LVM은 LVM1과 LVM2이 있는데 간단히 LVM2가 기능이 개선된 버전이라고 생각하면 된다.

LE(Logical Extent) : LV를 구성하는 일정한 크기의 블록으로 기본크기는 PE와 마찬가지로 4MB이며 LV들이 구성될때 각각의 LV들은 동일한 크기의 LE로 구성이되며 PE들과 1:1로 맵핑된다.

Linux에서 LVM 구성하기

1. fdisk 이용해 파티션 생성(Linux LVM)

Raid를 구성할때와 마찬가지로 파티션의 타입을 변경해 LVM으로 구성한다는 정보를 알려야한다.

8e라는 Hex코드가 LVM에 대한 타입이 정해져 있다. RAID와 동일한 과정을 수행하며 타입만 Linux LVM으로 설정하면 된다.


2. pvcreate 이용해 PV(Physical Volume) 생성
fdisk로 디스크에 LVM으로 구성할것 이라는 정보를 생성했으므로 LV를 구성하기 위해 PV로 초기화를 수행하야 한다.

이때 사용되는 명령어는 주로 4가지(pvcreate, pvremove, pvscan, pvdisplay)이다.

pvcreate 디스크명1 디스크명2 ... :PV 생성 명령어, 해당 HDD앞부분에 PV라고 알리는 메타데이터 생성
pvremove 디스크명1 디스크명2 .. : PV 관련 메타데이터를 삭제해 PV를 삭제하는 효과
pvdisplay PV명 : 해당 PV 상세정보 출력, PV명 작성 안하면 모든 PV에 대한 상세정보 출력
pvscan PV명 : PV상태 확인 명령어

 

pvcreate /dev/sdb1 /dev/sdc1 명령어를 통해 sdb, sdc 2개의 디스크를 PV로 초기화 할 수 있다. 그럼 해당 디스크들은 LV로 구성할 초기화 작업이 완료가 되며 정상적으로 수행 되었는지 확인하기 위해 pvscan명령을 통해 확인할 수 있다.

pvdisplay 명령을 사용하면 해당 PV의 VG이름이나 PE개수등 좀더 상세한 정보를 확인할 수 있다.

 

만약 임의의 디스크를 더이상 LV의 구성으로 사용하지 않는다면 pvremove 명령을 통해 해당 디스크의 PV상태를 제거할 수 있다.

 

3. vgcreate 이용해 VG(volume group) 생성

PV로 초기화한 디스크들을 LV로 할당하기 위해 하나의 논리적인 디스크로 묶는 과정인 VG생성 과정은 PV명령어 체계와 같으며 pv대신 vg라는 명령어(vgcreate, vgremove, vgscan, vgdisplay)로 이루어진다.

vgcreate VG명 PV명1 PV명2 ...
vgscan : VG 정보 확인
vgremove VG명 : 해당 VG를 삭제
vgdisplay VG명 : 해당 VG의 상세 정보 출력, VG명을 적지 않으면 모든 VG의 상세정보를 출력해준다.

 

PV로 초기화한 디스크들중 사용하고 싶은 만큼 하나의 VG로 묶으면 논리적인 디스크가 하나 생성된다. 위의 경우는 1G 하드디스크 1개를 하나로 묶어 총 2G크기의 myVG라는 하나의 논리 디스크를 생성한 것이며 vgscan을 통해 확인하면 lvm2 타입으로 생성된 그룹을 확인 할 수 있다.

 

또한 pvscan을 통해 PV를 확인해보면 기존에 볼수 없었던 VG명이 보이며 각각 PV들이 어떤 VG에 속해있는지 확인할 수 있다.


4. lvcreate 이용해 LV(Logical Volume) 생성

VG를 생성해 원하는 크기만큼 논리적인 하드디스크를 생성했으므로 해당 디스크를 원하는 만큼 잘라 LV로 사용하면 된다. pv, vg, lv 의 명령어 체계는 모두 동일하다.(lvcreate, lvremove, lvscan, lvdisplay)


lvcreate -l PE갯수 VG명 -n LV명
lvcreate -L 용량(M/G) VG명 -n LV명
lvscan : 전체 LV 상태 출력
lvdisplay : 전체 LV  상태 상세히 출력
lvremove LV명 : 해당 LV 삭제, 이때 LV명이 만약 /dev/myVG/myLV 라면 myLV라는 LV명만 사용하는것이 아닌 모든 경로를 전부 입력해야 한다

LV를 할당시 PE의 개수로 할당하는것을 추천한다. 이유는 PE의 크기가 정해져 있어 원하는 용량대로 추가할 경우 딱 떨어지면 괜찮지만 그렇지 않을 경우 디스크의 용량이 낭비되는 상황이 발생할 수 있기 때문이다. PE의 크기를 변경할 수 있지만 2MB가 최소 크기 이므로 vgscan을 통해 PE개수를 확인하여 할당하는 것이 좋다.

lvcreate -l 508 myVG -n myLV1 명령어로 PE개수를 통해 LV를 생성하였지만
lvcreate -L 650M myVG -n myLV2 를 통해 용량을 설정해 할당하는것 또한 가능하다.

 

모든 과정이 끝나면 LV또한 논리적으로 나눈 '디스크'이기 때문에 파일 시스템을 설정한후 마운트하여 사용가능 하다.

포맷이 되었는지 확인하는건 앞에서 했던것 처럼 blkid로 확인 가능하다.

 

파일 시스템까지 생성을 완료했다면 해당 디스크를 마운트해 사용하면 된다. 재부팅시에도 마운트 설정이 유지될 수 있게 fstab에 작성하면 LVM 사용 준비가 완료된다.

 

만약 더이상 LV를 사용하지 않아 지우게 된다면 생성의 역순인 LV삭제 -> VG삭제 -> PV삭제 순으로 진행하면 된다.

 


LVM 확장 및 축소하기

사용중인 LV의 용량이 부족하거나 사용하지 않는 용량이 남을 경우 LV를 확장하거나 축소해야 하는 상황이 발생한다. 이때도 LV를 생성할 때와 마찬가지로 새롭게 확장할 디스크를 Linux LVM으로 변경 하고 PV로 초기화한 후 기존의 LV에 추가하거나 기존의 LV에서 제거할 디스크를 빼내면 된다. 

vg 확장 및 축소 명령어

vgextend 기존VG명 디스크명  : 기존VG에 해당 디스크를 추가하는 방법
vgreduce 기존VG명 디스크명 : 기존 VG에 하드 디스크 일부를 제거하는 방법, 단 모든 용량이 free인 하드만 가능하다.

 

기존에 사용하던 lv가 용량이 부족해 1G 디스크를 추가해야 한다고 가정하면 새롭게 PV로 생성한 디스크를 vgcreate가 아닌 vgextend 명령어를 통해 기존의 VG에 추가해야 한다. vgdisplay로 확인하면 VG의 전체 용량이 추가한 만큼 늘어난 것을 확인할 수 있다.
vgextend myVG /dev/sdd1  : VG에 sdd 라는 새로운 하드 디스크를 추가하는 명령어 

 

만약 사용하던 LV에 더이상 추가될 데이터가 없어 남는 용량을 다른 곳에 사용하고 싶다면 vgreduce명령을 통해 디스크를 VG에서 빼내야 한다. 이때 축소또한 제거와 비슷하게 생성의 역순으로 진행되어야 하기 때문에 lv가 우선적으로 빠져있어야 하며 빼내는 디스크는 모든 용량이 사용중이 아니어야 제거가 가능하다.
vgreduce myVG /dev/sdd1 : VG중 sdd1 디스크를 제거하는 방법, 단 모든 용량이 free인 하드만 가능하다.

lv 확장 및 축소

새롭게 추가할 PV를 VG에 추가 시켰다면 전체적인 논리 디스크의 크기가 늘어난것을 확인했다. 그럼 추가된 논리디스크를 용량이 부족한 LV쪽에 추가해 용량을 늘려주거나 더이상 사용하지 않을것 같은 LV는 VG에서 빼내기 전에 할당된 LV에서 제거해주어야 한다.

 

lvextend [-l PE개수 / -L 용량] : 확장만 가능
lvreduce [-l PE개수 -L 용량] : 축소만 가능
lvresize [-l +-PE개수 -L +-용량] : 확장 또는 축소 선택해서 가능

 

이때 주의할 점이 있다. 우선 LE는 PE와 1:1 대응이 되므로 PE의 개수와 같기 때문에 PE의 개수또한 508이라고 생각하면 된다. 그럼 이때 lvextend -l 300 LV명 으로 명령어를 사용할 경우 의미가 해당 LV의 용량을 PE개수 300개로 확장한다 라는 의미가 되는데 이미 LV의 용량이 508개 이므로 확장이 아닌 축소가 되어 에러가 발생하게 된다. 따라서 이때 PE의 개수앞에 +PE개수 로 +기호를 사용하여 해당 갯수로 확장이 아닌 해당 갯수만큼 확장을 하라는 명령어를 사용해야 한다.

할당 가능한 PE의 갯수는 논리디스크 전체인 vg를 확인할 수 있는 vgdisplay 명령을 통해 확인하면 되고 +를 통해 정상적으로 LV를 추가할 수 있는것을 확인할 수 있다.

 

헷갈릴수 있기 때문에 lvextend의 명령어 해석을 정리하면 아래와 같다.
lvextend -l 300 /dev/myVG/myLV1 : PE를 300으로 확장하겠다 라는 의미 이기 때문에 기존의 PE가 300보다 클경우 에러가 발생한다.
lvextend -l +100 /dev/myVG/myLV1 : PE를 100개를 더 추가하겠다는 의미 기존의 용량을 몰라도 지정한 갯수만큼 추가된다.

 

lv에 새롭게 추가시키고 바로 마운트된 용량을 확인할 경우 용량의 증가가 없는것을 확인할 수 있다. 이는 새롭게 디스크 용량을 확인하여 사이즈를 재적용하도록 해주면 해결 된다. 
기존 사용중이던 LV에 용량 증가시킨 경우 포맷(fsck)없이 용량을 적용할 경우에 e2fsck 와 resize2fs 명령어를 이용하여 적용한다.

이때 마운트를 해제하지 않고 e2fsck를 통해 디스크를 체크하려고 하면 파일시스템에 손상을 입을 가능성이 있다고 경고 문구가 나오므로 마운트를 해제하고 위의 과정을 진행하면된다. 과정을 진행한뒤 df -h 명령어를 통해 확인하면 용량이 증가되어 재적용 되어있는 것을 확인할 수 있다.
umount /dev/myVG/myLV1 또는 umount /lvm1
e2fsck -f /dev/myVG/myLV1  디스크 체크
resize2fs /dev/myVG/myLV1 : 사이즈 재적용
mount /dev/myVG/myLV1 /lvm1

 

Disk quota (사용자별 디스크 할당)

파일시스템마다 사용자나 그룹이 생성할 수 있는 파일의 용량과 개수를 제한하는 것이다. 물론 파티션을 나누어 용량의 제한을 둬도 가능하지만 그럴 경우 사용자마다 일일이 파티션을 나누어 주어야 하기 때문에 굉장히 번거로워지기 때문에 quota를 사용한다.

quotacheck -옵션 마운트포인트  : 해당 마운트지점에 quota 상태 확인

-a : /etc/mtab에 있는 모든 마운트된 파일 시스템 검사(NFS는 제외)

-v : 상세하게 출력

-u : 사용자 할당량 검사

-g : 그룹 할당량 검사

-c : 기존 할당량 파일 무시

fstab에 defaults,usrquota 로 추가하여 유저쿼터 적용 mount -o remount /home으로 마운트 설정 재시작

 

 

quotaon 마운트포인트 : 해당 위치에서 쿼터 동작 시작
quotaon -a : 쿼터가 존재하는 모든 곳에서 시작
quotaoff /home : 해당 위치의 쿼터 동작 끄기
quotaoff -a : 한번에 다 끄기

-u : 유저 쿼터를 켜거나 끌때 해당 옵션 사용 -g : 그룹 쿼터를 켜거나 끌때 해당 옵션 사용 

 

 

quota를 사용하기 위해 해당 패키지가 설치되어 있는지 먼저 확인한 후 진행하며 설치가 되어 있지 않다면 yum을 통해 설치를 진행한 후 quota설정을 수행한다.

쿼터는 유저별, 그룹별 용량 제한이 가능하다. 유저별로 제한을 두기 위해 quotacheck 명령을 통해 /home 에 quota설정이 되어있는지 확인하면 quota설정이 되어있지 않기 때문에 설정을 진행하면 된다.

quota를 설정하려면 fstab에 등록되어 있는 마운트 정보에 defaults로 설정되어 있는 설정에 usrquota를 추가하면 된다. 그룹별로 용량을 설정하고자 한다면 grpquota를 설정해주면 된다.

설정을 완료 했으면 마운트정보의 갱신을 위해 remount를 수행한후 quotaon 명령어를 사용해 쿼터를 동작시키면 설정한 마운트 포인트인 /home에 auota.user 라는 파일이 생성된것을 확인 할 수 있다. 그럼 쿼터를 사용할 기본적인 준비가 완료된것이다.

댓글