一. 准备工作

  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用户登录

  1. sudo passwd root
    su - root

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

  1. cat > version-check.sh << "EOF"
  2. #!/bin/bash
  3. # Simple script to list version numbers of critical development tools
  4. export LC_ALL=C
  5. bash --version | head -n1 | cut -d" " -f2-4
  6. MYSH=$(readlink -f /bin/sh)
  7. echo "/bin/sh -> $MYSH"
  8. echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
  9. unset MYSH
  10.  
  11. echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
  12. bison --version | head -n1
  13.  
  14. if [ -h /usr/bin/yacc ]; then
  15. echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
  16. elif [ -x /usr/bin/yacc ]; then
  17. echo yacc is `/usr/bin/yacc --version | head -n1`
  18. else
  19. echo "yacc not found"
  20. fi
  21.  
  22. bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
  23. echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
  24. diff --version | head -n1
  25. find --version | head -n1
  26. gawk --version | head -n1
  27.  
  28. if [ -h /usr/bin/awk ]; then
  29. echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
  30. elif [ -x /usr/bin/awk ]; then
  31. echo awk is `/usr/bin/awk --version | head -n1`
  32. else
  33. echo "awk not found"
  34. fi
  35.  
  36. gcc --version | head -n1
  37. g++ --version | head -n1
  38. ldd --version | head -n1 | cut -d" " -f2- # glibc version
  39. grep --version | head -n1
  40. gzip --version | head -n1
  41. cat /proc/version
  42. m4 --version | head -n1
  43. make --version | head -n1
  44. patch --version | head -n1
  45. echo Perl `perl -V:version`
  46. sed --version | head -n1
  47. tar --version | head -n1
  48. makeinfo --version | head -n1
  49. xz --version | head -n1
  50.  
  51. echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
  52. if [ -x dummy ]
  53. then echo "g++ compilation OK";
  54. else echo "g++ compilation failed"; fi
  55. rm -f dummy.c dummy
  56. EOF
  57.  
  58. bash version-check.sh

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

  1. apt-get update
  2. apt-get install bison gawk m4 texinfo g++

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

  1. ln -sf bash /bin/sh

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

  1. cat > library-check.sh << "EOF"
  2. #!/bin/bash
  3. for lib in lib{gmp,mpfr,mpc}.la; do
  4. echo $lib: $(if find /usr/lib* -name $lib|
  5. grep -q $lib;then :;else echo not;fi) found
  6. done
  7. unset lib
  8. EOF
  9.  
  10. bash library-check.sh

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

四. 准备新分区

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

  1. 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. 挂载新分区

  1. export LFS=/mnt/lfs
    mkdir -pv $LFS  
    mount -v -t ext4 /dev/sdc2 $LFS   
  2.  
  3. # 如果你正在使用交换分区,用 swapon 命令确保它已经启用
    /sbin/swapon -v /dev/sda5

五. 软件包与补丁  

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

  1. mkdir -v $LFS/sources

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

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

  1. chmod -v a+wt $LFS/sources

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

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

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

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

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

