📄 0510osloader.htm
字号:
那么这个档案如何建立呢?挺简单!利用 depmod 这个指令就可以达到建立该档案的需求了!<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>depmod [-Ane]</span>
<span class=term_say>参数∶
-A ∶不加任何参数时, depmod 会主动的去分析目前核心的模组,并且重新写入
/lib/modules/`uname -r`/modules.dep 当中。若加入 -A 参数时,则 depmod
会去搜寻比 modules.dep 还要新的模组,如果真找到新模组,才会更新。
-n ∶不写入 modules.dep ,而是将结果输出到萤幕上(standard out);
-e ∶显示出目前已载入的不可执行的模组名称
范例∶</span>
<span class=term_hd>范例一∶若我已经做好一个网路卡驱动程式,假设档名为 a.ko,该如何更新核心相依性?</span>
[root@linux ~]# <span class=term_command>cp /full/path/a.ko /lib/modules/`uname -r`/kernel/drivers/net</span>
[root@linux ~]# <span class=term_command>depmod</span>
</pre></td></tr></table>
难就难在将那个新的驱动程式模组编译出来,如果编译出来之后,
依据核心模组放置的目录去放置好,然后输入 depmod 后,去更新好 modules.dep ,
如此一来,核心就能够认识该模组棉!够简单吧! ^_^ (关于核心模组的编译,请参考
<a href="0540kernel.php">核心编译</a> 一文!)<br><br>
</div>
<hr><a name="kernel_look"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>核心模组的观察∶ lsmod, modinfo</span><br>
<div class=block2>
那你到底晓不晓得目前核心载入了多少的模组呢?粉简单啦!利用 lsmod 即可!<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>lsmod</span>
Module Size Used by
loop 18121 0
ipt_state 1857 2
ipt_MASQUERADE 3265 2
iptable_filter 2881 1
ip_nat_irc 2753 0
ip_conntrack_irc 72401 1 ip_nat_irc
ip_nat_ftp 3393 0
ip_conntrack_ftp 73297 1 ip_nat_ftp
<span class=term_say>....中间省略.....</span>
8139too 30017 0
mii 5441 1 8139too
floppy 65141 0
ext3 132681 4
jbd 86233 1 ext3
</pre></td></tr></table>
使用 lsmod 之后,系统会显示出目前已经存在于核心当中的模组,显示的内容包括有∶<ul>
<li>模组名称(Module);
<li>模组的大小(size);
<li>此模组是否被其他模组所使用 (Used by)。</ul>
举例来说,上面的表格当中,我的 ip_conntrack_ftp 模组其实还被 ip_nat_ftp 模组所使用呢!
也就是说,这两个模组之间应该是有相关性的!所以棉,如果我载入 ip_nat_ftp 势必还得要载入
ip_conntrack_ftp 才行~而这个相依性就是被纪录在上个小节提到的 modules.dep 档案内棉! ^_^<br><br>
那么除了显示出目前的模组外,我还可以查阅每个模组的资讯吗?当然可以啦!就用 modinfo 即可∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>modinfo [-adln] [module_name|filename]</span>
<span class=term_say>参数∶
-a ∶仅列出作者名称;
-d ∶仅列出该 modules 的说明 (description);
-l ∶仅列出授权 (license);
-n ∶仅列出该模组的详细路径。
范例∶</span>
<span class=term_hd>范例一∶由上个表格当中,请列出 8139too 这个模组的相关资讯∶</span>
[root@linux ~]# <span class=term_command>modinfo 8139too</span>
filename: /lib/modules/2.6.12-1.1398_FC4/kernel/drivers/net/8139too.ko
author: Jeff Garzik <jgarzik@pobox.com>
description: RealTek RTL-8139 Fast Ethernet driver
license: GPL
version: 0.9.27
parmtype: multicast_filter_limit:int
parmtype: media:array of int
parmtype: full_duplex:array of int
parmtype: debug:int
parm: debug:8139too bitmapped message enable number
parm: media:8139too: Bits 4+9: force full duplex, bit 5: 100Mbps
parm: full_duplex:8139too: Force full duplex for board(s) (1)
vermagic: 2.6.12-1.1398_FC4 686 REGPARM 4KSTACKS gcc-4.0
depends: mii
alias: pci:v000010ECd00008139sv*sd*bc*sc*i*
<span class=term_hd>范例二∶我有一个模组名称为 a.ko ,请问该模组的资讯为?</span>
[root@linux ~]# <span class=term_command>modinfo a.ko</span>
<span class=term_say>.......省略......</span>
</pre></td></tr></table>
事实上,这个 modinfo 除了可以『查阅在核心内的模组』之外,还可以检查『某个模组档案』,
因此,如果你想要知道某个档案代表的意义为何,利用 modinfo 加上完整档名吧!
看看就晓得是啥玩意儿棉! ^_^<br><br>
</div>
<hr><a name="kernel_load"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>核心模组的载入与移除∶
insmod, modprobe, rmmod</span><br>
<div class=block2>
好了,如果我想要自行手动载入模组,又该如何是好?
有很多方法啦,最简单而且建议的,是使用 modprobe 这个指令来载入模组,
这是因为 modprobe 会主动的去搜寻 modules.dep 的内容,先克服了模组的相依性后,
才决定需要载入的模组有哪些,很方便。至于 insmod 则完全由使用者自行载入一个完整档名的模组,
并不会主动的分析模组相依性啊!<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>insmod [/full/path/module_name] [parameters]</span>
<span class=term_hd>范例一∶请尝试载入 /lib/modules/`uname -r`/kernel/fs/smbfs/smbfs.ko</span>
[root@linux ~]# <span class=term_command>insmod /lib/modules/`uname -r`/kernel/fs/smbfs/smbfs.ko</span>
[root@linux ~]# <span class=term_command>lsmod | grep smbfs</span>
smbfs 67897 0
</pre></td></tr></table>
对吧!他立刻就将该模组载入棉~这个需要加入完整档名啦!那如何移除这个模组呢?<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>rmmod [-fw] module_name</span>
<span class=term_say>参数∶
-f ∶强制将该模组移除掉,不论是否正被使用;
-w ∶若该模组正被使用,则 rmmod 会等待该模组被使用完毕后,才移除他!
范例∶</span>
<span class=term_hd>范例一∶将刚刚载入的 smbfs 模组移除!</span>
[root@linux ~]# <span class=term_command>rmmod smbfs</span>
</pre></td></tr></table>
帅吧!移除掉了。不过,如前所述的, insmod 实在不怎么人性化,近年来,
我们都建议直接使用 modprobe 来处理模组载入的问题,这个指令的用法是∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>modprobe [-lcf] module_name</span>
<span class=term_say>参数∶
-c ∶列出目前系统所有的模组!(更详细的代号对应表)
-l ∶列出目前在 /lib/modules/`uname -r`/kernel 当中的所有模组完整档名;
-f ∶强制载入该模组;
-r ∶类似 rmmod ,就是移除某个模组棉~
范例∶</span>
<span class=term_hd>范例一∶载入 smbfs 模组</span>
[root@linux ~]# <span class=term_command>modprobe smbfs</span>
<span class=term_say># 很方便吧!不需要知道完整的模组档名,这是因为该完整档名已经记录到
# /lib/modules/`uname -r`/modules.dep 当中的缘故啊!如果要移除的话∶</span>
[root@linux ~]# <span class=term_command>modprobe -r smbfs</span>
</pre></td></tr></table>
使用 modprobe 真的是要比 insmod 方便很多!因为他是直接去搜寻 modules.dep 的纪录,
所以棉,当然可以克服模组的相依性问题,而且还不需要知道该模组的详细路径呢!
好方便! ^_^<br><br>
</div>
<hr><a name="kernel_modprobe"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>核心模组的额外参数设定∶
/etc/modprobe.conf</span><br>
<div class=block2>
这个档案我们之前已经谈过了,这里只是再强调一下而已,如果您想要修改某些模组的额外参数设定,
就在这个档案内设定吧!我们假设一个案例好了,假设我的网路卡 eth0 是使用 ne ,
但是 eth1 同样也使用 ne ,为了避免同一个模组会导致网路卡的错乱,
因此,我可以先找到 eth0 与 eth1 的 I/O 与 IRQ ,假设∶<ul>
<li>eth0 ∶ I/O (0x300) 且 IRQ=5
<li>eth1 ∶ I/O (0x320) 且 IRQ=7</ul>则∶
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi /etc/modprobe.conf</span>
alias eth0 ne
alias eth1 ne
options eth0 io=0x300 irq=5
options eth1 io=0x320 irq=7
</pre></td></tr></table>
嘿嘿!如此一来,我的 Linux 就不会捉错网路卡的对应棉!因为被我强制指定某个 I/O 咯嘛! ^_^
</div>
</div>
<hr><a NAME="grub"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">Boot Loader: Grub</span><br>
<div class=block1>
在看完了前面的整个开机流程,以及核心模组的整理之后,你应该会发现到一件事情,
那就是『 boot loader 是载入核心的重要工具』啊!没有 boot loader 的话,那么
kernel 根本就没有办法被系统载入的呢!所以,底下我们会先谈一谈 boot loader 的功能,
然后再讲一讲现阶段 Linux 里头最主流的 grub 这个 boot loader 吧!<br><br>
<hr><a name="grub_loader"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>boot loader 的功能与意义∶</span><br>
<div class=block2>
我们在第一小节的地方,曾经讲过,在 BIOS 读完资讯后,接下来就是会到第一个开机装置的 MBR
去读取 boot loader 了,这个 boot loader 可以具有选单功能,而且『还能辨识硬碟的 filesystem ,
并且指向核心档案,以将他读入主记忆体当中』呢!所以棉,特点是∶
我们系统能够使用的 boot loader 必须要能够认识我们系统的 filesystem 才行。
目前台湾常见的有 grub, lilo 以及 spfdisk 这几个 loader 啦!<br><br>
但是我们都知道, MBR 是整个硬碟的第一个 sector,充其量整个大小不可能超过 512 bytes 的,那么,
我们的 loader 功能这么强,不可能只占不到 512 bytes 的容量吧?
而且某些情况下,设定档还会占用掉不少的容量呢!怎么办?<br><br>
为了解决这个问题,我们将 boot loader 分成两个阶段来执行 (stage)∶<ul><span class=text_import2>
<li>Stage 1∶第一阶段为 boot loader 的主程式,这个主程式必须要被安装在开机区,
亦即是 MBR 或者是 Super block (first sector)。但如前所述,因为 MBR 实在太小
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -