Método para testar se os discos no sistema estão formatados

3

Atualmente trabalhando em um projeto onde estou lidando com um grupo arbitrário de discos em vários sistemas. Eu escrevi um pacote de software para gravar nesses discos. Parte desse processo foi formatar os discos. Ao testar o meu software, percebi que, se em algum momento durante a formatação dos discos, o processo pára / morre, e eu quero reiniciar o processo, eu realmente não quero formatar todos os discos no conjunto, que já têm formatado com sucesso.

Estou executando este software a partir de um ramfs sem discos montados e nenhum dos discos em que estou trabalhando já foram montados e eles não são usados pelo meu software para qualquer outra coisa que não teste. qualquer coisa acontece nesses garotos maus. Não há dados sobre o que se preocupar.

EDITAR:

Não, não participo.

Sim, ext2 fs.

Este é o comando que estou usando para formatar:

(/sbin/mke2fs -q -O sparse_super,large_file -m 0 -T largefile -T xfs -FF $drive >> /tmp/mke2fs_drive.log 2>&1 & echo $? > $status_file &)

SOLUÇÃO:

Graças à sugestão de Jan abaixo:

# lsblk -f /dev/<drv> criei a seguinte função de shell, que funciona como esperado.

SOURCE

is_formatted()
{
  drive=$1
  fs_type=$2

  if [[ ! -z $drive ]]
  then
    if [[ ! -z $fs_type ]]
    then
      current_fs=$(lsblk -no KNAME,FSTYPE $drive)

      if [[ $(echo $current_fs | wc -w) == 1 ]]
      then
        echo "[INFO] '$drive' is not formatted. Formatting."
        return 0
      else
        current_fs=$(echo $current_fs | awk '{print $2}')

        if [[ $current_fs == $fs_type ]]
        then
          echo "[INFO] '$drive' is formatted with correct fs type. Moving on."
          return 1
        else
          echo "[WARN] '$drive' is formatted, but with wrong fs type '$current_fs'. Formatting."
          return 0
        fi
      fi
    else
      echo "[WARN] is_formatted() was called without specifying fs_type. Formatting."
      return 0
    fi
  else
    echo "[FATAL] is_formatted() was called without specifying a drive. Quitting."
    return -1
  fi
}

DATA

sdca  ext2             46b669fa-0c78-4b37-8fc5-a26368924b8c
sdce  ext2             1a375f80-a08c-4889-b759-363841b615b1
sdck  ext2             f4f43e8c-a5c6-495f-a731-2fcd6eb6683f
sdcn
sdby  ext2             cf276cce-56b1-4027-a795-62ef62d761fa
sdcd  ext2             42fdccb8-e9bc-441e-a43a-0b0f8d409c71
sdci  ext2             d6e7dc60-286d-41e2-9e1b-a64d42072253
sdbw  ext2             c3986491-b83f-4001-a3bd-439feb769d6a
sdch  ext2             3e7dba24-e3ec-471a-9fae-3fee91f988bd
sdcq
sdcf  ext2             8fd2a6fd-d1ae-449b-ad48-b2f9df997e5f
sdcs
sdco
sdcw  ext2             27bf220e-6cb3-4953-bee4-aff27c491721
sdcp  ext2             133d9474-e696-49a7-9deb-78d79c246844
sdcx
sdct
sdcu
sdcy
sdcr
sdcv
sdde
sddc  ext2             0b22bcf1-97ea-4d97-9ab5-c14a33c71e5c
sddi  ext2             3d95fbcb-c669-4eda-8b57-387518ca0b81
sddj
sddb
sdda  ext2             204bd088-7c48-4d61-8297-256e94feb264
sdcz
sddk  ext2             ed5c8bd8-5168-487f-8fee-4b7c671ef2cb
sddl
sddn
sdds  ext2             647d2dea-f71d-4e87-bbe5-30f6424b36c9
sddf  ext2             47128162-bcb7-4eab-802d-221e8eb36074
sddo
sddh  ext2             b7f41e1a-216d-4580-97e6-f2df917754a8
sddg  ext2             39b838e0-f0ae-447c-8876-2d36f9099568

Que resultou:

[INFO] '/dev/sdca' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdce' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdck' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcn' is not formatted. Formatting.
[INFO] '/dev/sdby' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcd' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdci' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdbw' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdch' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcq' is not formatted. Formatting.
[INFO] '/dev/sdcf' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcs' is not formatted. Formatting.
[INFO] '/dev/sdco' is not formatted. Formatting.
[INFO] '/dev/sdcw' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcp' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcx' is not formatted. Formatting.
[INFO] '/dev/sdct' is not formatted. Formatting.
[INFO] '/dev/sdcu' is not formatted. Formatting.
[INFO] '/dev/sdcy' is not formatted. Formatting.
[INFO] '/dev/sdcr' is not formatted. Formatting.
[INFO] '/dev/sdcv' is not formatted. Formatting.
[INFO] '/dev/sdde' is not formatted. Formatting.
[INFO] '/dev/sddc' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddi' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddj' is not formatted. Formatting.
[INFO] '/dev/sddb' is not formatted. Formatting.
[INFO] '/dev/sdda' is formatted with correct fs type. Moving on.
[INFO] '/dev/sdcz' is not formatted. Formatting.
[INFO] '/dev/sddk' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddl' is not formatted. Formatting.
[INFO] '/dev/sddn' is not formatted. Formatting.
[INFO] '/dev/sdds' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddf' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddo' is not formatted. Formatting.
[INFO] '/dev/sddh' is formatted with correct fs type. Moving on.
[INFO] '/dev/sddg' is formatted with correct fs type. Moving on.

Observe que a poção mágica estava estendendo a sugestão de Jan para simplesmente mostrar o que eu gostava: lsblk -no KNAME,FSTYPE $drive

    
por Jim 01.08.2016 / 22:09

2 respostas

4

Dependendo de como você acessa as unidades, você pode usar blkid -o list (depreciado) nelas e depois analisar a saída.
O comando gera, entre outras coisas, uma coluna de rótulo fs_type, que mostra o sistema de arquivos.

blkid -o list foi substituído por lsblk -f .

    
por 01.08.2016 / 22:43
1

A lógica que eu usaria pode parecer um pouco confusa, mas eu acho que ela deve pegar o modo de falha.

Basicamente, os passos são

  1. mke2fs
  2. monte o sistema de arquivos
  3. Crie um arquivo chamado "format.complete" no sistema de arquivos
  4. desmontar o sistema de arquivos

Então, precisamos colocar alguns testes antes disso. A lógica seria:

  1. Tente montar o sistema de arquivos em $tmpmount forçando ext2
  2. Se mount retornou o código de erro == > Goto NÃO FORMATOU
  3. Se $tmpmount/lost+found não existir, um sistema de arquivos ímpar será montado; não deve acontecer, mas ... umount . Goto NÃO FORMATOU
  4. Se $tmpmount/format.complete não existir, o formato foi interrompido; %código%. Goto NÃO FORMATOU
  5. umount == > FORMATTED, pule para o próximo disco.

O "NÃO FORMATADO" seria o original de 4 etapas.

Podemos adicionar essas estruturas juntas. O resultado seria que os discos só seriam formatados se não tivessem um arquivo umount neles.

Quando todos os discos tiverem sido formatados, você poderá, opcionalmente, remontar cada um deles e excluir o arquivo format.complete .

Essencialmente, mantemos uma pequena quantidade de estado em cada disco e o usamos para determinar se a formatação foi bem-sucedida.

    
por 01.08.2016 / 22:41