裸机源码LINUX,做你从未做过的事(LFS+BLFS for UBUNTU菜鸟)

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
ti8er
帖子: 497
注册时间: 2006-10-18 8:48

裸机源码LINUX,做你从未做过的事(LFS+BLFS for UBUNTU菜鸟)

#1

帖子 ti8er » 2008-09-22 22:05

用UBUNTU已经两年了。从DAPPER-6.06到现在的HARDY-8.04(只用了一个月就不用了)。自我感觉开始的时候LINUX技术突飞猛进,一段时间后进展非常缓慢。觉得自己还是一个菜鸟级的初学者,也觉得UBUNTU掩盖了LINUX的很多东西,我用的只是它的外壳,然后动动鼠标打打命令而已。而且用UBUNTU你甚至都不用打命令,用新立得什么都装好了。后来我不满足于现状,慢慢学会了用dpkg来编译和打包内核。后来想想,能不能直接在一台全新的机器上(也就是裸机),从源码开始一步步编译出内核,进而编译出整个系统呢?
上网找了资料,很快就找到了,这就是LFS(linux from scratch,从零开始LINUX)。
相关的资料,网上都非常齐全。LFS的官方网站是

http://www.linuxfromscratch.org

上面有6.3版本的英文手册。
在国内有6.2版本的中文翻译手册,网址是

http://lamp.linux.gov.cn/Linux/LFS-6.2/index.html

国内还有一个比较不错的网站:

http://www.magiclinux.org

可能你会说:我已经有UBUNTU了,何必要费功夫去折腾源码LINUX?现在的UBUNTU已经将我折磨得够受了,声卡不响,显卡不行。
我可以告诉你,只要你完成了LFS,你的声卡和显卡问题根本就算不上什么问题。对于以上的问题,我摘录了LFS6.2中文手册的序言的部分内容,请大家阅读。希望这个摘录没有侵权。

-------------------------------------
为什么要读这本书呢?有许多原因,最主要的原因是可以学习如何直接从源代码安装一个 linux 系统。许多人也许会问:"当你可以下载和安装一个现成的 linux 系统时,为什么要如此麻烦地从源代码开始手动构建一个 linux 系统呢?"这是一个好问题,也是本书存在本节的原因。

LFS 存在的一个重要原因是可以帮助人们学习 linux 系统内部是如何工作的。构建一个 LFS 系统会帮助演示是什么使 linux 运转,各种组件如何在一起互相依赖的工作。最好的事情之一通过这种学习可以获得完全根据自己的需求定制 linux 系统的能力。

LFS 的一个关键的好处是它让用户对于系统有更多的控制,而不是依赖于他人的 linux 实现。在 LFS 的世界里,你自己坐在司机的位置,掌控系统的每一个细节,比如目录布局和启动脚本配置等等。你也能掌控在哪里、为何、以及怎样安装每一个程序。

LFS 的另一个好处是可以创建一个非常小巧的 linux 系统。当安装一个常规的发行版时,人们经常要被迫安装一些可能永远不会用到的程序。这些程序浪费宝贵的磁盘空间,或更糟的是占用 CPU 资源。要构建一个少于100兆(MB)的 LFS 系统并不困难,这比目前大多数的发行版要小很多。这听起来是不是仍然占用太多空间?我们中的一些人专注于创建非常小的嵌入式 LFS 系统。我们成功的构建了一个只运行 Apache 服务器的系统,大约占 8MB 磁盘空间。进一步的缩减能够减至 5MB 或更少。你用一个常规的发行版试试?!这也只是设计你自己的 linux 所带来的好处之一。[译者注]关于如何构建这样的 Apache 服务器系统的详情,请参见 youbest 兄的两篇大作"做一个功能单一,体积小巧的LFS[5M]"和"我们可以做的更小!《功能单一,体积小巧的LFS》续篇[600K]"。此外,本文译者金步国也有一篇文章《DIY一个实用的 mini-LAPP 服务器》[15MB],详细讲述了如果从源代码编译一个既实用又小巧的 Linux + Apache + PHP + PostgreSQL + OpenSSH + Iptables 服务器,如果你对服务器情有独钟,也很值得参考。

