
Linux에서 ZFS를 실행하는 Samba 서버가 있습니다.
- 이는 설명서에 따른 표준 설치이며 특별한 구성은 없습니다.
- 각 공유는 자체 ZFS 데이터 세트에 매핑되지만 모든 데이터 세트가 자체 공유를 갖는 것은 아닙니다.
Oracle Linux 9.2
ZFS 2.1.12
Samba 4.17.5
나는 사용했다이 dfree 스크립트Windows가 파일 탐색기에서 올바른 사용 공간과 남은 여유 공간을 보고하도록 합니다.
#!/bin/bash
USED=$((`zfs get -o value -Hp used $1` / 1024)) > /dev/null
AVAIL=$((`zfs get -o value -Hp available $1` / 1024)) > /dev/null
TOTAL=$(($USED+$AVAIL)) > /dev/null
echo -ne $TOTAL $AVAIL
이것은 예상대로 작동합니다.
그러나 이는 최종 사용자에게 혼란을 야기했습니다. 그들은 서로 다른 공유에 대해 보고된 용량이 약간 다른 것을 보고 서로 다른 서버여야 한다는 것을 의미한다고 생각하고 저에게 전화하여 이유를 물었습니다.
그래서 Windows에서 사용된 공간과 용량을 보고하도록 하려고 합니다.전체 ZFS 풀사용된 공간과 여유 공간은 공유가 매핑된 개별 데이터 세트가 아니라 공유와 관계없이 보고됩니다.
이론적으로는 $1을 풀 이름(이 경우 "탱크")으로 바꿔야 하지만 보고된 디스크 공간은 Windows에서 변경되지 않습니다.
#!/bin/bash
USED=$((`zfs get -o value -Hp used tank` / 1024)) > /dev/null
AVAIL=$((`zfs get -o value -Hp available tank` / 1024)) > /dev/null
TOTAL=$(($USED+$AVAIL)) > /dev/null
echo -ne $TOTAL $AVAIL
다양한 수정으로 인해 Windows에서 이상한 값이 보고되거나 값이 전혀 보고되지 않을 수 있습니다.
이 작업을 수행하기 위해 지금까지 찾은 유일한 방법은 zfs get 명령이 반환해야 하는 항목에 USED 및 AVAIL을 하드코딩하는 것입니다.
#!/bin/bash
USED=11258621113
AVAIL=28766985099
TOTAL=$(($USED+$AVAIL)) > /dev/null
echo -ne $TOTAL $AVAIL
제가 뭔가 멍청한 걸 놓쳤나요? 누구든지 이것을 작동하게 만들었습니까?
감사해요!
답변1
우선, 고객님의 문제를 재현할 수 없기 때문에 해결책을 제시하지 못해서 죄송합니다. 나는 FreeBSD 시스템의 12개 정도의 Samba 인스턴스에 대해 이 지시어를 사용한 적이 없으며 dfree command
귀하가 설명하는 문제도 겪어본 적이 없습니다. smb.conf
Samba는 디스크 공간 통계를 쿼리하는 방법을 알고 있는 것으로 보이며 Windows는 합리적인 디스크 활용도 지표를 보고합니다. 다음을 갖춘 파일 시스템의 경우:
$ zfs list -Hpo used,avail tank/r2d2
2209625051136 1605933772800
Windows 표시: 1.45TB 중 3.32TB 사용 가능
확실히 말할 자격은 없지만 Samba가 일반 숫자를 결정할 수 없는 근본적인 문제는 ZFS와 Samba의 업스트림 통합에 있는 일부 결함에 있을 수 있습니다. 최소한 Samba는 수동으로 검색하려는 것처럼 ZFS 파일 시스템 used
과 속성을 찾을 수 있어야 합니다. avail
내 모든 시스템은 이 문제를 자체적으로 해결합니다.
그러나 보다 기본적인 수준에서 귀하의 게시물은 ZFS가 디스크 스토리지의 패러다임 전환이라는 점을 귀하가 인식하고 있음을 보여줍니다(사용자는 인식하지 못할 수도 있음). 한 가지 확실한 팁은 파일 시스템의 "총" 용량을 계산해야 한다는 것입니다. ZFS 자체에는 (파일 시스템 수준에서) 이에 대한 개념이 없으며 실제로 유틸리티가 size
액세스할 수 있는 속성이 없습니다 zfs list
.
파일 시스템 수준에서는 데이터 자체가 퍼지기 때문에 used
숫자도 항상 흐릿합니다. available
ZFS 파일 시스템은 사용자가 이를 인식하지 못한 채 즉시 데이터를 압축하도록 구성할 수 있으며 종종 그렇게 합니다. 따라서 사용자는 100G의 여유 공간이 있는 볼륨을 보고 압축 가능한 10G 파일을 보관한 다음 볼륨에 여유 공간이 90G로 줄어들지 않고 여전히 95G의 여유 공간이 있다는 사실에 혼란을 겪을 수 있습니다. 그들은 서버의 디스크 어레이가 10G의 파일을 저장하는 것처럼 보이지만 "사용 가능한" 공간은 5GB만 줄어든다는 사실에 놀랄 것입니다. 이 때문입니다압축은 사용자에게 투명합니다..
다르게 말하면 범용 4TB 드라이브를 사용하는 것입니다. 그 "능력"은 무엇입니까? 전화해서 디스크 공간에 대해 묻는 사람이 "4TB"라고 말할 수도 있습니다. 하지만 ZFS에서는 물리적 용량, 하드 디스크 공간의 양,최저 한도에서숫자이며, 데이터가 압축할 수 없는 경우에만 true입니다. 데이터가 압축 가능한 경우 총계는논리적드라이브 용량(사용자가 "남은 저장 공간이 얼마나 됩니까?"라고 물을 때 생각하는 용량)은 아마도 4TB보다 높을 것입니다. 이전 lz4
압축 알고리즘을 사용해도 내 파일 시스템은 3배 이상의 압축을 받았고 그 중 하나는 거의 6배였습니다. 이 속도라면 "4TB" 드라이브의 용량은 12TB에서 24TB 사이가 됩니다. 압축을 사용하면 zstd
압축 비율이 두 자릿수에 도달할 수 있습니다.
어려운 점은 ZFS가 파일의 압축 비율을 알고 있음에도 불구하고저장됨데이터가 ( used
대 logicalused
)인 경우, 데이터가 실제로 기록될 때까지 "사용 가능한" 공간이 얼마나 압축 가능한지 확인할 방법이 없습니다. 즉, total=used+avail
혼란은 used
알려져 있지만 avail
최소한의 영향만 미치기 때문입니다. 향후 데이터 스토리지 모델에 따라 total
실제로는 이를 초과할 수도 있습니다 .used+avail
ZFS에서파일 시스템, 저장될 실제 데이터의 맥락을 제외하고 "디스크 용량"과 같은 것은 없습니다. 알려진 값을 가진 파일 시스템이 available
10G 크기의 파일과 같은 추가 데이터를 저장하는 경우 2:1로 압축할 수 있으며 실제 디스크 공간은 5G만 소비합니다. 따라서 압축 가능한 10G 파일을 저장하면 논리적 용량이 5GB 증가할 수 있습니다. 10G의 데이터를 저장하면 겉보기 "용량"이 5GB 증가합니다. 이것이 사용자가 혼란스러워하는 이유입니다. 그들은 명목상 드라이브를 이해하지 못합니다물리적4TB 용량까지 확장 가능논리적사용자 데이터를 2:1로 압축할 수 있다면 실제 사용자 데이터 용량은 8TB이다. 압축 가능한 파일 시스템에서 공간의 양을 추적하는 것은 available
항상 total
움직이는 목표입니다.
IMO에서 풀 수준에서 디스크 공간 메트릭 보고로 이동하고 싶다고 말하면 올바른 방향으로 가고 있는 것입니다. 압축 수준에 관계없이 출력은 항상 zpool
드라이브에서 사용되거나 사용되지 않은(-) 실제 바이트 수를 반영하기 때문에 가동 시간 모니터링 시스템에서 수행하는 작업입니다 . 실제로 풀 수준에서는 ZFS 파일 시스템에 없는 "크기" 속성이 표시됩니다. 중고 및 무료는 특히 RAID-Z 패리티를 반영하므로 의미가 약간 덜하지만, 사용/크기 비율은 일반적으로 정확합니다.allocated
size
allocated
$ zpool list -po cap,alloc,size
CAP ALLOC SIZE
56 2256319561728 3985729650688
$ bc <<< 'scale=4; 2256319561728/3985729650688'
.5660
대부분의 사람들은 디스크가 "56% 찼습니다" 또는 "92% 찼습니다"라고 이해할 수 있습니다. 하지만 "얼마나 더 많은 데이터를 저장할 수 있나요?"라고 묻는다면 대답은 "상황에 따라 다릅니다."입니다.
원하는 솔루션에 가까워지면 게시물을 업데이트하세요. 여기에 게시한 내용 중 귀하의 문제를 직접적으로 해결하는 내용은 없지만 귀하가 직면하고 있는 어려움이 기술적인 접근 방식만큼이나 사용자 교육에 뿌리를 두고 있다는 사실을 언급하고 싶습니다.
답변2
Samba에서 공유 디스크 공간 보고는 일반적으로 풀 수준이 아닌 공유 수준에서 수행됩니다. 그렇기 때문에 개별 데이터 세트의 속성에 해당하므로 각 공유에 대해 보고된 용량이 약간씩 다르게 표시되는 것입니다.
Windows에서 전체 ZFS 풀에 대해 사용된 공간 및 용량을 보고하도록 하려면 대안을 고려해 볼 수 있습니다. 개별 공유에 대한 Samba 디스크 공간 보고 동작을 수정하는 것은 복잡할 수 있고 원하는 결과를 얻지 못할 수 있기 때문입니다.
한 가지 가능한 접근 방식은 ZFS 풀 루트(예: /tank
)를 가리키는 별도의 공유를 만든 다음 해당 공유를 사용하여 풀 수준 디스크 공간을 보고하는 것입니다. 다음을 수행할 수 있습니다.
ZFS 풀의 루트(일반적으로
/etc/samba/smb.conf
)를 가리키는 Samba 구성 파일에 공유를 만듭니다. 다음과 같이 새 섹션을 추가하면 됩니다.[pool-root] path = /tank read only = yes browseable = no
/tank
ZFS 풀의 마운트 지점과 일치하도록 경로( )를 조정합니다 .구성 변경 사항을 적용하려면 Samba 서비스를 다시 시작하십시오.
sudo systemctl restart smbd
pool-root
Windows에서 공유에 액세스 하면 전체 ZFS 풀의 디스크 공간이 보고됩니다.
이 특별한 공유를 생성하면 사용자는 ZFS 풀의 루트에 액세스할 수 있으므로 필요한 경우 액세스를 제한하려면 적절한 권한과 제한을 설정해야 합니다.
이 방법은 Samba에서 개별 공유 수준 보고가 작동하는 방식을 수정하지 않는다는 점을 명심하십시오. 이는 보고 목적으로 풀의 루트를 가리키는 추가 공유를 제공할 뿐입니다.