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

📄 0520source_code_and_tarball.htm

📁 鸟哥的linux私房菜
💻 HTM
📖 第 1 页 / 共 5 页
字号:
	    6.1 <a href="#check_md5sum">md5sum</a><br />
	</span>
7. <a href="#important">重点回顾</a><br />
8. <a href="#reference">参考资源</a><br />
9. <a href="#FAQ">课后练习</a><br />
<span class=text_h2>
10. <a href="http://phorum.vbird.org/viewtopic.php?t=23892"
    target="_blank">针对本文的建议∶http://phorum.vbird.org/viewtopic.php?t=23892</a>
</span>
</span>
</div>


<!-- 本文的正式部分 -->
<hr><a NAME="intro"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">前言</span><br>
<div class=block1>
	如果鸟哥想要在我的 Linux 伺服器上面跑网页伺服器( WWW server
	)这项服务,那么我应该要做些什么事呢?呵呵!当然就一定需要『
	<span class=text_import2>安装网页伺服器的套件</span>』棉!
	如果鸟哥的伺服器上面没有这个套件的话,那当然也就无法启用 WWW 的服务啦!所以啦,想要在您的
	Linux 上面进行一些有的没的功能,学会『<span class=text_import2>如何安装套件</span>』是很重要的一个课题!<br><br>

	咦!安装套件有什么难的?在 Windows 作业系统上面安装套件时,不是只要一直给他按
	『下一步』就可以安装妥当了吗?话是这样说没错啦,不过,也由于如此,所以在
	Windows 系统上面的软体都是一模一样的,也就是说,您『
	<span class=text_import2>无法修改该软体的原始程式码</span>』,因此,
	万一您想要增加或者减少该软体的某些功能时,呵呵!大概只能求助于当初发行该软体套件的厂商了!<br /><br>

	或许你会说∶『唉呦!我不过是一般人,不会用到多馀的功能,所以不太可能会更动到程式码的部分吧!?』
	如果您这么想的话,很抱歉~是有问题的!怎么说呢?
	像目前网路上面的病毒、黑客软体、臭虫程式等等,都可能对您的主机上面的某些软体造成影响
	(<span class=text_vbird>这是因为软体开发者在写作之初可能并没有想到某些问题所致!</span>)
	,导致主机的当机或者是其他资料损毁等等的伤害。如果您可以藉由安全资讯单位所提供的修订方式进行修改,
	那么您将可以很快速的自行修补好该软体的漏洞,而不必一定要等到套件开发商提供修补的程式包哩!要知道,
	<span class=text_import2>提早补洞</span>是很重要的一件事。<br><br>

	这样说可以了解 Linux 的优点了吗?!没错!因为 <span class=text_import2>Linux
	上面的套件几乎都是经过 GPL 的授权</span>,所以每个套件几乎均提供原始程式码,
	并且您可以自行修改该程式码,以符合您个人的需求呢!很棒吧!这就是开放源码(
	Open source )的优点棉!不过,到底什么是开放源码?这些程式码是什么咚咚?又
	Linux 上面可以执行的相关套件档案与开放源码之间是如何转换的?不同版本的
	Linux 之间能不能使用同一个执行档?或者是该执行档需要由原始程式码的部分重新进行转换?
	这些都是需要厘清观念的。底下我们先就原始程式码与可执行档来进行说明。<br><br>

	<hr><a NAME="intro_whatisopensource"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>什么是开放源码、
	编译器与可执行档?</span>
	<div class=block2>
		在讨论程式码是什么之前,我们先来谈论一下什么是可执行档?我们说过,在
		Linux 系统上面,一个档案能不能被执行看的是有没有可执行的那个权限( 具有
		x permission ),不过,<span class=text_import2>Linux 系统上真正认识的可执行档其实是二进位档案(
		binary file )</span>,例如 /usr/bin/passwd, /bin/touch 这些个档案即为 binary
		的可执行档案!<br><br>

		或许您会说,咦! shell scripts 不是也可以执行吗?!其实 shell
		scripts 只是利用 shell ( 例如 bash )这支程式的功能进行一些判断式,而最终执行的除了
		bash 提供的功能外,仍是呼叫一些已经编译好的 binary 档案来执行的呢!( 
		<span class=text_vbird>bash 本身就是 binary file 喔!</span>)
		那么我怎么知道一个档案是否为 binary 呢?!还记得我们在
		<a href="0220filemanager.php#suid_sgid_sticky">Linux 档案与目录管理</a> 
		里面提到的 file 这个指令的功能吗?!对啦!用他就是了!我们现在来测试一下∶<br>

<table class="term"><tr><td class="term"><pre>
<span class=term_hd># 先以系统的档案测试看看∶</span>
[root@linux ~]# <span class=term_command>file /bin/bash</span>
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped

<span class=term_hd># 如果是系统提供的 /etc/init.d/syslog 呢?</span>
[root@linux ~]# <span class=term_command>file /etc/init.d/syslog</span>
/etc/init.d/syslog: Bourne-Again shell script text executable
</pre></td></tr></table>

		看到了吧!如果是 binary file 而且是可以执行的时候,他就会显示执行档类别
		( ELF 32-bit LSB executable ),同时会说明是否使用<span class=text_import1>动态函式库(
		shared libs )</span>,而如果是一般的 script ,那他就会显示出 text executables
		之类的字样!<br>

		<div style="padding: 10 0 10 0 ;" align="right"><table width="90%"><tr><td><b>Tips:</b><br /><span style="font-style: italic; color : darkgreen">		事实上,syslog 的资料显示出 Bourne-Again ... 那一行,是因为您的 
		scripts 上面第一行有宣告 #!/bin/bash
		的缘故,如果您将 script 的第一行拿掉,呵呵!那么不管 /etc/init.d/syslog 
		的权限为何,他其实显示的是 ASCII 文字档的资讯喔!
		</span></td><td><img src="../images/vbird_face.gif" /></td></tr></table></div>
		既然 Linux 作业系统真正认识的其实是 binary file ,那么我们是如何做出这样的一支
		binary 的程式呢?!首先,我们必须要写程式,用什么东西写程式?就是一般的文书处理器啊!我都喜欢使用
		<a href="0310vi.php">vi</a>
		来进行程式的撰写,写完的程式就是所谓的原始程式码棉!
		<span class=text_import1>这个程式码档案其实就是一般的纯文字档( text file )</span>。
		在完成这个原始码档案的编写之后,再来就是要将这个档案『
		<span class=text_import1>编译</span>』成为作业系统看的懂得
		binary file 棉!而要编译自然就需要『<span class=text_import1>编译器</span>』来动作,
		经过编译器的编译之后,就会产生一支可以执行的 binary file 棉。<br><br>

		举个例子来说,在 Linux 上面最标准的程式语言为 C ,所以我使用 C 
		的语法进行原始程式码的书写,写完之后,以
		Linux 上标准的 C 语言编译器
		<span class=text_import1>gcc</span> 这支程式来编译,就可以制作一支可以执行的
		binary file 棉。整个的流程有点像这样∶<br><br>

		<center><a NAME="fig_1"></a><img SRC="0520source/source_to_binary.gif" 
			title="简易的 gcc 编译流程"
			alt="简易的 gcc 编译流程"><br>
			图一、简易的 gcc 编译流程</center><br>

		事实上,在编译的过程当中,还会产生所谓的<span class=text_import1>目标档(
		Object file )</span>,这些档案是以 *.o 的附档名样式存在的!至于 C 
		语言的原始码档案通常以 *.c 作为附档名。此外,有的时候,我们会在程式当中『引用、呼叫』
		其他的外部副程式,或者是利用其他套件提供的『函数功能』,
		这个时候,我们就必须要在编译的过程当中,将该函式库给他加进去,如此一来,
		编译器就可以将所有的程式码与函式库作一个连结(
		Link )以产生正确的执行档棉。<br><br>
	</div>

	<hr><a NAME="intro_library"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>什么是函式库?</span>
	<div class=block2>
		在前一小节的<a href="#fig_1">图一</a>示意图中,在编译的过程里面有提到函式库。好啦,
		那么什么是函式库呢?先举个例子来说,我们的
		Linux 系统上,系统通常已经提供一个可以进行身份验证的模组,称为 PAM ,这个
		PAM 提供的功能可以让很多的程式在被执行的时候,除了可以验证使用者登入的资讯外,
		还可以将身份确认的资料记录在登录档( log file, 请查阅后续的 <a href="0570syslog.php">认识登录档</a> 
		一文 )里面,以方便系统管理员的追踪!<br><br>

		既然有这么好用的功能,那如果我要编写具有身份认证功能的程式时,
		直接引用该 PAM 的功能就好啦,如此一来,我就不需要重新设计认证机制棉!也就是说,
		只要在我写的程式码里面,设定去呼叫 PAM 的函式功能,呵呵!我的程式就可以利用 Linux 
		原本就有的身份认证的程序咯!除此之外,其实我们的 Linux 核心( kernel 
		)也提供了相当多的函式库来给硬体开发者利用喔。<br><br>

		函式库又分为动态与静态函式库,这两个咚咚的分别我们在后面的章节再加以说明。
		这里我们以一个简单的流程图,来示意一支有呼叫外部函式库的程式的执行情况。<br><br>

		<center><a NAME="fig_2"></a><img SRC="0520source/library.gif" 
			title="程式引用函式库的示意图"
			alt="程式引用函式库的示意图"><br>
			图二、程式引用函式库的示意图</center><br>

		很简单的示意图啊!^_^!而如果要在程式里面加入引用的函式库,就需要如<a href="#fig_1">图一</a>所示,
		亦即在编译的过程当中,就需要加入函式库的相关设定棉。<br><br>

		事实上, Linux 的核心提供很多的核心相关函式库与外部参数,
		这些核心功能在设计硬体的驱动程式的时候是相当有用的资讯,这些核心相关资讯大多放置在
		<span class=text_import2>/usr/include, /lib, /usr/lib</span>
		里面哩!我们在本章的后续小节再来探讨。<br><br>
	</div>

	<hr><a NAME="intro_make"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>什么是 make 与 configure ?</span>
	<div class=block2>
		事实上,使用类似 gcc 的编译器来进行编译的过程并不简单,
		因为除了每个主程式与副程式均需要写上一笔编译过程的指令外,还需要写上最终的连结程序。
		程式码小的时候还好,如果是类似 WWW 伺服器软体( 例如 <a href="../linux_server/0360apache.php">Apache</a>
		),或者是类似核心的原始码,动则数百 MBytes 的资料量,呵呵!指令会写到疯掉~这个时候,我们就可以使用
		make 这个指令的相关功能来进行编译过程的指令简化了!<br><br>

		当执行 make 时,make 会在当时的目录下搜寻 <span class=text_import1>Makefile
		( or makefile )</span> 这个文字档,而 Makefile 里面则记录了原始码如何编译的详细资讯!&nbsp;
		make 会自动的判别原始码是否经过变动了,而自动更新执行档,是软体工程师相当好用的一个辅助工具呢!<br><br>

		咦!make 是一支程式,会去找 Makefile ,那 Makefile 怎么写?呵呵!
		通常软体开发商都会写一支侦测程式来侦测使用者的作业环境,
		以及该作业环境是否有软体开发商所需要的其他功能,该侦测程式侦测完毕后,就会主动的建立这个
		Makefile 的规则档案啦!通常这支侦测程式的档名为 configure 或者是 config 。<br><br>

		咦!?那为什么要侦测作业环境呢?!在 <a href="0110whatislinux.php">什么是 Linux </a>那个章节当中,
		不是有提到 Linux 不过就是一个核心吗?!是这样没错啦!但是您必须要了解的是,
		某些软体套件需要一些相关的套件辅助,并且,某些驱动程式则是适用在不同的核心系统(
		<span class=text_vbird>因为核心提供的函式库可能并不相同,例如
		kernel 2.4.xx 与 kernel 2.6.xx 就不太一样!</span> ),并且每个 Linux
		distribution 所提供的函式库名称与路径可能也不太一样,所以说,在 Fedora Core 4
		上面可以执行的一个 binary file ,直接复制到 SuSE 平台上,可不见得可以顺利执行(
		<span class=text_vbird>事实上,是不太可能可以执行啦!^_^</span> )。
		所以啦,原始码写出来之后,需要针对不同的作业环境来进行编译的行为呐!这个时候就很需要
		configure 以及 make 的功能啊!<br><br>

		详细的 make 用法与 Makefile 规则,在后续的小节里面再探讨棉!<br><br>
	</div>

	<hr><a NAME="intro_tarball"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>什么是 Tarball 的套件 ?</span>
	<div class=block2>
		从前面几个小节的说明来看,我们知道所谓的原始程式码,其实就是一些写满了程式码的纯文字档案。那我们从前面的
		<a href="0240tarcompress.php">档案的压缩与打包</a>
		章节当中,也了解了纯文字档其实是很浪费硬碟空间的一种档案格式!(<span class=text_vbird>
		想一想,一个核心的原始码档案大约要 200~300 MB 以上,如果每个人都去下载这样的一个核心档案,
		呵呵!那么网路频宽不被吃的死翘翘才怪呢!</span> )
		所以啦,如果能够将这些原始码透过档案的打包与压缩技术来将档案的数量与容量减小,
		不但让使用者容易下载,套件开发商的网站频宽也能够节省很多很多啊!这就是
		Tarball 档案的由来棉!<br><br>

		所谓的 Tarball 档案,其实就是将套件的所有原始码档案先以 <a href="0240tarcompress.php#tar">tar</a>
		打包,然后再以压缩技术来压缩,通常最常见的就是以 <a href="0240tarcompress.php#gzip">gzip</a>
		来压缩了。因为利用了 tar 与 gzip 的功能,所以 <span class=text_import2>tarball
		档案一般的附档名就会写成 *.tar.gz 或者是简写为 *.tgz 棉</span>!也就是说,
		Tarball 套件解压缩之后,里面的档案通常就会有∶<ul><span class=text_import2>
		<li>原始程式码档案;
		<li>侦测程式档案( 可能是 configure 或 config 等档名 );
		<li>本套件的简易说明与安装说明( INSTALL 或 README )。</ul></span>

		其中最重要的是那个 INSTALL 或者是 README 这两个档案,通常您只要能够参考这两个档案,呵呵!
		Tarball 套件的安装是很简单的啦!我们在后面的章节会再继续介绍 Tarball 这个玩意儿。<br><br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -