mdadm --mdraid의 모든 장치에 대한 zero-superblock?

mdadm --mdraid의 모든 장치에 대한 zero-superblock?

하나의 명령으로 서버에서 mdraid를 제거할 방법을 찾지 못했습니다.

다음을 통해 중지할 수 있습니다.mdadm --stop /dev/md0

그러나 슈퍼블록은 여전히 ​​장치에 있습니다.

mdadm --zero-superblock DEVICE모든 장치가 필요합니다(예: /dev/sdb1)

나는 할 수 있다는 것을 알고 mdadm --detail /dev/md0장치를 봅니다.

의 출력에서 ​​/dev/sd... 문자열을 가져오기 위해 취약한 스크립트를 작성할 수 있지만 mdadm --detail /dev/md0이를 피하고 싶습니다.

mdraid의 모든 장치에서 슈퍼블록을 제거하는 단일 라이너가 있습니까?

나는 의 출력을 파싱하는 것을 피하고 싶습니다 mdadm --detail. 왜냐하면 이것은 취약하다고 느껴지기 때문입니다.

답변1

어레이 구성 요소 장치를 알고 있다면 간단히 다음과 같이 발행할 수 있습니다.

mdadm --zero-superblock /dev/sd[abcd]

단일 명령으로 여러 장치에서 슈퍼블록을 제거합니다.

mdadm아무것도 0으로 설정하기 전에 슈퍼블록을 확인하므로 sd*위 명령에 지정하십시오.~해야 한다다른 디스크에는 아무것도 쓰지 않고 구성 요소 디스크만 만집니다. 그러나 나는강하게그렇게 하지 말 것을 제안합니다. 슈퍼블록 감지 라우팅 또는 사용에 문제가 있으면 --force비구성 요소 디스크의 양호한 데이터를 덮어쓰게 되어 데이터 손실이 발생합니다. 로부터매뉴얼 페이지:

장치에 유효한 md 수퍼블록이 포함되어 있으면 해당 블록을 0으로 덮어씁니다. --force를 사용하면 슈퍼블록이 있을 블록이 유효하지 않은 것처럼 보이더라도 덮어쓰게 됩니다.

위의 이유로 어레이 구성 요소 장치를 모르는 경우 다음을 통해 나열하는 것이 좋습니다.

blkid -t TYPE="linux_raid_member" -o device

그런 다음 mdadm --zero-superblock. 이는 한 줄의 bash 명령으로 스크립트할 수 있습니다.

for dev in `blkid -t TYPE="linux_raid_member" -o device`; do echo "zeroing $dev"; mdadm --zero-superblock $dev; done

언제나처럼,데이터 손실을 방지하려면 해당 명령을 세 번 확인하세요.

편집하다:출력 구문 분석에 의존하지 않고 배열 구성 요소 장치를 검색하려면 mdadm --detail를 사용할 수 있습니다 lsblk. 예를 들어 장치를 통해 생성된 테스트 배열에서는 다음과 같습니다 loop.

# lsblk -l -n -s /dev/md127
md127   9:127  0  255M  0 raid1
loop5   7:5    0  256M  0 loop
loop6   7:6    0  256M  0 loop

답변2

mdadm …mdraid의 모든 장치에서 슈퍼블록을 제거하는 단일 명령( )은 없습니다 . 그러나 한 줄짜리 스크립트를 작성하는 것은 매우 간단합니다.

#!/bin/bash
md=$1
[ ! -b "$md" ] && { echo "ERROR: Not a block device: $md" >&2; exit 1; }

# Collect the slices
slices=($(mdadm --detail "$md" 2>/dev/null | awk '/active/{print $NF}'))
[ ${#slices} -eq 0 ] && { echo "ERROR: No slices found for $md" >&2; exit 1; }

# Sanity check
if [ -t 2 ]
then
    echo "Active MD RAID $md has slices: ${slices[*]}" >&2
    if [ -t 0 ]
    then
        read -p 'Stop and erase (Y/n)? ' yn
        [ ! "$yn" = 'Y' ] && exit 1
    fi
fi

# Stop the array
echo "Stopping: $md" >&2
if ! mdadm --stop "$md"
then
    echo "ERROR: Cannot stop: $md" >&2
    exit 1
fi

# Erase the slices
for slice in "${slices[@]}"
do
    echo "Zero: $slice" >&2
    mdadm --zero-superblock "$slice"
done

# All done
exit 0

스크립트가 호출되고 mdzeroPATH 등에 있고 원하지 않는 RAID 장치가 있다고 가정하는 사용 예는 다음과 같습니다 /dev/md1.

mdzero /dev/md1

Active MD RAID /dev/md1 has slices: /dev/dm-2 /dev/dm-3 /dev/dm-4
Stop and erase (Y/n)? Y
Stopping: /dev/md1
mdadm: stopped /dev/md1
Zero: /dev/dm-2
Zero: /dev/dm-3
Zero: /dev/dm-4

"중지하고 지우시겠습니까?"라는 질문에 대한 응답으로 (대문자) "Y"를 입력하지 않는 한 질문 - 또는 명령이 비대화형으로 실행되는 경우 - 도구는 해당 시점에서 종료됩니다. 기본적으로 활성 mdadm --zero-superblock명령이 절대적으로 의도된 경우에만 실행되도록 보장하는 20개 이상의 온전성 검사 라인이 있습니다.

답변3

blkid약간의 조작을 통해 이 작업을 수행할 수 있습니다 .

먼저, 원하는 레이드 어레이를 구입하세요.

mdadm --detail /dev/md0
...
UUID : 8c9c9aa9:0c574535:e9080607:7ac4c6d8

blkidUUID를 적절한 UUID 형식으로 변환하면 모든 디스크 구성원을 꺼내는 데 사용할 수 있습니다 .

blkid -t UUID=8c9c9aa9-0c57-4535-e908-06077ac4c6d8 --output device
/dev/nvme1n1p3
/dev/nvme0n1p3

모든 mdadm raid 배열을 폭파하려는 경우 다른 식별자를 수집할 필요가 없습니다.

blkid -t TYPE="linux_raid_member" --output device
/dev/nvme1n1p2
/dev/nvme1n1p3
/dev/nvme0n1p2
/dev/nvme0n1p3

이 방법을 사용하여 모든 것을 폭발시키려면 wipefs. 다음과 같이 보일 수 있습니다..

blkid -t TYPE="linux_raid_member" --output device | xargs wipefs -n

물론 이렇게 하면 문제의 특정 RAID 어레이에 신경 쓰지 않고 모든 디스크의 모든 RAID 어레이가 0이 됩니다. -n사람들이 부주의하게 복사/붙여넣기를 하는 것을 방지하기 위해 a를 추가했습니다 !

관련 정보