Ist es möglich, eine RAMDisk / Ramdrive für Android 4.x zu erstellen?

8

Ist es möglich, eine automatisch wachsende tmpfs-Ramdisk auf einem verwurzelten Android 4.x zu erstellen ? Wenn ja, wie?

eadmaster
quelle
2
Wofür brauchst du das?
Geffchang
temporäre Speicherung für verschiedene Dokumentdateien
eadmaster
1
SDCard wird beim Stutdown nicht automatisch gereinigt ...
eadmaster
2
@geffchang Welchen Unterschied macht es aus, warum er das braucht? Ich brauche das auch aus einem ganz anderen Grund.
Michael
3
und in meinem Fall ist der Grund für die temporäre Speicherung (Android kann meinen Prozess fast jederzeit ohne Vorwarnung abbrechen), ohne dass der Blitz berührt werden muss (begrenzte Löschzyklen, erhöhter Stromverbrauch, langsamer usw.)
Michael,

Antworten:

6

Wenn Sie eine machen cat /proc/filesystems, sollten Sie tmpfs bemerken . Wenn Sie also Zugriff auf den mountBefehl haben, sollten Sie dazu in der Lage sein

  1. Erstelle ein Verzeichnis ( mkdir MYDIRECTORY)
  2. mounten Sie dort ein tmpfs-Dateisystem ( mount -t tmpfs tmpfs MYDIRECTROY)

Standardmäßig verwendet ein tmpfs-Mount die Hälfte des verfügbaren RAM auf Ihrem System. Anstatt "automatisch zu wachsen", können Sie es sich als "automatisch verkleinern" vorstellen - dh je mehr Sie es verwenden, desto weniger RAM steht zur Verfügung. Im schlimmsten Fall beginnt Ihr System möglicherweise mit dem Austausch (was Sie nicht möchten). Sie können Optionen verwenden, um eine andere RAM-Größe für diesen Mount zu verwenden.

28.02.2017 Update: Aufgrund der von Android auferlegten Einschränkungen sollten Sie einen Einhängepunkt unterhalb eines für alle Apps beschreibbaren auswählen. Wie eine SD-Karte.

Nils
quelle
ok, dieser Weg ist von allen Apps beschreibbar:mount -o size=16M -t tmpfs tmpfs /data/local/tmp
eadmaster
@eadmaster Welcher Teil davon macht es für alle beschreibbar? die Größe oder der Montagepunkt? (es funktioniert nicht für mich ...)
Michael
@ Michael, für welche Attribute siehst du? Wenn Sie ls -Falinnerhalb des gemounteten Verzeichnisses ausgeben ?
Nils
ls -Falim gemounteten Verzeichnis gibt keine Ausgabe. Ich bekomme gerade die Aufforderung zurück. Wenn ich das Verzeichnis vom Elternteil aufliste, bekomme ichdrwxrwxrwt root root 2014-04-06 20:18 tmp
Michael
@ Michael, wenn Ihr Betriebssystem gerootet ist, sollten Sie in der Lage sein, darauf zuzugreifen
eadmaster
3

Aus dem Link, den das OP beigefügt hat, fasste der Schlüsselteil es zusammen:

tmpfs wird vom Linux-Kernel ab Version 2.4 unterstützt. [3] tmpfs (früher als shmfs bekannt) basiert auf dem beim Booten verwendeten Ramfs-Code

Hervorheben von mir, darum geht es bei der RAMDisk! Dadurch kann der Kernel das Root-Dateisystem vorübergehend bereitstellen und die erforderlichen Skripts beim Start weiter ausführen.

Gleiches gilt in diesem Fall von Android. Jeder einzelne boot.img, der auf die /bootPartition geflasht wird , sei es von Odin, Fastboot, Kies, Sony Update Software, Heimdall usw., enthält den "Ramfs-Code", der eine Verzeichnisstruktur enthält, die relevante enthält sind inklusive:

  • /dev für Gerätedateien
  • /sbin für System-Binärdateien
  • /sysfür die Verwendung der Interaktion mit den Gerätedateien nach dem /proc Mounten

