linux kernel定制(二)

2.2寻找磁盘控制器
转载请注明出处 [By SELinux+]
本节为来实验效果,我们将进行稍微的去掉某个驱动,以达到设备无法运行的测试效果。
所有的块设备都显示在/sys/block和/sys/class/block中

[root@qfong.com ~]# tree -d /sys/block/ |egrep "hd|sd|sr"
├── sda -> ../devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda
└── sr0 -> ../devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sr0

和之前的网络设备一样,我们这里寻找sr设备,该设备是一个cdrom,本节我们要卸载cdrom驱动。

[root@qfong.com ~]# ll /sys/block/sr0/
total 0
-r--r--r--. 1 root root 4096 Oct  9 02:14 alignment_offset
lrwxrwxrwx. 1 root root    0 Oct  9 02:14 bdi -> ../../../../../../../virtual/bdi/11:0
-r--r--r--. 1 root root 4096 Oct  9 02:14 capability
-r--r--r--. 1 root root 4096 Oct  8 20:46 dev
lrwxrwxrwx. 1 root root    0 Oct  9 02:14 device -> ../../../2:0:0:0
-r--r--r--. 1 root root 4096 Oct  9 02:14 discard_alignment
-r--r--r--. 1 root root 4096 Oct  9 02:14 events
-r--r--r--. 1 root root 4096 Oct  9 02:14 events_async
-rw-r--r--. 1 root root 4096 Oct  8 20:45 events_poll_msecs
-r--r--r--. 1 root root 4096 Oct  9 02:14 ext_range
drwxr-xr-x. 2 root root    0 Oct  8 20:46 holders
-r--r--r--. 1 root root 4096 Oct  9 02:14 inflight
drwxr-xr-x. 2 root root    0 Oct  9 01:07 power
drwxr-xr-x. 3 root root    0 Oct  8 20:46 queue
-r--r--r--. 1 root root 4096 Oct  8 20:46 range
-r--r--r--. 1 root root 4096 Oct  8 20:46 removable
-r--r--r--. 1 root root 4096 Oct  9 02:14 ro
-r--r--r--. 1 root root 4096 Oct  9 02:14 size
drwxr-xr-x. 2 root root    0 Oct  8 20:46 slaves
-r--r--r--. 1 root root 4096 Oct  9 02:14 stat
lrwxrwxrwx. 1 root root    0 Oct  8 20:46 subsystem -> ../../../../../../../../class/block
drwxr-xr-x. 2 root root    0 Oct  9 01:07 trace
-rw-r--r--. 1 root root 4096 Oct  8 20:46 uevent

我们现在沿着sysfs中的设备进行寻找这个设备驱动

[root@qfong.com sr0]#ll /sys/devices/pci0000\:00/0000\:00\:1f.2/host2/target2\:0\:0/2\:0\:0\:0/
total 0
drwxr-xr-x. 3 root root    0 Oct  8 20:46 block
drwxr-xr-x. 3 root root    0 Oct  8 20:46 bsg
--w-------. 1 root root 4096 Oct  9 02:17 delete
-r--r--r--. 1 root root 4096 Oct  9 02:17 device_blocked
-rw-r--r--. 1 root root 4096 Oct  9 02:17 dh_state
lrwxrwxrwx. 1 root root    0 Oct  9 02:17 driver -> ../../../../../../bus/scsi/drivers/sr
-r--r--r--. 1 root root 4096 Oct  8 20:46 evt_media_change
lrwxrwxrwx. 1 root root    0 Oct  9 02:17 generic -> scsi_generic/sg1
-r--r--r--. 1 root root 4096 Oct  9 02:17 iocounterbits
-r--r--r--. 1 root root 4096 Oct  9 02:17 iodone_cnt
-r--r--r--. 1 root root 4096 Oct  9 02:17 ioerr_cnt
-r--r--r--. 1 root root 4096 Oct  9 02:17 iorequest_cnt
-r--r--r--. 1 root root 4096 Oct  9 01:07 modalias
-r--r--r--. 1 root root 4096 Oct  8 20:46 model
drwxr-xr-x. 2 root root    0 Oct  9 01:07 power
-rw-r--r--. 1 root root 4096 Oct  9 02:17 queue_depth
-rw-r--r--. 1 root root 4096 Oct  9 02:17 queue_ramp_up_period
-r--r--r--. 1 root root 4096 Oct  9 02:17 queue_type
--w-------. 1 root root 4096 Oct  9 02:17 rescan
-r--r--r--. 1 root root 4096 Oct  9 02:17 rev
drwxr-xr-x. 3 root root    0 Oct  8 20:46 scsi_device
drwxr-xr-x. 3 root root    0 Oct  8 20:46 scsi_generic
-r--r--r--. 1 root root 4096 Oct  8 20:46 scsi_level
-rw-r--r--. 1 root root 4096 Oct  9 02:17 state
lrwxrwxrwx. 1 root root    0 Oct  8 20:46 subsystem -> ../../../../../../bus/scsi
-rw-r--r--. 1 root root 4096 Oct  9 02:17 sw_activity
-rw-r--r--. 1 root root 4096 Oct  9 02:17 timeout
-r--r--r--. 1 root root 4096 Oct  8 20:46 type
-rw-r--r--. 1 root root 4096 Oct  8 20:46 uevent
-rw-r--r--. 1 root root 4096 Oct  9 02:17 unload_heads
-r--r--r--. 1 root root 4096 Oct  8 20:46 vendor