六. 最后的准备工作

  1. 创建 $LFS/tools 文件夹

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

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

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

  3. 添加lfs用户

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

  4. 设置环境

  1. # 以 lfs 用户登录运行以下两个命令,为 bash shell 创建两个开机启动的文件。
  2. # 当以 lfs 用户身份登录时,初始 shell 通常是一个可登录的 shell
  3. # 它先读取宿主机的 /etc/profile 文件(很可能包括一些设置和环境变量),然后是 .bash_profile 文件
  4. # .bash_profile 文件使用完全空环境的 shell 代替运行中的 shell
  5.  
  6. cat > ~/.bash_profile << "EOF"
  7. exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
  8. EOF
  9.  
  10. # 新的 shell 实例是一个非登录 shell,不会读取 /etc/profile 或者 .bash_profile 文件,而是读取 .bashrc 文件
  11. cat > ~/.bashrc << "EOF"
  12. set +h
  13. umask 022
  14. LFS=/mnt/lfs
  15. LC_ALL=POSIX
  16. LFS_TGT=$(uname -m)-lfs-linux-gnu
  17. PATH=/tools/bin:/bin:/usr/bin
  18. export LFS LC_ALL LFS_TGT PATH
  19. EOF
  20.  
  21. # 启用配置文件
  22. source ~/.bash_profile

Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(一)的更多相关文章

  1. LFS(Linux From Scratch)构建过程全记录(二):磁盘分区

    写在前面 本文将会详细记录LFS中,构建分区,构建文件系统和挂载分区的全过程 准备新硬盘 为了更加符合"从零开始构建Linux"的要求,我在虚拟机中,新建了一个磁盘 我们将会在这个 ...

  2. Linux From Scratch(从零开始构建Linux系统,简称LFS)(一)

    一. 准备工作 1. 需要一个Linux宿主系统,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架构上可以运行的其它发行版 如果想实现Win7与Linux双系统,可参考我的 ...

  3. Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(三)

    八. 构建LFS系统 1. 准备虚拟内核文件系统 内核会挂载几个文件系统用于自己和用户空间程序交换信息.这些文件系统是虚拟的,并不占用实际磁盘空间, 它们的内容会放在内存里. mkdir -pv $L ...

  4. Linux From Scratch(从零开始构建Linux系统,简称LFS)(三)

    九. 系统配置 1. 安装 LFS-Bootscripts-20150222 软件包包含一套在 LFS 系统启动和关闭时的启动和停止脚本. cd /sources tar -jxf lfs-boots ...

  5. Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(二)

    七. 构建临时系统 1. 通用编译指南 a. 确认是否正确设置了 LFS 环境变量 echo $LFS b. 假定你已经正确地设置了宿主系统的符号链接: 1)shell 使用的是 bash. 2)sh ...

  6. Linux From Scratch(从零开始构建Linux系统,简称LFS)(二)

    七. 构建临时系统 1. 通用编译指南 a. 确认是否正确设置了 LFS 环境变量 echo $LFS b. 假定你已经正确地设置了宿主系统需求和符号链接 c. 对于每个软件包: (1). 确保解压软 ...

  7. Raspberry Pi(树莓派)上从零开始构建Linux系统(简称PiLFS)(一)

    一. 准备工作 1. 装有Linux宿主系统的树莓派主板,可参考 Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器) 2. 参考网址:Linux From Scratch ...

  8. 从零开始构建Linux

    目的:深入了解以Linux内核为基础的系统是如何组成,运行,以构建一个最基础的,纯净的系统. LFS构建步骤宿主机准备- linux操作系统安装- 使用独立硬盘,创建分区- 配置用户和组- 下载所有需 ...

  9. LFS(Linux From Scratch)构建过程全记录(五):交叉工具链的构建

    写在前面 本文将详细讲述如何构建工具链 前置知识 在LFS-BOOK中,我们需要学习一些关于"交叉编译"的内容,详见书本 安装Binutils-2.39 我们cd到sources文 ...

随机推荐

  1. 解析ActionResult子类JsonResult

    前言 MVC我是11开始使用的,当时还是在上地软件园一小型互联网公司,当时是MVC2.0+Linq to sql.后来接着学习MVC3,MVC3的出现确实让我有种眼前一亮的感觉,期间我不断的写各种de ...

  2. Spring-Boot - 初步搭建

    official document:http://projects.spring.io/spring-boot/ 项目代码: https://github.com/chenxing12/springb ...

  3. co.js - 让异步代码同步化

    近期在全力开发个人网站,并且又沉淀了一些前后端的技术.近期会频繁更新. 这篇文章首发于我的个人网站:听说 - https://tasaid.com/,建议在我的个人网站阅读,拥有更好的阅读体验. 这篇 ...

  4. iOS页面间传值的一些方式总结

    废话不多说,直接进入主题: 这里要说的方式有6种:1.属性传值 2.block 3.delegate 4.UserDefault 5.单例 6.通知(篇幅原因我只写核心代码,如果看不懂可以直接在最下面 ...

  5. 数据结构(C语言第2版)-----数组,广义表,树,图

    任何一个算法的设计取决于选定的数据结构,而算法的实现依赖于采用的存储结构. 之前线性表的数据元素都是非结构的原子类型,元素的值是不可再分的.下面学习的这两个线性表是很特殊的,其中数据元素本身也可能是一 ...

  6. 那些年用过的xUnit.net的简单用法

    0x01 前言 单元测试,总是伴随着我们的开发过程,优劣自行google.当然呢,不排除有些公司是不做单元测试的, 但是呢,学多一点东西用来防身还是可以的. 0x02 简单的Demo 写个两数求和的方 ...

  7. 为jQuery写插件

    很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成sl ...

  8. nginx concat模块配置 页面返回400 bad request

    在1.4.x版本的nginx没有发现这个问题,但是在1.5.x版本就遇到了这个问题 由于Nginx在新版本中,使用了标准的 MIME-Type:application/javascript.而在ngi ...

  9. [moka同学笔记]七、Yii2.0课程笔记(魏曦老师教程)[新增管理员,重置密码]

  10. PHP常量

    常量的定义 在PHP中,常量的声明是通过define()函数来定义的,它也是对大小写敏感的,按照一般的习惯PHP常量总是大写的,且不能再命名的常量之前加上$符号,在这里详细介绍一下define()函数 ...