비중복 ZFS 풀에서 디스크를 어떻게 교체합니까?

비중복 ZFS 풀에서 디스크를 어떻게 교체합니까?

책을 몇 권 읽었더니 그런 것 같았어요ZFS는 중복되지 않은 어레이에서 디스크를 제거하는 것을 좋아하지 않습니다.:

zpool detach명령을 사용하여 미러링된 저장소 풀에서 장치를 분리할 수 있습니다. 예를 들어:

# zpool detach zeepool c2t1d0

그러나 다른 유효한 데이터 복사본이 없으면 작업이 거부됩니다. 예를 들어:

# zpool detach newpool c1t2d0
cannot detach c1t2d0: only applicable to mirror and replacing vdevs

기본적인 문제는 이해할 수 있습니다. 배열에서 데이터(메타데이터 또는 페이로드 데이터)의 유일한 복사본을 삭제하면 해당 데이터를 사용할 수 없게 됩니다.

의 예ZFS 저장소 풀에서 장치 교체저장소 풀에서 장치를 교체하는 방법에 대한 기본 단계별 지침을 제공합니다. 즉, 디스크를 오프라인으로 전환하고, 디스크를 제거하고, 교체 디스크를 삽입하고, zpool replaceZFS에 변경 사항 알림을 실행하고, 디스크를 온라인으로 전환합니다. 이를 위해서는 어레이가 교체되는 디스크에 의존하지 않아야 하므로 어레이가 중복되어야 합니다. 해당 드라이브에 의존하는 경우 이 접근 방식은 위와 동일한 문제를 나타냅니다.

권장되는 방법은 무엇입니까바꾸다디스크 중 하나중복되지 않는ZFS 배열?

기존 디스크가 제대로 작동하고 있다고 가정하고, 교체 디스크의 크기가 교체 중인 디스크와 최소한 동일하다고 가정합니다. (기존 디스크에 오류가 발생하는 경우 새 디스크를 추가하고 디스크 오류로 인해 영향을 받은 모든 파일을 백업에서 복원하는 것뿐입니다.)

답변1

zpool attach pool old-disk new-disk

이렇게 하면 기존 디스크가 기존 디스크와 새 디스크를 모두 포함하는 미러로 변환되고 재동기화가 시작된 후 기존 디스크를 분리할 수 있습니다.

zpool detach pool old-disk

루프 장치를 사용하여 테스트:

# truncate -s 1G a b
# truncate -s 1200M c
# losetup  /dev/loop0 a
# losetup  /dev/loop1 b
# losetup  /dev/loop2 c
# zpool create test loop{0,1}
# zpool attach test loop1 loop2
# zpool status
      pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            loop1   ONLINE       0     0     0
            loop2   ONLINE       0     0     0
# zpool detach test loop1
# zpool status
  pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          loop2     ONLINE       0     0     0

답변2

'13'에서는 상황이 다른지 모르지만 'zfs 바꾸기'는 중복되지 않은 풀에서 작동합니다. 먼저 분리하지 않고 명령 1개만 실행하면 됩니다.

d1은 1G, d2는 2G, /tmp는 모두 빈 파일입니다.

/t/test #> zpool create test /tmp/test/d1
/t/test #> zpool set autoexpand=on test
/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: none requested
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d1  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1008M   258K  1008M         -     0%     0%  1.00x  ONLINE  -


/t/test #> zpool replace test /tmp/test/d1 /tmp/test/d2


/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: resilvered 61K in 0h0m with 0 errors on Sun Sep 18 18:55:32 2016
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d2  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1.98G   408K  1.98G         -     0%     0%  1.00x  ONLINE  -

관련 정보