CentOS 8 - LVM 용량 증설

    LVM [Logical Volume Manager] + Expansion

    LVM [Logical Volume Manager]

    뜻 그대로 논리적 볼륨 관리자로 물리 디스크(하드디스크)에 가상의 레이어를 생성하여 여러 개의 논리적 개념의 볼륨을 나누거나 합치는 것을 가능하게 해주는 프로그램입니다.

    주로 물리 서버보다는 가상화 솔루션 [VMware/HiperV/XenServer] 등에서 많이 이용하며 이는 LVM 특징인 유연성과 관련이 있습니다. 일반적으로 물리 디스크의 용량을 늘리기 위해서는 서버를 종료하고 디스크를 연결한 다음에 백업 및 디스크 포맷 후에 파티션을 나누는 등 매우 복잡한 과정을 거쳐야 하지만 LVM으로 구성된 디스크는 처음 파티셔닝 구성에서만 재부팅이 필요하며 이후에는 명령어로 실서버 운영상태에서 용량을 늘릴 수가 있습니다.

     

    제 블로그에 CentOS8 설치 포스팅을 따라 진행을 했다면 루트[ /(root) ]와 홈[ /home ]디렉토리 파티션 타입[ Linux LVM ]으로 설정한 것을 확인하실 수 있습니다. 본인이 운영하는 사이트가 웹메일 호스팅이라면 주로 위 디렉토리에 용량이 쌓이게 되므로 LVM을 이용해 용량을 늘릴 수 있게 미리 구성이 되어 있으면 좋습니다.

    예시

    [root@localhost ~]# fdisk -l
    [root@localhost ~]# df -h

    [ fdisk ] 파티션 명령어와 [ df ] 명령어를 통해 비교해보면 파티션이 어떻게 구성되어있는지 확인이 가능합니다.

    그럼 새로운 하드디스크를 추가하여 기존 볼륨에 용량을 늘리는 방법을 알아보도록 하겠습니다.

    ■ [테스트 환경 및 준비물]

    □ CentOS 8 리눅스 설치 서버 [포스팅 참고]

    [root@localhost ~]# cat /etc/redhat-release
    CentOS Linux release 8.1.1911 (Core) [OS 버전 확인]

    [root@localhost ~]# uname -r

    5.7.2-1.el8.elrepo.x86_64 [CentOS 8 커널 5.7 적용 후 테스트 진행 (기본 커널에서 작업해도 상관없음)]

    주의사항

    LVM 이론상 용량을 줄이는 것이 가능하다고 나와있지만 설명은 증설만 진행하도록 하겠습니다.

    줄이는 것은 데이터가 있는 상태에서 진행할 경우 데이터 손실 또는 불량 섹터가 발생할 확률이 매우 높기 때문에 실서버 운영 중인 시스템에는 권장하지 않습니다. 정말로 줄여야 할 상황이 발생한다면 논리 볼륨 데이터를 모두 백업 후에 파티션 및 파일 시스템을 새로 구성하는 게 가장 안전합니다.

     

     해당 포스팅은 이미 LVM이 구성이 되어있는 서버에서 새로운 하드디스크를 연결하여 용량을 늘리는 방법입니다.

    기본 설정에서 많이 이용하는 [ /home ] 디렉토리 용량을 증설하는 방향으로 설명하도록 하겠습니다.

    ■진행 순서


    STEP01  → 운영 중인버에 하드디스크를 추가합니다.

    저는 VMware 가상화 솔루션을 이용하므로 추가하려는 서버 설정[Settings]에서 진행합니다.

    전부 기본 설정으로 다음만 누르면 되나 용량설정이나 추가할 하드디스크 경로만 임의설정해주시면 됩니다.

     

    STEP02 → 서버에 반영하기 위해 시스템 재시작

    [root@localhost ~]# reboot

     

    STEP03 → 부팅 후 [ fdisk ] 명령어를 통해 하드디스크가 제대로 연결되었는지 확인

    [root@localhost ~]# fdisk -l

     

    STEP04 → 새로 추가한 물리 디스크 파티션 설정하기[순차적 진행]

    [root@localhost ~]# fdisk /dev/sdb

    Welcome to fdisk (util-linux 2.32.1).
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.

    Device does not contain a recognized partition table.
    Created a new DOS disklabel with disk identifier 0x6c8a46a9.

    Command (m for help): n     [새로운 파티션 추가]

    Partition type
       p   primary (0 primary, 0 extended, 4 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (1-4, default 1): [Enter]
    First sector (2048-41943039, default 2048): [Enter]
    Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): [Enter]
    Created a new partition 1 of type 'Linux' and of size 20 GiB.

    [ 물리 디스크 처음 파티션 생성 시에는 디폴트 1번부터 시작하므로 Select 부분 빼고 전부 그냥 엔터(Enter) 키 누를 것]

     

    Command (m for help): t    [파티션 타입 변경]
    Selected partition 1     [처음 만든 파티션은 자동으로 1번 선택]
    Hex code (type L to list all codes): L     [설정 가능한 타입 리스트 전체 출력]

    Hex code (type L to list all codes): 8e     [Linux LVM 타입 입력]
    Changed type of partition 'Linux' to 'Linux LVM'.

     

    Command (m for help): w     [저장 후 종료]
    The partition table has been altered.
    Calling ioctl() to re-read partition table.
    Syncing disks.

    [root@localhost ~]# fdisk -l

     

    STEP05 → [ PV(Physical volume) ] 물리 볼륨 생성하기

    [root@localhost ~]# pvcreate /dev/sdb1
      Physical volume "/dev/sdb1" successfully created.

     

    STEP06이미 생성된 [ VG(Volume Group) ]에 볼륨 확장하기

    ※ [ VG ] 볼륨 그룹 설정된 이름 확인

    [root@localhost ~]# vgscan
      Found volume group "cl" using metadata type lvm2

     

    [root@localhost ~]# vgextend cl /dev/sdb1
      Volume group "cl" successfully extended

     

    STEP07논리 볼륨에 용량 할당을 하기 위해 [ /home ]디렉토리 언마운트[ umount ]진행

    [root@localhost ~]# df -h | grep home
    /dev/mapper/cl-home   20G   45M   19G   1% /home

     

    [root@localhost ~]# unmount /home

     

    STEP08해당 논리 볼륨 경로 이름 확인 후 [ /home ]에 용량 전부 할당[ lvresize ]하기

    ※ 넘어가기 전 확인해야 할 명령어

    □ [ PV ] 물리 볼륨 상태 확인 하기

    [root@localhost ~]# pvscan
      PV /dev/sda3   VG cl              lvm2 [<37.00 GiB / 0    free]
      PV /dev/sdb1   VG cl              lvm2 [<20.00 GiB / <20.00 GiB    free]
      Total: 2 [56.99 GiB] / in use: 2 [56.99 GiB] / in no VG: 0 [0   ]

     

    [ LV(Logical Volume) ] 논리 볼륨 상태 확인 하기

    [root@localhost ~]# lvscan
      ACTIVE            '/dev/cl/home' [20.00 GiB] inherit
      ACTIVE            '/dev/cl/root' [17.00 GiB] inherit

    [root@localhost home]# lvresize -l +100%FREE /dev/cl/home

      Size of logical volume cl/home changed from <20.00 GiB (5120 extents) to 40.00 GiB (10238 extents).

      Logical volume cl/home successfully resized.

     

    STEP09 → 파일시스템 체크 [ e2fsck ] 하기

    ※ 문제가 없다면 안 해도 되지만 예방차원에서 파일 검사 및 손상된 파일이 있을 경우 자동으로 복구를 하므로 꼭 리사이즈하기 전 체크하는 것을 권고

    [root@localhost ~]# e2fsck -f /dev/cl/home

    e2fsck 1.44.6 (5-Mar-2019) [데이터가 크면 시간이 오래 소요될 수 있음]

    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/cl/home 21/1310720 files (0.0% non-contiguous), 126332/5241856 blocks

     

    STEP10 → [ resize2fs ] 명령어를 통해 [ /home ] 디렉토리 용량 확장하기

    [root@localhost ~]# resize2fs /dev/cl/home

    resize2fs 1.44.6 (5-Mar2019) [데이터가 크면 시간이 오래 소요될 수 있음]

    Resizing the filesystem on /dev/cl/home to 10483712 (4k) blocks.

    The filesystem on /dev/cl/home is now 10483712 (4k) blocks long.

     

    STEP11 → 최종적으로 [ /home ]디렉토리 마운트 하기

    [root@localhost ~]# mount /home

     

    ※ 용량 증설[20GB ▷ 40GB] 확인하기

    [root@localhost ~]# df -h | grep home

    /dev/mapper/cl-home    40GB    48MB    38GB    1%    /home

    이렇게 서버가 운영되는 도중에도 그룹별로 나누어 용량 확장이 가능하기 때문에 파일 시스템 구축 시에 처음부터 LVM으로 구성하는 경우가 많습니다. 이제 가상화 솔루션에서도 많이 보편화되고 안정성이 뛰어나 여러 방면에서 활용되고 있으므로 꼭 알아두면 도움이 될 것으로 생각됩니다.

     

    ◇ 추가 설명

    ※ [ fdisk ] 파티션 작업 시 옵션 확인

    [ m/n/t/w ] 옵션 외에는 사용할 일이 많지 않으므로 참고만 하시기 바랍니다.

    Command (m for help): m
    Help:

      DOS (MBR)
       a   toggle a bootable flag
       b   edit nested BSD disklabel
       c   toggle the dos compatibility flag

      Generic
       d   delete a partition                                        [파티션 삭제]
       F   list free unpartitioned space                  [할당되지 않는 여유 공간 리스트 확인]
       l   list known partition types                        [알려진 파티션 타입 종류 확인]
       n   add a new partition                                   [새로운 파티션 추가]
       p   print the partition table                           [현재 파티션 테이블 정보 출력]
       t   change a partition type                             [파티션 타입 변경]
       v   verify the partition table                          [파티션 테이블 확인]
       i   print information about a partition      [파티션에 대한 정보를 표시]

      Misc
       m   print this menu                                            [옵션 확인]
       u   change display/entry units
       x   extra functionality (experts only)

      Script
       I   load disk layout from sfdisk script file
       O   dump disk layout to sfdisk script file

      Save & Exit
       w   write table to disk and exit                    [저장 후 종료]
       q   quit without saving changes                 [저장하지 않고 종료]

      Create a new label
       g   create a new empty GPT partition table
       G   create a new empty SGI (IRIX) partition table
       o   create a new empty DOS partition table
       s   create a new empty Sun partition table

    ※ [ umount ] 명령어 진행 시 만약 다음과 같은 메시지가 발생할 경우

    [root@localhost home]# umount /home
    umount: /home: target is busy.

     

    해당 디렉토리를 사용하고 있는 프로세스 확인

    [root@localhost home]# fuser -cu /home/
    /home:                1501c(test)  1531c(root)

    저의 경우는 원격 터미널 접속으로 test 계정이 /home 디렉토리를 물고 있어 원격 해제 후 콘솔로 진행하였습니다.

    ※ [ lvresize ] 용량 확장 시 일부 할당할 경우

    [root@localhost home]# lvresize -L +10G /dev/cl/home      [10GB 추가]

    [root@localhost home]# lvresize -L +500M /dev/cl/home   [500MB 추가]

    Designed by JB FACTORY