Como descobrir se um caminho é a raiz de um ponto de montagem do conjunto de dados do ZFS?

5

Gostaria de descobrir se um caminho arbitrário é a raiz de um ponto de montagem do ZFS para avaliação em um script (Python) (portanto, o código de retorno de um comando é preferível à análise de saída). O equivalente btrfs é btrfs subvolume show [path] , que retorna 0 ou 1, é o caminho que é a raiz de um subvolume btrfs ou não.

Afaik eu usaria zfs list e analisaria, mas talvez haja uma maneira mais elegante.

Estou usando o ZFS 0.6.5.8 no Ubuntu 16.10 com o Linux 4.8.0.

    
por Karl Richter 01.04.2017 / 14:41

2 respostas

3

Somente sistemas de arquivos atualmente montados

Se você estiver disposto a se limitar a sistemas de arquivos ZFS atualmente montados , poderá analisar /proc/mounts e não precisará de nenhum conhecimento específico do ZFS (a menos que deseje restringir-se especificamente ao arquivo ZFS sistemas).

Isso pode ou não funcionar em sistemas não-Linux.

/ proc / mounts é basicamente o / etc / mtab, mas é mantido pelo kernel. Ele contém uma lista de dispositivos de backup do sistema de arquivos, caminhos de montagem, tipos de sistema de arquivos e sinalizadores do sistema de arquivos.

Por exemplo, para listar os pontos de montagem de todos os sistemas de arquivos do ZFS montados, você pode fazer algo como

$ awk '$3 == "zfs" { print $2 }' < /proc/mounts

Para verificar se um determinado diretório corresponde a um ponto de montagem de um sistema de arquivos ZFS montado,

$ awk '$3 == "zfs" && $2 == "/some/particular/absolute/path" { print "yes" }' < /proc/mounts

Para permitir todos os sistemas de arquivos (não apenas o ZFS), basta remover a $3 == "zfs" check.

Montados ou sistemas de arquivos ZFS desmontados

Se você precisar incluir sistemas de arquivos desmontados em pools importados atualmente, será necessário usar zfs get para obter uma lista de todos os pontos de montagem do ZFS nos pools importados atualmente:

$ sudo zfs list -pH -o mountpoint | grep -q '^/some/particular/absolute/path$' && echo yes

imprimirá yes se um sistema de arquivos com um ponto de montagem de /some/particular/absolute/path existir em um pool atualmente importado, esteja ou não montado no sistema de arquivos atualmente.

Sistemas de arquivos nos pools exportados

Não estou ciente de nenhuma maneira de listar sistemas de arquivos em conjuntos exportados sem conhecimento fora de banda sobre os sistemas de arquivos nos conjuntos em questão. Por isso, não acredito que essa combinação seja possível.

Notas de acabamento

Sempre considere se existe um utilitário que faz o que você deseja. Por exemplo, df , como um efeito colateral, imprime a lista de sistemas de arquivos atualmente montados e seus dispositivos auxiliares, e espera-se que eles não participem de nenhuma mágica do kernel (usando apenas interfaces destinadas ao uso público). strace df 2>&1 | less é um bom começo nesse caso para ver como alguém pode encontrar as informações necessárias.

    
por 20.04.2017 / 13:03
2

Você pode usar zfs get para exibir propriedades selecionadas, como mountpoint .

# zfs get -pH -o value mountpoint rpool/swap

Explicação:

  • -p produz saída analisável com separadores como separadores
  • -H omite cabeçalhos
  • -o name,property,value,source exibe as quatro colunas ou qualquer variação delas

Você receberá o caminho definido como ponto de montagem (na maioria dos casos, isso será / mais nome do conjunto de dados (1), mas pode ser diferente (2)), - se nenhum ponto de montagem estiver definido (3) ou legado (4). Você pode usar grep para diferenciar:

# zfs get -pH -o value mountpoint rpool
/rpool
# zfs get -pH -o value mountpoint rpool/export/home
/export/home
# zfs get -pH -o value mountpoint rpool/swap
-
# zfs get -pH -o value mountpoint rpool/ROOT
legacy
    
por 03.04.2017 / 12:10