我们可以拿 linux 发行版与快餐店出售的汉堡打比喻,你不能决定自己正在吃的是什么。相反,LFS 没有给您一个汉堡。而是给您一张制作汉堡的配方。用户可以查阅配方,减掉不想要的配料,增加你自己的配料以增强汉堡的口味。当你对配方满意时,开始去制作它,您可以采用任何你喜欢的方式:或烤、或烘、或炸、或焙。

另外一个比方是把 LFS 与建筑房子比较。LFS 提供房子的框架蓝图,但是需要您自己去建筑它。LFS 包含了在这过程中调整计划的自由以及定制满足用户需求的参考。

自己定制 linux 系统的另一个好处是安全性。通过从源码编译整个系统,您能够审查任何东西,打上所有的安全补丁,而不需要等待别人编译好修补安全漏洞的二进制包。除非是您发现并制作的补丁,否则您无法确保新的二进制包一定被正确编译并修正了问题。

Linux From Scratch 的目标是构建一个完整的、可以使用的基础系统。不想构建自己的 linux 系统的读者,不会从本书中获益[译者不太赞同这句话,借用 d00m3d 的一句忠告:"對任何想深入了解的 Linux 愛好者,不論你現用哪個發行版,最少都應該做一次 LFS ,一定會終身受用的。"]。如果您仅仅想了解计算机启动的时候做了什么,我们推荐您查看 "From Power Up To Bash Prompt" HOWTO 文档,中文版位于 从按下电源开关到bash提示符 ,英文原版位于 http://axiom.anu.edu.au/~okeefe/p2b/ 或者 linux 文档工程(TLDP)网站 http://www.tldp.org/HOWTO/From-PowerUp- ... HOWTO.html 。那个 HOWTO 构建了一个类似本书的系统,但是它的焦点仅仅限制在创建一个能够启动并进入到 BASH 提示符的系统。想想您的目标,如果您想构建一个实用的 linux 系统并通过这种方式进行学习,那么本书是您的最佳选择。

构建您自己的 LFS 系统的若干原因以上都列出来了。本节只是冰山一角。随着您 LFS 经验的增长,您将会发现 LFS 真正带给您的信息和知识的力量。
----------------------------------------------

我这里以一个初学者的身份再进一步的补充说明几个简单问题(作为初学者扫盲),以及6.3英文官方手册的几个BUG(一定要看),余下的部份大家去看看上面的网站就可以了。

1、我在一个操作系统(如UBUNTU)下载了LINUX内核源码,现在可以删除这个操作系统,开始用这个源码启动机器了吗?
回答:当然不行。源码只是文本文件,而机器是只认二进制文件的(也就是XP下的.exe可执行文件),如果二进制文件用于启动机器的话,将有着更严格的要求。你需要用一个工具来编译这些源码,使之成为内核二进制文件,同时还要进行一些相关操作才可以用它来启动机器。

2、LFS的原理是什么?是怎么操作的?
回答:LFS的基本原理是,在现有的具有编译能力(或者叫开发能力)的操作系统上,或者用可启动的具有编译能力的光盘,编译出全新的开发环境,然后在这个全新的开发环境,编译出相关的程序和内核,最后用这个内核启动机器。
具体的操作,可以看看官方的手册就明白了。

3、我已经会在UBUNTU下编译和安装内核,这和用LFS方式安装的内核有什么不同?
回答:你在UBUNTU下编译和安装的内核,利用了UBUNTU的编译工具和库文件,在用这个内核启动时,又用了UBUNTU下的应用程序和工具,因此和 LFS相比有一些“不正宗”,或者叫“出老千”。而且在UBUNTU下编译内核的步骤是如此简单,用make-kpkg能够轻松创建内核。除了能够熟悉内核的配置选项以外,你几乎学不到其他的东西了。当然并不是说在UBUNTU下编译内核不重要,恰恰相反,这是你走向LFS的关键一步。因为LINUX内核的菜单,要熟悉它本身就是一项浩大的工作。
如果你学过编译内核,那么LFS对你是驾轻就熟。如果没有学过也没有关系,一步步来,照样能够完成工作。
如何在UBUNTU下编译内核,可以看这:viewtopic.php?f=50&t=34172

