一、简介

LFS──Linux from Scratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式。它不是发行版,只是一个菜谱,告诉你到哪里去买菜(下载源码),怎么把这些生东西( raw code) 作成符合自己口味的菜肴──个性化的linux,不单单是个性的桌面。

参考:http://www.linuxfromscratch.org/

http://www.ha97.com/book/lfs-book-6.6/index.html

http://xxb.is-programmer.com/2008/3/26/LFS-8.1730.html

http://sinojelly.blog.51cto.com/479153/201337/

二、环境准备

使用Debian平台,需做如下环境检查:

1、检查各个需要的工具及内核版本号,看看是否符合lfs7.7的列表要求

2、检查需要用到的库,一共有三个,gmp, mpfr和mpc

工具检查脚本如下:

#filename:check_env.sh
 
#/bin/sh
export LC_ALL=C # check for bash
bash --version | head -n1 | cut -d" " -f2-4
echo "/bin/sh -> `readlink -f /bin/sh`"
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1 # check for yacc
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 # check for other
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 yacc 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 "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

若结果如下,则环境就绪

若出现“command not found”,则缺少工具,可执行如下命令进行安装(以安装gawk工具为例)

sudo aptitude install gawk

库检查脚本如下:

#filename:check_lib.sh
 
#!/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

结果显示,三个库目前都不具备

三、存储设备准备

LFS的编译需要单独有一块存储,条件不好的就单独划个分区,条件好的就再挂块硬盘,实在不行就新建个目录来做这件事好了,只不过这样是没法引导起来,只能chroot之后当编译环境用。

下面以VMware新建一块SATA硬盘,然后接入虚拟机,分区,挂载为例来描述这个过程。

点击“编辑虚拟机设置”,选择添加硬盘,如下图:

选择“SATA(A)”,点击“下一步”,如下图:

选择“创建新的虚拟磁盘”,点击“下一步”,如下图:

设置磁盘大小为:20G,然后选择“将虚拟磁盘存储为单个文件”,点击“下一步”,如下图:

点击“完成”,如下图:

点击“确定”,如下图:

启动虚拟机,执行如下命令,查看新的硬盘信息

ls -l /dev | grep sd

新的硬盘为sdb,如下图:

执行如下命令后,选择”New”来新建一个分区,如下图:

cfdisk /dev/sdb

选择[Primary],创建一个新的主分区,如下图:

提示Size (in MB),选择要创建的分区大小为:128,如下图:

选择[Beginning],在空闲空间的起始位置来添加一个分区,如下图:

选择[ Bootable ],回车,在上方新建的分区这一栏Flags字段会出现Boot字样,如下图:

方向键按向下,光标选中”Free Space”,建立交换分区。基本上都是重复刚才的步骤,只不过大小改成1024,不需要置Boot标识。

移动光标到[ Type ],更改文件系统类型,回车后进入类型选择菜单,编号默认输入就是82,也就是”Linux swap / Solaris”,直接回车即可

此时回到主菜单,可以看到第二个分区sdb2的”FS Type”一项改成了”Linux swap / Solaris”,如下图:

按方向键向下,选中Free Space,重复sdb1的创建步骤,类型选择[Logical],大小默认最大即可,不需要更改,如下图:

此时回到主菜单,可以看到Name栏会显示sdb5,如下图:

新的硬盘分区表建立完毕,需要写入硬盘了,横移光标到[ Write ],回车,如下图:

提示”Are you sure you want to write the partition table to disk? (yes or no):”,敲入“yes”并回车,如下图:

右移光标到[ Quit ]回车,退出cfdisk,如下图:

至此,分区工作完成,LFS需要的独立存储设备与分区准备完毕,如下图:

四、磁盘初始化与源码准备

下面需要格式化分区,步骤如下:

/dev/sdb1使用ext2,执行如下命令,如下图

mkfs -v -t ext2 /dev/sdb1

/dev/sdb2使用swap,执行如下命令,如下图

mkswap /dev/sdb2

/dev/sdb5使用ext4,执行如下命令,如下图

mkfs -v -t ext4 /dev/sdb5

执行如下命令,创建目录:/mnt/lfs

mkdir -pv /mnt/lfs

方便起见,把/mnt/lfs目录的属主改为当前用户,否则每次操作都要加sudo,执行如下命令

chown -R lenovo.sudo lfs/

把lfs工程的主要存储分区/dev/sdb5挂载到这个目录上

mount -v -t ext4 /dev/sdb5 /mnt/lfs

每次宿主系统重启之后,都需要重新export和mount,方便起见,执行如下命令,建立环境变量$LFS=/mnt/lfs

vi ~/.bashrc
#在文件尾添加如下内容
export LFS=/mnt/lfs

执行如下命令,使环境变量立即生效

source ~/.bashrc

至此我们就可以在$LFS上面来下载和编译我们所需的lfs组件了。

