web-dev-qa-db-fra.com

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

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 à 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 commande partprobe 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?

8
c33s

Le programme wipefs 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.

5
user144437

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) lancez la séparation en exécutant Sudo parted /dev/sda

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

3) supprimez les partitions existantes en exécutant rm 1 en remplaçant 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éinitialisez le disklabel en exécutant mklabel gpt J'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 disques

5) Créez de nouvelles partitions en exécutant mkpart Cela 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 commande unit avant d'exécuter mkpart De cette façon, vous pouvez le spécifier en Go ou TB ou Mo, etc.

6) Vérifiez vos résultats à l'aide de print pour 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 d'exécuter quit pour quitter le terminal séparé, puis d'utiliser mkfs pour 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 sur le 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.

2
KroniK907

Utilisez 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
0
Suncatcher