4、LFS不是也用到了现有的开发环境吗?和上面提到的有什么不同?
不同点是,LFS是先利用现有的开发环境,构建出新的开发环境,然后才用这个新的开发环境编译内核,并且编译相关的程序。在你最终完成并用新内核启动机器时,里面的东西全部都是你一步步从源码编译来的东西,没有一样是直接从UBUNTU上拿来用的。

5、这里是对LFS的比较详细的解释:
LINUX下所有的应用程序,不外乎是由配置文件(etc)、库文件(lib)、程序文件(bin)组成。而要生成这个应用程序,你需要源代码,同时需要一个开发环境,由连接器、编译器、库文件组成。
编译器将源代码编译为二进制代码,它本身也是程序,所以需要库文件;连接器告诉编译器连接到哪个库文件,同时将编译器产生的结果输出给机器执行。连接器本身也是程序,也需要库文件。因此可以知道,库文件是很重要的。在LFS里,库文件是GLIBC,编译器是GCC,连接器是Binutils(它是一个程序包,其中真正用于连接的程序是ld)。

LFS的运作过程:
假设你现有的环境为A,制作的开发环境为B,最终的环境为C。
那么,一开始,先用库文件A/编译器A/连接器A,制作出了连接器B。
我在这表示成:LIB-A+GCC-A+LD-A==>LD-B

然后用库文件A/编译器A/连接器B,制作出编译器B。
就是:LIB-A+GCC-A+LD-B==>GCC-B。

然后是用库文件A/编译器B/连接器B,制作出库文件B。
LIB-A+GCC-B+LD-B==>LIB-B

由于编译器GCC-B和连接器LD-B都用了原系统的LIB-A,所以不是“纯种”的。而新生成的库LIB-B在编译完LD-B和GCC-B后,将会进行一个重定向,使得它并不依赖于原来系统的库,所以是相对“纯正”的。一定要注意这点!这里是关键的转折点。
新的库文件仅仅是依赖于你要编译的新的内核头文件。同时要认识到你编译出的库文件,除非你没有给它指定内核的头文件,不然它都不会依赖和利用原系统的东西,因为,库文件不是“程序”!

这时候,编译器B/连接器B/库文件B都做好了。但是我们知道,这编译器和连接器不正宗。需要进行“过滤”处理:
这时,用编译器B利用库文件B自己再一次编译编译器B,这回利用的是新的正宗的库文件B。
LIB-B+GCC-B+LD-B==>GCC-B2
然后是连接器
LIB-B+GCC-B2+LD-B==>LD-B2
这时新生成的编译器和连接器,都用了新的库文件。我们可以认为它们是正宗的了。其实,这时候它们已经和原来的系统脱离关系了。

接下来,我们会用到一个虚根环境。这是一个利用现有系统的硬件来运行,但是所有的程序和库和配置文件都独立于原系统的环境。之所以用这个环境,是因为内核还没有被编译,很多应用程序还没有编译,机器还是不能启动的。为了使用这个虚根环境,会用LIB-B+GCC-B2+LD-B2这套开发工具编译出很多新的程序。

这时候不知道你会不会问:既然新的一套工具出来了,我直接编译内核不就得了?还那么麻烦?是的,我开始也这么想的,同时也是这么做的。我也建议好奇心强的LINUX FANS这么做看看是什么结果。
结果我可以告诉你:内核是编译好了,也可以启动内核,但是却没有办法控制。为什么?因为你没有BASH这个控制台。
你这时是不是才恍然大悟:天啊,我以为一个内核就能够完全开机并操作的呢!

