저는 FreeNAS를 실행하는 오래된(2-3년) NAS를 가지고 있습니다. 이제 하드 드라이브를 업그레이드할 때가 된 것 같습니다. 현재 상태는 다음과 같습니다.
NAME STATE READ WRITE CKSUM
Pool1 ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ada3p2 ONLINE 0 0 0
ada4p2 ONLINE 0 0 0
ada5p2 ONLINE 0 0 0
mirror ONLINE 0 0 0
ada1p2 ONLINE 0 0 0
ada2p2 ONLINE 0 0 0
RaidZ1의 드라이브는 모두 1GB이며 그대로 유지됩니다.
RaidZ1에 2개 또는 3개의 1GB 하드 드라이브를 추가하고 다음 작업을 수행하지 않고도 미러 드라이브(500GB만)를 완전히 제거하는 가장 좋은 방법은 무엇입니까?
- 임시 저장 위치에 데이터 복사
- 풀 다시 만들기
- 다시 복사
풀이 50% 정도 찼기 때문에 미러링된 드라이브에 데이터가 있는지도 잘 모르겠습니다.
확인하는 방법이나 시작 위치는 무엇입니까?
답변1
유일한 방법은 제안한 대로 수행하는 것입니다. 모든 데이터 세트를 새 풀에 복사하고 풀을 다시 작성하는 것입니다. zfs는 드라이브 추가를 통한 raidz1 확장을 지원하지 않으며 최상위 vdev("미러") 제거도 지원하지 않습니다.
답변2
짧은 답변:
RaidZ1에 드라이브를 추가하고 미러 드라이브를 완전히 제거하는 가장 좋은 방법은 무엇입니까? 아니요:
- 임시 저장 위치에 데이터 복사
- 풀 다시 만들기
- 다시 복사
당신은 할 수 없습니다. 기간. 구성에 따라 새 풀을 만들고 복사하지 않으면 미러링된 드라이브를 삭제할 수 없습니다. 특히 게시물 시간을 고려하면 ZFS는 풀에서 VDEV 삭제를 지원하지 않습니다. 최근에 이 문제가 발생한 독자의 경우 이 글을 쓰는 시점에서 zpool remove
하나 이상의 VDEV가 포함된 풀에서 VDEV를 삭제하는 것이 지원되지 않습니다 raidz
. zpool remove
연결된 디스크 또는 연결된 미러 제거는 지원되지 않습니다.
긴 답변:
raidz1
미러 vdev에 대한 vdev 연결 구성은 약간 특이합니다. 새 풀을 생성하고 기존 풀의 데이터를 새 풀로 복사한 다음 기존 풀을 삭제하지 않으면 풀에서 미러링된 vdev를 제거할 수 없습니다.
그러나 vdev 구조를 변경하지 않는 한 현재 풀의 용량을 확실히 확장할 수 있습니다.
그래서 추가하는 대신더드라이브로 전환할 수 있습니다.더 큰운전사. 풀을 각각의 새 드라이브에 한 번에 하나씩 다시 동기화하려면 여러 번의 반복이 필요하지만 비교적 어렵지 않습니다. 그러나 ZFS는 재동기화 시 기존 RAID보다 더 효율적이므로 풀이 얼마나 가득 차 있는지에 따라 상황이 그렇게 나쁘지 않을 수도 있습니다.
핵심은 이것이다~ 해야 하다한 번에 하나의 디스크를 완료하십시오. 먼저 풀의 완전하고 테스트된 백업이 있는지 확인하십시오.
이것은 3개의 1G 드라이브와 장치 /dev/md0 ~ /dev/md2가 설정된 테스트 샌드박스입니다. 각 드라이브에는 GPT 파티션 테이블이 있습니다.
# gpart show md{0..2}
=> 40 2097072 md0 GPT (1.0G)
40 200 1 linux-swap (100K)
240 2096872 2 freebsd-zfs (1.0G)
=> 40 2097072 md1 GPT (1.0G)
40 200 1 linux-swap (100K)
240 2096872 2 freebsd-zfs (1.0G)
=> 40 2097072 md2 GPT (1.0G)
40 200 1 linux-swap (100K)
240 2096872 2 freebsd-zfs (1.0G)
다음 드라이브로 풀을 만들었습니다 raidz1
.
# zpool create tank raidz1 /dev/md{0..2}p2
# zpool status tank; echo; zpool list tank
pool: tank
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
md0p2 ONLINE 0 0 0
md1p2 ONLINE 0 0 0
md2p2 ONLINE 0 0 0
errors: No known data errors
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH
tank 2.75G 196K 2.75G - - 0% 0% 1.00x ONLINE
매력적인. 이제 /dev/md3, md4 및 md5라는 세 개의 새 드라이브가 있다고 가정해 보겠습니다. 하지만 이 드라이브는 단순한 1G 드라이브가 아니라 10G 드라이브입니다. 또한 GPT 파티션 테이블이 설정되어 준비되어 있습니다.
# gpart show md{3..5}
=> 40 20971440 md3 GPT (10G)
40 200 1 linux-swap (100K)
240 20971240 2 freebsd-zfs (10G)
=> 40 20971440 md4 GPT (10G)
40 200 1 linux-swap (100K)
240 20971240 2 freebsd-zfs (10G)
=> 40 20971440 md5 GPT (10G)
40 200 1 linux-swap (100K)
240 20971240 2 freebsd-zfs (10G)
수영장이 중복되어 있으므로주의 깊은바꾸다하나raidz1
어레이 로 구동하나그러면 더 큰 드라이브기다리다풀이 다시 동기화되도록 한 후 다음 드라이브를 한 번에 하나씩 계속 교체합니다. offline
드라이브를 -ing하고 어레이가 아직 실행 중인지 확인한 다음 작은 드라이브를 큰 드라이브로 교체하여 첫 번째 작업을 완료합니다 .
# zpool offline tank md0p2
# zpool status tank
pool: tank
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
md0p2 OFFLINE 0 0 0
md1p2 ONLINE 0 0 0
md2p2 ONLINE 0 0 0
errors: No known data errors
/dev/md0p2
이제 1G 파티션을 10G 파티션으로 교체 할 수 있습니다 /dev/md3p2
. 사실 zpool offline
위의 단계가 반드시 필요한 것은 아닙니다. 이 명령을 직접 실행할 수 있습니다 zpool replace
.
# zpool replace tank md0p2 md3p2
# zpool status tank; echo; zpool list tank
pool: tank
state: ONLINE
scan: resilvered 128K in 00:00:02 with 0 errors on Wed Oct 13 13:46:23 2021
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
md3p2 ONLINE 0 0 0
md1p2 ONLINE 0 0 0
md2p2 ONLINE 0 0 0
errors: No known data errors
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH
tank 2.75G 265K 2.75G - - 0% 0% 1.00x ONLINE
재동기화가 완료되었습니다. 이것은 매우 중요합니다. 풀에 저장된 데이터의 양이 많은 경우 zpool status tank
재동기화가 완료될 때까지 가끔씩 기다려 확인해야 합니다.
재동기화가 완료되면 두 번째 디스크 교체를 진행할 수 있습니다.
# zpool replace tank md1p2 md4p2
zpool status
다시 한 번, 재동기화가 완료될 때까지 기다려야 합니다 .
# zpool status tank
pool: tank
state: ONLINE
scan: resilvered 134K in 00:00:03 with 0 errors on Wed Oct 13 13:54:17 2021
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
md3p2 ONLINE 0 0 0
md4p2 ONLINE 0 0 0
md2p2 ONLINE 0 0 0
errors: No known data errors
이제 재동기화가 완료되었으므로 세 번째 작은 디스크를 더 큰 교체 디스크로 교체하겠습니다.
# zpool replace tank md2p2 md5p2
# zpool status tank; echo; zpool list tank
pool: tank
state: ONLINE
scan: resilvered 146K in 00:00:03 with 0 errors on Wed Oct 13 14:55:56 2021
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
md3p2 ONLINE 0 0 0
md4p2 ONLINE 0 0 0
md5p2 ONLINE 0 0 0
errors: No known data errors
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH
tank 2.75G 319K 2.75G - - 0% 0% 1.00x ONLINE
이제 이전 소형 디스크 md0 md1 및 md2는 더 이상 풀에 없습니다. 풀은 더 큰 디스크 md3, md4 및 md5에서 실행됩니다. 하지만 어레이를 zpool
확장하라는 지시가 없기 때문에 추가 공간은 없습니다 . raidz1
이것은 쉽습니다:
# zpool online -e tank md5p2
# zpool status tank; echo; zpool list tank
pool: tank
state: ONLINE
scan: resilvered 146K in 00:00:03 with 0 errors on Wed Oct 13 14:55:56 2021
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
md3p2 ONLINE 0 0 0
md4p2 ONLINE 0 0 0
md5p2 ONLINE 0 0 0
errors: No known data errors
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH
tank 29.8G 394K 29.7G - - 0% 0% 1.00x ONLINE
이제 3G 풀을 사용하는 대신 30G 풀을 사용하게 되었는데, 이는 디스크를 한 번에 하나씩 조심스럽게 교체한 다음 어레이를 확장하는 방식으로 수행됩니다.
답변3
zpool scrub
먼저, 변경하기 전에 모든 것이 제대로 작동하는지 확인하기 위해 부팅을 고려할 수 있습니다 .
메모리에서 벗어나(따라서 확인이 필요함) 원하는 옵션은 zpool add
기존 raidz 풀을 확장할 수 있는 것이라고 생각합니다.
데이터를 쉽게 이동하려면 zfs send|receive와 스냅샷을 사용한 증분 send|receive를 사용할 수 있습니다.