O kernel contém um sistema de arquivos, nsfs. snapd
cria uma montagem nsfs /run/snapd/ns/<snapname>.mnt
para cada snap instalado. ls
mostra-o como um arquivo de 0 byte.
O código-fonte do kernel parece não conter nenhuma documentação ou comentários sobre ele. A implementação principal parece estar aqui e o arquivo de cabeçalho aqui .
A partir disso, parece estar relacionado ao namespace.
Uma pesquisa no repositório nem mesmo encontra entradas do Kconfig para habilitá-lo ou desativá-lo ...
Qual é o propósito deste sistema de arquivos e para que é usado?
Conforme descrito no log de confirmação do kernel vinculado ao jiliagre acima, o sistema de arquivos é um sistema de arquivos virtual que disponibiliza namespaces
nsfs
do kernel Linux . Ele é separado do sistema de arquivos "proc", onde algumas entradas do diretório de processos fazem referência a inodes no sistema de arquivos para mostrar quais namespaces um determinado processo (ou thread) está usando no momento./proc
nsfs
O
nsfs
não é listado em/proc/filesystems
(enquantoproc
é), portanto, não pode ser montado explicitamente.mount -t nsfs ./namespaces
falha com "tipo de sistema de arquivos desconhecido". Isto é, comonsfs
está intimamente interligado com o sistema deproc
arquivos.O tipo de sistema de arquivos
nsfs
só se torna visível/proc/$PID/mountinfo
ao montar um link de sistema de arquivos de namespace existente(!) para outro destino. Como Stephen Kitt corretamente sugere acima, isso é para manter os namespaces existentes mesmo que nenhum processo os esteja usando mais.Por exemplo, crie um novo namespace de usuário com um novo namespace de rede, depois monte-o e saia: o namespace ainda existe, mas
lsns
não o encontrará, pois não está mais listado/proc/$PID/ns
, mas existe como uma montagem (bind) ponto.A saída deve ser semelhante a esta:
Observe que não é possível criar namespaces por meio do sistema de arquivos nsfs, apenas por meio das syscalls clone() (
CLONE_NEW...
) e unshare . Onsfs
único reflete os namespaces wrt do status atual do kernel, mas não pode criá-los ou destruí-los.Os namespaces são destruídos automaticamente sempre que não houver nenhuma referência a eles, nenhum processo (portanto, não
/proc/$PID/ns/...
) E também nenhuma montagem de ligação, como exploramos no exemplo acima.Esse é o "Name Space File System", usado pela
setns
chamada do sistema e, como mostra o código-fonte, ioctl's relacionados ao Name Space (por exemploNS_GET_USERNS
,NS_GET_OWNER_UID
...)NSFS
entradas de pseudo-arquivos costumavam ser fornecidas pelo/proc
sistema de arquivos até o Linux 3.19. Aqui está o commit desta mudança .Veja o comentário de Stephen Kitt sobre uma possível explicação sobre a presença desse arquivo.