LinuxSir.cn,穿越时空的Linuxsir!

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

另一中LFS的安装

[复制链接]
发表于 2006-2-17 09:41:28 | 显示全部楼层 |阅读模式
以下纯属个人简介,正在尝试:
安装环境RH9,内核2.4.20-8。
LFS的很大一部分都是在编译toolchain,移植toolchain。我的想法是先做出一个可以启动的内核,然后在该内核上安装pre-complie的toolchain。本地升级toolchain到相应的版本。

RH9中进行的:
1。建立LFS分区,我用的是/dev/hda8(ext2)
2。下载busybox1.1,静态编译busybox.busybox提供了LFS中很多软件包提供的功能
Currently defined functions include:

        [, [[, addgroup, adduser, adjtimex, ar, arping, ash, awk, basename,
        bbconfig, bunzip2, busybox, bzcat, cal, cat, chattr, chgrp, chmod,
        chown, chroot, chvt, clear, cmp, comm, cp, cpio, crond, crontab,
        cut, date, dc, dd, deallocvt, delgroup, deluser, devfsd, df, dirname,
        dmesg, dos2unix, dpkg, dpkg-deb, du, dumpkmap, dumpleases, e2fsck,
        e2label, echo, egrep, eject, env, ether-wake, expr, fakeidentd,
        false, fbset, fdflush, fdformat, fdisk, fgrep, find, findfs, fold,
        free, freeramdisk, fsck, fsck.ext2, fsck.ext3, fsck.minix, ftpget,
        ftpput, fuser, getopt, getty, grep, gunzip, gzip, halt, hdparm,
        head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig,
        ifdown, ifup, inetd, init, insmod, install, ip, ipaddr, ipcalc,
        ipcrm, ipcs, iplink, iproute, iptunnel, kill, killall, klogd,
        lash, last, length, less, linuxrc, ln, loadfont, loadkmap, logger,
        login, logname, logread, losetup, ls, lsattr, lsmod, makedevs,
        md5sum, mdev, mesg, mkdir, mke2fs, mkfifo, mkfs.ext2, mkfs.ext3,
        mkfs.minix, mknod, mkswap, mktemp, modprobe, more, mount, mountpoint,
        msh, mt, mv, nameif, nc, netstat, nice, nohup, nslookup, od, openvt,
        passwd, patch, pidof, ping, ping6, pipe_progress, pivot_root,
        poweroff, printenv, printf, ps, pwd, rdate, readlink, readprofile,
        realpath, reboot, renice, reset, rm, rmdir, rmmod, route, rpm,
        rpm2cpio, run-parts, runlevel, rx, sed, seq, setconsole, setkeycodes,
        setsid, sha1sum, sleep, sort, start-stop-daemon, stat, strings,
        stty, su, sulogin, sum, swapoff, swapon, switch_root, sync, sysctl,
        syslogd, tail, tar, tee, telnet, telnetd, test, tftp, time, top,
        touch, tr, traceroute, true, tty, tune2fs, udhcpc, udhcpd, umount,
        uname, uncompress, uniq, unix2dos, unzip, uptime, usleep, uudecode,
        uuencode, vconfig, vi, vlock, watch, watchdog, wc, wget, which,
        who, whoami, xargs, yes, zcat, zcip
3。在LFS分区上建立文件系统目录关键是/dev目录,并拷贝busybox的_install目录。
4。在LFS/etc目录下面创建fstab和inittab文件
5。在RH9下面编译linux-2.6.12内核,并安装。
6。修改/boot/grub/grub.conf文件:
   关于2.6.12启动部分的内核参数:root=/dev/hda8 noinitrd
     删除Initrd映象。我们的启动不需要initrd支持。
7。reboot,进入2.6.12内核中。很干净的文件系统,除了busybox提供的软件没有其他软件。
8。在2.6.12内核中,使用busybox提供的rpm安装binutils,gcc,glibc的编译好的软件包。版本不用最新的。
9。现在toolchain就建立起来了,然后toolchain本地编译新版本的就可以了。

我已经做到第7步了。后面2步还没有弄,周末试试。

中间出个问题,2.6.12内核mount的/dev/hda8怎么是只读的呢? 挂载根文件系统,在哪里设置访问属性?在grub.conf中,内核启动参数部分,kernel /boot/.....     root/dev/hda8 noinitrd 确信是没有“ro”的。/etc/fstab中/最后参数是1 1,不知道从哪里拷贝的了,这两个不会是只读的意思吧?

大家共同尝试一下。
发表于 2006-2-17 10:17:04 | 显示全部楼层
欢迎各种新想法。

不过就你的想法有几个问题可以探讨一下:
1、用busybox的命令来代替那些通用命令的方案在使用Linux下问题不大,但如果用在编译的情况下可能就会有问题,我曾经试过用busybox的命令来编译软件包,但经常会出现问题,通过测试和分析,我认为是busybox中的命令属于简化版本,如果编译时候调用了一些未提供的参数则编译会失败,不过这点我想可以通过打补丁的办法来解决,不过可能需要打补丁的软件比较多。
2、使用busybox提供的rpm安装binutils,gcc,glibc的编译好的软件包,这点我总觉得不妥当,而且一个完整的工具链还需要一些命令,这些命令在busybox中没有提供,比如make。
回复 支持 反对

使用道具 举报

发表于 2006-2-17 10:19:39 | 显示全部楼层
第8中 安装的 toolchain 是已经编译好的,并不一定适合你的机器。没测试过是否可行。
第9中 重新编译toolchain,那是开始第6章的东西。第5章后边的那些软件包都省略了,用busybox 代替。不知道busybox的效果如何和能否覆盖所有需要的包。

不知道这样出来的系统会否纯洁,会不会受到一开始安装的那个toolchain的影响。不过编译2次toolchain的话,应该就没问题了。


不错,感觉思路基本可行,你的实验结果记得写出来。:)。谢谢分享。


至于只读问题,启动参数中加入 rw 试试。

嘿嘿。。。^_^。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-17 10:46:23 | 显示全部楼层
谢谢斑竹点评。
1。busybox的里面的命令是简化版本的,不过一般的makefile文件很少会用到复杂的功能。
2。一个完整的工具链有很多发布好的,我手上就有一个40多M。是tar.gz压缩的,连rpm都不用了。解压后,就可以使用的工具链。
bin:
addr2line,ar,as,c++,c++filt,cc,ccache,chrpath,cpp,g++,gcc,gccbug,gcov,gdb,gdbserver,gprof,i686-pc-linux-gnu-c++,i686-pc-linux-gnu-g++,i686-pc-linux-gnu-gcc,insight,ld,ltrace,nm,objcopy,objdump,ranlib,readelf,size,strace,strings,strip,tclsh8.3,tixindex,tixwish4.1.8.1,wish8.3,xxdiff
不知道整个工具链是否够用的。
当然,这个gcc是3.2的,在此基础上编译出4.0的,不是更容易吗?
回复 支持 反对

使用道具 举报

发表于 2006-2-17 10:58:36 | 显示全部楼层
1。最好试试再说。youbest说他用过效果不好,你也测试一下,看看效果如何。

2。工具链,如果你喜欢,有专门的脚本制作。而且支持跨越多体系多架构。
但是这个不是LFS的主要目的。

3。是不难,本来 LFS 也不难,对不?:)。
至于这个toolchain是否足够,那也许要装一次才知道,我的/tools/bin目录中很多文件,我不知道是否都用到了。你可以对比一下。
[html]
[             c++        dd         fold        i686-pc-linux-gnu-c++        link       nice           ptx       split     tic       wc
addr2line     captoinfo  df         g++         i686-pc-linux-gnu-g++        ln         nl             pwd       sprof     toe       who
ar            cat        diff       gawk        i686-pc-linux-gnu-gcc        locale     nm             ranlib    stat      touch     whoami
as            catchsegv  diff3      gawk-3.1.5  i686-pc-linux-gnu-gcc-4.0.2  localedef  nohup          readelf   strings   tput      xargs
awk           cc         dir        gcc         iconv                        locate     objcopy        readlink  strip     tr        xtrace
basename      c++filt    dircolors  gccbug      id                           logname    objdump        reset     stty      true      yes
bash          chgrp      dirname    gcov        igawk                        ls         od             rm        sum       tset      zcat
bashbug       chmod      du         gencat      info                         m4         paste          rmdir     sync      tsort     zcmp
bunzip2       chown      echo       getconf     infocmp                      make       patch          rpcgen    tac       tty       zdiff
bzcat         chroot     egrep      getent      infokey                      makeinfo   pathchk        runtest   tack      tzselect  zegrep
bzcmp         cksum      env        gprof       infotocap                    md5sum     pcprofiledump  sdiff     tail      umount    zfgrep
bzdiff        clear      expand     grep        install                      mkdir      perl           sed       tar       uname     zforce
bzegrep       cmp        expect     groups      install-info                 mkfifo     pgawk          seq       tclsh     unexpand  zgrep
bzfgrep       comm       expr       gunzip      join                         mknod      pgawk-3.1.5    sh        tclsh8.4  uniq      zless
bzgrep        cp         factor     gzexe       kill                         more       pinky          sha1sum   tee       unlink    zmore
bzip2         cpp        false      gzip        ld                           mount      pod2man        shred     test      updatedb  znew
bzip2recover  csplit     fgrep      head        ldd                          msgfmt     pr             size      texi2dvi  uptime
bzless        cut        find       hostid      lddlibc4                     mtrace     printenv       sleep     texi2pdf  users
bzmore        date       fmt        hostname    ld-old                       mv         printf         sort      texindex  vdir
[/html]
回复 支持 反对

使用道具 举报

发表于 2006-2-18 00:04:05 | 显示全部楼层
Post by 终极幻想
2。工具链,如果你喜欢,有专门的脚本制作。而且支持跨越多体系多架构。



请指教,我很感兴趣。
回复 支持 反对

使用道具 举报

发表于 2006-2-18 00:09:28 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-18 15:43:11 | 显示全部楼层
今天试过了,真的很复杂,不是不能用,是后患太多了。
1。RH9中构建了一个2.6.12的新内核,/dev/hda8作为/root分区,文件系统为ext2。
2.RH9中编译busybox1.1,把_install目录里面的安装到/root。
3。/root中创建/dev设备
4。/root创建etc目录,有3个文件够了。
inittab:
::sysinit:/etc/rc.d/rc.sysinit
::askfirst:/bin/sh
---------------
rc.d/rc.sysinit
#!/bin/sh
mount -a
----------------
fstab
proc /proc proc defaults 0 0
----------------
5。grub引导时,kernel参数:noinitrd root=/dev/hda8 rw
6。内核正确引导,进入shell.
以上过程和软盘里的Linux基本一致。进去之后发行这个系统没有任何用处,安装toolchain.
7。找到一个pre-compile的gcc,解压到/toolchain目录。在/toolchain/bin中有了gcc,as,ld等。
8。./gcc  hello.c系统提示,无法找到gcc。
很明显,gcc当时是动态编译的,现在/lib下面没有任何东西,系统找不到动态连接器了。
9。将RH9的root /dev/hda3 mount到/disk目录,拷贝/disk/lib目录下面的ld和libc库到/lib。
10。gcc可以正常运行了,但是提示as缺少libbfd库。
11。这个库在/toolchain/lib目录下找到,拷贝到/lib
12。as 缺少libgcc_s.so库,同11步
13。as可以运行,提示ld缺少libdl.so库,从/disk/lib目录下拷贝到/lib
14。ld缺少crt1.o,从/disk/usr/lib拷贝到/usr/lib
15.ld缺少crti.o,从/disk/usr/lib拷贝到/usr/lib
16。ld缺少lc库,拷贝/disk/usr/lib中的libc.a和libc.so到/usr/lib
17。ld缺少libc_nonshared.a,从/disk/usr/lib中拷贝到/usr/lib
18。ld缺少crtn.o,从/disk/usr/lib中拷贝到/usr/lib
19。gcc hello.c运行成功,./a.out输出正确。
20。gcc可以使用。
从过程中发行,仅仅安装编译过的gcc没用,需要太多的库支持
既然gcc能用了,打算安装glibc库,需要make.
那就先安装make,还是需要make,基于源码的安装过程终止。
需要安装很多很多编译好的toolchain成员,基于裸系统的安装的确不好。

现在明白了,一个目标系统如果能够独立运行,必须交叉编译好所有的toolchain才有意义。这样的文件系统才能够自力更生,不断扩展。
当然如果在/root上继续从RH拷贝需要的toolchain支持,一个完整的toolchain也是可以建立的,不过就不是基于src安装了,离LFS越来越远,变得毫无意义。
回复 支持 反对

使用道具 举报

发表于 2006-2-18 17:11:50 | 显示全部楼层
有兴趣的话,可以看看CLFS,这个东西[color="Red"]也许能帮助你实现你所想要的,不过学习难度也许有点大,加油。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-18 18:00:54 | 显示全部楼层
是啊,我要的就是CLFS。
以前我就做ARM平台上的内核,rootfs,应用。不过当时那个arm-linux的toolchain是编译好的,直接拿来用了,所有的东东都是在386上交叉编译的。
就是后来看到了LFS,我才想到那个arm-linux的toolchain是怎么出来的。
LFS中的大部分做的就是toolchain,是386=》386的交叉编译,如果platform改成arm就是386=》arm的toolchain了。

搞定了LFS,CLFS应该就是个交叉编译的问题了,再深点应该就是CCLFS,不知道又没有。呵呵。
在ARM平台上本地编译代码,这应该是最高境界了吧。
386编译GCC,386上用GCC再编译出一个arm-linux-gcc,386上用arm-linux-gcc编译gcc。最后生成的gcc就应该是CCLFS了吧?可以运行在arm平台的toolchain。
如果再追求,那就从gcc=>i386-linux-gcc=>GCC,从arm平台把gcc逆向回来,这个境界估计是无人可及了。应该叫做CCCCLFS了,呵呵。
回复 支持 反对

使用道具 举报

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

本版积分规则

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