Вопрос или проблема
Для того чтобы начать с чистого состояния, мне нужно сбросить жесткий диск в пустое состояние из командной строки.
Дело не в использовании утилиты для шифрования, данные не обязательно должны быть перезаписаны.
Этот вопрос довольно похож на Удаление всех разделов из командной строки
Решение там работает довольно хорошо,
dd if=/dev/zero of=/dev/sda bs=512 count=1 conv=notrunc
но если я хочу работать с таким перезаписанным диском, то получаю ошибку, что устройство все еще используется.
root@grml ~ # blockdev --rereadpt /dev/sda
BLKRRPART: Устройство или ресурс заняты
или
root@grml ~ # partprobe
Ошибка: Раздел(ы) 2, 3 на /dev/sda были записаны, но мы не смогли уведомить ядро о изменении, вероятно, потому что они используются. В результате старые разделы останутся в использовании. Вам следует перезагрузиться прежде чем вносить дальнейшие изменения.
Ошибка: Раздел(ы) 2, 3 на /dev/sdb были записаны, но мы не смогли уведомить ядро о изменении, вероятно, потому что они используются. В результате старые разделы останутся в использовании. Вам следует перезагрузиться прежде чем вносить дальнейшие изменения.
Поэтому мне нужно вручную отключить все, что “сидит” на устройстве
umount /mnt/debootstrap
umount /mnt/debootstrap/tmp
umount /mnt/debootstrap/var/log
umount /mnt/debootstrap/var
umount /mnt/debootstrap/home
service mdadm stop
service lvm2 stop
vgremove vg_main
pvremove /dev/md1
mdadm --stop /dev/md0
mdadm --stop /dev/md1
mdadm --remove /dev/md0
mdadm --remove /dev/md1
после этого команда partprobe
работает.
Существует ли какая-то команда, которая работает проще? Например
harddiskreset /dev/sda
чтобы ее можно было легко использовать на системах с различным разбиением/lvm/md?
Программа wipefs
(пакет Debian/Ubuntu: util-linux) позволяет вам легко удалить подпись таблицы разделов:
wipefs -a /dev/sda
Тем не менее, вам все еще нужно остановить любые процессы, использующие устройство, такие как LVM.
Из man wipefs
wipefs может удалить подписи файловых систем, RAID или таблицы разделов (магические строки) с заданного устройства, чтобы сделать подписи невидимыми для libblkid.
wipefs не удаляет саму файловую систему, а также любые другие данные с устройства. При использовании без каких-либо опций, wipefs отображает все видимые файловые системы и смещения их основных подписей.
wipefs вызывает ioctl BLKRRPART, когда он стер подпись таблицы разделов, чтобы уведомить ядро о изменении.
Я всегда использовал parted для этого. Он хорошо работает для изменения типа метки диска и добавления/удаления разделов, особенно поскольку он может обрабатывать современные большие HDD в отличие от fdisk.
Вы можете запустить
$ sudo parted /dev/sda
Это запустит процесс и откроет терминал parted. Затем вы можете выполнить команду помощи, чтобы показать все доступные команды. Это довольно самообъясняюще.
Я упомяну, что да, вам нужно, чтобы все разделы диска, который вы хотите отформатировать, были размонтированы. Если вы просто хотите более быстрый способ размонтировать все разделы, я полагаю, вы можете сделать это с помощью regex в команде umount, но это кажется глупым.
Используя parted для управления HDD, мне никогда не приходилось принудительно обновлять диск или что-то подобное.
Чтобы полностью обновить диск для нового использования, я обычно делаю следующее:
1) запускаю parted, выполнив sudo parted /dev/sda
2) нахожу любые существующие разделы, выполнив print
3) удаляю существующие разделы, выполнив rm 1
, заменяя 1 на номер раздела, который вы хотите удалить. Затем повторите для всех оставшихся разделов на диске.
4) сбрасываю метку диска, выполнив mklabel gpt
. Я использую тип метки gpt, но вы можете использовать стандартный msdos или что-либо еще по вашему выбору. Вот список типов меток диска
5) создаю новые разделы, выполнив mkpart
. Это проведет вас через процедуру создания раздела. Начальные и конечные точки по умолчанию устанавливаются на сектора. Вы можете изменить это, выполнив команду unit
перед выполнением mkpart
. Таким образом, вы можете указать это в ГБ или ТБ или МБ и т. д.
6) проверяю ваши результаты, используя print
для просмотра информации о новой таблице разделов
7) Затем вам нужно отформатировать разделы. Это не должно быть сделано через parted, хотя некоторые опции для этого доступны. Я бы предложил вместо этого выйти из терминала parted, выполнив quit
, а затем использовать mkfs
для форматирования разделов. Не забудьте выполнить ‘mkfs’ на /dev/sda1 вместо /dev/sda, потому что вы форматируете раздел, а не диск в целом.
Вот и все.
Надеюсь, это отвечает на ваш вопрос.
Также вот онлайн-руководство по parted для справки: https://www.gnu.org/software/parted/manual/html_node/index.html
ИЗМЕНЕНИЕ:
Автор вопроса хотел сделать это из скрипта, а не из терминала. Вы можете выполнить ту же процедуру через скрипт, запустив parted через однострочные команды, а не в терминале parted.
Например, команда
$ sudo parted /dev/sda print
выведет информацию о диске и таблицу разделов в консоль bash, которую затем можно будет обработать с помощью grep и т. д. для создания переменных или чего угодно в bash-скрипте.
Используйте улучшенную неинтерактивную версию fdisk, которая называется sfdisk
Чтобы стереть таблицу разделов, используйте эту команду:
sfdisk --delete /dev/sda
Очень запоздалый ответ, который, надеюсь, поможет кому-то:
Я использовал следующий скрипт для стирания всего диска и воссоздания одного раздела с 100% использованием, как ниже:
#!/bin/bash
DEVICE=$1
TARGET=$2
sudo dd if=/dev/zero of=${DEVICE} bs=1M count=10
sudo partprobe -s "${DEVICE}"
echo -e 'mktable gpt\nmkpart primary xfs 0% 100%\nquit' | sudo parted "${DEVICE}"
sudo partprobe -s "${DEVICE}"
sudo mkfs.xfs "${DEVICE}"1
sudo partprobe -s "${DEVICE}"
sleep 3
echo $(sudo lsblk -o UUID "${DEVICE}"1 |fmt -w 2000 |tr ' ' =) "${TARGET}" xfs defaults 0 0 | sudo tee -a /etc/fstab
Заметки:
- Используйте
dd
на первых 10 М диска для стирания GPT - Используйте
parted
для создания новой GPT и одного первичного раздела, начинающегося с0%
и заканчивающегося на100%
(типаXFS
), используяecho -e
для передачи команд в parted. - Добавьте запись для него в
/etc/fstab
- Также требуется
sudo systemctl daemon-reload
на последних системах, использующихsystemd-mountd
. partprobe
разбросан по командам для обновления ядра о изменениях- Небольшая задержка добавляется между форматированием и использованием новой информации UUID, чтобы позволить изменениям распространиться по интерфейсам ядра (если нет, есть вероятность повреждения записи в
/etc/fstab
) - Параметризовано для использования устройства и новой точки монтирования.
- ПРЕДУПРЕЖДЕНИЕ: НЕ ИСПОЛЬЗУЙТЕ НА ЗАУСТРОЧЕННОМ ДИСКЕ, который будет стерто, без вопросов.
- Дополнительная заметка – Когда диск будет удален, запись для этого раздела должна быть удалена из
/etc/fstab
, и systemd обновлен сsudo systemctl daemon-reload
.
В основном, эта ошибка
Ошибка: Раздел(ы) 1 на /dev/sdc были записаны, но мы не смогли уведомить ядро о изменении, вероятно, потому что они используются. В результате старые разделы останутся в использовании. Вам следует перезагрузиться прежде чем вносить дальнейшие изменения.
появляется, когда вы пропускаете какой-то параметр при разбивке диска. Вы можете исправить эту ошибку, внимательно проверив параметры, которые вы определили во время разбиения.
Используйте:
fdisk -l
, чтобы проверить параметры вашего диска:
Ответ или решение
Для сброса жесткого диска (удаления MBR и разделов) с помощью командной строки без перезагрузки, вы можете использовать несколько различных методов. Базируясь на особенностях вашей задачи и предоставленной информации, я предлагаю вам детальное руководство по выполнению данной процедуры.
Инструменты и команды
- wipefs: Позволяет удалить сигнатуры таблицы разделов.
- parted: Удобный инструмент для управления разделами на дисках.
- dd: Для манипуляции с первым сектором диска.
- sfdisk: Для удаления таблицы разделов.
- blockdev: Для обновления информации о разделах в ядре.
Скрипт для сброса жесткого диска
Приведенный ниже скрипт демонстрирует, как можно автоматизировать процесс сброса жесткого диска с использованием указанных инструментов. Этот скрипт будет работать, если вы запускаете его с правами администратора.
#!/bin/bash
DEVICE=$1
# Проверка на наличие аргумента
if [ -z "$DEVICE" ]; then
echo "Использование: $0 /dev/sdX"
exit 1
fi
# Отключение всех разделов, использующих устройство
echo "Отключение всех разделов на $DEVICE..."
for part in $(ls ${DEVICE}*[0-9]); do
umount $part 2>/dev/null
done
# Остановка LVM и RAID, если используются
if command -v lvm &> /dev/null; then
echo "Остановка LVM..."
vgchange -an
fi
if command -v mdadm &> /dev/null; then
echo "Остановка RAID..."
for md in $(ls /dev/md*); do
mdadm --stop $md 2>/dev/null
done
fi
# Удаление сигнатур таблиц разделов
echo "Удаление сигнатур таблиц разделов..."
wipefs -a "$DEVICE"
# Удаление таблицы разделов
echo "Удаление таблицы разделов..."
sfdisk --delete "$DEVICE"
# Прочие команды для сброса MBR (опционально)
echo "Сброс MBR..."
dd if=/dev/zero of=$DEVICE bs=512 count=1 conv=notrunc
# Обновление ядра о изменениях
echo "Обновление конфигурации устройства в ядре..."
partprobe "$DEVICE" || echo "Ошибка: не удалось обновить информацию о разделе"
echo "Сброс жесткого диска завершён."
Примечания по использованию скрипта:
- Параметр DEVICE: Передайте в скрипт имя устройства (например,
/dev/sda
). - Права администратора: Скрипт требует прав суперпользователя, так что используйте
sudo
. - Остановка служб: Проверьте и остановите все активные службы, использующие диск, прежде чем продолжить. Это может быть LVM, RAID, или монтированные файловые системы.
- Восстановление функциональности: После выполнения скрипта, вы сможете заново создать таблицу разделов или отформатировать диск, как вам необходимо.
Заключение
Этот скрипт позволяет безопасно и эффективно сбросить диск до пустого состояния. Несмотря на то, что система может иногда потребовать перезагрузку, правильное выполнение всех вышеперечисленных команд обеспечит работоспособность диска без необходимости перезагрузки.