内核启动了,需要一个init程序来进行初始化。
这个init就是所谓的“根进程”。没有这个程序,一切程序都无法运行。然后这个进程开始挂载、运行相应的程序。比如BASH。有了BASH还不行。 BASH只是一个外壳(SHELL),它没有任何东西,比如我们经常打的ls命令,根本没有。因为ls本身就是个程序文件!还有mkdir等等命令,全部都是程序文件,都没有。也没有办法控制机器。因此这些程序全部都要从源码编译出来。

这时你可能还会问,为什么要用虚根环境?我直接在现有的环境下编不就成了?反正我用的是新的开发工具。
原因是:如果你没有搞好设置,新的开发工具可能还是会用到原有系统的东西,甚至会把编译好的程序安装到原来的系统,从而能破坏原来的系统。当然如果你非常清楚如何进行每一项设置的话是可以的,但是你有这样的水平,你用的估计已经就是你自己做出来的LFS系统了。为了避免不必要的麻烦(重定位程序、连接器等等操作是非常复杂的),才会使用虚根环境,直接与原系统隔离。

有了虚根环境,还会再一次编译库文件。这是因为之前编译的LIB-B是经过重定位装在别的地方的(可见重定位的麻烦),
你要编译一个新的没有重定位的库文件,装在默认的地方,以便将来你的程序都可以利用它。这时生成了LIB-C。
LIB-B+GCC-B2+LD-B2==>LIB-C。
然后,编译GCC和LD,将它们之前的重定位去掉。
LIB-C+GCC-B2+LD-B2==>LD-C
LIB-C+GCC-B2+LD-C==>GCC-C

这时候,最终的开发环境大功告成了。
现在,把所有内核启动需要的程序都进行编译。比如init,比如bash等。最后编译内核。设置好GRUB后用新内核、新程序
启动机器。至此,LFS工作全部完成。

6、在进行LFS时需要注意的关键地方和LFS6.3手册的一些BUG
第一,你需要注意的地方是你的环境变量PATH。你可以用命令:
echo $PATH
来查看。如果你和LFS手册一样建立的是/mnt/lfs/tools和/tools,那么你要确保:
在进入虚根环境之前,PATH的第一个必须要是/tools/bin,
如:
PATH=/tools/bin:/bin:/usr/bin
就是正确的。
在进入虚根环境之后,PATH的/tools/bin必须要是最后一个。

PATH=/bin:/usr/bin:/tools/bin
原因是PATH决定着系统在调用应用程序时的优先级,比如系统里同时有两个GCC,那么它会先用PATH排在前面的那个。这在LFS中被用来进行重定向了。如果你排错了顺序,那么将会用错程序,后面的步骤就会失败。

官方手册在第4章“设置工作环境”时,第一行的.bash_profile文件中没有将PATH进行设置,这是严重错误的地方,导致我第一次编译时失败,找了好久才找到原因。
因此,任何时候,都要确保你的PATH设置正确。

第二,你需要注意的是,如果你用的不是官方提供的2.6.22内核,而是用了更新的内核,比如我用了2.6.26.4。那么
这两个内核的头文件是不一样的。其中,2.6.26的内核在asm/目录下少了一个page.h的头文件。这个文件perl会用到。
因此为了欺骗perl,我拷贝了这个文件过来。新的内核用的机制有所不同,因此估计要等perl6出来了,我才可以删除这冒牌的头文件。

第三,官方的手册是6.3版本,上面的中文手册是6.2版本。这里面有一些地方是不太一样的。因此你要特别注意。
第四,没事不要用root来操作。这是为了防止出错毁掉你现在的系统。比如我进入了/mnt/lfs目录,想删除里面的bin目录,我了rm -fr /bin想删除,提示权限不够。这时我才发现,我打的是/bin,而不是bin。前者是“根目录”下的bin目录,后者是“当前目录”下的bin目录,这两个的差别是相当巨大的!我庆幸我使用的不是root,而是用了另外的用户名。否则现有的系统将由于失去了关键的二进制文件而直接崩溃!如果不信你试试!

