⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0510osloader.htm

📁 鸟哥的linux私房菜
💻 HTM
📖 第 1 页 / 共 5 页
字号:
		那么这个档案如何建立呢?挺简单!利用 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 + -