Das Startskript liest die Verzeichnisstruktur von ramfs und stellt sie bereit, nachdem sie /systemin der sehr frühen Phase des Startvorgangs erfolgreich bereitgestellt wurde .

Wie in Bezug auf das Schlüsselwort des OP in der Frage:

Erstellen Sie eine automatisch wachsende ...

Es wächst nicht automatisch per se, sondern ist durch die RAMFS-Struktur und die verfügbare RAM-Größe begrenzt, und was noch wichtiger ist, es verschwindet beim Neustart!

Die Verwirrung entsteht durch das austauschbare Mischen von "RAMDisk" mit "RAMDrive", technisch gesehen ein RAMDrive, ein Swap-Bereich in der nativen Swap-Partition, der häufig unter Desktop-Linux zu finden ist. Wenn Sie an die alte DOS-Ära denken, in der RAMDrive verwendet wurde , um ein im Speicher befindliches Laufwerk und Programme zu simulieren, die beim Kopieren auf diese Festplatte kopiert und schneller geladen werden, nicht schneller ausgeführt werden , anstatt von den alten MFM / RLL-Laufwerken geladen zu werden ( siehe DOS-Verzeichnisliste, scrollen Sie auf diesen Laufwerken sehr langsam ? ) das war auch als RAMDisk bekannt! (Um die Sache noch schlimmer zu machen, produzierten damals verschiedene Hersteller RAMDRIVE.SYS oder sogar RAMDISK.SYS!)

Im Hinblick auf den Linux-Kernel, sowohl Desktop als auch Android, ist RAMDisk tmpfs , aber nicht für normale Benutzer zum Speichern von Daten / Dokumenten usw. gedacht, da dies ausschließlich für die Verwendung durch den Kernel selbst bestimmt ist!

Bearbeiten

Um den Kommentar von @ nil unten zu vermerken, können Sie ihn ja mounten, aber er ist mit Kosten verbunden, die dem zugewiesenen Ressourcen werden tmpfshalbiert und verbrauchen die Hälfte des verbleibenden RAM-Speichers. Realistisch gesehen ist dies kein idealer Weg, um aus der Sicht von Android, das auf Geräten ausgeführt wird, weiterzumachen.

Hier kommt das ins /sdcardSpiel, um Benutzerdaten / Dokumente allein aus diesem Grund zu speichern. Deshalb habe ich die Tatsache weggelassen, dass Sie es können, aber andererseits, warum ?

  • Was ist, wenn der Endbenutzer vergisst, die Daten am richtigen Ort zu speichern - denn das geht beim Neustart verloren!
t0mm13b
quelle
Die kurze Antwort lautet also: Ja, das können Sie. mount -t tmpfs.
Nils
@Nils Ich habe nicht ja gesagt! Dies geschieht ab dem Moment, in dem der Kernel mount -t tmpfs nach dem Lesen der Ramfs (mit einem Barebone-Init-Skript) gestartet und ausgeführt wird. Sobald dieser gemountet ist, wird der Rest des Systems wie nach dem Start aufgerufen, bei dem es sich um die Android-Umgebung handelt. Wenn Sie dies später tun, adb shellreduzieren Sie beispielsweise die Systemressourcen, insbesondere bei Smartphones mit begrenztem Speicher und begrenzten Ressourcen!
t0mm13b
1
Nein, beim Mounten eines tmpfs wird kein RAM verwendet. Die Verwendung beginnt, wenn Sie Dateien darin ablegen - zumindest tun dies meine Linux-Server. Und Android läuft unter Linux ...
Nils
@Nils Sehr falscher Eindruck. Android läuft nicht unter Linux! Der Kernel ist Linux, aber Userland Space ist kein Bash usw. wie ein vollwertiges Desktop-Gegenstück. Es verwendet eine bionische Laufzeitbibliothek, kein Glibc und Dalvik / Zygote von da an bis zum Android-Startbildschirm.
t0mm13b
tmpfs ist Kernel, kein User Space. Ich vermute also, dass dies nicht einmal ein Kernel-Modul ist, da dies beim Booten benötigt wird, um die initrd zu mounten.
Nils