ZFS 이미지 혼란

ZFS 이미지 혼란

RAID10에 6개의 드라이브가 있는 ZFS 풀이 있습니다. 예전에는 그랬습니다.

146GB 드라이브를 1TB 드라이브로 업그레이드하려고 했는데 결과가 좋지 않았습니다.

root@x7550:~# zpool status
  pool: stuffpool
 state: ONLINE
  scan: scrub repaired 0 in 0h6m with 0 errors on Mon May  9 15:26:39 2016
config:

    NAME                                               STATE     READ WRITE CKSUM
    stuffpool                                          ONLINE       0     0     0
      mirror-0                                         ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1  ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1  ONLINE       0     0     0
      mirror-1                                         ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1  ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1009C03158BP-part1  ONLINE       0     0     0
      scsi-35000c50016ebcdfb-part1                     ONLINE       0     0     0
      ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1    ONLINE       0     0     0

scsi-35000c50016ebcdfb-part1드라이브는 미러-2에 있으며 ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1미러-2에 추가하려는 드라이브입니다.

이 문제를 해결하기 위해 제가 할 수 있는 일이 있나요?

우분투 16.04에서 실행 중입니다.

root@x7550:~# zpool history stuffpool | tail -n50
History for 'stuffpool':
2016-03-27.01:56:12 zpool create stuffpool mirror ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1 -f
2016-03-27.01:57:41 zpool add stuffpool mirror /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1 /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1009C03158BP-part1 -f
2016-03-27.01:59:25 zpool add stuffpool mirror /dev/disk/by-id/scsi-35000c50016ebcdfb-part1 /dev/disk/by-id/scsi-35000c50017675203-part1 -f
2016-03-27.02:12:38 zpool import -c /etc/zfs/zpool.cache -aN
2016-03-27.23:48:32 zfs create stuffpool/stuff
2016-03-27.23:54:47 zpool import -c /etc/zfs/zpool.cache -aN
2016-03-28.00:02:23 zfs create stuffpool/backup
2016-03-30.23:18:04 zpool scrub stuffpool
2016-04-03.01:06:06 zpool import -c /etc/zfs/zpool.cache -aN
2016-04-03.01:15:33 zfs create -p -o mountpoint=/var/lib/lxd/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9.zfs stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9
2016-04-03.01:15:53 zfs set readonly=on stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9
2016-04-03.01:15:54 zfs snapshot -r stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9@readonly
2016-04-03.01:16:00 zfs clone -p -o mountpoint=/var/lib/lxd/containers/ux-1.zfs stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9@readonly stuffpool/containers/ux-1
2016-04-08.01:31:47 zpool import -c /etc/zfs/zpool.cache -aN
2016-04-08.01:43:48 zpool import -c /etc/zfs/zpool.cache -aN
2016-04-19.00:00:30 zpool import -c /etc/zfs/zpool.cache -aN
2016-04-21.18:14:15 zfs create -p -o mountpoint=/var/lib/lxd/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20.zfs stuffpool/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20
2016-04-21.18:14:35 zfs set readonly=on stuffpool/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20
2016-04-21.18:14:36 zfs snapshot -r stuffpool/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20@readonly
2016-04-21.18:14:36 zfs set mountpoint=none stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9
2016-04-21.18:14:41 zfs rename -p stuffpool/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9 stuffpool/deleted/images/f96b6b5d7587150b880e96f872393b7fee53741046b40a76c6db22ed40886bc9
2016-04-24.22:54:03 zpool scrub stuffpool
2016-05-07.22:55:42 zpool import -c /etc/zfs/zpool.cache -aN
2016-05-09.15:20:27 zpool scrub stuffpool
2016-05-17.22:56:53 zfs create -p -o mountpoint=/var/lib/lxd/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5.zfs stuffpool/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5
2016-05-17.22:57:12 zfs set readonly=on stuffpool/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5
2016-05-17.22:57:13 zfs snapshot -r stuffpool/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5@readonly
2016-05-17.22:57:18 zfs destroy -r stuffpool/images/9b03bacc30bcfbe3378e8803daa48ca2d32baa99d111efada484876750e5cc20
2016-05-21.16:47:49 zpool import -c /etc/zfs/zpool.cache -aN
2016-06-09.22:59:47 zpool import -c /etc/zfs/zpool.cache -aN
2016-06-13.20:59:10 zpool import -c /etc/zfs/zpool.cache -aN
2016-06-13.20:59:34 zfs create -p -o mountpoint=/var/lib/lxd/images/49fc7d0d6f01a7639129308b73ad27f5fb7b9d3bb783d905393b6b9e9c4bf1c5.zfs stuffpool/images/49fc7d0d6f01a7639129308b73ad27f5fb7b9d3bb783d905393b6b9e9c4bf1c5
2016-06-13.20:59:54 zfs set readonly=on stuffpool/images/49fc7d0d6f01a7639129308b73ad27f5fb7b9d3bb783d905393b6b9e9c4bf1c5
2016-06-13.20:59:54 zfs snapshot -r stuffpool/images/49fc7d0d6f01a7639129308b73ad27f5fb7b9d3bb783d905393b6b9e9c4bf1c5@readonly
2016-06-13.21:00:00 zfs destroy -r stuffpool/images/4f7a1fe6b71446eba6ee56f49698bd6592f193f731f1c0d9d51b1d199b9b75a5
2016-06-18.02:18:55 zpool import -c /etc/zfs/zpool.cache -aN
2016-06-18.02:27:08 zpool offline stuffpool 1759097636360003165
2016-06-18.02:33:28 zpool detach stuffpool 1759097636360003165
2016-06-18.12:23:26 zpool export stuffpool
2016-06-18.12:24:38 zpool import stuffpool
2016-06-18.12:27:34 zpool add -f stuffpool ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1
2016-06-18.12:31:05 zpool export stuffpool
2016-06-18.13:19:17 zpool import stuffpool

