FreeNAS zfs 환경에서 HDD 교체 노트

7538 단어 FreenasZFS
FreeNAS에 설정된 zfs 환경에서 HDD 교체 방법을 사용하는 메모입니다.
이는 CUI 기반 단계입니다.

컨디션


이 노트는 다음과 같은 환경을 전제로 한다.
  • FreeNAS8.3.2 활용
  • USB 스토리지에 FreeNAS OS를 설치하여 부팅
  • 4개의 HDD를 사용한 raidz2(RAID6) 구축

  • GPT 활용
  • 일의 시작


    HDD 하나가 잘못되기 시작했어요.
     ↓
    어느 일요일, 지난번 조폴 스크랩을 시작한 지 35일 이상이 지났습니다. 조폴 스크랩이 자동으로 시작됩니다.
     ↓
    OS 측면에서 디스크 자동 분리
     ↓
    이 HDD는 zfs에서 UNAVAIL로 변경되었습니다.
    문제 부분을 발췌하다.
    # zpool status
      pool: tank
     state: DEGRADED
    (略)
    config:
    
        NAME                             STATE     READ WRITE CKSUM
        tank                             DEGRADED     0     0     0
          raidz2-0                       DEGRADED     0     0     0
    (略)
            10284868363385756633         UNAVAIL      0     0     0  was /dev/gptid/46b7e268-9176-11e2-83a7-7054d244c94e
    
    errors: No known data errors
    #
    

    교환 준비


    dmesg 명령을 실행하여 교체할 HDD 및 파티션 정보를 확인합니다.
    명령의 결과를 보면 아다1이라는 HDD가 OS에서 끊겼는데 이것이 바로 고장난 HDD다.
    dmesg의 결과
    ### あらかじめFreeNASサーバにSSHでログインしておく
    % dmesg
    (ada1:ahcich2:0:0:0): lost device
    ahcich2: AHCI reset: device not ready after 31000ms (tfd = 00000080)
    ahcich2: Poll timeout on slot 7 port 0
    ahcich2: is 00000000 cs 00000080 ss 00000000 rs 00000080 tfd 80 serr 00000000 cmd 0004c717
    ahcich2: Poll timeout on slot 7 port 0
    ahcich2: is 00000000 cs 00000080 ss 00000000 rs 00000080 tfd 80 serr 00000000 cmd 0004c717
    (ada1:ahcich2:0:0:0): removing device entry
    Closed disk ada1 -> 6
    

    액세스 표시등이 깜박이는 HDD 확인


    이번 작업에서 아래의 빨간 테두리처럼 HDD 접근등이 꺼지지 않았다.이것은 이번에 교환한 아다1의 HDD인 것 같다.

    일련 번호 확인


    위와 같은 확인뿐만 아니라 신중하게 HDD의 일련 번호도 확인하기 위해 뽑은 HDD가 실제로 고장이 났는지 미리 조사한다.그리고 HDD가 안 보이는데 어떤 HDD로 바꿀 수 없나요?확인
    사용할 명령
    # camcontrol identify {HDD名}
    
    일반 HDD의 경우(예)
    % su -
    ### 以下からrootで作業
    # camcontrol identify ada0
    (略)
    firmware revision     CN01
    serial number         ????????      # ←正常なディスクすべてでこの値をメモしておく
    (以下略)
    
    교체할 HDD(다음 오류 출력)
    ### rootで作業
    # camcontrol identify ada1
    camcontrol: cam_lookup_pass: CAMGETPASSTHRU ioctl failed
    cam_lookup_pass: No such file or directory
    cam_lookup_pass: either the pass driver isn't in your kernel
    cam_lookup_pass: or ada1 doesn't exist
    (以下略)
    

    파티션 정보 얻기


    만일의 경우를 대비하여 전원이 꺼지기 전에 구역 정보를 미리 얻을 수 있습니다.
    사용할 명령
    # gpart show {HDD名}
    
    파티 정보 얻기(예)
    # gpart show ada0
    =>        34  3907029101  ada0  GPT  (1.8T)
              34          94        - free -  (47k)
             128     4194304     1  freebsd-swap  (2.0G)
         4194432  3902834696     2  freebsd-zfs  (1.8T)
      3907029128           7        - free -  (3.5k)
    #
    

    디스크 스왑


    본체 끄기

    ### rootで作業
    # shutdown -p now
    

    장애가 발생한 HDD 제거, 일련 번호 확인


    손상된 HDD를 제거합니다.
    그리고 다음 서열 번호가 모두 다르다는 것을 확인하세요.
  • 미리 기록된 일련 번호
  • 체크 아웃된 HDD에 기재된 일련 번호
  • 일치하면 HDD를 제자리에 두세요(웃음)

    호스트 부팅


    HDD를 교체한 후 호스트 전원을 켜고 전원을 켭니다.제대로 작동하길 기도하자(웃음)
    또한 zfs에서는 HDD만 교체해도 자동으로 RAID를 재구성할 수 없기 때문에 다음과 같은 작업을 계속할 예정이다.

    교체된 HDD에 GPT 모드 및 파티션 생성


    부팅 후 FreeNAS 서버에 로그인하여 파티션을 생성합니다.
    또 원래 GPT를 사용하기 때문에 GPT 모드를 만든 후 파티션을 만든다.
    ### 以下からはrootで作業します
    ### GPTスキーマを作成する
    # gpart create -s gpt ada1
    ada1 created
    ### 確認
    # gpart show ada1      # GPT化していることを確認
    =>        34  3907029101  ada1  GPT  (1.8T)
              34  3907029101        - free -  (1.8T)
    
    전원이 꺼지기 전에 얻은 구역 정보를 사용하여 구역을 만듭니다.
    gpart에 구역을 만드는 방법
    # gpart add -i {index番号} -t {ファイルシステムタイプ} -b {スタート位置} -s {サイズ} ada1
    ### -bオプションはfreebsd-swapのみで利用
    
    파티션 생성 방법
    ### 以下のようにパーティションを作る
    # gpart show ada0
    =>        34  3907029101  ada0  GPT  (1.8T)
              34          94        - free -  (47k)
             128     4194304     1  freebsd-swap  (2.0G)
         4194432  3902834696     2  freebsd-zfs  (1.8T)
      3907029128           7        - free -  (3.5k)
    ### swap領域作成
    # gpart add -i 1 -t freebsd-swap -b 128 -s 4194304 ada1
    ada1p1 added
    ### zfs領域作成
    # gpart add -i 2 -t freebsd-zfs -s 3902834696 ada1
    ada1p2 added
    
    ### 作成したパーティション確認
    # gpart show ada1
    =>        34  3907029101  ada1  GPT  (1.8T)
              34          94        - free -  (47k)
             128     4194304     1  freebsd-swap  (2.0G)
         4194432  3902834696     2  freebsd-zfs  (1.8T)
      3907029128           7        - free -  (3.5k)
    ### 他のディスクの情報
    # gpart show ada0
    =>        34  3907029101  ada0  GPT  (1.8T)
              34          94        - free -  (47k)
             128     4194304     1  freebsd-swap  (2.0G)
         4194432  3902834696     2  freebsd-zfs  (1.8T)
      3907029128           7        - free -  (3.5k)
    #
    ### ada1とada0で値が一致している!(問題なし)
    

    rawuuid 값 확인 및 디스크 교환 명령 실행

    # gpart list ada1
    Geom name: ada1
    modified: false
    state: OK
    fwheads: 16
    fwsectors: 63
    last: 3907029134
    first: 34
    entries: 128
    scheme: GPT
    Providers:
    1. Name: ada1p1
    (略)
       rawuuid: 58e6ad2b-5e8e-11e5-a197-7054d244c94e     # ←こっちはswapのなので無視
    (略)
    2. Name: ada1p2
    (略)
       rawuuid: f5e5af6c-5e8e-11e5-a197-7054d244c94e     # ←こっちをメモ
    (略)
    #
    
    방금 기록된rawuid 값을 이용하여 새 HDD의 zfs 영역의 문자 장치가 완성되었는지 확인하십시오.
    # ls -la /dev/gptid/f5e5af6c-5e8e-11e5-a197-7054d244c94e
    crw-r-----  1 root  operator    0, 140 Sep 19 14:26 /dev/gptid/f5e5af6c-5e8e-11e5-a197-7054d244c94e
    ###デバイスができているので問題なし
    
    디스크 스왑 명령을 실행합니다.
    사용법
    zpool replaece {プール名} {zfs上の壊れたHDD} {zfs上の新しいHDD}
    
    실행 예
    # zpool replaece tank 10284868363385756633 gptid/f5e5af6c-5e8e-11e5-a197-7054d244c94e
    #
    
    RAID 재구성 여부를 확인합니다.
    # zpool status
      pool: tank
     state: DEGRADED
    (略)
    config:
    
        NAME                                              STATE     READ WRITE CKSUM
          raidz2-0                                        DEGRADED     0     0     0
            replacing-2                                   UNAVAIL      0     0     0
              10284868363385756633                        UNAVAIL      0     0     0  was /dev/gptid/46b7e268-9176-11e2-83a7-7054d244c94e
              gptid/f5e5af6c-5e8e-11e5-a197-7054d244c94e  ONLINE       0     0     0  (resilvering)    # ←"resilvering"と出ていればOK
    
    errors: No known data errors
    #
    
    이렇게 기다리면 재건은 끝나고, 작업은 끝이야.


    이번 작업을 통해 FreeNAS를 USB 메모리에 설치하면 HDD에 2GB의 swap 구역을 설치할 수 있다는 것을 처음 알게 되었다.swap이기 때문에 자유롭게 읽고 쓸 수 있는 넓은 영역이 필요하기 때문에 HDD를 선택하는 것이 당연하다는 점도 이번 학습이다.
    WebGUI에 액세스하면/var/log/messages에서 다음 로그를 출력합니다.
    swap_pager: I/O error - pagein failed; blkno 75,size 45056, error 6
    vm_fault: pager read error, pid 2054 (python)
    
    이 내용에 근거하다
  • 이번 HDD 고장은 zfs영역이 아니라 swap영역에서 발생
  • swap 영역이 이중화되지 않음
  • 그렇게 말해도 돼.
    USB 메모리에 FreeNAS의 OS를 추가하더라도 swap 분야는 HDD에 존재하고 이중화된 대상이 없는 것을 주의해야 한다.

    횡설수설


    이 페이지에는 전문 정비원에게 의뢰할 수 있다면 전문직에게 맡겨 해결해야 한다. 이런 사람은 본래 이 자료를 읽을 필요가 없다.
    또 AWS나 SalesForce처럼 공공 클라우드만 아는 사람들이 앞으로 많아질 것이고, 그러면 머지않아 과거의 일이 되겠죠.
    그 결과 HDD가 고장났을 때 이런 작업의 존재를 알게 된 IT 엔지니어는 앞으로 점점 줄어들겠지만, 파일 서버의 HDD 교체가 실패하면 최악의 데이터가 모두 사라지는 영향이 크다.그래서 수요가 적더라도 남을 돕기 위해 나는 잊지 않을 때 업무 기록을 필기로 정리했다.

    잠꼬대


    이번 작업의 NAS, HDD 케이스와 호스트에 붙인 번호는 왼쪽부터 0, 1, 2, 3이지만ada의 번호는 왼쪽부터 3, 2, 1, 0이 반대입니다(웃음)
    액세스 램프가 꺼졌기 때문에 HDD의 오류를 배제할 가능성은 낮다고 생각하지만, HDD의 일련 번호를 제대로 확인하지 않으면 위험할 것 같다.

    좋은 웹페이지 즐겨찾기