LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 993|回复: 2

用FC3作为主机系统成功安装LFS 6.1(原创)

[复制链接]
发表于 2005-8-29 17:38:45 | 显示全部楼层 |阅读模式
第一天: 2005-8-24
by likedust
qq:47921117 mail: likedust@163.com

最好在装系统之前就确定好自己要作LFS, 要事先准备好一个分区, 大小在5G左右. 我的机器的配置是Celeron 800, 512M RAM, 40G硬盘, 分区情况为:
hda1: 10G fat32 装有windows server 2003
hda2: win95 ext'd
hda5: 10G ext2 装有red hat9
hda6: 512M swap
hda7: 9G fat32 (装有windows的应用程序)
hda8: 9G 本来是fat32分区, 由于我开始没有准备安装lfs, 后来想安装, 只好把这个分区变成ext2分区.
linux下要对磁盘分区进行格式化, 使用命令mke2fs, mke2fs -c /dev/hda8, 这样就可以把/dev/hda8格式化为ext2.-c表示强制检查坏块.格式化后发现一个问题, 在linux下, 用fdisk -l 列表列出磁盘分区的情况, 发现最后一个分区的格式仍然是fat32, 而且在windows下还可以看到这个分区. 验证此分区是否为ext2分区的方法是通过创建文件.
下载所有的软件包到/mnt/lfs/source文件夹下, 下载所有的patch到/mnt/lfs/source文件夹下.

第二天:2005-8-25
1.安装binutils. 在进行build(configure, make, make install)时, 通常建立一个新的目录完成一些工作,而不在和souce一样的目录下(即解压缩的目录下), 因为build 会产生一些临时文件, 如Makefile啦, config.**啦. 等等. 对此进行记时, time { ../源码目录/configure 参数 && ./当前目录make(因为makefile是在当前的build目录产生的) && make install; }, 注意, 最后一个命令后面有一个;, 大括号的开始和结束时都有一个空格.

2.安装gcc. 注意命令的大小写敏感.
3.安装linux-libc-headers, 这个包是为了维护应用程序所使用的kernel headers(不直接使用/usr/include里面的)的稳定性.
4.安装glibc.出现问题,make时出现了kernel too old..我使用的主机系统是red hat9, 看来的确要使用内核还有编译器版本相差不大的主机系统来作LFS.

