美文网首页我爱编程Linux修行之路
从源码编译属于自己的Linux系统——Linux From Sc

从源码编译属于自己的Linux系统——Linux From Sc

作者: 忆霜晨 | 来源:发表于2018-02-28 20:57 被阅读0次
    (注:如若记忆没有出现偏差,本文应是写于2014年,楼主习惯使用LaTeX写笔记,后发现markdown不错,于是稍有修改后发布与此。)

    前言

    写本文之时,不禁想起了大一学习C语言的上机课程,虽然学校的网络教室已经将机器更新为液晶电脑(据说是校庆的时候由校友捐赠),但是上机机房的机器还是那种“坨坨”显示器的电脑,而且只有一个黑黑的界面,没有鼠标,老师告诉我们这是Unix系统。回想起那段使用Vi编写简单的C语言程序的时光真是令人难忘(或许因为之后修《数据结构》课程而再次到此机房遇到的那个温柔美丽的助教师姐?)。对于习惯于Windows或Mac等图形界面系统且刚刚接触Linux的同学而言,面对一个经常需要打开黑白命令行界面的系统环境往往有些不知所措。而通过Linux From Scratch,对了解Linux系统的工作方式以及熟悉Linux环境,是十分有帮助的。楼主认为,在完成LFS系统之后,至少有以下几方面的收获:

    • 了解Linux系统的工作方式,无论是SystemV,或者之后的systemd;
    • 熟练从源码编译安装Linux软件的方式。(注:这里面用得最多的就是make工具,如果希望进一步学习make工具的话,可以参考楼主整理排版(网络收集,修正部分错误,增加部分注释)的make工具中文帮助手册

    本文仅仅是对Linux From Scratch帮助文档以及编译LFS系统的过程做一个框架式的总结,并记录过程中可能遇到的问题,具体的细节需要仔细阅读Linux From Scratch的帮助文档,建议先初步阅读文档之后,做到心中有数之后再动手开始编译LFS系统的征程,这样可以少走一些弯路。

    一、主机环境

    • 创建分区:在与Host相同的硬盘上创建或者单独一块硬盘的分区创建。
    • 创建路径:在分区上创建必要的路径并设置好权限。
    • 下载源码包:源码包比较多,在Windows环境下,可以打开网页(在Linux From Scratch官网LFS的文档 II. Preparing for the Build → 3. Packages and Patches → All Packages),使用迅雷下载全部链接。在Linux环境下,可以将该网页复制为文本并保存,然后使用cat、grep工具抓取链接并使用wget批量下载即可。
    • 创建专用账户:并为之设置好相应环境。
    • 搭建主机编译环境:在Ubuntu中,用以下命令即可完成
    sudo apt-get install build-essential
    

    最后确认以下几条:

    • 使用的是bash: echo \$0env | grep SHELL
    • sh是指向bash符号链接:在/bin目录下查看ls -l /bin/sh
    • /usr/bin/awk是指向/usr/bin/gawk的符号链接ls -l /usr/bin/awk:若不是则创建
    sudo ln -sv gawk awk
    
    • /usr/bin/yacc是指向/usr/bin/bison的符号链接ls -l /usr/bin/yacc:在Ubuntu中,需要另外安装bison。
    sudo apt-get install bison
    

    二、编译工具链

    编译过程中,注意检查几个关键包是否正常,例如gcc。

    三、编译基本系统

    利用之前编译好的工具链来编译出基本的系统,进入chroot环境后,利用PATH设置搜索顺序,新编译的工具逐渐取代工具链中的工具,直到最后编译完成.此时,我们不再需要工具链了,可以将其删除或者保存以便以后继续编译系统使用.然后重新进入chroot环境。以后每次重新进入Host开始编译基本系统工作时,将要做的操作保存成脚本,每次运行一下即可:

    #!/bin/bash
    #readForLFS.sh
    
    export LFS=/mnt/lfs
    
    mount -v --bind /dev $LFS/dev
    mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
    mount -vt proc proc $LFS/proc
    mount -vt sysfs sysfs $LFS/sys
    mount -vt tmpfs tmpfs $LFS/run
    
    chroot "$LFS" /usr/bin/env -i \
        HOME=/root TERM="$TERM"   \
        PS1='\u:\w\$ '            \
        PATH=/bin:/usr/bin:/sbin:/usr/sbin \
        /bin/bash --login
    

    四、配置系统

    包括配置主机信息、网络环境等等,值得注意的是,完成/etc/sysconfig/console的配置时,只需要指UNICODE和LEGACY_CHARSET值,其余用默认值即可。

    五、内核编译

    第一次解压准备编译前,先做一下清理:make mrproper
    以后编译前清理使用命令:make clean
    用图像界面选择内核功能:make menuconfig
    编译:make
    安装模块:make modules_install
    接下来复制编译好的内核等。

    其中,关键的一步就是选择内核的功能,由于我使用VMware来完成的,未正确选择驱动功能,导致每次启动LFS遇到错误:

    end kernel panic - not syncing: VFS: Unable to mount root fs on unknown - block(0,0)
    

    这里需要针对VMware选择的模块是:Device DriversFusion MPT device support菜单下的功能选择将其编译进内核。

    另外还有网卡模块:Device DriversNetworking supportEthernet (10 or 100Mbit)AMD PCnet32 PCI support(直接搜索关键字ethernet即可找到在菜单中的位置)。另外,文件系统可以添加对NTFS格式的支持等等,具体见《鸟哥的Linux私房菜:基础学习篇(第3版)》内核编译部分。

    六、配置grub

    使用grub引导启动LFS分以下几种情形。
    (注:这里需要知道一些grub的基本知识,例如下文中grub配置文件中set root=(hd0,2),hd后面的数字表示第几块硬盘,序号从0开始,而括号中的2表示该块硬盘的第几个分区,序号从1开始。)

    6.1 /boot在/dev/sda2

    此时并不需要重新安装grub,只需要修改Host的/boot/grub/grub.cfg文件,添加一条引导LFS的菜单:

     menuentry "LFS" {
        insmod ext2
        set root=(hd0,2) #第一块硬盘的第二个分区
        linux /boot/vmlinuz-3.16.2-lfs-7.6 root=/dev/sda2 ro
     }
    

    另外/etc/fstab中根目录的挂载是:

    /dev/sda2  /   ext4    defaults    0   1"
    

    6.2 /boot在/dev/sdb1

    又可以分成两种情况。

    6.2.1 保留Host

    此时也不需要重新安装grub,只需要修改Host的/boot/grub/grub.cfg文件,添加一条引导LFS的菜单:

     menuentry "LFS" {
        insmod ext2
        set root=(hd1,1) #第二块硬盘的第一个分区
        linux /boot/vmlinuz-3.16.2-lfs-7.6 root=/dev/sdb1 ro
     }
    

    6.2.2 不保留Host

    安装grub:

    #注:不加--force会报错
    grub-install --force /dev/sdb
    

    修改LFS系统/boot/grub/grub.cfg,添加引导LFS的菜单:

     menuentry "LFS" {
        insmod ext2
        set root=(hd0,1) #第一块硬盘的第一个分区
        linux /boot/vmlinuz-3.16.2-lfs-7.6 root=/dev/sda1 ro
     }
    

    另外/etc/fstab中根目录的挂载是:

    /dev/sda1  /   ext4    defaults    0   1
    

    然后移除原Host所在硬盘,并设置LFS所在硬盘为第一块硬盘。

    最后,LFS启动成功的界面如下图所示。


    LFS启动成功界面

    相关文章

      网友评论

        本文标题:从源码编译属于自己的Linux系统——Linux From Sc

        本文链接:https://www.haomeiwen.com/subject/cqaixftx.html