web-dev-qa-db-ja.com

LinuxでSATAデバイスに関連付けられているドライバー(モジュール)を見つける方法は?

私のアプリケーションの1つでは、SATAデバイスドライバーのフローを理解する必要があります。私の理解によれば、SATAデバイスドライバーはLinuxカーネルツリーにあるはずです。 Linux上のデバイスに関連付けられているドライバーモジュールを見つける方法 SATAデバイスのデバイスドライバーを見つける方法を参照しました。

$ readlink /sys/block/sda/device/driver ../../../../../../../bus/scsi/d

上記の場所に移動しましたが、デバイスドライバーファイルが見つかりません。

usr@usr:/sys/bus/scsi/drivers/sd$ ll
total 0
drwxr-xr-x 2 root root    0 Dec  9 17:00 ./
drwxr-xr-x 4 root root    0 Dec  9 17:00 ../
lrwxrwxrwx 1 root root    0 Dec  9 17:47 2:0:1:0 -> ../../../../devices/pci0000:00/0000:00:1f.2/ata3/Host2/target2:0:1/2:0:1:0/
--w------- 1 root root 4096 Dec  9 17:47 bind
--w------- 1 root root 4096 Dec  9 17:47 uevent
--w------- 1 root root 4096 Dec  9 17:47 unbind
usr@usr:/sys/bus/scsi/drivers/sd$ 

システムのSATAハードドライブに実際にロードされたデバイスドライバーを確認する方法を提案してください。

2
Hemant

あなたが言及したリンクに対する他の回答で説明されているように、udevadm infoを使用してください。 /sysツリーを逆方向にたどりながら、出力を削減する別のgrepバリアントの例を次に示します。

$ udevadm info -a -n /dev/sda | egrep 'looking|DRIVER'
  looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/Host0/target0:0:0/0:0:0:0/block/sda':
    DRIVER==""
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/Host0/target0:0:0/0:0:0:0':
    DRIVERS=="sd"
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/Host0/target0:0:0':
    DRIVERS==""
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/Host0':
    DRIVERS==""
  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1':
    DRIVERS==""
  looking at parent device '/devices/pci0000:00/0000:00:1f.2':
    DRIVERS=="ahci"
  looking at parent device '/devices/pci0000:00':
    DRIVERS==""

したがって、私のシステムでは、/dev/sdaがSCSIデバイス0:0:0:0にマップされ、PCIデバイスata1(ホストアダプタ)の0:00:1f.2に接続されていることがわかります。

ドライバーsdはブロックデバイスの処理を担当し、ドライバーahciはSATAホストアダプターの処理を担当します。

4
dirkt

これは、質問の一部、つまりカーネルドライバコードを見つける方法に答えようとするだけです。これをコメントとして追加しますが、長すぎます。

まず、Debianカーネルソースパッケージをインストールします。

apt-get install linux-source-3.16

または、対応するカーネルのバージョンが何であれ。次に、ソースが/usr/src/linux-source-3.16.tar.xzにインストールされます。

次に、/usr/local/src/linuxディレクトリを作成し、そこにソースをコピーします。すなわち:

mkdir /usr/local/src/linux 

に続く

cp -ar /usr/src/linux-source-3.16.tar.xz /usr/local/src/linux

これで、タールで開梱できます。

tar xvf linux-source-3.16.tar.xz 
cd linux-source-3.16

次に、目的のデバイスドライバーに対してfindを実行します。

/usr/local/src/linux/linux-source-3.16$ find . -name 'sg.c'
./drivers/scsi/sg.c

したがって、問題のドライバーは

/usr/local/src/linux/linux-source-3.16/drivers/scsi/sg.c

lsmodにリストされているすべてのモジュールは、modname.cの形式でソースツリーにある必要があります。ここで、modnamelsmodリストに表示される名前です。

0
Faheem Mitha