mknod permanente no archlinux

7

Eu tenho um módulo de kernel personalizado (no ArchLinux) que posso carregar manualmente e interagir. O que eu gostaria de fazer é carregá-lo no momento da inicialização. Até agora, consegui que o dispositivo aparecesse em /proc/devices ao inicializar.

Como criar um nó no momento da inicialização é o que está me assombrando. Tendo analisado udev da maioria dos exemplos, use drives USB como guias, o que não é o caso para mim. O dispositivo atual é um cartão IO personalizado. É um dispositivo de caracteres.

Abaixo está o script para carregar o dispositivo a partir do shell (que funciona):

#!/bin/sh
sudo insmod ./robsio.ko
DEV='cat /proc/devices | grep robsio | awk '{print $1}''
sudo mknod /dev/proc/robsio c $DEV 0
    
por Rob Sloot 22.06.2011 / 06:34

2 respostas

4

Todos os nós de dispositivos criados em /lib/udev/devices serão copiados em /dev/ no início do sistema:

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.

Mas se você quiser tornar algo mais conveniente para seus usuários, há duas abordagens que você pode seguir:

  1. Você pode modificar o código do driver para criar um nó de dispositivo: drivers/base/core.c::device_add(struct device *dev) permite que você crie nós de dispositivo se o campo struct device devt for diferente de zero:

        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);
        }
    

    Como isso funcionará somente se você escolher um major / menor estático, talvez não seja o melhor caminho a seguir, mas toda a documentação menciona esses "nós de dispositivos estáticos" com bastante frequência, então talvez ainda haja algum espaço para fazer nós de dispositivos estáticos.

  2. Você pode fornecer regras do udev para seus dispositivos; Daniel Drake escreveu um belo tutorial que você pode achar mais esclarecedor do que a documentação oficial do udev(7) .

por 11.07.2011 / 06:01
1

Você pode começar colocando robsio em /etc/modules ou onde quer que sua distro procure os módulos para serem carregados no tempo de inicialização (geralmente após a detecção automática). Pode ser /etc/modules.d/_____ no seu sistema.

Depois disso, pedir uma entrada proc pode ser algo que você faz no código do módulo, mas isso está fora do meu campo de conhecimento, então vou deixar para os gurus.

    
por 22.06.2011 / 10:02