我们看到这个scsi磁盘控制器控制着该设备,因此scsi设备是我们必须要加到我们内核配置里面的,因为scsi控制着scsi总线上的所有磁盘设备。我们主要目标是找到控制该设备的硬件驱动
接着我们继续寻找硬件的驱动
在sysfs链接中返回上一级目录,继续寻找,试着找出控制硬件的驱动

[root@qfong.com 2:0:0:0]# cd ..
[root@qfong.com target2:0:0]# ll
total 0
drwxr-xr-x. 7 root root    0 Oct  8 20:46 2:0:0:0
drwxr-xr-x. 2 root root    0 Oct  9 01:07 power
lrwxrwxrwx. 1 root root    0 Oct  8 20:46 subsystem -> ../../../../../bus/scsi
-rw-r--r--. 1 root root 4096 Oct  8 20:46 uevent

该目录下没有driver的链接,我们继续返回上一级目录

[root@qfong.com target2:0:0]# cd ..
[root@qfong.com host2]# ll
total 0
drwxr-xr-x. 2 root root    0 Oct  9 01:07 power
drwxr-xr-x. 3 root root    0 Oct  8 20:46 scsi_host
lrwxrwxrwx. 1 root root    0 Oct  8 20:46 subsystem -> ../../../../bus/scsi
drwxr-xr-x. 4 root root    0 Oct  8 20:46 target2:0:0
-rw-r--r--. 1 root root 4096 Oct  8 20:46 uevent

该目录下仍没有driver的链接,我们继续返回上一级目录

[root@qfong.com host2]# cd ..
[root@qfong.com 0000:00:1f.2]# ll
total 0
drwxr-xr-x. 5 root root    0 Oct  8 20:46 ata1
drwxr-xr-x. 5 root root    0 Oct  8 20:46 ata2
drwxr-xr-x. 5 root root    0 Oct  8 20:46 ata3
drwxr-xr-x. 5 root root    0 Oct  8 20:46 ata4
drwxr-xr-x. 5 root root    0 Oct  8 20:46 ata5
drwxr-xr-x. 5 root root    0 Oct  8 20:46 ata6
-rw-r--r--. 1 root root 4096 Oct  9 04:35 broken_parity_status
-r--r--r--. 1 root root 4096 Oct  8 20:46 class
-rw-r--r--. 1 root root  256 Oct  8 20:46 config
-r--r--r--. 1 root root 4096 Oct  9 04:35 consistent_dma_mask_bits
-r--r--r--. 1 root root 4096 Oct  8 20:46 device
-r--r--r--. 1 root root 4096 Oct  9 04:35 dma_mask_bits
lrwxrwxrwx. 1 root root    0 Oct  8 20:46 driver -> ../../../bus/pci/drivers/ahci
-rw-------. 1 root root 4096 Oct  9 04:35 enable
lrwxrwxrwx. 1 root root    0 Oct  9 04:35 firmware_node -> ../../LNXSYSTM:00/device:00/PNP0A03:00/device:1f

该目录下我们看到了为的驱动程序了。该驱动为 driver -> ../../../bus/pci/drivers/ahci
achi便是我们要寻找的驱动,但是achi驱动是inter芯片组的驱动,对我们来说这个驱动不是我们真正想要的,我们要分析我们的设备,cdrom是在scsi设备上的,我们要找到scsi的接口。接下来,我们继续寻找最终的驱动

[root@qfong.com linux-2.6.38.x86_64]# find -type f -name Makefile |xargs grep "ahci"
./drivers/ata/Makefile:obj-$(CONFIG_SATA_AHCI)+= ahci.o libahci.o
./drivers/ata/Makefile:obj-$(CONFIG_SATA_ACARD_AHCI)+= acard-ahci.o libahci.o
./drivers/ata/Makefile:obj-$(CONFIG_SATA_AHCI_PLATFORM)+= ahci_platform.o libahci.o

我们回到上一层driver -> ../../../../../../bus/scsi/drivers/sr
我们看到我们的驱动指向的是sr

[root@qfong.com linux-2.6.38.x86_64]# find -type f -name "Makefile" |xargs grep  "sr" |grep "CONFIG_" |grep "scsi"
./drivers/scsi/Makefile:obj-$(CONFIG_SCSI_SRP_ATTRS)+= scsi_transport_srp.o
./drivers/scsi/Makefile:obj-$(CONFIG_SCSI_ARCMSR)+= arcmsr/
./drivers/scsi/Makefile:obj-$(CONFIG_SCSI_SRP)+= libsrp.o
./drivers/scsi/Makefile:obj-$(CONFIG_BLK_DEV_SR)+= sr_mod.o
./drivers/scsi/arcmsr/Makefile:obj-$(CONFIG_SCSI_ARCMSR):= arcmsr.o

我们猜想上图的sr_mod.o应该是我们所要寻找的驱动。
那么他指向的驱动为CONFIG_BLK_DEV_SR

如上图所示:我们看到来scsi CDROM 支持的选项。
当然了,寻找驱动很麻烦,我给大家准备了一个脚本,可以轻易的获得驱动。以上仅是对其分析的方法进行说明

发表评论

您的电子邮箱地址不会被公开。