리눅스2023. 8. 8. 08:45

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/615899 (2018.6.4)

RAID카드 없이 여러개의 HDD를 묶어서 하나의 저장공간으로 사용할 방법을 찾아보다가 ZFS에 대해 알게 되었다. 주요 특징 두어가지가 눈에 띄어서 실제로 괜찮은지 시험해 보기로.

ZFS는 zpool이라는 것을 구성해서 여러개의 저장장치를 하나의 저장공간으로 묶을 수 있다. 다만 여러개의 저장장치를 묶을 때 각 저장장치의 사용가능 공간은 이들중 가장 용량이 작은 저장장치에 의해 제한된다. 그러므로 같은 용량의 디스크를 묶는 것이 좋겠다.

zpool의 종류에 따라 RAID와 유사하게 데이터 오류에 대한 보호 기능도 제공한다. 종류는 아래와 같다.

striped: RAID0 비슷한 형태. 데이터 보호 기능이 없다.

mirror: RAID1 비슷한 형태. 데이터 전체를 별도로 복사해서 가지고 있으므로 용량은 절반으로 줄어든다.

raidz: RAID5 비슷한 형태. 1개의 디스크가 망가져도 데이터가 유지된다.

raidz2: 2개의 디스크가 망가져도 데이터가 유지된다.

raidz3: 3개의 디스크가 망가져도 데이터가 유지된다.

한가지 고려할 점은, ZFS 사용시 RAM이 상당히 많이 필요하다는 점이다. 저장공간 1TB당 1GB의 RAM을 확보해 두는 것이 좋다고 한다.

그 외에도 뭔가 여러 가지 기능이 있는 듯한데, 좀 더 자세히 알아보고 싶다면 위키피디아의 ZFS 페이지를 참고하자. 여기로

 

아무튼, 관심이 생긴 김에 우선 버추얼박스 가상머신으로 시험해 보기로 했다. 4개의 HDD를 탑재한 가상 머신을 만들고 우분투 계열 배포판인 리눅스 민트 18.2 XFCE를 설치했다. 12GB HDD 1개는 OS용, 8GB HDD 3개는 ZFS 시험용으로 구성.

ZFS를 사용하기 위해서는 zfsutils-linux 패키지를 설치해야 한다. 터미널창에서 아래와 같이 작업.

# 저장소 정보 갱신
sudo apt-get update

# zfsutils-linux 패키지 설치
sudo apt-get install zfsutils-linux

fdisk로 ZFS에 사용할 디스크 장치를 확인한다.

# 디스크 목록 출력
sudo fdisk -l

zpool에 사용할 장치는 /dev/sdb, /dev/sdc, /dev/sdd로 확인. 이제 zpool을 생성한다. 디스크가 3개니까 1개가 망가져도 버틸 수 있는 raidz로 생성. zpool 명칭은 my_test_pool.

# zpool 생성(create)
sudo zpool create my_test_pool raidz /dev/sdb /dev/sdc /dev/sdd

생성에 실패하고 오류 메시지가 나왔다. 내용은 아래와 같다.

invalid vdev specification
use '-f' to override the following errors:
/dev/sdb does not contain an EFI label but it may contain partition information in the MBR
...

새로 생성한 빈 디스크이므로 -f 옵션을 추가해서 오류를 무시하고 진행.

# zpool 생성 (-f 옵션)
sudo zpool create my_test_pool raidz /dev/sdb /dev/sdc /dev/sdd -f

생성이 잘 되었는지 상태를 확인한다.

# zpool 상태 확인(status)
sudo zpool status

기본 마운트 지점은 루트 디렉토리 하위에 zpool 이름으로 정해진다. 위의 예시로 보자면 /my_test_pool 디렉토리에 자동으로 연결. df 명령으로 확인해 볼 수 있다.

# 디스크 빈 공간 확인
df -h

8GB HDD 3개를 raidz로 구성했기 때문에 실제 사용 가능한 용량은 HDD 2개 분량은 16GB가 되었다.

zpool을 생성할 때 마운트 지점을 -m 옵션으로 직접 지정해 줄 수도 있다.

# zpool 생성 시점에서 -m 옵션으로 마운트 지점을 지정하는 예시
sudo zpool create my_test_pool raids /dev/sdb /dev/sdc /dev/sdd -f -m /my_mountpoint

이미 마운트된 zpool을 다른 디렉토리에 마운트하려면 아래와 같이 작업하면 되겠다.

# /my_test_pool과의 연결 해제(unmount)
sudo zfs unmount /my_test_pool

# 새로 마운트할 디렉토리 /zpool_mount 생성
sudo mkdir /zpool_mount

# my_test_pool의 마운트 지점을 /zpool_mount 디렉토리로 변경
sudo zfs set mountpoint=/zpool_mount my_test_pool

# my_test_pool의 마운트 지점 설정 출력(제대로 설정되었는지 확인)
sudo zfs get mountpoint my_test_pool

# my_test_pool 마운트(mount)
sudo zfs mount my_test_pool

zpool 생성이 완료되었으면 이제 내부에 파일 시스템을 생성하자. 하나의 zpool에 여러개의 파일 시스템을 가질 수 있다. 예를 들어 my_test_pool이라는 zpool을 temp와 data라는 2개의 파일 시스템으로 분할하려면 아래와 같이 작업한다.

# my_test_pool에 temp 및 data 파일 시스템 생성
sudo zfs create my_test_pool/temp
sudo zfs create my_test_pool/data

특정 파일 시스템의 용량을 제한할 수도 있다. 예를 들어 my_test_pool/temp의 용량을 4GB로 제한하려면 아래와 같이 작업한다.

# my_test_pool/temp 용량 제한(4GB)
sudo zfs quota=4G my_test_pool/temp

이제 파일 시스템별로 소유권 및 접근권을 chown과 chmod 명령으로 적절히 설정하여 사용하면 되겠다.

파일 시스템 삭제는 아래와 같이 작업한다.

# my_test_pool/data 삭제
sudo zfs destroy my_test_pool/data

zpool을 삭제하려면 아래와 같이 작업한다.

# my_test_pool 삭제
sudo zpool destroy my_test_pool

참고로, 디스크가 많다면 적당히 묶어서 여러개의 zpool을 만들어 사용할 수도 있다. 예를 들어 zfs에 사용할 디스크가 6개라면 /dev/sdb~sdc 2개를 mirror 방식으로 묶어서 zpool을 만들고, /dev/sdd~sdg 4개를 raidz 방식으로 묶어서  zpool을 하나 더 만든다거나 하는 식이다. 

 

 

728x90
Posted by 반달가면