正在加载...

感谢 丁哥 分享 QQ:13712899

概述:系统版本:opensuse11.3
  initrd:系统引导内核!系统安装光盘和硬盘上的系统均需要此内核引导!
  所在目录: /boot/ 下
  .ko文件:驱动程序模块!所在目录‘/initrd/lib/modules/2.6.5-override-default/initrd/’ 目录下!


1 使用linux dd  或者是(suse)按 f5  f6 进取安装驱动画面!

suse: yes  和no  是是否允许用软驱安装驱动,此软驱可以用u盘顶替!  (dd  if=xxx.iso 或者是xxx.img  of=dev/sdd) 注意是sdd  不是sdd1

2  在initrd 内添加

  首先得到.ko文件:  方法: 使用源码进行编译
      在一台机器上安装需要安装的操作系统,可以是虚拟机!
      进入驱动源目录 make  -c "本机内核目录"   M=要安装的目的地址  modules
       例如  make  -c /lib/modules/内核/build   M=/tmp  modules
      在M后边的目录找到.ko文件
3  将ko文件添加到initrd文件中
    file initrd
    mkdir ./suse
    cd suse
    cp initrd suse
    gzip -dc initrd |cpio -ivd rm -f initrd
    cp xxx.ko /initrd/lib/modules/2.6.5-override-default/initrd/
    cd suse
    find . |cpio -o -H newc |gzip -9 >/tmp/initrd

4  将 ko文件在安装系统最后一步的时候拷贝到硬盘上 !
   ctrl+alt  f2  切后台  
   挂在u盘
   查看mount ,看看根分区挂在到那个目录下 ,一般是/mnt目录
   拷贝u盘内的ko文件到/mnt/lib/modules/。。。。。。
   #不要进入/lib目录 ,这里是系统缓存目录!
  

疑问 :modinfo -F alias modules/e1000e.ko | sed -e 's/^/alias /' -e 's/$/ e1000e/' >> lib/modules/2.6.16.60-0.21-default/modules.alias
        make 其他的文件干嘛用的
疑问:opensuse 因为 /dev/sda 盘符跳转问题,可能需要删除引导扇区
        dd if=/dev/zero of=/dev/sdx bs=446 count=1  
          注意sdx没有数字


            

列出rpm包内容和解压rpm包内容


列出rpm包的内容:
rpm -qpl *.rpm

解压rpm包的内容:(没有安装,就像解压tgz包一样rpm包)
rpm2cpio *.rpm | cpio -div
      


(1)

然而,为了建立外部模块,用户必须先完成内核源代码树接口的编写。这样可以建立一些临时目录以供编译时使用。下面是一个为2.6内核构建模块的命令行。它可以从包含模块源代码目录下执行:
    # make -C /usr/src/linux-2.6.1 SUBDIRS=$PWD modules

    此示例命令假设用户的模块源代码和Makefile所在的目录与用户正在运行的命令中的相同。如果用户不使用POSIX命令(例如BASH),那么可以通过“SUBDIRS=`pwd`”命令,用$PWD变量代替SUBDIRS参数。这样用户就可以使用“pwd”命令识别工作目录。建立出口的命令如下所示:

#make: Entering directory `/usr/src/linux-2.6.1´
*** Warning: Overriding SUBDIRS on the command line can cause
***          inconsistencies
make[1]: `arch/i386/kernel/asm-offsets.s´ is up to date.
  Building modules, stage 2.
  MODPOST
  CC      /home/wvh/timesys/2.6/testmod/testmod.mod.o
  LD [M]  /home/wvh/timesys/2.6/testmod/testmod.ko
#make: Leaving directory `/usr/src/linux-2.6.1´  

在模块的加载方面,最主要的开机时即加载模块的档案在于:/etc/modprobe.conf
如果你有任何的新的驱动程序需要在开机的时候加载,呵呵!写入这个档案就对了!而核心的驱动程序写在哪里?就是在:/lib/modules/`uname–r`/kernel/drivers。
手动编译一些驱动程序或者是 tarball 的套件时,得到了 *.ko 这个编译成功的目标档案。这样就编译完成了,接着下来就是将编译好的模块放置在核心应该要放置的地方!
因此,我们要把模块给他直接 copy 到该目录. 完成编译之后,想要在开机的时候立即启动这个模块的对应,那么就写入/etc/modprobe.conf 当中.



(2)vmlinuz 和 vmlinux

vmlinuz是可引导的、压缩的内核,“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制,Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。

vmlinuz是可执行的Linux内核,vmlinuz的建立有两种方式:

一是编译内核时通过“make zImage”创建,zImage适用于小内核的情况,它的存在是为了向后的兼容性;

二是内核编译时通过命令make bzImage创建,bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”,bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码,所以你不能用gunzip 或 gzip –dc解包vmlinuz。内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。 vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

(3)initrd.img

