打印本文 打印本文 关闭窗口 关闭窗口
从源代码打造一个最小化的Linux系统实作指南(转)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1907  更新时间:2009/4/22 23:08:21  文章录入:mintao  责任编辑:mintao
p;

    Glibc库是一个很大而且很复杂的软件包.在我那个旧型的带8兆内存的386sx/16机器上,得花掉我90个小时来完成编译工作.但是在我那带有64兆内存的赛杨(Celeron)433上只花掉了33分钟.如果您只有8兆内存(或者少得让人打颤的容量)的话,那就做好苦熬的准备。 

    glibc的安装文档建议在不同的独立分离目录里面编译.这样做就能够让您很轻松地再次编译,因为您可以该目录下面接着编译.您可能也会想这么做,因为可以为您节省大约265兆的磁盘空间哦! 

    跟平常一样,把glibc-2.1.3.tar.gz(或者其它版本)这个tar包解压到/mnt/target/usr/src这个目录下面.接下来,我们得把附加库也解压到glibc 库目录下面.所以先cd glibc-2.1.3,然后接着在这个目录下面 把glibc-crypt-2.1.3.tar.gz和glibc-linuxthreads-2.1.3.tar.gz这两个tar包解开。

    现在我们就可以生成编译目录,设置选项,执行make编译和安装glibc库了.这些都是我所使用过的命令,但是最好您自己阅读一下文档,确认最适合您的状况的做法.然而在您开始前,您可能需要执行df命令来查看一下还有多少剩余空间.您还可以在编译并安装完毕glibc库之后再执行一次看看这玩意儿到底得占多大地儿。


    cd .. 
    mkdir glibc-build 
    ../glibc-2.1.3/configure --enable-add-ons --prefix=/usr 
    make 
    make install_root=/mnt/target install 

    注意了,我们还有别的方法来告知一个软件包该装到什么地方。


    7. SysVinit初始化脚本包 

    编译并安装SysVinit可执行代码是非常之简洁明了的.我偷懒一次,就给您操作命令吧.假定您已经解压并且进入SysVinit源码目录了∶ 

    cd src 
    make 
    ROOT=/mnt/target make install 

    另外还有很多与init相关的脚本.在SysVinit包里面有一些工作正常的范例脚本,但是您得自个儿手工安装了.它们在SysVinit源码树中是有层次地布置在debian/etc下面的.您只需要执行类似这样的命令∶cd ../debian/etc; cp -r * /mnt/target/etc 直接把它们复制到目标系统的etc目录下面就行了.当然了,您最好是在复制之前查看一下. 

    当重启之后,目标系统的内核就会加载init,一切都该各就其位了.此时的问题可能是脚本不能正常运行,因为没有命令解释器bash来解释执行这些脚本.而且init还会尝试执行getty,但是根本就没有getty可供运行.请重新启动并确认没有其它的错误。


    8. Ncurses库 

    我们所需要的下一个东东是命令解释器Bash,而bash需要ncurses库,所以我们得先安装这玩意儿.ncurses库可以代替termcap处理文本屏幕的活计,同时还通过支持termcap调用提供了向后兼容性.为了拥有一个简洁新潮的系统,我觉得最好是禁止旧式的termcap方法.如果您后头要编译使用了termcap的较老的应用程序,您可能会不断地与麻烦为伴了.但是您至少会知道什么东东使用了什么东东.如果您必须要用,那么您可以重新编译ncurses库,使其带有termcap支持. 

    我所使用的命令是∶ 

    ./configure --prefix=/usr --with-install-prefix=/mnt/target \ 
    --with-shared --disable-termcap 
    make 
    make install 


    9. Bash命令解释器 

    为了把bash安装到我认为它该呆的地方,我花费了很多时间做了大量阅读和思考以及不断地尝试和出错,可谓是历尽千辛万苦啊.我所使用的配置选项是∶


    ./configure --prefix=/mnt/target/usr/local \ 
                       --exec-prefix=/mnt/target --with-curses 


    一旦您已经编译并安装了bash之后,您需要生成一个符号连接,就象这样∶ 


    cd /mnt/target/bin; ln -s bash sh. 

    这是因为脚本通常头一句是这么写着的∶ 

    #!/bin/sh 

    如果您没有这么一个符号连接,那么您的脚本就不能运行,因为它们会去寻找/bin/sh而非/bin/bash. 

    如果您愿意,您也可以到这里时重新启动一次.您会注意到脚本这一次确实运行了.虽然您还是没能登录(login),这是因为还没有安装getty或者login 这些程序。


    10. Util-linux (getty 和login) 

    软件包util-linux包含有agetty和login.我们需要这两个程序才能登录系统(log in)和得到命令行提示符(bash prompt).在安装之后,请在目标系统的/sbin目录下为agetty建立一个符号连接到getty.getty是所有Unix类系统当中被认为应该呆在那个地方的程序之一,所以生成连接的主意要强于改动inittab来运行agetty. 

    对于util-linux这个包,我剩下的一个问题就是该包的编译.这个包还包含有more这个程序,而我没法让make进程给more在目标系统上做一个指向ncurses 5库的连接,而不是在源头系统上指向ncurses 4库的连接.我会努力克服这个困难的。

    您还得在目标系统上准备一个密码文件/etc/passwd.login登录程序正是通过查询该文件来确认您是否允许登录的.因为此次我们只是打造一个玩具系统,所以我们可以只设置根系统用户就够了,而且不需要任何密码!! 只需要在目标系统的密码文件/etc/passwd加上如下一行即可∶ 

    root::0:0:root:/root:/bin/bash 

    所有的域是通过冒号(:)分隔开的,自左向右分别代表∶用户名称(user id),密码密串(password),用户号码(user number),用户群组号码(group number),用户真实姓名(user"s name),用户主目录(home directory)和缺省命令解释器(default shell)。


    11. Sh-utils 

    我们所必须的最后一个软件包就是GNU sh-utils包.我们此时所需要从这个包里面得到的唯一的程序就是stty,它会在/etc/init.d/rc里面用到.而后者是用于改变运行级别和进入初始化运行级别的脚本.实际上我有一个而且用过仅包含有stty的软件包,但是却忘了是从何处得到的了.使用GNU的软件包是个好主意,因为在里头还有其它您需要的东西,增加了这些东东会使得系统可用性更好。

    好了,打造完毕.您现在应该拥有一个可以启动并且能够提示您登录的系统了.输入``root"",您就会进入命令解释器了.但是您做不了很多事情,甚至没有一个ls命令给您看看您的作品里面都有些什么东西.请连续按两次TAB键,您就会看到可用的命令了.这大概是这个系统中,我所发现的最令我满意的事情。

    12. 可用性商榷 

    看起来好像我们打造的是一个毫无用处的系统.说真的,要让它能够有实用价值也并不是什么难事.首先要做的事情之一就是您应该使得根文件系统(root filesystem)以可读写方式挂载起来.SysVinit软件包里面有干这活儿的脚本,就在/etc/init.d/mountall.sh里面.还执行了一次mount -a把所有在/etc/fstab当中的条目以您所指定的方式挂载起来.请在目标系统的etc/rc2.d目录下生成一个类似S05mountall的符号连接。

    您可能会看到这个脚本会用到您尚未安装的命令.如果真是这样,找到包含该命令的软件包并安装之.请参看 随机小技巧(Random Tips)这一小节,了解如何查找软件包. 

    看看在/etc/init.d里面的其它脚本.它们大部分都应该包含在任何正经的系统里面.一次添加一个,别忘了要确定添加下一个之前个个都运行无误.请对照文件层次结构标准(File Heirarchy Standard),请参看 文件系统(Filesystem)一节.那里有一个命令列表,都是该在/bin和/sbin的命令.请确定您已经把那里列举的所有命令都安装在系统上了.最好就是再找找相关这类问题的POSIX文档来看看. 

    从此,在这个系统里面添加更多必要的软件包就真是个事儿了.越是早些把编译工具,比如说gcc和make这些添加进去就越好.一旦这些都完工了,您就可以利用目标系统来自我生息,就会越来越简单了. 

    13. 更多信息 


    13.1 随机小技巧 

    如果您的Linux系统上曾经使用RPM安装过有一个叫做thingy命令,而您想获知这个命令的源码来源,那么您就使用如下命令∶ 

    rpm -qif `which thingy` 

    如果您有小红帽RedHat的源码光盘,那么您就可以使用下列命令安装源码包了∶ 

    rpm -i /mnt/cdrom/SRPMS/what.it.just.said-1.2.srpm 

    这个命令会把tar包以及任何RedHat补丁包放到/usr/src/redhat/SOURCES目录下面。


    13.2 资源链接 

    * 有一个关于从源代码编译软件的小型实作指南(mini-howto),就是《软件打造小小实作指南(Software Building mini-HOWTO)》: 
http://www.linuxdoc.org/HOWTO/Software-Building.html.


    * 另外还有一个关于从一穷二白空手起家打造一个Linux系统的实作指南.该文更为集中于打造一个有实际应用价值的系统,而不仅仅是一个实习.请看∶ 《Linux系统空手道实作指南篇(The Linux From Scratch HOWTO)》: http://www.linuxfromscratch.org/. 


    * Unix文件系统标准(Unix File System Standard) 还有一个关于Unix文件系统标准的 链接.这个标准描述了在一个Unix系统中什么东东该呆在什么位置以及原因.它还描述了在/bin,/sbin等等目录中最小化的要求.如果您的目标是要打造一个小而全的系统,那么这个标准正是一个好的参考. 
ftp://tsx-11.mit.edu/pub/linux/docs/linux-standards/fsstnd/


    14. Administrivia 

    14.1 版权声明(Copyright) 

    本文版权所有,归属Greg O"Keefe.欢迎您在遵循 GNU通用公共许可证(GNU General Public Licence)的各项条款的前提下无需付费来使用,复制,散发或者修改本文. 如果您在其它文档里面使用了本文的全文或者部分,请在鸣谢录提提我就行了. 

    This document is copyright (c) 1999, 2000 Greg O"Keefe. You are welcome to use, copy, distribute or modify it, without charge, under the terms of the GNU GPL (GNU General Public Licence). Please acknowledge me if you use all or part of this in another document. 

    14.2 主页 

    本文最新的英文版本"From Powerup To Bash Prompt"可在此找到∶ 
http://learning.taslug.org.au/power2bash 


    14.3 您的反馈意见 

    我很乐意从读者您那儿得知任何评论、改进意见和建议.请写信给我∶ Greg O"Keefe 

    14.4 鸣谢录 

    本文所提及的产品名称是相应持有者的商标,在此我一并致谢. 我想对以下人员致谢,因为他们的帮助才有了这篇实作指南. 

    Michael Emery 
    因其提醒我注意到Unios. 

    Tim Little 
    因其提供了关于/etc/passwd的一些线索. 

    sPaKr on #linux in efnet 
    因其发现syslogd需要/etc/services的支持以及介绍给我 使用短语``rolling your own""来表述从源码打造系统. 

    Alex Aitkin 
    因其引起了我对Vico以及他的``verum ipsum factum""(对编译进一步的理解) 的注意. 

    Dennis Scott 
    因其纠正了我的十六进制计算错误. 

    jdd 
    因其指出一些拼写错误. 

    14.5 修订历史记录 

    0.8 

    * 最初版本.自"From PowerUp to Bash Prompt(从加电启动到Bash提示符)实作篇"分离独立出来. 

    14.6 未来计划(TODO) 

    * 转换为docbook格式. 


本文出处:【嵌入式开发网 论坛

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口