모든 ATA 드라이브는 1TB, SCSI 드라이브는 146GB

이용안내입니다

root@x7550:~# zpool list
NAME        SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
stuffpool  2.85T   162G  2.69T         -     2%     5%  1.00x  ONLINE  -

이것은 내 개인 서버이므로 가동 중지 시간이 문제가 되지 않습니다.

답변1

좋아, 당신 스스로 문제를 좀 일으켰지만 해결 가능한 것 같군요.

첫 번째 실수는 zpool add대신 새 드라이브를 사용하는 것입니다 zpool attach(미러에 추가 장치 연결). 아니면 zpool replace이전 장치가 여전히 풀 메타데이터에 존재하는 것이 더 좋습니다. 장치를 교체하는 올바른 방법은 다음과 같습니다.

# zpool replace stuffpool 1759097636360003165 ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1

또는 더 좋은 점은 물리적 능력이 있는 경우 zpool replace이전 장치와 새 장치가 모두 연결되어 있다는 것입니다(이렇게 하면 풀이 전체적으로 중복 상태로 유지됩니다).

귀하의 오래된 수영장은 기본적으로 수리할 수 없을 정도로 손상되었습니다.이 시점에서는 vdev를 추가한 후 풀에서 vdev를 제거할 수 없으며(vdev 중복 수준 불일치로 인해 -f새 디스크를 풀에 넣어야 할 수도 있음) 두 디스크를 비-디스크로 변환할 하드웨어가 없습니다. 중복 vdev가 양방향 미러링을 시작합니다.

그러나 다음을 수행할 수 있습니다.기존 리소스를 사용하여 새 풀을 구축합니다.

어떤 조치를 취하기 전에 모든 내용을 읽고 각 단계의 내용과 이유를 이해했는지 확인하세요. 너진짜더 이상 문제를 일으키고 싶지 않습니다.

먼저 최신 버전인지 확인하세요.믿을 수 있는데이터를 백업하세요. 저장 공간이 160GB가 조금 넘는다는 점을 고려하면 이는 큰 문제가 되지 않습니다. 또한 zpool scrub풀에 저장된 모든 데이터에 오류가 없는지 확인하는 것이 좋습니다 . 160GB의 경우 이전 정리에서 볼 수 있듯이 완료하는 데 시간이 오래 걸리지 않습니다.

그런 다음 미러에서 드라이브를 분리하여 드라이브 하나를 비웁니다. 예를 들어 미러 0을 분할하고 드라이브 중 하나를 사용하려면 다음을 수행합니다.

# zpool detach stuffpool ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1

stuffpool그러면 3개의 단일 장치 vdev와 1개의 양방향 미러 vdev(mirror-1)가 남게 됩니다 . 그런 다음 용도를 변경할 수 있도록 미러에서 분리된 드라이브의 모든 ZFS 레이블을 지웁니다.

# zpool labelclear /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1

현재 ZFS는 드라이브를 이전 풀의 일부로 인식하지 않습니다. 필요할 수도 있지만 -f맹목적 zpool labelclear으로 추가하지 마세요. 왜 필요한지 이해했는지 확인하세요.

이전 풀의 이름을 바꿉니다(해당 이름을 유지하려는 경우 그렇지 않으면 필요에 따라 아래에서 조정).

# zpool export stuffpool
# zpool import stuffpool stuffpoolold

확보된 드라이브에 새 풀을 만듭니다.

# zpool create -o ashift=12 -O checksum=sha256 -m none -f stuffpool /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1

