Verknüpfen von / proc / mnt mit / proc / mounts

7

Ich verstehe, dass das /procDateisystem die Ausgabe verschiedener Prozesse widerspiegelt. Leider habe ich eine propietary ( romdump) - Binärdatei, die erwartet, dass die Mount-Tabelle als /proc/mtdangezeigt wird, während mein Android-Gerät sie als ausgibt /proc/mounts.

Ich habe versucht, einen symbolischen Link zu erstellen, aber dies funktioniert natürlich nur für tatsächliche Dateien oder Verzeichnisse. Wie kann ich diese Binärdatei täuschen, um die Ausgabe zu lesen, /proc/mountsanstatt /proc/mtd?

Paul Lammertsma
quelle
1
Bist du sicher? Warum sollte es das tun?
Stéphane Chazelas
Verwandte: Ist es möglich, ein Verzeichnis und eine Datei in / proc / sys zu erstellen? wo ich zeige, wie man unionfs benutzt (ich erinnere mich nicht, ob das unter Android sofort möglich ist).
Gilles 'SO - hör auf böse zu sein'

Antworten:

7

Der einfachste Weg wäre, die Binärdatei zu ändern:

sed s-/proc/mtd-/tmp/mntx- < romdump > romdump.new
ln -s /proc/mounts /tmp/mntx
./romdump.new

Da Sie eine Binärdatei bearbeiten, besteht der Trick darin, sicherzustellen, dass die ursprüngliche Zeichenfolge /proc/mtddieselbe Länge wie die neue Zeichenfolge hat /tmp/mntx, damit Sie die Größe oder Position von Elementen in der Binärdatei nicht ändern.

Dies ist nicht kinderleicht - es funktioniert nicht, wenn die Binärdatei den Pfadnamen in Teilen aufbaut, anstatt eine feste Zeichenfolge zu verwenden. Aber es wird wahrscheinlich den Trick machen.

Jim Paris
quelle
Clevere Art, es zu erledigen. Leider lngibt "Link abgelegt Datei existiert", während /tmp/mntxnicht. (Tatsächlich musste ich das /tmpVerzeichnis erstellen .)
Paul Lammertsma
Sie können auch einen anderen Pfad verwenden, wenn / tmp nicht funktioniert, wie / etc. Sie brauchen auch überhaupt keinen Symlink - kopieren Sie einfach den Inhalt von / proc / mounts in Ihre neue Datei.
Jim Paris
Oh, auch mein lnBefehl war rückwärts, sorry. Fest!
Jim Paris
Dumm, dass ich das auch übersehen habe. Danke, dieses Update funktioniert wie ein Zauber!
Paul Lammertsma
7

Ich kenne keine Möglichkeit, Dinge /procaußerhalb des Schreibens eines Moduls (oder eines einfachen Kernel-Codes) hinzuzufügen . Könnte aber einige Dienstprogramme da draußen sein.

Wenn Sie ein Modul erstellen und einfügen können, ist es ziemlich einfach: Sie können einfach einen anderen Symlink erstellen ( /proc/mountsist bereits ein Symlink).

Quelle ( mnt_link.c):

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>

#define MODULE_VERS "0.0"
#define MODULE_NAME "mnt_link"

static int __init init_mnt_link(void)
{
    static struct proc_dir_entry *symlink;
    symlink = proc_symlink("mnt", NULL, "self/mounts");
    if(!symlink)
        return -ENOMEM;
    return 0;
}

static void __exit cleanup_mnt_link(void)
{
    remove_proc_entry("mnt", NULL);
}

module_init(init_mnt_link);
module_exit(cleanup_mnt_link);

MODULE_AUTHOR("U&L");
MODULE_LICENSE("CC-WIKI");
MODULE_DESCRIPTION("Create a /proc/mnt symlink to /proc/self/mounts");

Makefile:

obj-m := mnt_link.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

(Dies setzt voraus, dass Sie für Ihr aktuelles Linux-System erstellen. Um etwas für Android zu erstellen, lesen Sie bitte: Wie erstellen Sie ein ladbares Kernelmodul für Android? )

Sobald Sie das Modul ( insmod mnt_link.ko) geladen haben , sollten Sie Folgendes erhalten:

$ ls -l /proc/m*nt*
lrwxrwxrwx 1 root root 11 Nov 27 22:43 /proc/mnt -> self/mounts
lrwxrwxrwx 1 root root 11 Nov 27 22:43 /proc/mounts -> self/mounts

Davon abgesehen könnte Ihr Dienstprogramm sehr wohl etwas anderes als diesen Symlink erwarten. (Möglicherweise hängt es davon ab, dass ein anderes Modul geladen wird, um an dieser Stelle Informationen bereitzustellen.)

Verwendung auf eigenes Risiko .

Matte
quelle
Wow, das ist eine verdammt gute Antwort! Vielen Dank, dass Sie nicht nur eine Lösung angegeben haben, sondern auch Einblick in Symlinks und deren Erstellung gegeben haben.
Paul Lammertsma
@Mat Dieses Modul beeinträchtigt den Kernel, da CC-WIKIes sich nicht um eine bekannte GPL-kompatible Lizenz für den Kernel handelt (siehe include/linux/license.h).
Lekensteyn
3

Das / proc-Dateisystem existiert sozusagen im Speicher. Weitere Informationen finden Sie unter http://www.kernel.org/doc/Documentation/filesystems/proc.txt . Links werden wahrscheinlich nicht funktionieren.

Möglicherweise können Sie LD_PRELOAD verwenden, um die Funktion open () abzufangen. Siehe /programming/426230/what-is-the-ld-preload-trick

Möglicherweise können Sie auch die Binärdatei bearbeiten, um den Dateinamen von / proc / mnt in / proc_mnt zu ändern und diesen mit / proc / mounts zu verknüpfen.

Eine andere Möglichkeit wäre, den Kernel neu zu kompilieren und / proc / mnt zu einem Alias ​​für / proc / mounts zu machen.

Chad Clark
quelle
-1

Haben Sie einen harten Link ausprobiert?

ln /proc/mnt /proc/mounts
Mark Cohen
quelle
Ich fürchte, das kehrt mit zurück link failed No such file or directory.
Paul Lammertsma
versuchen Sie es umzukehren ..
Mark Cohen
3
Wird nicht funktionieren. Sie können nur unter Verwendung von /procKernel-Code Dateien erstellen .
Gilles 'SO - hör auf böse zu sein'