Comment réinitialiser un disque dur (supprimer Mbr & supprimer des partitions) de la ligne de commande avec un script sans redémarrer?

8

Pour commencer à partir d'un état propre, je dois réinitialiser le disque dur à un état vide à partir de la ligne de commande.

Il ne s'agit pas d'exécuter un utilitaire de nettoyage, les données ne doivent pas être écrasées.

Cette question est assez similaire à la suppression de toutes les partitions de la ligne de commande

La solution fonctionne plutôt bien,

dd if=/dev/zero of=/dev/sda bs=512 count=1 conv=notrunc

mais si je veux travailler avec un tel disque écrasé, je reçois l'erreur que le périphérique est toujours en cours d'utilisation.

root@grml ~ # blockdev --rereadpt /dev/sda
BLKRRPART: Device or resource busy

ou

root@grml ~ # partprobe
Error: Partition(s) 2, 3 on /dev/sda have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.  As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.
Error: Partition(s) 2, 3 on /dev/sdb have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.  As a result, the old partition(s) will remain in use.  You should reboot now before making further changes.

Je dois donc désactiver manuellement tout ce qui "se trouve" sur l'appareil

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

après cela, la partprobecommande fonctionne.

existe-t-il une commande qui fonctionne plus simplement? comme

harddiskreset /dev/sda

donc il peut facilement être utilisé sur des systèmes avec une disposition de partition / lvm / md différente?

c33s
la source
1
Outre le redémarrage, quelle est la recommandation de ce dernier? Quel est le contexte ici?
Michael Hampton
je ne sais pas si je comprends vos questions. je veux amorcer un système debian avec un script bash qui utilise setup-storage. pour garantir que le script fonctionne toujours, le disque dur du système cible doit être vidé / réinitialisé avant. est-ce le contexte que vous avez demandé? alors je voudrais étendre ma question. cela ne m'a pas semblé pertinent, car je suis juste à la recherche d'une commande capable de supprimer mbr & partitions du disque dur ...
c33s
Vous devez effacer le MBR avant de configurer les partitions. Il semble qu'ici, vous le fassiez après les avoir configurés!
Michael Hampton
Ah ha! J? ai compris. Pour le faire fonctionner (à partir d'un LiveCD), j'ai d'abord dû faire ceci: sudo wipefs -a / dev / sdb - fdisk -l n'a montré aucune table de partition sur / dev / sdb - puis - sudo dd if = / dev / sda of = / dev / sdb a travaillé pour créer une copie de démarrage du lecteur principal.
SDsolar

Réponses:

5

Le wipefsprogramme vous permet de supprimer facilement la signature de la table de partition:

wipefs -a /dev/sda

Cependant, vous devez toujours arrêter tout processus utilisant l'appareil, comme LVM.

De man wipefs

wipefs peut effacer les signatures de système de fichiers, de raid ou de table de partition (chaînes magiques) du périphérique spécifié pour rendre les signatures invisibles pour libblkid.

wipefs n'efface pas le système de fichiers lui-même ni aucune autre donnée de l'appareil. Lorsqu'il est utilisé sans aucune option, wipefs répertorie tous les systèmes de fichiers visibles et les décalages de leurs signatures de base.

wipefs appelle l'ioctl BLKRRPART lorsqu'il a effacé une signature de table de partition pour informer le noyau de la modification.

user144437
la source
2

J'ai toujours utilisé simplement séparé pour cela. Il fonctionne bien pour changer le type d'étiquette de disque et ajouter / supprimer des partitions, d'autant plus qu'il peut gérer les grands disques durs modernes contrairement à fdisk.

Tu peux courir

$ sudo parted /dev/sda

Cela fera démarrer les choses et vous amènera dans le terminal séparé. Vous pouvez ensuite exécuter la commande d'aide pour afficher toutes les commandes disponibles. C'est très explicite.

Je mentionnerai que oui, vous devez avoir toutes les partitions du disque que vous souhaitez formater non montées. Si vous cherchiez simplement un moyen plus rapide de démonter toutes les partitions, je suppose que vous pourriez le faire avec une regex dans la commande umount mais cela semble idiot.

En utilisant parted pour gérer le disque dur, je n'ai jamais eu à forcer un rafraîchissement du disque ou quelque chose de similaire.

Pour actualiser complètement un lecteur pour une toute nouvelle utilisation, je procède généralement comme suit:

1) commencer à se séparer en courant sudo parted /dev/sda

2) trouver toutes les partitions existantes en exécutant print

