zoukankan      html  css  js  c++  java
  • Linux From Scratch(从零开始构建Linux系统,简称LFS)(一)

    一. 准备工作

      1. 需要一个Linux宿主系统,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架构上可以运行的其它发行版

        如果想实现Win7与Linux双系统,可参考我的上一篇博文:Win7下硬盘安装Ubuntu双系统  

      2. 一个8G的U盘,LFS系统将安装在上面

      3. 参考网址:Linux From Scratch V7.10

      4. 中文版参考网址:Linux From Scratch Version 7.7-systemd (简体中文版)  

      5. 参考文档:LFS-BOOK-7.10.pdf

      6. 参考网址:U盘上安装与启动LFS系统

    二. LFS目标架构

        LFS主要支持 AMD/Intel 的 x86(32 位)和 x86_64(64 位) 的目标架构。

        假如按照本文的默认方式构建,那么你将得到一个“纯” 64 位系统————这意味着你仅能够执行64 位的程序。

    三. 宿主系统需求

      1. 如果未设置root密码,先设置,再以root用户登录

    sudo passwd root
    su - root

      2. 请执行以下命令,查看宿主机的各个软件包的版本以及编译环境是否准备妥当:

    cat > version-check.sh << "EOF"
    #!/bin/bash
    # Simple script to list version numbers of critical development tools
    export LC_ALL=C
    bash --version | head -n1 | cut -d" " -f2-4
    MYSH=$(readlink -f /bin/sh)
    echo "/bin/sh -> $MYSH"
    echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
    unset MYSH
    
    echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
    bison --version | head -n1
    
    if [ -h /usr/bin/yacc ]; then
      echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
    elif [ -x /usr/bin/yacc ]; then
      echo yacc is `/usr/bin/yacc --version | head -n1`
    else
      echo "yacc not found" 
    fi
    
    bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
    echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
    diff --version | head -n1
    find --version | head -n1
    gawk --version | head -n1
    
    if [ -h /usr/bin/awk ]; then
      echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
    elif [ -x /usr/bin/awk ]; then
      echo awk is `/usr/bin/awk --version | head -n1`
    else 
      echo "awk not found" 
    fi
    
    gcc --version | head -n1
    g++ --version | head -n1
    ldd --version | head -n1 | cut -d" " -f2-  # glibc version
    grep --version | head -n1
    gzip --version | head -n1
    cat /proc/version
    m4 --version | head -n1
    make --version | head -n1
    patch --version | head -n1
    echo Perl `perl -V:version`
    sed --version | head -n1
    tar --version | head -n1
    makeinfo --version | head -n1
    xz --version | head -n1
    
    echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
    if [ -x dummy ]
      then echo "g++ compilation OK";
      else echo "g++ compilation failed"; fi
    rm -f dummy.c dummy
    EOF
    
    bash version-check.sh
    View Code

        a. 如果宿主系统是Ubuntu 14.04.5,你会发现缺少了五个包,使用命令行增加:

    apt-get update
    apt-get install bison gawk m4 texinfo g++

        b. 同时,/bin/sh 是指向dash,使用命令行修改指向bash:

    ln -sf bash /bin/sh

      3. 同时,还请进行库文件的一致性检查,这些文件应该要么都在或者是都缺失,而不应该只有一两个。

    cat > library-check.sh << "EOF"
    #!/bin/bash
    for lib in lib{gmp,mpfr,mpc}.la; do
      echo $lib: $(if find /usr/lib* -name $lib|
                   grep -q $lib;then :;else echo not;fi) found
    done
    unset lib
    EOF
    
    bash library-check.sh
    View Code

         如果宿主系统是Ubuntu 14.04.5,这些库文件都是缺失的,不用管它

    四. 准备新分区

      1. 宿主系统下安装分区工具 gparted,命令:

    apt-get install gparted

      2. 利用 gparted 重新划分U盘,我的U盘是分为:

        /dev/sdc1      100M        EXT4          boot分区

        /dev/sdc2       7.3G        EXT4          LFS系统分区  

      3. 我的宿主分区是这样的:         

        /dev/sda5       2G         Swap          交换分区

        /dev/sda6       100M      EXT4          boot分区

        /dev/sda7       28G        EXT4          Ubuntu系统分区

      5. 挂载新分区

    export LFS=/mnt/lfs
    mkdir -pv $LFS  
    mount -v -t ext4 /dev/sdc2 $LFS   

    # 如果你正在使用交换分区,用 swapon 命令确保它已经启用
    /sbin/swapon -v /dev/sda5


    五. 软件包与补丁  

      1. 执行下面的命令创建$LFS/sources目录

    mkdir -v $LFS/sources

        此目录用于保存软件包和补丁,同时用来解压源代码并执行编译。 

      2. 设置目录的写权限和粘滞模式

    chmod -v a+wt $LFS/sources

        “粘滞模式”意思是就算有多个用户对某个目录有写权限,仍然只有该文件的主人能删除一个粘滞目录里的文件。

      3. 下载需要的软件包和补丁,它们用来构建一个基本的 Linux 系统  

        点击此下载 wget-list 文件作为 wget 的输入:

    wget --input-file=wget-list --continue --directory-prefix=$LFS/sources

      4. 下载批处理脚本 ch5-build.shch6-build.sh,放到 $LFS/sources 文件夹下

    六. 最后的准备工作

      1. 创建 $LFS/tools 文件夹

    # 编译的临时工具会安装到 $LFS/tools 文件夹,不会成为最终 LFS 系统的一部分。
    
    mkdir -v $LFS/tools

      2. 在宿主系统中创建 /tools 的符号链接,将其指向$LFS/tools

    # 创建的符号链接使得编译的工具链总是指向 /tools 文件夹。
    
    ln -sv $LFS/tools /

      3. 添加lfs用户

    groupadd lfs    # 添加新组
    useradd -s /bin/bash -g lfs -m -k /dev/null lfs     # 添加新用户    
    passwd lfs      # 为用户设置密码
    chown -v lfs $LFS/tools     # 赋予了访问 $LFS/tools 文件夹的所有权限
    chown -vR lfs $LFS/sources   # 赋予了访问 $LFS/sources 文件夹的所有权限
    su - lfs    # 切换用户

      4. 设置环境

    # 以 lfs 用户登录运行以下两个命令,为 bash shell 创建两个开机启动的文件。
    # 当以 lfs 用户身份登录时,初始 shell 通常是一个可登录的 shell
    # 它先读取宿主机的 /etc/profile 文件(很可能包括一些设置和环境变量),然后是 .bash_profile 文件
    # .bash_profile 文件使用完全空环境的 shell 代替运行中的 shell
    
    cat > ~/.bash_profile << "EOF"
    exec env -i HOME=$HOME TERM=$TERM PS1='u:w$ ' /bin/bash
    EOF
    
    
    # 新的 shell 实例是一个非登录 shell,不会读取 /etc/profile 或者 .bash_profile 文件,而是读取 .bashrc 文件
    cat > ~/.bashrc << "EOF"
    set +h
    umask 022
    LFS=/mnt/lfs
    LC_ALL=POSIX
    LFS_TGT=$(uname -m)-lfs-linux-gnu
    PATH=/tools/bin:/bin:/usr/bin
    export LFS LC_ALL LFS_TGT PATH
    EOF
    
    
    # 启用配置文件
    source ~/.bash_profile
    View Code
  • 相关阅读:
    中国3G网络频段
    Cortex系列M0-4简单对比
    PLUM_LITE 系统框图
    POE原理
    Excel 自动分列实现一则
    记Discuz X3.4 Windows部署后无法上传附件的问题
    在64位PC的32位COM组件注册失败
    以管理员运行批处理时修正当前路径
    记录type cover失灵
    AutoCAD Viewcube and Navigation bar not diplayed in some viewports
  • 原文地址:https://www.cnblogs.com/Mr-kevin/p/5656303.html
Copyright © 2011-2022 走看看