initrd是“initial ramdisk”的简写。

initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。比如initrd- 2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。如果你使用的是scsi硬盘,而内核vmlinuz中并没有这个 scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题,initrd-2.4.7-10.img是用gzip压缩的文件。initrd映象文件是使用mkinitrd创建的,mkinitrd实用程序能够创建initrd映象文件,这个命令是RedHat专有的,其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd


(4)
Linux操作系统中模块操作相关命令解释
lsmod  查看已经安装好的模块, 也可以查看/proc/modules文件的内容. 实际上,lsmod读命令就是通过查看/proc/modules的内容来显示模块信息的.
modinfo 显示模块信息
modprobe  不需要指定路径,它会到默认路径下寻找模块。模块也存在依赖性问题: 比如你要加载msdos.ko, 需要先加载fat.ko. modprobe查看/lib/module/version/modules.dep得知模块的依赖关系
rmmod 卸载模块,但是内核会认为卸载模块不安全,可以添加命令强制卸载。
depmod 检查系统中模块之间的依赖关系,并把依赖关系信息存于/lib/modules/2.6.18-1.2798/modules.dep中。 一般加载模块后,要命令行下先执行 depmod -a后,在系统加载模块时候会查看modules.dep中模块依赖及路径信息,这样子才可以成功加载需要模块。
insmod 加载模块,需要指定完整的路径和模块名字。  

modprobe
[root @test /root]# modprobe [-l |-c]
[root @test /root]# modprobe modules_name<==直接加载该模块与其相依属性的模块
参数说明:
-l :列出目前系统所有的模块 ( 在 /lib/modules/`uname -r`/kernel 底下 )
-c :列出目前系统所有的模块!(更详细的代号对应表)
范例:
[root @test /root]# modprobe ip_tables <==直接加载 ip_tables.ko 这个模块
需要特别留意的是,模块全部都摆在『 /lib/modules/`uname -r`/kernel 』这个目录下,而且模块的名称都是以 *.ko 这个附档名存在,但是在实际加载模块的时候,只要写入名称即可,千万不可写入 .ko 或者是路径名称。
insmod
[root @test /root]# insmod [-fkps] module_name
参数说明:
-f :强制将模块加载,要加载不相同版本的模块时候可能会用到的参数
-k :自动在核心没有使用到该模块的时候,先清除干净!
-p :测试模块是否可以被加载,不会直接加载系统中!
-s :将一些执行讯息写到 syslog 这种登录档,而不是写到 terminal 当中!
insmod 可以读取非 /lib/modules/`uname -r`/kernel 内的模块,而且还可以为模块进行加载测试呢!您可以加上路径与完整的文件名来加载模块,加上 -p 这个参数可以验证该模块的可执行性与否!
rmmod
[root @test /root]# rmmod modules_name
参数说明:
范例:[root @test /root]# rmmod 8139too
顾名思义,呵呵!移除模块的程序啦!!使用 lsmod 得到以存在的模块之后,,然后再输入『 rmmod 模块名称』就可以移除模块!    



(5)  驱动程序在内核的开关(选项)
基础知识:
make menuconfig 图形化的内核配置make mrproper -----删除不必要的文件和目录.

1  #make config(基于文本的最为传统的配置界面,不推荐使用)

2  #make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)

注意:使用make menuconfig 需要安装ncurses( sudo apt-get install ncurses-dev)

3  #make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)

注意:如果要用make xconfig,则要先安装libqt3-compat-headers( sudo apt-get install libqt3-compat-headers)

4  #make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)

目的都是生成一个.config文件,这三个命令中,make

xconfig的界面最为友好,如果你可以使用Xwindow,你就用这个好了,这个比较方便,也好设置。如果你不能使用Xwindow,那么就使用make

menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了。 选择相应的配置时,有三种选择,它们分别代表的含义如下:

Y或者是 * --将该功能编译进内核 N--不将该功能编译进内核 M--将该功能编译成可以在需要时动态插入到内核中的模块


执行make menuconfig,就可以在Device Drivers   !
Multiple devices driver support:多设备驱动支持
    

未测试的解决办法

把你的driver.i586.img挂载

mount -o loop driver.i586.img   /mnt/dud
cd /mnt/dud
mkfs.cramfs  ./   /tmp/driverupdate

把生成的driverupdate拷贝到光盘的根目录
cp /tmp/driverupdate  /tmp/SLES10SP2_DVD/

然后重新生成ISO

相关日志

为openSUSE添加 RAID 驱动
为openSUSE添加 RAID 驱动 操作笔记

最后编辑: selboo 编辑于2014/07/04 11:44
,
jiyouzhan
2024/05/18 10:06
这篇文章写得深入浅出,让我这个小白也看懂了!
猫客入侵学院
2014/07/17 02:12
挺不错的,支持一下
分页: 1/1 第一页 1 最后页
发表评论
表情
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]