검증을 위해 SHA-256을 사용하는 것을 권장하지만, -O checksum=sha256원하지 않는 경우 해당 부분을 생략해도 됩니다. -o ashift=12최소 할당 단위로 4,096바이트 블록을 사용하도록 ZFS에 지시합니다. 이는 더 적은 저장 공간 비용으로 고급 포맷 드라이브에서 더 잘 작동합니다.

데이터를 저장하기 위해 풀의 루트 파일 시스템을 사용하지 않는 경우 일부 실패 조건은 복구하기가 더 쉽습니다. 풀에 프록시 루트 파일 시스템을 생성하는 것이 좋습니다.

# zfs create -o mountpoint=/mnt/stuffpoolnew stuffpool/data

이제 기존 풀의 모든 것을 새 풀로 전송합니다. 먼저 이전 풀의 현재 상태에 대한 스냅샷을 만듭니다.

# zfs snapshot stuffpoolold@transfer -r

스냅샷이 성공적으로 생성되었는지 확인하세요. 그 다음에:

# zfs send -R stuffpoolold@transfer | zfs receive -uvF stuffpool/data

시간이 좀 걸립니다. 완료될 때까지 실행한 후 그 동안 발생한 변경 사항을 가져옵니다.

# zfs snapshot stuffpoolold@transfer2 -r
# zfs send -I stuffpoolold@transfer stuffpoolold@transfer2 -Rv | zfs receive stuffpool/data -uv

이 시점에서 풀의 데이터는 모든 의도와 목적에 대해 동일해야 합니다. 크론 작업이나 유사한 작업을 실행하여 풀에 쓰는 경우 zfs send -I ...단일 사용자 모드에서 두 번째 스냅샷을 생성하여 풀에 데이터가 추가되는 위험을 줄이는 것이 좋습니다.

기존 풀을 대체할 새 풀을 설정합니다.

# zfs get mountpoint stuffpoolold
... this will give you a mountpoint directory ...
# zpool export stuffpoolold
# zfs set mountpoint=...mountpoint_directory_from_above... stuffpool/data
# zpool export stuffpool
# zpool import stuffpool

이제 단일 장치로만 구성된 새로운 zpool이 생겼습니다. 스크러빙하여 데이터가 괜찮은지 확인합니다.

# zpool scrub stuffpool

완료되고 오류가 발견되지 않으면 기존 디스크를 새 풀로 마이그레이션을 진행합니다. 이전 풀을 가져올 수 있는 상태로 유지하려면(위의 미러 0의 두 번째 드라이브를 사용했기 때문에) 이전 남은 미러 1 쌍의 두 번째 드라이브로 시작합니다.

# zpool labelclear /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1009C03158BP-part1
# zpool attach stuffpool /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1 /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1009C03158BP-part1

zpool status stuffpool아래와 같이 단일 양방향 미러링 vdev 풀이 있는지 확인하십시오 .

root@x7550:~# zpool status stuffpool
  pool: stuffpool
 state: ONLINE
  scan: scrub repaired 0 in 0h6m with 0 errors on ...
config:

    NAME                                               STATE     READ WRITE CKSUM
    stuffpool                                          ONLINE       0     0     0
      mirror-0                                         ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1  ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1009C03158BP-part1  ONLINE       0     0     0

이제 원래 원했던 방식으로 두 개의 미러 vdev를 추가하세요. 먼저 장치에 태그를 지정하고 지워야 합니다. 그렇지 않으면 ZFS에서 장치가 이미 내보내기 풀의 일부라고 불평합니다. 다시 말하지만, 필요할 수도 -f있지만zpool labelclear절대적으로하지맹목적 -f으로 에 추가되었습니다 zpool add. (이렇게 해야 한다면 제가 어딘가에서 실수를 한 것입니다.)

# zpool labelclear /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1
# zpool labelclear /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1
# zpool labelclear /dev/disk/by-id/scsi-35000c50016ebcdfb-part1
# zpool labelclear /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1
# zpool add stuffpool mirror /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1
# zpool add stuffpool mirror /dev/disk/by-id/scsi-35000c50016ebcdfb-part1 /dev/disk/by-id/ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1

다시 문지릅니다(모두가 깨끗하고 깔끔한 수영장을 좋아하기 때문에).

# zpool scrub stuffpool

이 시점에서 풀은 처음부터 원하는 것처럼 보일 것입니다.

root@x7550:~# zpool status
  pool: stuffpool
 state: ONLINE
  scan: scrub repaired 0 in 0h6m with 0 errors on ...
