Como você determina a disponibilidade do sistema de arquivos a partir de um script bash?

2

Se eu tiver um script que dependa de um dos seguintes elementos presentes: overlayfs, aufs, unionfs - qual é a melhor maneira de determinar qual está disponível em um script bash? Eu gostaria de usar overlayfs, mas voltar para aufs ou unionfs se não estiver disponível. Eu posso olhar para a versão do kernel como um palpite - mas só porque é um > = 3.18 kernel não significa que o overlayfs foi construído - existe uma maneira razoavelmente infalível de verificar?

    
por Ryan 19.11.2015 / 23:24

1 resposta

7

No Linux, você pode ver quais tipos de sistema de arquivos estão disponíveis no kernel em execução no arquivo /proc/filesystems . O conteúdo deste arquivo é construído em tempo real pelo kernel quando é lido, então reflete o status atual. O formato deste arquivo é um pouco chato: cada linha contém 8 espaços seguidos por um tipo de sistema de arquivos, ou nodev seguido por 3 espaços seguidos por um tipo de sistema de arquivos. Retire os primeiros 8 caracteres de cada linha para obter apenas os tipos de sistema de arquivos disponíveis, ou use grep -w (contanto que você não esteja procurando por um tipo de sistema de arquivos chamado nodev ).

if grep -qw aufs /proc/filesystems; then
  echo aufs is available
fi

Esta não é a história completa, porque o driver do sistema de arquivos pode estar disponível na forma de um módulo que não está atualmente carregado. Supondo que você possa carregar módulos, se o sistema de arquivos não estiver disponível, tente carregá-lo. Os módulos do sistema de arquivos possuem um alias na forma fs-FSTYPE (o nome real do módulo é geralmente o nome do tipo de sistema de arquivos, mas nem sempre).

if grep -qw aufs /proc/filesystems; then
  echo aufs is available
elif modprobe fs-aufs; then
  echo now aufs is available
fi

Isto é para sistemas de arquivos do kernel. Para os arquivos do FUSE, verifique se o sistema de arquivos fuse está disponível e procure o executável que implementa o sistema de arquivos. Embora você possa procurar por fuse em /proc/filesystems , isso apenas informa se está disponível, não se seu programa tem privilégios suficientes para usá-lo. Um teste mais confiável na prática é verificar se você pode gravar em /dev/fuse .

if [ -w /dev/fuse ]; then
  echo FUSE is available
  if type unionfs-fuse >/dev/null 2>/dev/null; then 
    echo unionfs-fuse is available
  fi
fi
    
por 20.11.2015 / 02:46