Linux From Scratch [1]
0. 首先解释下build, host和target
build:编译过程运行在build上
host:编译出来的东西运行在host上
target:运行在host上的编译器编译出来的东西运行于target。
例如,编译gcc时,build=x86,host=arm,target=mips,表示:
a) 在x86上编译gcc源代码;
b) a步骤得到的gcc在arm上运行(姑且把这个编译器叫做xxx-linux-gcc)
c) 你写了个小东西main.c在arm上用xxx-linux-gcc编译,得到的东西在mips上运行。
As you see, only if $build != $host a cross-compilation is performed.
1. We start from VMWare
2. Add a new disk in VMWare for our guest OS (Maybe you need restart)
3. fdisk this new disk, one partition for root, one partition for swap
4. format our new partitions:
# mkfs -t ext4 /dev/sdb1
# mkswap /dev/sdb2
5. # mkdir /mnt/lfs
6. # mount /dev/sdb1 /mnt/lfs
6.1 # chmod a+w lfs
7. # mkdir -p /mnt/lfs/sources
8. # chmod a+wt /mnt/lfs/sources
9. # mkdir /mnt/lfs/tools
这个目录存放系统构建过程中要用到,系统构造完成后就可以吃干抹净的东西。
10. # ln -s /mnt/lfs/tools /
在host的根目录上创建一个指向lfs/tools的symbolic link,这样在host侧和lfs侧能够用相同路径访问工具链。
11. 新建一个用户专用于我们的工作
# groupadd lfs
# useradd -s /bin/bash -g lfs -m -k /dev/null lfs -s: bash; -g: group; -m: create home directory;
-k: useradd默认会从/etc/skel复制东西来初始化用户目录,-k /dev/null让useradd从/dev/null复制。
12. passwd lfs
13. su - lfs
切换到lfs
14. exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
exec命令替换当前shell,因此该命令会清除系统默认环境变量(/etc/profile),得到一个干净的环境。
注意\u和\w小写。
15. cat > ~/.bashrc << "EOF"
set +h # 禁止bash记住最近执行命令的路径,以使得bash总是使用最新的可执行文件。
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
关于set +h多解释下:比如你在/bin下有个gcc执行了一下,后来在/tools/bin下有了个gcc,尽管PATH规定先搜索/tools/bin,但bash会记住/bin下已经有个gcc而执行/bin下的。我们需要禁止该功能。
16. 因为我们打算从源代码开始构造整个系统,所以我们要先构造编译环境。我们需要从Binutils开始,因为gcc要用到Binutils。我们不想让gcc使用host上的Binutils,以得到纯净系统,避免因gcc和Binutils不匹配导致的可能出现的稀奇古怪问题。
17. 在sources目录下解压Binutils。Binutils的Doc说建一个build目录用于编译:
cd binutils-2.26 && mkdir build && cd build
../configure --prefix=/tools \ # 安装目录
--with-sysroot=$LFS \ # build system在需要时到$LFS下找target system的libraries
--with-lib-path=/tools/lib \ # 编译出来的linker在运行时使用的lib所在目录
--target=$LFS_TGT \ # 编译出来的东西要使用该前缀,前缀使用约定名+自定义名的形式,必须以约定名开始。
--disable-nls \ # 不要国际化
--disable-werror # 忽略编译过程中的警告
make
mkdir -v /tools/lib && ln -s lib /tools/lib64 # 64位系统用
make install # 因为我们安装目录是/tools,不需要su就可安装
[在binutils的configure文件中完全找不到--with-sysroot和--with-lib-path选项:也许这两者其实是不必要的?]
[此处我们将去除以上选项编译binutils,以验证之。如果发生问题,我们会再回来。]
18.
Linux From Scratch [1]的更多相关文章
- Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(三)
八. 构建LFS系统 1. 准备虚拟内核文件系统 内核会挂载几个文件系统用于自己和用户空间程序交换信息.这些文件系统是虚拟的,并不占用实际磁盘空间, 它们的内容会放在内存里. mkdir -pv $L ...
- Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(一)
一. 准备工作 1. 需要一个Linux宿主系统,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架构上可以运行的其它发行版 如果想实现Win7与Linux双系统,可参考我的 ...
- Linux From Scratch - Version 7.7-systemd (中文)
Linux From Scratch - Version 7.7-systemd: https://linux.cn/lfs/LFS-BOOK-7.7-systemd/index.html
- What is Cross Linux From Scratch?
/**************************************************************************** * What is Cross Linux ...
- Welcome to Linux From Scratch!
/**************************************************************************** * Welcome to Linux Fro ...
- LFS(Linux From Scratch)学习
一.简介 LFS──Linux from Scratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式.它不是发行版,只是一个菜谱,告诉你到哪里去买菜(下载源码),怎么把这些生东西( ra ...
- Linux From Scratch(从零开始构建Linux系统,简称LFS)(三)
九. 系统配置 1. 安装 LFS-Bootscripts-20150222 软件包包含一套在 LFS 系统启动和关闭时的启动和停止脚本. cd /sources tar -jxf lfs-boots ...
- Linux From Scratch(从零开始构建Linux系统,简称LFS)(一)
一. 准备工作 1. 需要一个Linux宿主系统,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架构上可以运行的其它发行版 如果想实现Win7与Linux双系统,可参考我的 ...
- 高手从零开始的全定制发行版-Linux from Scratch
在制作Linux发行版中Linux from Scratch可谓是真正的大师级.Linux from Scratch是在线的社区创建的一本电子书,目的是帮助那些根深蒂固的想方设法提高计算机性能的人(t ...
- LFS Linux From Scratch 笔记2(经验非教程)BLFS
LFS 完了. 其实还没完,还要装一些其他的组件,系统才算是对人类有用的系统. 正好这里有个BLFS Beyound Linux From Scratch 的教程. 其实,按照现有的可运行的LFS系统 ...
随机推荐
- PAT (Basic Level) Practise:1013. 数素数
[题目连接] 令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数. 输入格式: 输入在一行中给出M和N,其间以空格分隔. 输出格式: 输出从PM到 ...
- LINQ 按多个字段排序
多字段排序 添加到 LINQ 查询结果中的Take()扩展方法用于提取前 个结果: private static void Ordering() { var racers = (from r in F ...
- WordPress自定义文章页面模板
如果想让某个分类的文章页面样式有别于其它分类,我们可以使用自定义的模板的方法实现.例如,我们准备让名称为 WordPress 的分类文章使用有别于其它分类的模板样式, 首先在所用主题根目录新建一个名称 ...
- UVALive-4670 Dominating Patterns(AC自动机)
题目大意:找出出现次数最多的模式串. 题目分析:AC自动机裸题. 代码如下: # include<iostream> # include<cstdio> # include&l ...
- 黑马程序员——JAVA基础之final this.和super.的区别
------- android培训.java培训.期待与您交流! ---------- final关键字: final可以修饰类,方法,变量. final修饰的类不可以被继承. final修饰的方法 ...
- WebForm 中的页面重定向和传值(转自 MSDN)
——原文地址:https://msdn.microsoft.com/zh-cn/library/6c3yckfw(v=vs.100).aspx 在开发 ASP.NET 网站时,您经常需要从一 ...
- jquery.ajaxfileupload.js
jquery.ajaxfileupload.js上传插件,利用iframe提交不刷新页面功能完成. /* // jQuery Ajax File Uploader // // @author: Jor ...
- Qt消息机制和事件(二)
三,事件过滤器 有时候,对象需要查看.甚至要拦截发送到另外对象的事件.例如,对话框可能想要拦截按键事件,不让别的组件接收到:或者要修改回车键的默认处理. 通过前面的章节,我们已经知道,Qt 创建了QE ...
- socket、webService、RMI ?
网络七层协议为:物理层.数据链路层.网络层.传输层.会话层.表示层.应用层 webService > RMI > socket RMI比socket更高一点 socket 只是 java在 ...
- 20150826运算符,if语句
运算符+ - * / % 加减乘除与注意:1.做除法运算时,如果两个操作数同为整数,则运算结果也是整数,不会出现小数.2.上面这些运算,如果两个操作数不同是一个类型,在运算的时候会自动进行类型转换. ...