第五,为了提高成功率,强烈建议用LFS官方的livecd6.3来开展工作。里面有所有需要的软件。而且就算你误操作删除了系统也不要紧,因为光盘是只读的,重启就又恢复了。(在光盘启动后输入startx会进入图形界面)

好了。你经过努力,终于完成了你的LINUX系统。其中不知道误操作了多少回,英文看不太懂猜了多少回。反正过程很艰苦,结果很幸福。

新系统和原来系统相比,有何优点?
速度!就是速度!
我的是华硕的笔记本,256MB内存,Intel Pentinum M 735,很垃圾的配置吧?但是就是这样一个垃圾机器,编译LINUX内核用了6分钟。而我之前在UBUNTU下用make-kpkg编译内核的时候, 128MB的机器用了4个小时。512MB内存,双核CPU联想品牌机用了35分钟。就是这个区别。
还有一个区别,就是小巧,我的新内核只有2.7MB,其他应用程序只有40来MB。当然现在硬盘大了也无所谓了。

接下来你可能还是不会满足,因为现在这个系统是命令行模式的,没有图形桌面,也不能看网页(没有装W3M)。
那么,进入下一章,就是BLFS,Beyond linux from scratch,超越LFS。
BLFS教你怎么在建立好LFS后,配置系统,安装相关的软件,构建X桌面平台等等。这一章就比较灵活和广泛,在你有了前面LFS的基础后,这些都是简单的工作了。
其中要说的一点就是,如果你不想装KDE和GNOME桌面,而是装XFCE桌面的话,比如我,那么去www.xfce.org下载软件包,一项项编译安装就可以了。如果要在XFCE中使用SCIM输入法的话,在BLFS的wiki上可以查到。
对于一个从源码安装了LINUX的人来说,安装和使用SCIM只是学好了武功,小试牛刀而已了。

在进行BLFS时候的小技巧:

如果你这时候打算完全使用自己建立的LFS,不使用LIVECD了,那么你首先需要装上w3m这个网页文本浏览器。因为LFS本身没有安装网页浏览器,也无法使用图形浏览器。浏览器的使用可以看UBUNTU上的WIKI。要装w3m,你需要libssl和libgpm,自己想办法去搞到,在 ubuntu.cn99.com/ubuntu上有下载的。我是先装了DPKG软件后,用DPKG直接安装deb包的。

在文本模式下如何复制粘贴:

你用w3m看英文的BLFS手册时,可能会发现这个命令相当长,想要复制粘贴。我是这么做的:先按S将当前网页保存到temp.txt文件,然后切控制台(你也可以用ctrl+z将w3m丢到后台,操作完成后用fg命令调回w3m,不过我喜欢切控制台,反正有6个。用ctrl+alt+F1-F6来切),切控制台后用vim来打开temp.txt,用v键可视化来选择相应的命令,选好后用:w temp写入temp文件(如果temp已经存在,用:w! temp强制写),然后ctrl+z放VIM到后台,用命令source temp就运行复制的命令了。别忘记了vim还在后台,你fg调出来,又可以继续复制运行这个网页上的所有命令了。

你看着是不是很头大?复制粘贴运行命令那么麻烦?可能是我本人没有找到更好的方法吧,但是我熟练后觉得并不慢,因为vim本身就是一个操作起来相当快速的编辑器。如果有人找到了更好的方法,麻烦贴出来给大家分享。
安装SCIM相应的网页:
http://wiki.linuxfromscratch.org/blfs/wiki/InputMethods

