mdadm --zero-superblock для всех устройств мдраида?
Я не нашел способа удалить mdraid с сервера одной командой.
Я могу остановить это черезmdadm --stop /dev/md0
Но суперблок все еще в устройствах.
mdadm --zero-superblock DEVICE
требуется каждое устройство (например, /dev/sdb1)
Я знаю, что могу сделать, и тогда вижу устройства.
Я мог бы написать хрупкий скрипт для извлечения строк /dev/sd... из выводаmdadm --detail /dev/md0
, но мне бы хотелось этого избежать.
Есть ли однострочный способ снять суперблок со всех устройств мдраида?
Я хотел бы избежать анализа выводаmdadm --detail
, так как это кажется хрупким.
3 ответа
Если вы знаете устройства компонентов массива, вы можете просто выдать что-то вроде
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
Нет ни одной команды(mdadm …
), что снимет суперблок со всех устройств мдраида. Однако написать сценарий, который затем станет однострочным, довольно просто:
#!/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
команда запускается только в том случае и там, где это абсолютно необходимо
Вы можете сделать это с помощью небольших манипуляций.
Сначала получите интересующий вас рейд-массив.
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
Если вы просто хотите уничтожить все рейд-массивы 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
чтобы люди не были небрежны при копировании/вставке!