ZFS에는 중복 제거 기능이 있어 동일한 파일을 여러 위치에 보관할 수 있지만 복사본 1개 정도의 공간만 사용할 수 있다고 들었습니다. 나는 음악/이미지 등으로 끝나는 경향이 있다는 것을 알았습니다. 시간이 지남에 따라 내 하드 드라이브의 여러 위치에서 이런 일이 발생했으며 ZFS 파티션을 만들고 내 미디어를 해당 파티션으로 옮기는 것이 가장 좋을 것이라고 생각했습니다. 이 작업을 수행하는 방법이나 가능한지 찾는 데 어려움을 겪고 있습니다. 대부분의 튜토리얼에서는 "디스크 3개를 가져와 ZFS로 RAID"라고 설명하지만 저는 디스크가 1개 있는 노트북을 사용하고 있으며 기존 OS를 제거할 계획은 없습니다. ZFS 파티셔닝(https://serverfault.com/questions/628632/should-i-create-zfs-zpools-with-whole-disks-or-partitions), 그러나 단일 ZFS 파티션을 기존 디스크에 추가하는 방법을 설명하는 내용을 찾지 못했습니다. 그런 일이 가능할까요? (제 디스크 파티션 테이블 유형은 msdos이고, 그런데 저는 Ubuntu를 실행하고 있습니다.)
답변1
공간을 절약하면서 미디어 구성을 최대화하는 것이 목표라면 미디어 라이브러리에 대한 디렉터리 트리를 배치한 다음 cp
명령(데이터 복사) 및 명령(하드 또는 하드 데이터 생성)을 신중하게 사용하여 ln
이를 달성 할 수 있습니다. 소프트 [ -s
사용하는 경우] 링크) 참조 데이터에 액세스하거나 복사하려면 편의상 동일한 파일을 다른 디렉토리에서 다른 이름으로 사용할 수 있는 경우에도 마찬가지입니다. 여전히 동일한 파일이며 하드 또는 소프트 링크가 다를 뿐입니다.
수동 수준에서 매우 간단한 관점에서 ln
보면 cp
.
ln
ZFS를 추가하면 사용하기 전까지 기억할 필요가 없다는 즉각적인 이점이 있습니다 cp
. 미디어를 의도적으로 분할, 수정, 편집, 정렬하는 경우 등 다양한 사용 사례가 있습니다. 개별 미디어 "클립"을 저장하면 ZFS에서 수행됩니다. 데이터 중복 제거의 이점을 누리십시오.
ZFS의 비용은 중복 제거가 상당히 RAM 집약적이라는 것입니다. 커널은 각 블록의 체크섬이나 해시를 디스크에 저장하고 블록이 풀에 다시 기록될 때 실시간으로 어레이에 액세스해야 합니다. 따라서 디스크가 가득 차면(더 많은 ZFS 블록이 기록됨) 커널이 각 블록 데이터의 해시를 캐시하기 때문에 더 많은 RAM이 채워집니다. 노트북에 있는 RAM 용량과 디스크 수에 따라 문제가 될 수도 있고 아닐 수도 있지만, 중복 제거의 주요 비용은 전체 디스크의 해시 배열을 저장할 만큼 충분한 RAM을 확보하는 데 있다는 점을 기억하는 것이 좋습니다. 더 적은 RAM으로 수행할 수 있지만 전체 해시 배열을 한 번에 보유할 만큼 RAM이 충분하지 않은 시스템에서 커널이 RAM 청크로 해시 배열을 RAM 안팎으로 교환하려고 시도할 때 특히 쓰기 액세스가 어려워집니다.
그러나 작은 ZFS 풀을 시도하는 한 가지 방법은 다음과 같습니다.
가상 블록 장치 만들기
여기서는 FreeBSD 명령을 사용하고 있지만 단계는 Ubuntu에서도 비슷합니다. 제가 예시한 블록 장치의 크기는 10G이지만 여유 공간이 있으면 더 큰 크기를 사용해도 됩니다.
ztest.dat
10G 파일을 생성합니다:# truncate -s 10G ztest.dat
그리고 이 파일로 지원되는 가상 블록 장치를 만듭니다.
# mdconfig -f ztest.dat
md0
그렇다면 우리의 가상 장치는 입니다 /dev/md0
.
간단한 ZPOOL 생성 및 중복 제거 활성화
# zpool create ztest md0
# zfs set dedup=on ztest
# zpool status ztest
pool: ztest
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
ztest ONLINE 0 0 0
md0 ONLINE 0 0 0
errors: No known data errors
그러면 ztest
파일 시스템이 에 마운트 됩니다 /ztest
. 또한 /ztest
디렉토리, 파일 시스템 및 ZFS 풀에 대한 몇 가지 기본 통계를 신속하게 표시하는 간단한 셸 기능을 만들어 보겠습니다 .
zlist() {
zfs list ztest
echo
zfs get all ztest | egrep 'used|refer'
echo
zpool get dedupratio ztest
}
그런 다음 이러한 도구를 사용하여 아래에 필요한 미디어 계층 구조를 만들고 /ztest
일부 샘플 미디어 파일을 /ztest
파일 시스템에 복사하기 시작할 수 있습니다.
# ls -l /ztest; echo; zlist
total 0
NAME USED AVAIL REFER MOUNTPOINT
ztest 114K 9.20G 24K /ztest
ztest used 114K -
ztest referenced 24K -
ztest usedbysnapshots 0B -
ztest usedbydataset 24K -
ztest usedbychildren 90K -
ztest usedbyrefreservation 0B -
ztest logicalused 42K -
ztest logicalreferenced 12K -
NAME PROPERTY VALUE SOURCE
ztest dedupratio 1.00x -
A dedupratio
가 1.00이면 중복 제거가 수행되지 않음을 의미합니다. 파일 시스템에 있는 데이터의 논리적 크기는 풀에 저장된 물리적 데이터 크기의 1.00배입니다.
하지만 아직 아무것도 복사하지 않았습니다! 지금 해보자:
# cp -vp ~jim/my-fave-dvd.iso /ztest/copy1.iso
/home/jim/my-fave-dvd.iso -> /ztest/copy1.iso
결과를 확인하십시오.
# ls -l /ztest; echo; zlist
total 3271173
-rw-r--r-- 1 jim jim 3347775488 Jul 1 2014 copy1.iso
NAME USED AVAIL REFER MOUNTPOINT
ztest 3.13G 6.08G 3.12G /ztest
ztest used 3.13G -
ztest referenced 3.12G -
ztest usedbysnapshots 0B -
ztest usedbydataset 3.12G -
ztest usedbychildren 7.18M -
ztest usedbyrefreservation 0B -
ztest logicalused 3.12G -
ztest logicalreferenced 3.12G -
NAME PROPERTY VALUE SOURCE
ztest dedupratio 1.00x -
첫 번째 미디어 파일의 복사본 하나만 저장하므로 중복 제거 비율은 여전히 1.00입니다. 복사본을 만들어 보겠습니다.
# cp -vp /ztest/copy1.iso /ztest/copy2.iso
/ztest/copy1.iso -> /ztest/copy2.iso
# ls -l /ztest; echo; zlist
total 6542345
-rw-r--r-- 1 jim jim 3347775488 Jul 1 2014 copy1.iso
-rw-r--r-- 1 jim jim 3347775488 Jul 1 2014 copy2.iso
NAME USED AVAIL REFER MOUNTPOINT
ztest 6.25G 6.07G 6.24G /ztest
ztest used 6.25G -
ztest referenced 6.24G -
ztest usedbysnapshots 0B -
ztest usedbydataset 6.24G -
ztest usedbychildren 10.6M -
ztest usedbyrefreservation 0B -
ztest logicalused 6.24G -
ztest logicalreferenced 6.24G -
NAME PROPERTY VALUE SOURCE
ztest dedupratio 2.00x -
파일 시스템이 풀에 실제로 저장된 데이터보다 2.00배 더 큰 논리 데이터를 참조하므로 중복 제거 비율은 이제 2.00입니다. 그러나 의 출력에서는 값이 로 증가했지만 거의 변경되지 않은 zfs list
것으로 표시 됩니다 . 더 많은 복사본을 만들어 보겠습니다.USED
6.25G
AVAIL
6.07G
# cp -vp /ztest/copy1.iso /ztest/copy3.iso
/ztest/copy1.iso -> /ztest/copy3.iso
# cp -vp /ztest/copy1.iso /ztest/copy4.iso
/ztest/copy1.iso -> /ztest/copy4.iso
# ls -lh /ztest; echo; zlist
total 13084690
-rw-r--r-- 1 jim jim 3.1G Jul 1 2014 copy1.iso
-rw-r--r-- 1 jim jim 3.1G Jul 1 2014 copy2.iso
-rw-r--r-- 1 jim jim 3.1G Jul 1 2014 copy3.iso
-rw-r--r-- 1 jim jim 3.1G Jul 1 2014 copy4.iso
NAME USED AVAIL REFER MOUNTPOINT
ztest 12.5G 6.07G 12.5G /ztest
ztest used 12.5G -
ztest referenced 12.5G -
ztest usedbysnapshots 0B -
ztest usedbydataset 12.5G -
ztest usedbychildren 10.6M -
ztest usedbyrefreservation 0B -
ztest logicalused 12.5G -
ztest logicalreferenced 12.5G -
NAME PROPERTY VALUE SOURCE
ztest dedupratio 4.00x -
이제 du
12G 파일을 저장한다고 가정해 보겠습니다.
# du -h /ztest
12G /ztest
그러나 zpool
풀에 3.14G의 데이터만 할당했으며 풀에는 여전히 6.36G의 할당되지 않은 공간이 있음을 보여줍니다.
# zpool list ztest
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
ztest 9.50G 3.14G 6.36G - - 0% 33% 4.00x ONLINE -
ln
중복 제거 없이 사용하는 것과 동일
반면, 중복 제거 기능이 없는 파일 시스템은 동일한 목적을 달성하기 위해 신중하게 사용될 수 있으며 잠재적으로 복잡성, RAM 요구 사항 및 속도 측면에서 더 저렴한 비용으로 사용할 수 있습니다.
# zpool destroy ztest
# zpool create ztest md0
# cp -vp ~jim/my-fave-dvd.iso /ztest/copy1.iso
/home/jim/my-fave-dvd.iso -> /ztest/copy1.iso
# ln /ztest/copy1.iso /ztest/copy2.iso
# ln /ztest/copy1.iso /ztest/copy3.iso
# ln -s /ztest/copy1.iso /ztest/copy4.iso
이제 우리는 여전히 네 가지 다른 위치(마스터 복사본 copy1.iso
및 복제본 copy2
) 에서 액세스할 수 있는 파일을 보유하고 있습니다 copy4.iso
.
du
3.1G 파일을 저장했음을 보여줍니다.
# du -h /ztest
3.1G /ztest
ls
많은 inode 번호가 동일하고(하드 링크) 하나의 파일이 심볼릭 링크임을 보여줍니다. 를 사용하면 ln
추가 저장 오버헤드 없이 동일한 파일을 여러 위치에 배치할 수 있습니다.
# ls -lih /ztest
total 9813518
2 -rw-r--r-- 3 jim jim 3.1G Jul 1 2014 copy1.iso
2 -rw-r--r-- 3 jim jim 3.1G Jul 1 2014 copy2.iso
2 -rw-r--r-- 3 jim jim 3.1G Jul 1 2014 copy3.iso
128 lrwxr-xr-x 1 root wheel 16B Oct 7 13:25 copy4.iso -> /ztest/copy1.iso
zfs 파일 시스템은 3.1G가 사용되고 6.1G를 사용할 수 있음을 보여줍니다.
# zlist
NAME USED AVAIL REFER MOUNTPOINT
ztest 3.12G 6.08G 3.12G /ztest
ztest used 3.12G -
ztest referenced 3.12G -
ztest usedbysnapshots 0B -
ztest usedbydataset 3.12G -
ztest usedbychildren 189K -
ztest usedbyrefreservation 0B -
ztest logicalused 3.12G -
ztest logicalreferenced 3.12G -
NAME PROPERTY VALUE SOURCE
ztest dedupratio 1.00x -
또한 zpool
3.12G를 할당했으며 6.38G를 사용할 수 있음을 보여줍니다.
# zpool list ztest
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
ztest 9.50G 3.12G 6.38G - - 0% 32% 1.00x ONLINE -
이 예를 통해 여러분이 자체 테스트 프레임워크를 개발하여 ZFS 중복 제거를 실험하고 비용/이점 비율이 적합한지 확인할 수 있기를 바랍니다.
질문을 피하다
파일 지원 가상 장치의 ZFS 풀 실험 프레임워크는 기존 시스템에 ZFS 풀을 추가하기 위한 장기적인 솔루션이 아닙니다. 그러나 이는 현재 하드웨어가 필요한 리소스를 제공할 수 있는지, 특정 사용 사례의 데이터 및 데이터 처리 방식이 ZFS가 제공하는 기능을 활용할 수 있는지 여부를 결정하는 데 도움이 될 수 있습니다.
ZFS 풀을 추가하는 것이 이상적인 목표라고 판단되는 경우 새 디스크 파티션 및 파일 시스템으로 작업할 때마다 고려해야 할 몇 가지 일반적인 전제 조건은 다음과 같습니다.
- 최근에 백업하셨나요? 지금 그것을 할!
- 디스크에 이미 빈 파티션이 있습니까? 매우 편리합니다.
- 사용 가능한 무료 파티션이 없나요? 그렇다면 현재 파일 시스템에 백업하고, 더 작은 파티션으로 크기를 조정하고, 새로 확보된 공간을 ZFS 전용 새 파티션에서 사용할 수 있도록 데이터를 복원할 수 있을 만큼 사용되지 않은 공간이 충분합니까?
- 더 큰 새 드라이브를 구입하고 거기에 적절한 크기의 파티션을 만들어 현재 파일 시스템과 새 ZFS 파티션을 보관할 수 있습니까?
일단 가지고 있는 것:
- 기존 파일 시스템 백업
- ZFS 전용 파티션(우리는 이를 이라고 함
/dev/sda3
) - ZFS 풀을 설치할 위치 결정
/tank
다음 명령을 사용하여 기존 시스템에 ZFS 풀을 추가할 수 있습니다.
# zpool create tank /dev/sda3
필요한 경우 다음을 통해 중복 제거를 활성화할 수 있습니다.
# zfs set dedup=on tank
이는 비중복 풀이라는 점을 명심하세요. 드라이브에 오류가 발생하면 데이터가 손실됩니다. zpool scrub
작업에서는 데이터 손상을 감지할 수 있지만 발견된 오류를 수정할 수는 없습니다.
즐기다!