config:

    NAME                                               STATE     READ WRITE CKSUM
    stuffpool                                          ONLINE       0     0     0
      mirror-0                                         ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1  ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1009C03158BP-part1  ONLINE       0     0     0
      mirror-1                                         ONLINE       0     0     0
        ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1  ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1  ONLINE       0     0     0
      mirror-2                                         ONLINE       0     0     0
        scsi-35000c50016ebcdfb-part1                   ONLINE       0     0     0
        ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1  ONLINE       0     0     0

이제 풀의 균형이 맞지 않습니다(거의 모든 데이터는 미러-0에 있으며 다시 작성될 때까지 거기에 유지됩니다. ZFS에는 비슷한 것이 부족하지만 btrfs rebalance여전히 현명하게 사용하여 수정할 수 있습니다 zfs send ... | zfs receive). 필요한 레이아웃과 중복성이 계획되어 있습니다. 시작할 때.

여러 단계로 이루어진 긴 과정이지만 천천히 하고 각 단계마다 무엇을 하는지 주의 깊게 생각하면 특별히 위험하지는 않습니다.

장점은 드라이브 하나를 채우는 것보다 풀에 데이터가 훨씬 적다는 것입니다. 수영장이 거의 가득 차면 상황이 훨씬 더 복잡해집니다.

답변2

다행히 풀에는 160GB의 데이터만 있습니다.

약 160GB의 백업 데이터를 저장할 수 있는 충분한 여유 공간이 있는 다른 파일 시스템에 디렉터리가 있거나 압축 후( /var/backup/예제에서는 사용함) 그 이하인 경우 다음을 수행할 수 있습니다.

먼저 에 쓰고 있을 수 있는 모든 작업을 종료합니다 . 에 쓰고 stuffpool있을 수 있는 cron 등의 작업이 있는 경우 .crondatdstuffpool

stuffpoolwith의 전체 백업을 생성 zfs send -R하고 파일에 저장합니다.

zfs snapshot stuffpool@fullbackup
zfs send -R stuffpool@fullbackup | gzip > /var/backup/stuffpool.zfs.send.gz

그런데 압축된 백업은 디스크 공간을 덜 차지할 뿐만 아니라 백업 및 복원에도 시간이 덜 걸립니다. 사용된 CPU 시간 gzip은 거의 항상 읽기/쓰기에 표시된 것보다 훨씬 적습니다. 디스크의 데이터가 줄어들어 시간이 절약됩니다. 디스크 I/O는 병목 현상이며 일반적으로 압축보다 시간이 더 오래 걸립니다.

다음으로 현재 풀 삭제를 사용합니다 zfs destroy stuffpool.

다음 명령을 사용하여 stuffpool을 다시 만듭니다.

zpool create -o ashift=12 -o checksum=sha256 -f \
  mirror \
    ata-HGST_HTS721010A9E630_JR10004M0M17TE-part1 \
    ata-HGST_HTS541010A9E680_JA1009C03158BP-part1 \
  mirror \
    ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 \
    ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1 \
  mirror \
    scsi-35000c50016ebcdfb-part1 \
    ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1

마지막으로 stuffpool다음 명령을 사용하여 복원합니다.

zcat /var/backup/stuffpool.zfs.send.gz | zfs receive stuffpool -v -d

필요한 경우 스냅샷을 삭제하여 풀을 정리할 수 있습니다 fullbackup.

zfs destroy stuffpool@fullbackup

또는 풀을 재구축해야 할 때 특정 시점 스냅샷으로 유지할 수 있습니다.

삭제할 수 있습니다 /var/backup/stuffpool.zfs.send.gz.


기존 파일 시스템에 여유 디스크 공간이 충분하지 않은 경우 기존 스터프풀에서 미러 디스크 중 하나를 분리하고 포맷한 후 임시로 파일을 저장하는 데 사용할 수 있습니다 stuffpool.zfs.send.gz.

예를 들어 ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1:

zpool detach stuffpool ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1

mkfs.ext4 /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1
mount /dev/disk/by-id/ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 /mnt

zfs snapshot stuffpool@fullbackup
zfs send -R stuffpool@fullbackup | gzip > /mnt/stuffpool.zfs.send.gz

zfs destroy stuffpool

zpool create -o ashift=12 -o checksum=sha256 -f \
    ata-HGST_HTS541010A9E680_JA1009C03158BP-part1 \
  mirror \
    ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 \
    ata-HGST_HTS541010A9E680_JA1000102MG9UR-part1 \
  mirror \
    scsi-35000c50016ebcdfb-part1 \
    ata-HGST_HTS541010A9E680_JA109NDW206MAS-part1

zcat /mnt/stuffpool.zfs.send.gz | zfs receive stuffpool -v -d

umount /mnt

zpool attach -f stuffpool \
    ata-HGST_HTS541010A9E680_JA1009C03158BP-part1 \
    ata-HGST_HTS721010A9E630_JR10004M0LGN6E-part1 

관련 정보