/ devで欠落しているデバイスファイルを修正する正しい方法は何ですか?

/ devで欠落しているデバイスファイルを修正する正しい方法は何ですか?

私はUbunut 14.04システムでSensoray独自のPCIカードを使用しています(まもなく18.04にアップグレードする予定です)。カードには、ドライバのソースコードとドライバの構築とインストールのためのMakefileが付属しています。 Makefileのドライバ関連部分は次の場所にあります。

######################################################################
# for kernel modeule level driver:

# Kernel directory
KDIR        := /lib/modules/$(shell uname -r)/build
# Module directory
MODDIR      := /lib/modules/$(shell uname -r)/kernel/drivers/sensoray

# System values
PWD     := $(shell pwd)
KERNEL_24   := $(if $(wildcard $(KDIR)/Rules.make),1,0)

# Target file
obj-m       := s626.o


# Source files
ifeq    ($(KERNEL_24),0) # > 2.4
s626-objs   := s626drv.o 
else # <= 2.4
s626-objs   := s626drv.o
endif

.PHONY:     all clean modules_install

ifeq    ($(KERNEL_24),0) # > 2.4
ifeq    ($(KERNELRELEASE),)
all:
        $(MAKE) -C $(KDIR) M=$(PWD) SUBDIRS=$(PWD)
clean modules_install:
        $(MAKE) -C $(KDIR) M=$(PWD) SUBDIRS=$(PWD) $@
endif   # KERNELRELEASE

else    # <= 2.4

ifneq   ($(KERNELRELEASE),)

include $(KDIR)/Rules.make

s626.o: $(s626-objs)
        $(Q)$(LD) $(LD_RFLAG) -r -o $@ $(s626-objs)
else

all:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
        rm -f *.ko *.o .*.cmd .*.o.flags *.mod.c

endif   # KERNELRELEASE

endif   # KERNEL_24

ifeq    ($(KERNEL_24),1) # <= 2.4

install:        s626.o
    @if [ -d /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/ ];\
    then rm -f /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/s626.*;\
    fi
    @if [ -d /lib/modules/$(shell uname -r)/extra/ ];\
    then rm -f /lib/modules/$(shell uname -r)/extra/s626.*;\
    fi
    su -c "set -x;./MAKEDEV;mkdir -p $(MODDIR);cp -v s626.o $(MODDIR);depmod -a"

else
install:        s626.ko
    @if [ -d /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/ ];\
    then rm -f /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/s626.*; \
    fi
    @if [ -d /lib/modules/$(shell uname -r)/extra/ ];\
    then rm -f /lib/modules/$(shell uname -r)/extra/s626.*;\
    fi
    @if [ -d /lib/modules/$(shell uname -r)/kernel/drivers/staging/comedi/drivers ];\
    then rm -f /lib/modules/$(shell uname -r)/kernel/drivers/staging/comedi/drivers/s626.*;\
    fi
    su -c "set -x;./MAKEDEV;mkdir -p $(MODDIR);cp -v s626.ko $(MODDIR);install -m 444 s626.ko $(MODDIR);depmod -a"
endif  # KERNEL > 2.4

Makefileの終わりには、ファイルが作成された後にディレクトリ.koに簡単にコピーされるように見えます。/lib/modules/$(shell uname -r)/kernel/drivers/sensorayデバイスファイルを生成するために実行されるカスタムMAKEDEVシェルスクリプトもあります。スクリプトは次のとおりです。

#!/bin/bash

function makedev () {

    for dev in 0 1 2 3; do
        echo "/dev/$1$dev: char $2 $dev"
        rm -f /dev/$1$dev
        mknod /dev/$1$dev c $2 $dev
        chmod 666 /dev/$1$dev
    done

    # symlink for default device
    rm -f /dev/$1
    ln -s /dev/${1}0 /dev/$1
}

makedev s626a 146

問題は、システムが再起動されるたびに発生します。ドライバが正しくロードされているようですが、デバイスファイルが/dev消えました。私はドライバの開発についてはよくわかりませんが、この問題について多くの研究を行っており、起動時にこれらのデバイスファイルを生成する方法について矛盾する情報が見つかりました。 udevルールを作成するのが最善だと言う人もいますが、udevルールを使用して欠落しているデバイスファイルを作成してはいけないか、udevが新しいdevtempfsを参照するデバイスファイルの作成に責任を負わないと言います。私の質問は:この問題を解決する正しい方法は何ですか?私は本質的にSensorayからカスタムMAKEDEVスクリプトを呼び出すudevルールアプローチを試しましたが、これは私のルールがpciカードの特定のプロパティを参照していない場合にのみ機能します。たとえば、次のルールが有効です。

ACTION=="add", SUBSYSTEM=="pci", RUN+="/home/kpopek/MAKEDEV"

このルールはそうではありません。

ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x1131", RUN+="/home/kpopek/MAKEDEV"

起動時にueventSensoray PCIカードと一致するものがないようです。これは、欠落しているデバイスファイルのソースである可能性があります。ueventsこれを確認するために開始にログオンする方法が見つかりませんでした。 udevルールが正しいアプローチであればuevent他のデバイスで発生するため、スクリプトを実行する一般的なルールよりもカード固有のルールが大好きです。

ベストアンサー1

カスタムドライバは必須のudevイベントを生成しないようです(これを確認するにはドライバを見てください)。

だから適切解決策は、イベントを生成するようにドライバを変更することです。最も単純な場合、コードは次のようになります。これ。より複雑な場合は、追加のudevルールを使用してより複雑な操作を実行できます。

カーネルモジュールを変更できない場合、または変更したくない場合は、すべての可能な解決策が許可されます。 IMHO。理想的には、モジュールがロードされたときにデバイスを作成し、モジュールがアンロードされたときにデバイスを削除する依存関係を持ちたいのですが、udevイベントが必要です(上記を参照)。したがって、次善策は起動時に作成することです。つまり、init.dまたはsystemdスクリプトを追加するだけです。

ハードウェアの既存のudevイベントをハイジャックできる場合は、それも良いでしょう。でも試してみましたが見つかりませんでした。

おすすめ記事