(Como) posso criar um tmpfs como um usuário comum (não raiz)?

39

A distribuição é um servidor Ubuntu executando o kernel Linux 2.6.35-30.

Eu gostaria de ter um diretório que fica completamente na memória. Isso é possível sem privilégios de root?

bitmask
fonte

Respostas:

49

O Linux fornece um dispositivo tmpfs que qualquer usuário pode usar /dev/shm,. Por padrão, ele não é montado em um diretório específico, mas você ainda pode usá-lo como um.

Simplesmente crie um diretório /dev/shme, em seguida, faça o link simbólico para onde quiser. Você pode conceder ao diretório criado as permissões que escolher, para que outros usuários não possam acessá-lo.

Este é um dispositivo suportado por RAM, então o que há na memória por padrão. Você pode criar todos os diretórios que precisar dentro/dev/shm

Naturalmente, os arquivos colocados aqui não sobreviverão a uma reinicialização e, se sua máquina começar a trocar, /dev/shmnão o ajudará.

O Solaris paralelo com /dev/shmé /tmpque é uma "troca" partição tipo, e também a memória baseada. Assim como os /dev/shmusuários arbitrários, podem criar arquivos no /tmpSolaris.

O OpenBSD também tem a capacidade de usar uma montagem baseada em memória, mas não tem uma disponível por padrão. O comando mount_mfs está disponível para o super usuário.

Não tenho certeza sobre outros * BSDs.

Gabe.
fonte
11
Um link simbólico poderia resolver o que problema.
enzotib
D'oh ... esqueceu aqueles pequenos links irritantes.
Gabe.
@enzotib corrigiu isso!
Gabe.
Parece não haver um /dev/tmpfsno sistema (nem meu próprio sistema que possui um kernel 3.0.0). Tem certeza de que isso não é algo criado por sua distribuição?
bitmask
11
Não tenho certeza se isso se aplica a outras pessoas também, mas na minha versão atual do ubuntu isso parece ter mudado /rune possivelmente /run/shmprecisa ser investigado antes de atualizar minha resposta.
Gabe.
14

/ dev / shm é inseguro

... em sistemas com swap ativo ! As chances são muito altas de serem ativadas pelo computador.

Existe uma alternativa padrão melhor, segura e padrão - ramfs. Você pode usar ramfsse planeja usar o espaço suportado por RAM para armazenar temporariamente dados confidenciais, como chaves privadas, carteiras Bitcoin ou Ethereum e outras.

ramfsé melhor do que tmpfsquando se trata de segurança, pois os ramfsdados nunca são trocados (salvos em uma unidade de armazenamento físico), enquanto tmpfs podem ser trocados. Terceiros podem inspecionar o espaço de troca e extrair dados confidenciais .

A solução

Você pode preparar a ramfsmontagem para que qualquer usuário não privilegiado possa montá-lo / desmontá-lo sob demanda.

Para fazer isso, você precisará do privilégio root uma vez . Peça ao administrador do seu sistema para configurar isso para você, se você não tiver privilégios de root.

No início, você precisa adicionar uma linha ao /etc/fstab. A linha no fstab pode ficar assim:

none    /mnt/ramfs    ramfs    noauto,user,size=1024M,mode=0770    0    0
  • /mnt/ramfsé um ponto de montagem, onde o sistema de arquivos ramfs será montado. Diretório deve existir.
  • noauto A opção impede que isso seja montado automaticamente (por exemplo, na inicialização do sistema).
  • user torna isso montável por usuários regulares.
  • sizedefine o tamanho desse "ramdisk" (você pode usar Me Gaqui).
  • modeé muito importante , 0770pois somente o código octal root e o usuário, que montou este sistema de arquivos, poderão ler e escrever nele, não nos outros (você também pode usar código diferente de sua escolha, mas tenha certeza! )

Quando isso for feito, qualquer usuário poderá montar isso sob demanda.

Depois que algum usuário monta isso, um novo ramfssistema de arquivos de 1024 MB é criado e montado em /mnt/ramfs/. Será de propriedade de root:user. Quando ele desmontar ou o sistema for reiniciado, esse sistema de arquivos baseado em RAM desaparecerá com todos os seus dados. O que é legal.

Além disso, esse sistema de arquivos pode ser montado por vários usuários de forma independente, mas não ao mesmo tempo , ou seja, para estar pronto para ser montado por um próximo usuário, o usuário anterior deve desmontar esse sistema de arquivos.

montar:

mount /mnt/ramfs/

desmontar:

umount /mnt/ramfs/

PS Se você estiver tentando rsyncarquivos na raiz dos ramfs recém-montados / criados como um usuário não raiz, poderá encontrar um rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1]erro. Isso é completamente bom e esperado, porque o usuário não possui a raiz do sistema de arquivos ram. A solução é simples, basta criar um diretório lá, /mnt/ramfs/copied/por exemplo, e rsyncnele.

PPS testado no Debian 9. Certamente também funcionará no Ubuntu.

TranslucentCloud
fonte
10

Seu sistema pode ter um já disponível; sistemas Linux recentes baseados no Glibc sempre têm um tmpfs montado/dev/shm .

Se o seu sistema não possui um ou é muito pequeno, um sistema de arquivos não montado pelo root significa praticamente o FUSE . No Ubuntu, você precisa estar no fusegrupo para usar o FUSE. Examinando os sistemas de arquivos FUSE disponíveis , vejo apenas o Ramfuse , que infelizmente está abandonado no upstream.

Gilles 'SO- parar de ser mau'
fonte
5

Em geral, não, os sistemas de arquivos podem ser montados apenas pela raiz. Se você permitir que um usuário coloque sistemas de arquivos arbitrariamente, isso está basicamente dando raiz a ele. (Maneira fácil: monte uma sobre / etc, coloque sua própria senha e sombra lá, su com a nova senha root que você acabou de criar, desmonte)

Se você quiser um tmpfs em um local específico, poderá adicioná-lo /etc/fstab, com os sinalizadores de noauto,usere, em seguida, um usuário poderá montá-lo (mas não está particularmente claro por que você não o montaria automaticamente)

Se os usuários precisarem de tmpfs arbitrários, você terá algumas opções:

  • use subdiretórios de um tmpfs. Provavelmente a melhor abordagem. Você provavelmente não precisa de mais de um tmpfs.
  • crie um script que criará um diretório e monte um tmpfs sobre ele e, em seguida, imprima onde ele o colocou. Use sudopara permitir que os usuários o executem. Certifique-se de não permitir que o usuário escolha caminhos arbitrários.
derobert
fonte