下面,新建用于存储源码的目录,并下载源码

mkdir $LFS/src
cd $LFS/src

wget http://www.haopingrui.cn/lfs.tar.gz 124e1eb0e52f176ab84c38118b4975e3

至此,分区和源码准备完成。

五、工具链编译

为了避免使用权限大的账号误操作造成宿主机损失,首先,新建一个lfs用户

为用户lfs设置密码

为用户lfs添加环境变量

vi ~/.bashrc

在文件尾添加如下内容

HOME=$HOME
TERM=$TERM
#PS1=’${debian_chroot:+($debian_chroot)}\[\033[01;31m\][\A]\[\033[01;33m\]\u\[\033[00m\]@\[\033[01;32m\]\h:\[\033[01;34m\]\w\[\033[00m\]$ ‘
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

执行如下命令

source ~/.bashrc

最后,将用户lfs加入sudo组,以获得执行sudo的权限

usermod -g sudo -G sudo lfs

执行如下命令,创建目录并建立软链接后,更改文件属主

mkdir -v $LFS/tools
sudo ln -sv $LFS/tools /tools
sudo chown -Rv lfs $LFS/src

解压并移动文件至目录$LFS/src/

cd /mnt/lfs/src
tar -zxvf lfs.tar.gz
mv $LFS/src/lfs/* $LFS/src/

接下来进行工具编译

编译binutils

tar jxvf binutils-2.25.tar.bz2
cd binutils-2.25
mkdir -v ../binutils-build
cd ../binutils-build/
../binutils-2.25/configure --prefix=/tools --with-sysroot=$LFS --with-lib-path=/tools/lib --target=$LFS_TGT --disable-nls --disable-werror
make
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
make install

LFS(Linux From Scratch)学习的更多相关文章

  1. LFS Linux From Scratch 笔记2(经验非教程)BLFS

    LFS 完了. 其实还没完,还要装一些其他的组件,系统才算是对人类有用的系统. 正好这里有个BLFS Beyound Linux From Scratch 的教程. 其实,按照现有的可运行的LFS系统 ...

  2. LFS Linux From Scratch 笔记(经验非教程)

    做了一个自己的DIY Linux系统.从编译每一行代码,建立每一个文件系统结构开始. 创造自己的GNU/Linux系统,不同于任何发行版.按照的教程是来自 linuxfromscratch.org 来 ...

  3. Welcome to Linux From Scratch!

    /**************************************************************************** * Welcome to Linux Fro ...

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

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

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

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

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

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

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

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

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

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

  9. 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

随机推荐

  1. php 七种数据类型介绍

    PHP有7个数据类型.七个类型: 字符串, 整数, 浮动, 布尔, 数组, 对象, 资源. 字符串 字符串保持字符,如“一”.“abc”,“www.manongjc.com”等.PHP字符串是区分大小 ...

  2. Python3 引入sqlite3时出现错误:ModuleNotFoundError: No module named '_sqlite3'

    在Python3 中内置了SQLite3,但是在编译安装完之后执行: import sqlite3 出现错误: ModuleNotFoundError: No module named '_sqlit ...

  3. html_table表格

    ## `table`表格 表格的常用标签 - `table`表格- `thead`表格头- `tbody`表格主体- `tfoot`表格尾- `th`元素定义表头单元格- `tr`定义表格行- `td ...

  4. 折腾了好久,thinkphp5打开提示加载failed to open stream: No such file or directory in think start.php

    GIT上下载的THINKPHP5记得先 composer update 我就是没update ,折腾了1个小时,才想起来这个事 thinkphp5默认首页打开空白 打开报错提示  提示thinkphp ...

  5. memcache.so的报错信息,未解决

    memcache.so php版本5.6 executor_globals_id in Unknown on line 0 编译也成功了,路径也是在其他so文件的目录 但是加载失败的,查看apache ...

  6. 5. jdk路径配置

    path , classpath 的配置及作用? 1) PATH环境变量.作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到 ...

  7. spring data jpa 注解

    @Data 注解引出的 lombok 小辣椒   今天在看代码的时候, 看到了这个注解, 之前都没有见过, 所以就查了下, 发现还是个不错的注解, 可以让代码更加简洁. 这个注解来自于 lombok, ...

  8. PHP 使用协同程序实现合作多任务

    多任务协作 如果阅读了上面的logger()例子,那么你认为“为了双向通信我为什么要使用协程呢? 为什么我不能只用常见的类呢?”,你这么问完全正确.上面的例子演示了基本用法,然而上下文中没有真正的展示 ...

  9. Spring MVC 重定向

    @RequestMapping("/testRedirect") public String testRedirect(){ System.out.println("te ...

  10. 前段开发-css-总结

    应用参考https://www.cnblogs.com/alice-bj/p/8972299.html CSS:层叠样式表(Cascading Style Sheets) 1.css的特征 一.css ...