Como redefinir um disco rígido (excluir Mbr e excluir partições) da linha de comando com um script sem reiniciar?

8

Para começar de um estado limpo, preciso redefinir o disco rígido para um estado vazio na linha de comando.

Não se trata de executar um utilitário de limpeza, os dados não precisam ser substituídos.

Esta pergunta é bastante semelhante a Excluir todas as partições da linha de comando

A solução lá funciona muito bem,

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

mas se eu quiser trabalhar com um disco substituído, recebo o erro de que o dispositivo ainda esteja em uso.

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.

Então, eu tenho que desativar manualmente tudo o que "fica" no dispositivo

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

depois que o partprobecomando funciona.

existe algum comando que funciona mais simples? gostar

harddiskreset /dev/sda

para que ele possa ser facilmente usado em sistemas com layout de partição / lvm / md diferente?

c33s
fonte
1
Além de reiniciar, qual foi o conselho para você fazer? Qual é o contexto aqui?
Michael Hampton
não tenho certeza se entendi suas perguntas. Eu quero inicializar um sistema debian com um script bash que esteja usando o setup-storage. para garantir que o script sempre funcione, o disco rígido no sistema de destino deve ser esvaziado / redefinido antes. esse é o contexto que você pediu? então eu estenderia minha pergunta. não me pareceu relevante, porque estou apenas procurando por um comando capaz de excluir o mbr e partições do disco rígido ...
c33s
Você deve limpar o MBR antes de configurar as partições. Parece que aqui você está fazendo isso depois de configurá-los!
Michael Hampton
Ah ha! Deixa comigo. Para fazê-lo funcionar (em um LiveCD), primeiro tive que fazer isso: sudo wipefs -a / dev / sdb - o fdisk -l não mostrou tabelas de partição em / dev / sdb - então - sudo dd if = / dev / sda de = / dev / sdb trabalhou para fazer uma cópia inicializável da unidade principal.
SDSolar 15/07

Respostas:

5

O wipefsprograma permite excluir facilmente a assinatura da tabela de partições:

wipefs -a /dev/sda

Você ainda precisa interromper qualquer processo usando o dispositivo, como o LVM.

De man wipefs

Os wipefs podem apagar as assinaturas do sistema de arquivos, raid ou tabela de partição (strings mágicas) do dispositivo especificado para tornar as assinaturas invisíveis para libblkid.

O wipefs não apaga o próprio sistema de arquivos nem outros dados do dispositivo. Quando usado sem nenhuma opção, o wipefs lista todos os sistemas de arquivos visíveis e os deslocamentos de suas assinaturas básicas.

O wipefs chama o BLKRRPART ioctl quando ele apaga uma assinatura da tabela de partições para informar o kernel sobre a alteração.

user144437
fonte
2

Eu sempre usei simplesmente parted para isso. Ele funciona bem para alterar o tipo de rótulo de disco e adicionar / remover partições, especialmente porque ele pode lidar com grandes HDDs modernos, diferentemente do fdisk.

Você pode correr

$ sudo parted /dev/sda

Isso fará com que tudo comece e você entre no terminal separado. Você pode executar o comando help para mostrar todos os comandos disponíveis. É muito auto-explicativo.

Mencionarei que sim, você precisa ter todas as partições do disco que deseja formatar desmontadas. Se você estivesse simplesmente procurando uma maneira mais rápida de desmontar todas as partições, acho que você poderia fazê-lo com uma regex no comando umount, mas isso parece bobagem.

Usando o parted para gerenciar o disco rígido, nunca tive que forçar uma atualização do disco ou algo semelhante.

Para atualizar completamente uma unidade para uso totalmente novo, geralmente faço o seguinte:

1) comece a se separar executando sudo parted /dev/sda

2) encontre partições existentes executando print

3) remova as partições existentes executando a rm 1substituição de 1 pelo número da partição que você deseja remover. Em seguida, repita para todas as partições restantes no disco.

