LFS经验总结

       总想打造一个属于自己的定制版Linux,这不在网上接触到LFS这个东东,虽然网上教程比较全,但是编译过程中还是遇到一些问题,这里写出解决方法,方便同行。我所参考的中文编译教程是LFS7.7编译教程 ,编译版本为LFS7.7最新版。这是LFS7.7的中文翻译版,到目前(2017.02.05)为止,LFS已经更新到了7.10的稳定版,但是7.7版后续以及之前的版本都只有英文版,其实各个版本之间的改动只是包的版本改动,手册基本一样,所以其他版本的编译也可以参照此中文范本。

      (1)用户权限管理很重要,每次确保以lfs用户登录并确保LFS LFS_TGT等环境变量的存在,最好是按教程所说的将初始化内容放在.bashrc等文件中;

      (2)ln -sv $LFS/tools /   这句的作用是将/tools链接到$LFS/tools;

      (3)每个软件包都是先解压,然后进入解压后的目录,输入教程中的命令(切记,切记!!!);

(********):编译到后面发现一个严重问题,回过来思考才想通这个问题,LFS手册的步骤中从第6章才开始讲打补丁,我之前在第6章之前也打过不定,这个补丁不要打,第6张之前不要打补丁,到了第6章再打,打补丁是在每个源码包解压之后,进入解压的目录执行:patch -Np1 - i $LFS/sources/xxxxx.patch

        LFS7.7需要打补丁的有:

            mpfr    glibc      bash     bzip2 coreutils
              bc       kbd       readline      systemd

      (4)注意编译gcc的那段脚本文件中echo后面是一点。

echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file

      (5) 第五章glibc的执行结果如果和教程不一样肯定是前面出了问题;

      (6)gcc第二遍编译过之后,后面的编译都是小菜;

      (7)5.35节清理无用内容属于可选内容,因为本机空间足够且清理也减少不了多少空间(<100MB),因此没有清理;5.36节改变属主时备份/tools目录,为后备之用;5.36节以后的命令以root执行,但要保证$LFS的存在;

      (8)LFS 系统的一个优点是没有会依赖磁盘系统里文件位置的文件。克隆一份 LFS 到和宿主机器相似配置的机器上,简单到只要对包含根目录的 LFS 分区(对于一个基本的 LFS 构建不压缩的话大概有 250MB)使用tar命令打包,然后通过网络传输或光盘拷贝到新机器上展开即可;最好对第5章编译的工具链打包,在后面出了问题,依然可以解压这个包来用,是与宿主系统无关的包。

       (9)6.4节的注意非常重要:本章从这以后的命令,以及后续章节里的命令都要在 chroot 环境下运行。如果因为某种原因(比如说重启)离开了这个环境,请保证要按6.2.2,“挂载和激活 /dev” 6.2.3,“挂载虚拟内核文件系统”里所说的那样挂载虚拟内核文件系统(挂载之后可用mount查看是否挂载成功),然后在继续构建之前重新运行 chroot 进入环境。

如果没有按照这个来做,在运行诸如make --version等命令时都会报段错误;如果在第6章出现了诸如Segment Fault,可能是因为挂载出了问题,重启之后从第6章重新开始做;

       (10)6.7节运行make mrproper时出现如下错误:

明明在/tools/bin下有gcc却报没有,这让我联想到5.36改变属主一节,当时感觉用chown改变了之后没有变化,于是我

用ls -l /tools和ls -l /tools/bin查看发现各个工具的属主如下:

发现其中的文件将属于一个没有相关联帐号的用户ID-1001*(lfs用户的ID,进入chroot之后,lfs用户消失,故没有关联 ),这与5.36节描述的注意一样,于是重回5.36节改变属主;修改成功之后查看如下图:

重新执行6.7节,问题没有解决;

找到解决方案:在gcc第二遍的时候导出设定的环境变量,即加export,如下所示,原手册没有加export。干脆第二遍binutils就加上。

export CC=$LFS_TGT-gcc
export CXX=$LFS_TGT-g++
export AR=$LFS_TGT-ar
export RANLIB=$LFS_TGT-ranlib

参考网址:http://www.linuxquestions.org/questions/linux-from-scratch-13/gcc-no-such-file-or-directory-%5Bchapter-6%5D-695622/

     (11)为了节约时间,不运行测试套件(特别是第6章gcc的测试套件特别费时),也没必要,FAILED的测试也不处理;

    (12)教程中有几次工具链的调整,每次调整之后记得通过echo 'main(){}' > dummy.c 验证后调整后工具链可以使用,第6章工具链调整后有个 cc dummy.c -v -Wl,--verbose &> dummy.log,注意是Wl,是英文的l,不是数字1。对于工具链的调整原理可以通过下图理解清楚,具体可参考网址:点击打开链接


