你的位置:首页 > 操作系统

[操作系统]LFS(Linux From Scratch)学习


一、简介

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/shexport LC_ALL=C# check for bashbash --version | head -n1 | cut -d" " -f2-4echo "/bin/sh -> `readlink -f /bin/sh`"echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-bison --version | head -n1# check for yaccif [ -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 otherbzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2diff --version | head -n1find --version | head -n1gawk --version | head -n1if [ -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"figcc --version | head -n1g++ --version | head -n1ldd --version | head -n1 | cut -d" " -f2- # glibc versiongrep --version | head -n1gzip --version | head -n1cat /proc/versionm4 --version | head -n1make --version | head -n1patch --version | head -n1echo Perl `perl -V:version`sed --version | head -n1tar --version | head -n1makeinfo --version | head -n1xz --version | head -n1echo "main(){}" > dummy.c && g++ -o dummy dummy.cif [ -x dummy ]; then  echo "g++ compilation OK";else  echo "g++ compilation failed";firm -f dummy.c dummy

若结果如下,则环境就绪

image

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

sudo aptitude install gawk

 

库检查脚本如下:

#filename:check_lib.sh
 
#!/bin/bashfor lib in lib{gmp,mpfr,mpc}.la; do  echo $lib: $(          if find /usr/lib* -name $lib | grep -q $lib; then            :;          else            echo not;          fi        ) founddoneunset lib

image

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

 

三、存储设备准备

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

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

 

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

image

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

image

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

image

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

image

点击“完成”,如下图:

image

点击“确定”,如下图:

image

 

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

ls -l /dev | grep sd

新的硬盘为sdb,如下图:

image

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

cfdisk /dev/sdb

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

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

image

 

 

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

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

 

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

mkfs -v -t ext2 /dev/sdb1

image

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

mkswap /dev/sdb2

image

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

mkfs -v -t ext4 /dev/sdb5

image

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

mkdir -pv /mnt/lfs

image

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

chown -R lenovo.sudo lfs/

image

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

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

image

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

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

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

source ~/.bashrc

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

 

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

mkdir $LFS/srccd $LFS/src

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

image

 

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

 

 

五、工具链编译

 

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

 

image

 

image

为用户lfs设置密码

image

为用户lfs添加环境变量

vi ~/.bashrc

在文件尾添加如下内容

HOME=$HOMETERM=$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 +humask 022LFS=/mnt/lfsLC_ALL=POSIXLFS_TGT=$(uname -m)-lfs-linux-gnuPATH=/tools/bin:/bin:/usr/binexport LFS LC_ALL LFS_TGT PATH

执行如下命令

source ~/.bashrc

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

usermod -g sudo -G sudo lfs

image

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

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

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

cd /mnt/lfs/srctar -zxvf lfs.tar.gzmv $LFS/src/lfs/* $LFS/src/

 

接下来进行工具编译

编译binutils

tar jxvf binutils-2.25.tar.bz2cd binutils-2.25mkdir -v ../binutils-buildcd ../binutils-build/
../binutils-2.25/configure --prefix=/tools --with-sysroot=$LFS --with-lib-path=/tools/lib --target=$LFS_TGT --disable-nls --disable-werrormakecase $(uname -m) in x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;esacmake install