mknod permanent in archlinux

7

Ich habe ein benutzerdefiniertes Kernelmodul (unter ArchLinux), das ich manuell laden und mit dem ich interagieren kann. Was ich tun möchte, ist, es beim Booten laden zu lassen. Bisher habe ich es geschafft, dass das Gerät /proc/devicesbeim Booten angezeigt wird .

Wie man beim Booten einen Knoten daraus macht, verfolgt mich. Nachdem udevich mir die meisten Beispiele angesehen habe, verwenden Sie USB-Laufwerke als Leitfaden, was bei mir nicht der Fall ist. Das eigentliche Gerät ist eine maßgeschneiderte E / A-Karte. Es ist ein Charaktergerät.

Unten finden Sie das Skript zum Laden des Geräts aus der Shell (was funktioniert):

#!/bin/sh
sudo insmod ./robsio.ko
DEV=`cat /proc/devices | grep robsio | awk '{print $1}'`
sudo mknod /dev/proc/robsio c $DEV 0
Rob Sloot
quelle
Was hindert Sie daran, nur den Code zu verwenden, der beim Booten in der Shell funktioniert, indem Sie ihn (zum Beispiel) in /etc/rc.local ablegen?
Gentledevil
udev sollte beim Laden des Moduls automatisch den Entwicklungsknoten für Sie erstellen.
Psusi
@zanko danke das funktioniert ja. Obwohl es nicht die schönste Lösung zu sein scheint, wird es mein Problem in der Zwischenzeit lösen, bis ich besser weiß, wie 'udev' funktioniert. @psusi 'udev' macht es nicht automatisch, weshalb ich die Frage gepostet habe, vielleicht hätte ich das in meiner ursprünglichen Frage angeben sollen
Rob Sloot

Antworten:

4

Alle Geräteknoten, in denen Sie erstellen /lib/udev/devices, werden /dev/beim Systemstart kopiert :

DESCRIPTION
   udevd listens to kernel uevents. For every event, udevd
   executes matching instructions specified in udev rules. See
   udev(7).

   On startup the content of the directory /lib/udev/devices is
   copied to /dev. If kernel modules specify static device
   nodes, these nodes are created even wihtout a corresponding
   kernel device, to allow on-demand loading of kernel modules.
   Matching permissions specified in udev rules are applied to
   these static device nodes.

Wenn Sie Ihren Benutzern jedoch etwas Bequemeres bieten möchten, können Sie zwei Ansätze verfolgen:

  1. Sie können den Treibercode ändern, um einen Geräteknoten zu erstellen: drivers/base/core.c::device_add(struct device *dev)Ermöglicht das Erstellen von Geräteknoten , wenn Ihr struct device devtFeld nicht Null ist:

        if (MAJOR(dev->devt)) {
            error = device_create_file(dev, &devt_attr);
            if (error)
                goto ueventattrError;
    
            error = device_create_sys_dev_entry(dev);
            if (error)
                goto devtattrError;
    
            devtmpfs_create_node(dev);
        }
    

    Da dies nur funktioniert, wenn Sie ein statisches Dur / Moll auswählen, ist dies möglicherweise nicht der beste Weg, aber in der gesamten Dokumentation werden diese "statischen Geräteknoten" häufig erwähnt, sodass möglicherweise noch Platz für die Erstellung statischer Geräteknoten vorhanden ist .

  2. Sie können udev-Regeln für Ihre Geräte angeben. Daniel Drake hat ein nettes Tutorial geschrieben , das vielleicht aufschlussreicher ist als die udev(7)offizielle Dokumentation.

Sarnold
quelle
1

Sie können damit beginnen, dass Sie robsioin /etc/modulesoder überall dort, wo Ihre Distribution nach Modulen sucht, die beim Booten geladen werden sollen (normalerweise nach der automatischen Erkennung). Möglicherweise befindet es sich /etc/modules.d/_____auf Ihrem System.

Danach können Sie im Modulcode nach einem Proc-Eintrag fragen, aber das liegt außerhalb meines Fachgebiets, also überlasse ich es den Gurus.

Caleb
quelle