(13)6.17 GCC-4.9.2的编译后,通过所有校验,确认前面所有编译没有问题,若在pdf文档中发现分不清1和l,可以直接看html版的教程,然后复制到terminal里执行,地址是:点击打开链接

(14)编译6.21的Attr时报错”msgmerge not installed“,在pdf教程里搜了一下msgmerge,发现这个库其实是在gettext中安装的,于是先编译安装6.49节的Gettext包,再回来安装Attr时正常;在编译6.28的E2fsprogs时同样遇到libuuid不存在,先编译安装6.65的Utillinux后再来安装此包即可;

(15)6.71若磁盘空间足够可以不用清理;第七章基本没有什么可操作内容;8.3节make mrproper之后直接make menuconfig,按照教程勾选,其它默认即可;

(16)内核编译完毕之后就是引导启动系统了,因为我是安装到双系统,我想直接在宿主机到grub2上加个启动项来启动我的lfs系统,因此我的操作不是参考8.4节,而是参考此博文操作:点击打开链接 ;;;;;;若在按此教程操作时已经退出了chroot,则重新进入chroot:chroot $LFS /usr/bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash --login,注意此时/tools文件夹已经被我删除了,所以用到目标系统到env和bash,因为chroot后就已经以/mnt/lfs为根目录了,所以这样写命令;

            执行 grub-install --grub-setup=/bin/true /dev/sda,显示Installation finished. No error reported.---------正确

            执行grub-mkconfig -o /boot/grub/grub.cfg,显示done,生成了grub.cfg;复制其中的两个menuentry到宿主机的grub.cfg中,我的menuentry如下:
menuentry 'GNU/Linux' --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14' {
    load_video
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos9'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos9 --hint-efi=hd0,msdos9 --hint-baremetal=ahci0,msdos9  d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14
    else
      search --no-floppy --fs-uuid --set=root d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14
    fi
    echo    'Loading Linux 3.19-lfs-7.7-systemd ...'
    linux    /boot/vmlinuz-3.19-lfs-7.7-systemd root=/dev/sda9 ro  
}
submenu 'Advanced options for GNU/Linux' $menuentry_id_option 'gnulinux-advanced-d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14' {
    menuentry 'GNU/Linux, with Linux 3.19-lfs-7.7-systemd' --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19-lfs-7.7-systemd-advanced-d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14' {
        load_video
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos9'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos9 --hint-efi=hd0,msdos9 --hint-baremetal=ahci0,msdos9  d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14
        else
          search --no-floppy --fs-uuid --set=root d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14
        fi
        echo    'Loading Linux 3.19-lfs-7.7-systemd ...'
        linux    /boot/vmlinuz-3.19-lfs-7.7-systemd root=/dev/sda9 ro  
    }
    menuentry 'GNU/Linux, with Linux 3.19-lfs-7.7-systemd (recovery mode)' --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19-lfs-7.7-systemd-recovery-d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14' {
        load_video
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos9'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos9 --hint-efi=hd0,msdos9 --hint-baremetal=ahci0,msdos9  d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14
        else
          search --no-floppy --fs-uuid --set=root d3cb58f0-c5ed-47ec-9d01-7467cc3f1b14
        fi
        echo    'Loading Linux 3.19-lfs-7.7-systemd ...'
        linux    /boot/vmlinuz-3.19-lfs-7.7-systemd root=/dev/sda9 ro single
    }
}
我只取了第1个menuentry到宿主机到grub.cfg中,后面的修复模式什么的感觉没有必要。
注意,我开机重启后问题出现了,grub-install --grub-setup=/bin/true /dev/sda虽然没有把MBR覆盖掉,但是原来的宿主机grub引导被覆盖了,因为我用的easybcd装的双系统,导致的结果就是win7可以正常启动,原来的Ubuntu启动会进入lfs的grub引导,然后进入lfs系统,原来的Ubuntu宿主系统的启动项没有了,与我的初衷不一样,我只是想把lfs的启动项加入Ubuntu的grub启动项中。并且还发现了做lfs系统中出现的一个问题,在生成/etc/passwd文件时root用户的登录shell少写了一个/,导致正常root不能登录,只能先进入修复模式修正/etc/passwd文件才能正常登录。
 
      解决宿主系统启动项消失的方法就是进入制作好的lfs,然后将原宿主系统所在的分区挂载到lfs下,然后将原宿主系统的grub.cfg中linux启动项内容复制到lfs的grub.cfg中,保存后开机启动就可以出现原宿主系统的启动项了,点击进入会报错2-3秒,不用管,稍等片刻即可进入原宿主系统,大功告成。

(17)制作lfs的目的已经达到即熟悉linux的架构,了解内核只是其中一部分,基本的支撑工具如bash、gcc等又是一部分,最后各种上层应用如gnome界面又是一部分,制作好基本的lfs系统之后就可以探索其他部分了。

       

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值