Essuyez le dernier 1 Mo d'un disque dur

25

Existe-t-il une commande simple que je peux utiliser pour mettre à zéro le dernier 1 Mo d'un disque dur?

Pour le début du lecteur je le ferais dd if=/dev/zero of=/dev/sdx bs=1M count=1. L' seekoption pour dd semble prometteuse, mais est-ce que quelqu'un a un moyen facile de déterminer exactement jusqu'où je dois chercher?

J'ai une appliance RAID matérielle, qui stocke une partie de la configuration RAID à la fin du lecteur. J'ai besoin de l'appliance RAID pour voir les disques comme non configurés, donc je veux supprimer la configuration RAID sans avoir à passer le temps de faire un nettoyage complet des disques. J'ai une douzaine de disques de 2 To, et un effacement complet de tous ces disques prendrait beaucoup de temps.

Zoredache
la source

Réponses:

22

La manière la plus simple sur Linux pour obtenir la taille du disque est de blockdev --getsz:

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))
psusi
la source
Excellent, je savais qu'il devait y avoir un outil qui pourrait facilement obtenir la taille.
Zoredache
1
Bien que j'aime la solution, utiliser sdacomme exemple est horriblement dangereux si vous copiez et collez et parvenez à copier le retour chariot. sdxserait beaucoup mieux adapté. Je prends des précautions, mais seulement à cause d'eux, je n'ai pas détruit mon disque pour le moment.
emk2203
@ emk2203 Bon point. Je suis curieux, quelles précautions avez-vous mises en place pour de tels scénarios?
Hashim
1
J'utilise une seule citation avant de coller. Si la ligne contient un retour chariot, elle est interceptée par l'invite du shell en raison de la fin manquante de la citation. Si tout va bien, je vais au début de la ligne avec Ctrl-A, puis supprime le devis, puis reviens. Trois touches de plus pour l'assurance, ça vaut le coup.
emk2203
Au lieu de / dev / sdx, regardez les liens dans / dev / disk / by-id / tels que nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX. ls -l / dev / disk / by-id / affichera le nom du lien et le / dev / sdX auquel il est lié.
rcpa0
6

La taille de chaque partition est disponible en /proc/partitions. La commande suivante montre la taille sdx(en unités kB):

awk '$4 == "sdx" {print $3}' </proc/partitions

Ainsi:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))
Gilles 'SO- arrête d'être méchant'
la source
Quelle est la raison du -1024 à la fin?
Hashim
1
@Hashim La question demande comment effacer le dernier 1 Mo. Le dernier 1 Mo commence 1024 Ko avant la fin.
Gilles 'SO- arrête d'être méchant'
3

L'utilisation de la recherche pour atteindre la fin du lecteur fonctionne très bien, c'est-à-dire:

chercher = $ (( blockdev --getsz /dev/sda- 2048))

Cependant, lorsque vous l'utilisez, je vous recommande soit de savoir que votre valeur de comptage est correcte, soit de ne pas l'utiliser du tout. La raison pour laquelle je dis cela est que les lecteurs peuvent avoir soit des secteurs de 512 octets soit des secteurs de 4k, et si vous utilisez cette solution avec un lecteur qui a des secteurs de 4k, vous n'irez pas à la fin du lecteur avec cette valeur de comptage, et peut manquer les informations RAID à la fin (j'ai rencontré cela).

J Akers
la source
Pourriez-vous partager en quelque sorte ce que vous avez rencontré exactement? Je suis intrigué, me demandant si j'ai mal compris comment les ddsecteurs des adresses lorsqu'ils sont utilisés avec des bsvaleurs personnalisées plus petites / plus grandes que la taille de bloc réelle signalée par le micrologiciel de l'appareil ou le noyau Linux.
sjas
2

Vous pouvez obtenir le nombre de secteurs sur le disque avec hdparm -v /dev/sdx. Essayez de chercher à number_of_sectors - 2048 (en supposant des secteurs de 512 octets).


la source
hdparm semble pratique, mais comment vérifier la taille du secteur?
Peter.O
1
/sys/block/sdx/queue/physical_block_sizepeut vous donner les informations, mais certains disques plus récents jouent rapidement et librement avec la taille de secteur qu'ils signalent. Il est probablement préférable de lire l'étiquette sur le disque ou de la rechercher dans la fiche technique du fabricant.
1
Merci .. Je viens de remarquer que la hdparm -I /dev/sdaliste 2 "versions" de la taille du secteur: Logicalet Physical. Est-ce ce que vous entendez par «rapide et lâche»? .... Je ressens ce "sentiment" que si quelque chose va se comporter de cette manière, il pourrait bien s'agir d'un système RAID ..
Peter.O
1
@red: Je ne peux pas fid maintenant la référence, mais j'ai lu quelque part que certains lecteurs avec des secteurs de 4096 octets signalent au système qu'ils sont 512 octets, puis traitent avec la conversion en interne.
1

Vous pouvez utiliser ddet obtenir la taille de l'appareil via fdisk:

dd if=/dev/zero of=/dev/sda bs=1k \
   seek=$(( (`fdisk -l /dev/sda | grep 'Disk /' | cut -d' ' -f 5` -1024*1024)/1024  )) count=1024

Je n'utilise pas une taille de bloc de 1 m pour éviter les erreurs d'arrondi.

Alternativement, vous pouvez écrire un petit programme C (ou script) qui appelle la lseekfonction avec SEEK_ENDet un décalage négatif de 1 Mo, puis appeler write.

maxschlepzig
la source