É possível criar um RAMDisk / Ramdrive para Android 4.x?

8

É possível criar um ramdisk tmpfs de crescimento automático em um Android 4.x enraizado? Se sim, como?

eadmaster
fonte
2
Para que você precisa disso?
geffchang
armazenamento temporário para vários arquivos de documentos
eadmaster
11
O SDCard não é limpo automaticamente em stutdown ...
eadmaster 31/03
2
@geffchang que diferença importa porque ele precisa disso? Por acaso também preciso disso, por uma razão totalmente diferente.
Michael
3
e no meu caso, a razão é para armazenamento temporário (Android pode matar meu processo sem aviso em quase qualquer hora), sem necessidade de flash de toque (ciclos de apagar limitada, o aumento da utilização de energia, mais lento, etc.)
Michael

Respostas:

6

Se você fizer um, cat /proc/filesystemsdeverá observar o tmpfs . Portanto, se você tiver acesso ao mountcomando, deverá poder

  1. crie um diretório ( mkdir MYDIRECTORY)
  2. montar um sistema de arquivos tmpfs lá ( mount -t tmpfs tmpfs MYDIRECTROY)

Por padrão, um tmpfs-mount usará metade da RAM disponível no seu sistema. Portanto, em vez de "auto-crescimento", você pode pensar nele como "auto-encolhimento" - ou seja, quanto mais você usá-lo, menos RAM estará disponível. Na pior das hipóteses, seu sistema pode começar a trocar (o que você não deseja). Você pode usar opções para usar um tamanho de RAM diferente para essa montagem.

28-02-2017 atualização: devido às restrições impostas pelo Android, você deve escolher um ponto de montagem abaixo do gravável em todos os aplicativos. Como um cartão SD.

Nils
fonte
ok, desta forma é gravável por todas as aplicações:mount -o size=16M -t tmpfs tmpfs /data/local/tmp
eadmaster
@eadmaster, que parte disso pode ser gravada por todos? o tamanho ou o ponto de montagem? (ele não está funcionando para mim ...)
Michael
@ Michael, para quais atributos você vê. se você emitir ls -Faldentro do diretório montado?
Nels
ls -Falno diretório montado não fornece saída. Acabei de receber o aviso de volta. Se eu listar o diretório do pai, eu ficodrwxrwxrwt root root 2014-04-06 20:18 tmp
Michael
@ Michael se seu sistema operacional está enraizada você deve ser capaz de acessá-lo
eadmaster
3

Do link que o OP incluiu, a parte principal resumiu:

O tmpfs é suportado pelo kernel do Linux a partir da versão 2.4 e posterior. [3] O tmpfs (anteriormente conhecido como shmfs) é baseado no código ramfs usado durante a inicialização

Ênfase minha, é disso que trata o RAMDisk! Ele permite que o kernel monte temporariamente o sistema de arquivos raiz e continue executando os scripts necessários na inicialização.

O mesmo se aplica neste caso do Android, cada um boot.imgque é exibido na /bootpartição, seja por Odin, fastboot, Kies, Sony Update Software, Heimdall, etc., contém o "código ramfs", que possui uma estrutura de diretórios que contém os pertinentes estão incluídos:

  • /dev para arquivos de dispositivo
  • /sbin para binários do sistema
  • /syspara uso da interação com os arquivos do dispositivo após a /proc montagem

O script de inicialização lê a estrutura do diretório ramfs e a monta após a montagem bem-sucedida /systemno estágio inicial da inicialização.

Como em relação à palavra-chave do OP na pergunta:

criar um crescimento automático ...

Ele não cresce automaticamente por si só, pelo contrário, é limitado pela estrutura ramfs e pela quantidade de RAM disponível e, mais importante, desaparece na reinicialização!

A confusão vem de inter-mistura "RAMDisk" com "RAMDrive" alternadamente, tecnicamente um RAMDrive, é um espaço de troca na partição swap nativa, comumente encontrada no desktop Linux Se você está pensando do velho era DOS, onde RAMDrive foi usado , para simular uma unidade de disco residente na memória e programas quando copiados para esse disco e carregados mais rapidamente , não executados mais rapidamente , em vez de serem carregados pelas antigas unidades de disco MFM / RLL ( veja a lista de diretórios do DOS rolando muito lentamente nessas unidades ? ) isso também era conhecido como RAMDisk! (Para piorar as coisas, naquela época, diferentes fabricantes produziam RAMDRIVE.SYS ou mesmo RAMDISK.SYS!)

No caso do ponto de vista do kernel Linux, tanto no desktop quanto no Android, o RAMDisk é tmpfs , mas não se destina a usuários normais para armazenar dados / documentos etc., pois é exclusivamente para uso pelo próprio kernel!

Editar

Para anotar o comentário do @ nil abaixo, você pode montá-lo sim, mas ele vem com um custo, os recursos alocados para o meio tmpfssão reduzidos à metade e consomem metade do restante da quantidade de RAM restante. Realisticamente falando, não é um caminho ideal para se persuadir do ponto de vista do Android em dispositivos.

É aí que /sdcardentra, armazenar dados / documentos do usuário apenas por esse motivo; por isso, omiti o fato de que você pode, mas, novamente, por quê ?

  • E se o usuário final esquecer de salvar os dados no lugar certo - porque isso é perdido na reinicialização!
t0mm13b
fonte
Portanto, a resposta curta é: sim, você pode. mount -t tmpfs.
Nils
@ Nils eu não disse que sim! Isso é feito a partir do momento em que o kernel é inicializado e executado mount -t tmpfs após a leitura dos ramfs (que possui um script init barebones), uma vez montada, o resto do sistema é exibido como no pós-boot, que é o ambiente Android. Além disso, ao fazer isso posteriormente, por exemplo adb shell, você está reduzindo os recursos do sistema, especialmente no caso de smartphones com memória e recursos limitados!
T0mm13b
11
Não, a montagem de um tmpfs não utilizará RAM. O uso começará quando você colocar arquivos nele - pelo menos é o que meus servidores Linux fazem. E o Android é executado no Linux ...
Nils
@ Nils Impressão muito errada. O Android não roda no Linux! O kernel é linux, mas o espaço da terra do usuário não é bash, etc., como o equivalente na área de trabalho. Ele usa a biblioteca de tempo de execução biônico, sem glibc e dalvik / zygote de lá em diante para a tela inicial do Android.
precisa saber é o seguinte
O tmpfs é o kernel - não o espaço do usuário. Então, meu palpite é que esse nem é um módulo do kernel, pois isso é necessário durante a inicialização para montar o initrd.
Nils