Estou trabalhando em um Linux embarcado. Quero escrever um script bash que corrija partições automaticamente.
Declarei um array associativo onde a chave é o ponto de montagem e o valor é o dispositivo a ser montado.
Agora, meu problema é que os dispositivos podem ter sistemas de arquivos diferentes e a versão correta fsck
deve ser selecionada.
Cada sistema de arquivos tem sua própria fsck
variante, como fsck.vfat
e fsck.ext4
.
Preciso trazer isso de alguma forma para que a variante correta seja chamada. Infelizmente, a variante principal fsck
não fornece correção ou detecção automática de sistemas de arquivos em minha configuração.
Então a verdadeira questão é como ter uma tabela de pesquisa aqui?
declare -A arrPartitionsToCheck=(
[/run/media/my-backup]="/dev/sda1" # vfat
[/run/media/my-data]="/dev/sdb1" # ext4
)
for part in "${!arrPartitionsToCheck[@]}"; do
# Unmount
# umount /dev/sda1
umount "${arrPartitionsToCheck[$part]}"
# Select the right variant of FSCK and repair automatically
fsck.vfat -a "${arrPartitionsToCheck[$part]}"
# Mont Again! For example
# mount /dev/sda1 /run/media/my-backups
mount "${arrPartitionsToCheck[$part]}" "$part"
done
Você pode obter o tipo de sistema de arquivos em
lsblk
. Por exemplo, na minha máquina:Então, com isso em mente, você pode fazer algo assim (preciso pós-processar para adicionar um valor onde não há nenhum para que os dados estejam corretos):
Bash não consegue adivinhar os tipos de sistema de arquivos. E você realmente não pode perguntar ao mount em si, porque suspeito que o objetivo da verificação também seja cobrir casos em que as coisas estão ligeiramente quebradas e um sistema de arquivos não pode ser montado automaticamente.
Portanto, antes de instalar um sistema completo
fsck
que possa detectar os próprios sistemas de arquivos (ou usar/abusarfile
de si mesmo), você mesmo precisa alimentar essas informações. Realmente não deveria ser um problema, já que você já está definindo manualmente os dispositivos de bloco e seus pontos de montagem! (O que nos faz pensar por que você não está simplesmente confiando/etc/fstab
e executandofsck -A
.)Você poderia integrar seu conhecimento do sistema de arquivos em sua matriz associativa:
E extraia isso em sua iteração:
(Renomeei seu nome
$part
para$mountpoint
, porquepart
é realmente enganoso; é um ponto de montagem, não uma partição.)Você poderia fazer algo como
mount -t "${type}"
extrair o tipo dafsck.TYPE
string, se presente, e simplesmente não montar se não estiver presente.