mdadm --zero-superblock для всех устройств mdraid?

mdadm --zero-superblock для всех устройств mdraid?

Я не нашел способа удалить 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перед обнулением выполняется проверка суперблока, поэтому указание sd*в команде вышедолжентолько касаться компонентов дисков, не записывая ничего на другие. Однако ясильноне советую этого делать: любые проблемы с маршрутизацией обнаружения суперблока или использованием --forceприведут к перезаписи хороших данных на некомпонентных дисках (что приведет к потере данных). Изстраница руководства:

Если устройство содержит допустимый суперблок md, блок перезаписывается нулями. С --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

Пример использования, предполагающий, что скрипт вызван mdzeroи находится в PATH и т. д., а нежелательное устройство 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" в ответ на вопрос "Остановить и стереть?" - или команда не будет запущена неинтерактивно - инструмент завершит работу в этот момент. По сути, у вас есть более 20 строк проверки работоспособности, чтобы гарантировать, что активная mdadm --zero-superblockкоманда будет запущена только тогда и там, где это абсолютно необходимо

решение3

Это можно blkidсделать с помощью небольшой манипуляции.

Сначала приобретите нужный вам рейдовый массив.

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

Преобразуйте UUID в правильный формат UUID, и вы сможете использовать его blkidдля извлечения всех участников диска.

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

Если вы просто хотите уничтожить все RAID-массивы mdadm, вам не нужно собирать какие-либо другие идентификаторы:

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-массиве, о котором идет речь. Я добавил, -nчтобы люди не были небрежны с копированием/вставкой!

Связанный контент