Linuxデバイス・ハードウェア関連まとめ

# ハードウェアが認識されているか確認する

```
# lspci -v
# lspci -vt
# lspci -vv
# lsusb -v
# lshw
```

これらのコマンドはCentOSの場合は`yum install pciutils usbutils lshw`でインストールできる。

lspciの出力における`00:01.2`という部分の意味は「バス番号:スロット番号.機能番号」。
スロット番号は`enp0s3`とかの「s3」に対応している。

ハードウェア情報はprocファイルシステムの下記のパスでも参照できる:

- /proc/bus/pci/*          
    - PCIデバイス情報
- /sys/bus/usb/*         
    - USBデバイス情報
- /proc/scsi/scsi           
    - SCSIデバイス情報
- /proc/cpuinfo             
    - CPU情報
- /proc/interrupts          
    - IRQ情報
- /proc/scsi/scsi           
    - SCSIデバイス情報


`lspci -v` で `Kernel driver in use` を見ればどのデバイスドライバ（カーネルモジュール）が使われているか確認できる。

`lspci -v` で `Kernel modules` と出ているものは、そのデバイスのドライバとして使えるモジュールのリスト。

# デバイスドライバ（正確にはカーネルモジュール）の操作・情報取得

## ロードされている全ドライバの情報を一気に取得

```
cat /proc/modules  | cut -d' ' -f1 | while read i; do echo $i; modinfo $i; echo "==============="; done
```

## デバイスドライバはディスクのどこに保存されているか

`/lib/modules/`の中にある。

## ロードされているデバイスドライバの確認

```
lsmod
```

## デバイスドライバの詳細情報表示

```
modinfo モジュール名（例：cdrom）
```

## デバイスドライバのロード・アンロード

```
modprobe
```

（`insmod` `rmmod`でもできるが、`modprobe`の方が高機能）

## モジュールとメジャー番号の対応を調べる

```
cat /proc/devices
```

## Linuxのデバイスはメジャー番号とマイナー番号を持っている。

```
# ls -l /dev/ttyS0
↓キャラクタデバイス      ↓メジャー番号、マイナー番号
crw-rw---- 1 root dialout 4, 64 Feb  6 21:45 ttyS0　　←デバイスファイル
```

メジャー番号がどのデバイスに対応するかはカーネルのドキュメントに書いてある。
https://www.kernel.org/doc/Documentation/devices.txt
上記ファイル内で「4 char」を検索するとちゃんと「64 = /dev/ttyS0 First UART serial port」と書いてある。

## ブロックデバイスとキャラクタデバイス
* ブロックデバイスはブロック単位（512バイトや1024バイト）で読み書き。ランダムアクセスできる。
* キャラクタデバイスは1バイト単位。シーケンシャルで、読み戻したりはできない。

# デバイスファイルの作成

```
mknod -m 660 /dev/ttyS0 c 4 64
```

デバイスはベンダーID、デバイスIDを持っている。
ベンダーID、デバイスIDは有償の登録制。
`/usr/share/hwdata/` 内のファイルにIDとテキストの対応が記されている。

# 異なるカーネルのバージョン間でデバイスドライバの互換性はない
カーネル2.6.10用にコンパイルしたドライバは2.6.12で動くとは限らない。

## 例：どのグラフィックのドライバが使われているか調べる

```
lshw -c video
  *-display              
       description: VGA compatible controller
       product: 82865G Integrated Graphics Controller
       vendor: Intel Corporation
       physical id: 2
       bus info: pci@0000:00:02.0
       version: 02
       width: 32 bits
       clock: 33MHz
       capabilities: pm vga_controller bus_master cap_list rom
       configuration: driver=i915 latency=0
       resources: irq:16 memory:e8000000-efffffff memory:feb80000-febfffff ioport:ed98(size=8)
```

driver=i915と書いてあるので、modinfoする：

```
modinfo i915
filename:       /lib/modules/3.18.6-1-ARCH/kernel/drivers/gpu/drm/i915/i915.ko.gz
license:        GPL and additional rights
description:    Intel Graphics
author:         Intel Corporation
author:         Tungsten Graphics, Inc.
（略）
```

`/lib/modules/3.18.6-1-ARCH/kernel/drivers/gpu/drm/i915/i915.ko.gz` が使われていることが分かった。

# 特定のデバイスドライバを読み込ませないようにする（Arch Linuxの場合）
参考：https://wiki.archlinuxjp.org/index.php/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB#.E3.83.96.E3.83.A9.E3.83.83.E3.82.AF.E3.83.AA.E3.82.B9.E3.83.88

１．`/etc/modprobe.d/modprobe.conf`を新規作成して以下のように記述

```
blacklist joydev
blacklist psmouse
blacklist mousedev
blacklist floppy
```

２．`/etc/mkinitcpio.conf`の`FILES＝`にそのファイル名を記述

```
FILES=/etc/modprobe.d/modprobe.conf
```

３．initramfsを再作成（カーネルをインストールしたときと同じコマンド）

```
mkinitcpio -k 4.1.2-aoyama -c /etc/mkinitcpio.conf -g /boot/initramfs-4.1.2-aoyama.img
```

`-k`はカーネルバージョンの指定。現行稼働中のカーネルの場合は省略可能のようだ。


# 参考

●QEMUで仮想PCIデバイスとデバイスドライバを作ってみる
（デバイスドライバの情報がいっぱい）
http://qiita.com/rafilia/items/7e30f1119614964ce4c9

●実践でも役立つLPICドリル（1）：表示結果から読み解け！ ハードウェア構成の調査 (3/3) - ＠IT
http://www.atmarkit.co.jp/ait/articles/0804/10/news136_3.html