第三天:2005-8-26
1. 重新安装系统FC3. 安装好各种开发工具. 接下来, 用mke2fs /dev/hda8格式化要装lfs的分区, mount上该目录,在其中建立sources目录(设置sticy位, chmod a+wt ./sources), 建立tools目录, 在/下为tools创建一个符号链接, 建立一个lfs用户, 为lfs用户建立一个干净的环境(environment).
2. 重新编译binutils.time记时:
real: 10min14.653s
user: 6m11.739s
sys: 2m5.576s
3.安装gcc, linux-libc-headers, glibc. binutils, gcc, glibc是整个工具链的核心.
4. 重新调整工具链: 此处注意在引用shell命令执行的结果时用数字键1旁边的那个`,而不是单引号. 调整好工具链后binutils的源码包和编译目录可以删除.
5. 安装tcl, expect, dejagnu,这三个包主要是用来支持测试包的运行.

第四天:2005-8-27
1.安装gcc第二遍: 这里有个问题, 就是如何处理上一次编译时产生的源码目录和build目录,我把build目录移动到另外一个目录, 用上一次的源码目录进行编译(源码在第一次编译中应该没有被修改). 不知道这里会不会是问题的隐患.还有发现总共configure, make, make install的时间比给出的要短, 不知道是不是没有运行test suite的原因.
2.安装binutils第二遍; gawk, coreutils等软件包. 使用mkdir -p 来创建目录, 意思是若目录已经存在不报错. 如此继续完成第五章的全部内容.
3.进入第6章: 首先切换成root用户,来完成下面的工作. mount上两个文件系统, proc和sysfs, 然后伪加载tmpfs到$LFS/dev, tmpfs到$LFS/dev/shm,devpts到$LFS/dev/pts,伪加载就是作mount的所有动作除了真正的加载这一动作, 写入/etc/mtab文件. tmpfs是一个文件系统的类型. 它类似/proc,使用的介质是内存. 运行chroot, 这样切换到/mnt/lfs目录, 系统便自成一体, 只能使用/mnt/lfs下的资源和工具了.
4. 创建目录树和相应的符号链接,创建/etc/passwd和/etc/group文件, 相应的log文件,因为有的进程要记录log, 但是若开始log文件不存在, 便不会自动创建.
5. 创建设备文件: 当内核起动时, 有的设备文件是必需的, 如console和null设备. mknod命令用来创建设备文件, 参数-m用来指定mode(类似chmod中的规定), 现在可运行的发行版本中这两个设备的属性分别是:
crw-------  1 root root 5, 1  8月 27 15:21 /dev/console
crw-rw-rw-  1 root root 1, 3 2005-08-27  /dev/null
6. 安装glibc.在make check时出现问题:libgcc_s.so.1 must be installed for pthread_cancel to work. 当时我忽略了这个错误, 继续进行make install, 并没有出错, 只是在作程序动态加载器(dynamic loader)测试时失败, cc不能编译程序,提示是:ld: cannot find -lgcc_s(不知道这个是l还是1)
-------------------------------------------------------------------------------------------------------------------
有可能是因为使用了上次的源码目录? 想不通, 或者长命令我没有使用书中给出的换行符号, 而是直接写下去的? 不理解.

第五天:2005-8-28(连续工作18小时)
一切从头开始.
除非指导书中特别强调要保留源码目录, 否则安装完后就删除. 再没有出现上面的错误. 第五章以及之前是为了安装一个"工具链", 第六章一开始就chroot, chroot的意思是, 将一个目录变成根目录, 这样在整个这个环境中只能使用这个目录以下安装的程序.并且在切换到这个目录时,可以用env -i忽略所有的环境变量, 再设置一些环境变量.
这次我只运行了glibc, binutils, gcc的test suites, gcc在测试g++时有failed to produce executable的错误. 其他的安装包的test suite没有运行.
第6章当中除了安装一些必备的软件包之外, 还创建一些系统正常运行所必须的文件. LFS不是一个最小的linux系统,它应该是一个最小的可用的linux系统. 这些系统正常运行所必须的文件包括:
/etc/passwd用户登录时从该文件中提取一些信息)
root:x:0:0:root:/root:/bin/bash
各个域的含义分别是:用户名/用户密码(新版本密码不在这里存储了)/用户ID/用户组ID/用户全名/用户主目录/所用shell
/etc/group文件.

创建必要的设备,我想是因为在有的软件包的安装过程中, 要从设备读消息或者向设备写入消息.
在安装软件包中用到的一些实用的语法:
ls /root/mydocs/*.{html,jsp}, {}表示选择其中一个匹配, 用逗号间隔各个选项, 可以是/bin/{,lib}这表示/bin目录或者/bin/lib目录.

在软件包安装过程中通常用到sed命令, 它是一个非交互式的文本流编辑器,是stream editor的缩写.
例子:sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' specfile > tempspecfile
它表示对原文件specfile执行sed替换, 并将结果写在tempspecfile中. sed的命令中有一个s/原字串/目的字串/替换命令,其中的3个斜线是分隔符号,若在最后一个/后面加上g,表示进行全部替换, 默认是替换每一行的第一次出现. 要作与目录相关的替换, 分隔符号可以用其他的代替, 如:或者@.

安装好所有的软件包后, LFS系统基本就完成了, 只是它还不能够起动, 只是一组工具的集合, 还不是一个操作系统, 没有内核的支持. 第7章首先要安装bootstripts. 设置时钟/etc/sysconfig/clock; 设置键盘布局/etc/inputrc; 网络脚本. 配置/etc/fstab文件. 重新编译内核, 注意在编译内核前先执行make mrproper以保证源码树是干净的, 配置并编译好后, 需要拷贝3个文件到/boot目录, 一个是kernel的bzImage,一个是System.map,一个是.config文件.

下面是安装并配置grub.
前面提到过我的ext2分区原来是一个fat32分区, 我用mke2fs把它变成ext2分区的, 但fdisk -l列表显示的该分区仍然是fat32分区, 结果grub在运行setup (hd0,7)时提示,不能mount该partition. 我想在主机host系统的grub的启动菜单中添加一项来起动LFS系统,结果起动时也是提示相同的错误. grub的root分区指保存linux内核的分区,不同于linux中root分区的概念.GRUB 对硬盘和分区的编号都是从 0 开始计算。另外,硬盘和分区都用逗号分隔,整个表达式用括号括起。现在,可以发现如果要引导 linux 硬盘 hda5,应输入"root (hd0,4)"。
我知道我所选择的分区是ext2,现在要想让它起动只是因为分区表的标志仍然是0xb,所以只需要修改这个为0x83.我用diskgenius修改了该标志, 重新起动.... 一切正常.
发表于 2005-9-2 15:52:09 | 显示全部楼层
桌面装了没
有装的话,顺便把你的软件包的安装顺序也列出来下吧
回复 支持 反对

使用道具 举报

发表于 2005-9-2 15:59:07 | 显示全部楼层
桌面装了没
有装的话,顺便把你的软件包的安装顺序也列出来下吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表