3) supprimez les partitions existantes en exécutant le rm 1remplacement de 1 par le numéro de partition que vous souhaitez supprimer. Répétez ensuite pour toutes les partitions restantes sur le disque.

4) réinitialiser le disklabel en exécutant mklabel gptJ'utilise le type d'étiquette gpt mais vous pouvez utiliser les msdos standard ou quelle que soit votre préférence. Voici une liste des types d'étiquettes de disque

5) Créez de nouvelles partitions en exécutant mkpartCela vous fera parcourir l'assistant de création de partition. Les points de début et de fin sont définis par défaut sur les secteurs. Vous pouvez changer cela en exécutant la unitcommande avant d'exécuter. De mkpartcette façon, vous pouvez la spécifier en Go ou TB ou MB etc.

6) Vérifiez vos résultats en utilisant printpour afficher vos nouvelles informations sur la table de partition

7) Vous devez ensuite formater les partitions. Cela ne devrait pas être fait par parted bien que certaines options soient disponibles. Je suggérerais plutôt de courir quitpour quitter le terminal séparé, puis d'utiliser mkfspour formater les partitions. N'oubliez pas d'exécuter 'mkfs' sur / dev / sda1 au lieu de / dev / sda car vous formatez la partition et non le disque dans son ensemble.

C'est à peu près ça.

J'espère que cela répond à votre question.

En outre, voici le manuel séparé en ligne pour référence: https://www.gnu.org/software/parted/manual/html_node/index.html

ÉDITER:

L'OP voulait faire ce genre de chose à partir d'un script et non à partir d'un terminal. Vous pouvez effectuer le même type de procédure via un script en exécutant parted via des commandes sur une seule ligne plutôt que dans le terminal parted.

Par exemple la commande

$ sudo parted /dev/sda print

Imprime les informations du lecteur et la table de partition sur la console bash qui peut ensuite être manipulée à l'aide de grep, etc. pour créer des variables ou tout ce que vous voulez dans un script bash.

KroniK907
la source
j'en ai besoin automatisé à partir d'un script non manuellement depuis le terminal
c33s
Attendez que votre message d'origine ne mentionne pas de script. Quelle partie de ceci écrivez-vous? Je pense que vous pouvez exécuter des commandes séparées sans entrer dans le terminal séparé. Je n'en suis pas sûr cependant.
KroniK907
Juste pour confirmer, vous pouvez exécuter parted à partir de commandes sur une seule ligne. Par exemple parted /dev/sda print, imprimera la table de partition pour / dev / sda. Vous pouvez faire la même chose que je décris ci-dessus uniquement avec des commandes d'une seule ligne si vous devez le faire dans un script bash.
KroniK907
mais je dois savoir quel sera le nom du périphérique pour utiliser la commande parted /dev/sdaaussi je dois savoir combien de partitions sont sur le lecteur à appeler rm 1, je cherche une commande pour simplement nettoyer le disque, donc je peux le repartitionner, sans faire tout le travail manuel pour arrêter les md en supprimant les lv et ainsi de suite.
c33s
1) vous devez encore savoir quel sera le nom du périphérique pour exécuter une commande dd ... vous ne savez pas ce que vous en pensez. Accédez simplement dfsi le lecteur est monté. Comment prévoyez-vous de créer un "script" si vous ne pouvez pas obtenir l'emplacement du lecteur? 2) il est assez facile d'exécuter parted $drive printet de grep les résultats pour trouver tous les numéros de partition disponibles, puis les stocker dans un tableau. Utilisez ensuite ces valeurs pour exécuter parted $drive rm $partition. Tout cela est un script bash assez simple.
KroniK907
0

Utiliser une version non interactive améliorée de fdisk, qui est sfdisk

Pour effacer la table de partition, utilisez cette commande:

sfdisk --delete /dev/sda
Suncatcher
la source
0

Fondamentalement, cette erreur

Erreur: la ou les partitions 1 sur / dev / sdc ont été écrites, mais nous n'avons pas pu informer le noyau du changement, probablement parce qu'elles sont en cours d'utilisation. Par conséquent, les anciennes partitions resteront utilisées. Vous devez redémarrer maintenant avant d'apporter d'autres modifications.

s'affiche lorsque vous manquez un paramètre lors du partitionnement de votre disque. Vous pouvez corriger cette erreur en examinant attentivement les paramètres que vous avez définis lors du partitionnement.

Utilisez: fdisk -lpour vérifier les paramètres de votre disque:

user569959
la source