D.I.Y.:自己来为

Linux注入新的软体

上期因为稿挤,使得几期不见的王国泰,
又复未能与您见面,实在非常遗憾与抱歉。
不过,这番等待也似乎挺值得的,毕竟相信您
也实在很少听说竟然有什麽软体DIY的,更何况
这还是Linux有关的实用兼有效的DIY及解惑呢!

王国泰(Kuotai Wang)

    有越来越多人听到Linux、安装Linux、开始接触Linux,在台湾学术网
  路上,也越来越多单位是使用Linux来架构,同时也有越来越多的人讨论着
  与Linux相关的话题,Linux她显然已经渐渐踏进你我的生活空间之中了!!

     Not only good, but also powerful
      —————————————that's L i n u x

    废话不多说,回到本次的主题--"D.I.Y."。由於Linux是一个集世界一大
  群电脑爱好者智慧的共同创造体,能够在Linux上执行的软体实在是相当相当
  的多,而且这种数字是以很快的速度在增加当中,而对於已经发表过的软体
  ,也会适时地将新的修正版本供诸於世。面对着这麽多的可用资源,真的会
  令人一时之间无所适从,如果一切都是自己来将这些散落在世界各地的资源
  收入自己的机器中,这种事几乎太折腾自己了吧!。於是乎,有心的个人或
  团体将流传的资源 集整理後成为一个完整的安装套件,供应各位人士安装
  Linux系统之用,大家熟知的着名套件诸如Slackware、SLS、Debain等等。在
  这些安装套件里,囊括了最基本、最常用的Linux软体,对於一般使用者而言
  是非常非常足够了!说到这里,读者可能不禁冒出个疑问,既然已经足够,
  那何必又扯出这样一个"D.I.Y."的话题呢?

    这些套件实在是造福了广大的Linux爱好者,让人省时省力,马上就有
  VIP般的享受,而要整理出这样的套件其工程之钜大也可想而知。由於在时
  间与空间因素之下,在我们安装完某些套件後,其中的部份软体可能已经在
  国际网路上发表了更新版、或者有些自己需要却没 录进来的软体,另外更
  有许多新出炉的软体还来不及纳入该套件之中。由於TANet、HiNet、SEEDnet
  越来越发达的关系,接触Internet的机会越来越多,使用者可以轻易的使用
  ftp来取得最新最新的软体,而没有这样资源可用的人也可以在光碟月刊中取
  得不少此类的新软体。在这种情形之下,你就得自己透过管道取得软体,然
  後自己动手将取得的软体安装至你的Linux系统中啦!—"D.I.Y."就是来谈谈
  一些自行安装时所会遇到的状况,以供读者不时之需。

  LSM软体指引

    几乎所有为Linux发展的软体在正式发表时,都会将发表的消息在comp.
  os.linux.announce这个信区中公告给大家知晓,而在这个同时也会附上一份
  简述该软体的基本功能以及特色的LSM(Linux Software Map)。即使,该
  作者并未在该信区中公告,但是也会填具这样一份文件以供一般使用者在下
  载该软体之前的参考之用。因此,在你要进行下载或是安装该软体之前,如
  果可能的话最好先参考一下这份文件内容中对於该软体的基本描述,然後才
  接着下载的动作,以免花费一堆时间在传输或安装上,结果是取得一个自己
  用不上的软体,这样就多走一大段冤枉路了。


      ----------------------------------------------------------------------

      Begin

      PkgName      = idleout.tar.Z

      Title        = autologout of idle users

      Version      = 1.01(patched)

      Desc1        = Automatically logs out idle users after a predetermined

      Desc2        = period of inactivity.  Includes a .diff file to

      Desc3        = optionally(and selectively) disallow automatic logout

      Desc4        = for certain users.

      Author       = David Dickson

      AuthorEmail  = (unknown)

      Required1    = cc, patch, make, compress, tar

      FileSize1    = 5198 bytes

      CopyPolicy1  = GNU copyleft.

      Keywords     = linux, modem, serial, autologout, idle, users

      Comment1     = Found on ftp.uu.net in unix-world/grabbag/may90

      Comment2     = Written for SysV in c.

      Entered      = 13JUL1994

      EnteredBy    = Mark Horton

      CheckedEmail = mah@ka4ybr.atl.ga.us

      End

      --------------------------( LSM 的范例 )------------------------------

  解开档案封包

    从国际网路上(Internet)的档案伺服器(FTP Server)取得的Linux软体
  档案格式大多是下列几种型态中的一种:


       *.tar    ——— 直接使用 tar 将所有档案打包成一个档案。

       *.gz     —┬— 使用 gzip 或 compress 将档案压缩成一个档案。

       *.z      —┘

       *.tar.gz —┐

       *.tar.z    ├— 先使用 tar 将档案打包後,再利用 gzip 或

       *.tgz    —┘   compress 将该档案再进行压缩。

    为了节省大量的储存空间以及传输的效率,绝大部分软体档案都是会经
  过压缩的处理,才放置在档案伺服器上供使用者取用。因此,在你取得到这
  些档案後的第一件事,便是要将此档案进行解压缩的工作。我们就以这些常
  见的储存档案格式作为说明的内容,举一些常见解开封包的方法。首先,先
  将常常利用来解开封包的工具程式做一个简单介绍。

  ①tar --
   用来将多个档案打包成一个合并档案的工具程式(可以与DOS中的Backup、
   Restore指令联想)。透过tar,软体原作者可以将所有档案包括目录、属
   性等)都把包成一个单一档案。而使用者,也要使用tar来将这些档案还原。

  ②gzip --
   GNU Zip是一个普遍在Unix系统中被使用的压缩、解压缩的程式经过
   "gzip"压缩的档案大都会在档案名称的後面加上.gz、.z以兹区别。