4) redefina o disklabel executando mklabel gptEu uso o tipo de rótulo gpt, mas você pode usar os msdos padrão ou qualquer que seja sua preferência. Aqui está uma lista dos tipos de disco

5) Crie novas partições executando mkpartIsso o guiará pelo assistente de criação de partições. Os pontos inicial e final são padronizados para setores. Você pode alterar isso executando o unitcomando antes de executar. mkpartDessa forma, você pode especificá-lo em GB ou TB ou MB etc.

6) verifique seus resultados usando printpara visualizar suas novas informações da tabela de partições

7) Você precisa formatar as partições. Isso não deve ser feito através de partições, embora algumas opções estejam disponíveis. Eu sugeriria, em vez disso, correr quitpara sair do terminal dividido e depois usar mkfspara formatar as partições. Lembre-se de executar 'mkfs' em / dev / sda1 em vez de / dev / sda porque você está formatando a partição e não o disco como um todo.

É sobre isso.

Espero que isso responda à sua pergunta.

Além disso, aqui está o manual online dividido para referência: https://www.gnu.org/software/parted/manual/html_node/index.html

EDITAR:

O OP queria fazer esse tipo de coisa a partir de um script e não de um terminal. Você pode executar o mesmo tipo de procedimento por meio de um script executando parted através de comandos de linha única em vez de dentro do terminal separado.

Por exemplo, o comando

$ sudo parted /dev/sda print

Irá imprimir as informações da unidade e a tabela de partição no console do bash, que pode ser manipulado usando grep etc para criar variáveis ​​ou o que você desejar em um script do bash.

KroniK907
fonte
eu preciso dele automatizado a partir de um script não manualmente a partir do terminal
c33s
Aguarde que sua postagem original não mencione um script. Que parte disso você está usando scripts? Eu acho que você pode executar comandos separados sem entrar no terminal separado. Não tenho certeza disso.
precisa saber é o seguinte
Apenas para confirmar, você pode executar partidos a partir de comandos de linha única. Por exemplo parted /dev/sda print, imprimirá a tabela de partição para / dev / sda. Você pode fazer a mesma coisa que descrevi acima apenas com comandos de linha única, se precisar fazê-lo em um script bash.
precisa saber é o seguinte
mas tenho que saber qual será o nome do dispositivo para usar o comando parted /dev/sdatambém tenho que saber quantas partições há na unidade para chamar rm 1, estou procurando um comando para simplesmente limpar o disco, para reparticioná-lo, sem fazer todo o material manual de desligar md's removendo lv's e assim por diante.
C33s
1) você ainda precisa saber qual será o nome do dispositivo para executar um comando dd ... não sabe ao certo o que está recebendo. Apenas aguarde dfse a unidade estiver montada. Como você planeja criar um "script" se não consegue obter a localização da unidade? 2) é fácil o suficiente executar parted $drive printe grep os resultados para encontrar todos os números de partição disponíveis e armazená-los em uma matriz. Em seguida, use esses valores para executar parted $drive rm $partition. Todas essas coisas são scripts simples do bash.
precisa saber é o seguinte
0

Use a versão não interativa aprimorada do fdisk, que é sfdisk

Para apagar a tabela de partição, use este comando:

sfdisk --delete /dev/sda
Suncatcher
fonte
0

Basicamente, esse erro

Erro: As partições 1 em / dev / sdc foram gravadas, mas não conseguimos informar o kernel sobre a alteração, provavelmente porque estão em uso. Como resultado, as partições antigas permanecerão em uso. Você deve reiniciar agora antes de fazer mais alterações.

aparece quando você perde algum parâmetro ao particionar seu disco. Você pode corrigir esse erro observando atentamente os parâmetros que você definiu ao particionar.

Use: fdisk -lpara verificar os parâmetros do seu disco:

user569959
fonte