最后,可能你想要一个和UBUNTU差不多的系统,可以用DPKG和APT来管理软件包。我一开始也是这么想的。
于是我安装了DPKG,但是运行不了,需要sysv软件包的内容,于是我下载了sysv的软件包,发现只有.deb包的,没有tar压缩包的,弄了好久才发现dpkg用不了,但是dpkg-deb可以用来解deb包的(dpkg-deb -x命令)。于是解压后把相关程序拷贝
到了相关地方,dpkg可以用了!运行得和UBUNTU下一模一样。安装好包之后,用dpkg -l可以清楚地列出所有安装好的软件包。
我系统上用的wget和w3m就用了UBUNTU版本的(建议用dapper版本,hardy版本需要更新的glibc,意味着你需要编译新的库文件),但是我安装的APT不能用,提示无法识别系统的包类型。如果不能用APT,而仅仅用dpkg来安装出X桌面的话,意味着你要下载300多个.deb的包。。。。
后来我看了apt的源代码,发现在init.cc中有一段对系统进行判断。我想改掉内核的版本代码(改为ubuntu),来欺骗apt,没有成功。
我又想改掉apt的代码,不过由于本人的C++水平如此之烂,导致改变的代码不能用。后面只能放弃安装apt了。要是你C++厉害的话,估计这不成问题。
即使没有APT,用dpkg来安装一些简单的包也是不错的了。

做你从未做过的事,想怎么样就怎么样,这就是LINUX的魅力所在。最后,祝广大的UBUNTU初学者功力能够更进一层,早日成功!
tumer163
帖子: 7
注册时间: 2008-09-19 21:38

Re: 裸机源码LINUX,做你从未做过的事(LFS+BLFS for UBUNTU菜鸟)

#2

帖子 tumer163 » 2008-09-22 22:27

沙发,牛人,羡慕
头像
ebok
帖子: 852
注册时间: 2008-02-15 0:09

Re: 裸机源码LINUX,做你从未做过的事(LFS+BLFS for UBUNTU菜鸟)

#3

帖子 ebok » 2008-09-22 22:48

兽血沸腾啊,差点就心动了 :em05
Somebody think they are full of niubility, so they play a zhuangbility, but only reflect their shability.
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

Re: 裸机源码LINUX,做你从未做过的事(LFS+BLFS for UBUNTU菜鸟)

#4

帖子 HuntXu » 2008-09-22 23:05

没必要
HUNT Unfortunately No Talent...
boxid
帖子: 62
注册时间: 2006-08-27 7:40

Re: 裸机源码LINUX,做你从未做过的事(LFS+BLFS for UBUNTU菜鸟)

#5

帖子 boxid » 2008-09-22 23:20

这是一个很好的自虐的过程 当然也能学到很多东西
头像
hubert_star
论坛版主
帖子: 5373
注册时间: 2007-10-29 22:12
系统: OSX 10.9 + Ub 1304
来自: 江苏南京

Re: 裸机源码LINUX,做你从未做过的事(LFS+BLFS for UBUNTU菜鸟)

#6

帖子 hubert_star » 2008-09-22 23:25

如果你能一直用下去,我估计你一辈子都不用换系统了(引用fcitx开发者的话),哈哈,完全自己去维护,什么版本号,什么软件源,都见鬼去吧。
佛经说,人有八苦: 生、老、病、死、求不得、怨憎、爱别离、五阴盛 故我苦!
圣经说,人有七罪: 饕餮、贪婪、懒惰、淫欲、傲慢、嫉妒和暴怒  故我有罪!

我这篇帖子里面没有任何攻击我们伟大的中华人民共和国政府和任劳任怨的人民公仆(和本论坛高素质的版主)的文字和含义;

特此声明!

有些事,我们明知道是错的,也要去坚持,因为不甘心;有些人,我们明知道是爱的,也要去放弃,因为没结局;有时候,我们明知道没路了,却还在前行,因为习惯了。

欢迎来我的新浪微博@me
yvqiang
帖子: 278
注册时间: 2008-04-28 22:02

Re: 裸机源码LINUX,做你从未做过的事(LFS+BLFS for UBUNTU菜鸟)

#7

帖子 yvqiang » 2008-09-23 8:42

说实在的 根本没有必要每个人都去这样做 甚至可以说只有极少数可以去看一下 就像我们每个人都要有住的地方 但没有必要每个人都会建造大楼一样。。而且也没有一个人能单独建造一做大楼

要普及linux 就是要让他易用 而不是让他显得那么高深
回复