<


      <DOSEMU 0.52 QuickStartい癸セ弧>

     >>>> Skip this section if you already Linux 1.1.12 or later installed.

      - Preferable course of action is to upgrade to v1.1.12 or above.

      - If you use Linux v1.0.8+, you can patch the kernel with the

        included patch ./kernel/kernel.1.0.x.diff

      - NOTE: At least GCC 2.5.8 and libc 4.5.21 are required to run DOSEMU

  3.记忆体、硬碟的需求
   有一些软体在编译或是执行时有特定的需求(不仅仅是执行效率的问题而
   已)所以会要求系统至少要有多少的记忆体、硬碟空间。就以「dosemu0.
   52」来说,在编译时期必须要有16M的记忆体(实际+虚拟)才可以,所以
   如果当初没有注意到这一点,那麽就有可能发生花了好久的功夫结果所得
   到的是一个错误的讯息。

  4.其他相关辅助软体
   有一些软体会使用到其他的软体,因此如果目前系统并没有该辅助软体的
   话,那也没办法安装该软体。譬如,安装ingres89这个资料库软体时,因
   为他会使用到「bison」这个软体,所以你的系统里也必须先有「bison」
   。再举一个「tgdb」(一个图形界面的GNU Debugger)为例,它是使用
   tk/tcl所发展的,因此系统中就也需要安装tcl/tclX才可。

  5.软体安装步骤说明
   对於较为复杂的软体,作者为了便利使用者正确安装该软体,一般说来都
   会附上一份简要的安装程序说明,所以如果有这类文件最好看过一次,让
   心中有一个底。

  6.系统参数选项设定
   系统参数依照设定的时期来区分,可以分为两种:
   ⑴编译时期参数--在软体编译时就会使用到,根据这个设定产生不同的执
    行档案。
   ⑵执行时期参数--在软体执行时才去读取该参数内容,再依设定来执行。

  7.其他资讯
   有些软体已经有多个更新版本,所以他可能会附上"ChangeLog"来说明该
   软体每个版本更新的主要内容以及错误修正的情形,像这类档案亦可以参
   考来知道该软体的历史以及稳定性。此外,有些软体可以在多个作业系统
   中执行但是功能可能有所差异..等等,这类文件也不妨读一读。经过一番
   资料的苦读之後,开始要执行安装的工作,当然啦!!如果该软体是以执行
   档方式提供给使用者,在你确定该软体执行期间的条件都符合,那麽就可
   以进行"执行期间的参数设定",然後就可以开始使用该软体了,一切的安
   装工作也就到此为止。如果,该软体是以提供原始程式的方式给使用者的
   话,那麽,就得继续下面我们要说的「重新编译软体」的内容。

  重新编译软体

    「重新编译软体」这是一件相当频繁的工作,玩Linux的人应该要习以
  为常了。那究竟该怎麽编译软体呢?说简单一点就是直接在该软体原始程式
  所在的目录敲入"make"就可以完成编译的工作。(通常这一招可以有六成以
  上的成功率)因为作者通常就在原始程式目录的最上一层建立该软体编译所
  需要的"Makefile"让使用者直接使用"make"来完成程式编译的工作。

    例如编译ppp 2.1.2b版的"pppd",最简单的方式就是输入下列指令:

      simon98:~/ppp-2.1.2b/pppd$ make

    通常这样子就可以完成编译的工作,但是由某些软体他需要安装置固定
  的档案目录位置或是有固定的档案属性,如果只是完成编译的工作并不代表
  就完成安装的工作。而这些後续的步骤虽然你可以自行处理,但是最省力的
  方式,就是利用作者所提供Makefile中的设定。

    关於"make"这个工具程式的使用方式暂且不在本篇幅中深谈,由於整个
  "make"的行动就靠一个控制档来控制,如果为经过特别指定就内定为目前工
  作目录中一个叫作"Makefile"的档案来控制。在这里我们现在以一个基本架
  构的"Makefile来指出两个焦点。


    —————————————————————————————————————

          ┌—————————————————————————

          │  #       $Id: Makefile,v 1.1 1993/08/14 06:30:44

          │

          ┌→BINDIR=/usr/etc

     (1)—┤  CDEF1=  -DTERMIOS                       #

          │  CDEF2=  -DPIDSTRING                     #

          │  CDEF3=  -DLOCK_DIR=\"/usr/spool/uucp\"  #

          │  CDEF4=  -DSIGTYPE=void                  #

          │  CDEF5=  -UNO_SLEEP                      #

          │  CDEFS=  $(CDEF1) $(CDEF2) $(CDEF3) $(CDEF4) $(CDEF5)

          └→CFLAGS= -O2 -N $(CDEFS)

           │

           │  all:    chat

             ??

         (2)  chat:   chat.o

                         $(CC) -o chat chat.o

           │

           │  chat.o: chat.c

           │             $(CC) -c $(CFLAGS) -o chat.o chat.c

           │

           │  install: chat

           └—————————————————————————

    —————————————————————————————————————



  焦点(1)

    这一段都是在定义一些编译时使用到的符号值。其中有关於目录的部份
  ,必须要与自己目前系统名称相符,由於每个Linux安装套件对於档案的规
  划不一定完全相同,所以虽然这个差异的可能机率较小,但仍应注意。

  焦点(2)

    这里定义make如何完成每一段工作。例如说代号"all"的工作是要完成"
  chat"这个工作,恰巧chat是另一个工作代号。这里定义着chat是完成"chat
  .o"然後执行"$(CC) -o chat chat.o"...。因此我们在shell底下,输入
  "make all"表示要完成代号all的工作,输入make install表示要进行代号
  install的工作。所以,在执行make之前,先看看在Makefile中究竟定义了哪
  些工作代号。

    在你确定了这个"Makefile"档案中关於符号所指定的工作目录值没问题
  之後然後就可以选择一个最适当的工作代号进行软体编译的工作了。(有些
  软体由於工程浩大,所以可能将编译工作分成数个步骤,因此就需要执行多
  次的「make」完成,比如重新编译Linux Kernel)。

  後记

    「自己动手做一次收获会更多」,这个过程中难免会碰到些问题。最後
  则是提供一些常在信区里发现的安装问题,如果你也遇到这类问题不要慌,
  静心找找,或可找到问题所在。
  1.记忆体不足(memoru exhausted)?
    如果发生记忆体(实际记忆体+虚拟记忆体)不足,导致编译失败时,或
  许你可以用"root"的身分利用下面的方法,临时加一块虚拟记忆体以供系统
  使用。


      # dd if=/dev/zero of=swapfile bs=1024 count=8192

      # mkswap swapfile 8192

      # sync

      # swapon swapfile

  2.编译时,出现"Undefined symbol...." ?
    大部分发生这个问题的原因是因为Linux版本不符合需求的问题,因为
  Linux在版本变动时,可能也改变了某些中的设定,因此才
  会发生此种状况。
  3.编译时,出现"file not found...." ?
    可能是因为"Makefile"中指定档案路径的值有误而导致无法找到需要的
  档案。此外也可能是OS版本的问题,也可能是该档案是後来才安装至系统中
  的,但安装过程中因某些插曲而导致将该档案安装到其他的目录中。
  4.重新config过,但是编译出来的好像是重新config前的功能?
    如果确定要重新config过编译的选项时,你最好将先前产生的*.o、*.a
  等档案删除後重新编译。通常在Makefile有一个clean的代号可以完成这个工
  作。如果有,那麽输入make clean就可将先前产生的目的档案全部删除,然
  後重新进行编译工作这样一定可以确保结果与设定的一致。
  5.程式成功编译,但是却无法正常执行?
    如果不是编译时期设定错误,就可能是执行时期的设定有问题,另外,
  某些软体会在/var或是/tmp中开启一些暂时档案,如果他所使用的目录不存
  在系统也可能发生执行上的问题。这些都需要参阅该软体的文件说明。
    好了就此打住,希望各位在看完这篇D.I.Y.後,真的可以开始自己动手
  进行一次,在此预祝各位Linux的爱好者都够顺顺利利的安装成功。