0x00 简介
上一节说到了基础软件的版本的修正的问题,这一次我们继续制作基础的环境。这里说一下几乎所有的教程最后的 grub 都是安装在了准备好的第二块空的独立的硬盘上,然后去掉第一块硬盘,直接启动。这样做的好处的完全的独立与宿主主机没有任何的联系,是一个真真正正的独立的操作系统,还有好多人是在虚拟机上去做的,虚拟机最大的好处在于各种方便的回退,怎么做都不会破坏掉宿主主机,但是这样做也有个问题,就是效率实在是太低了。我就想在自己的真机上去做。所以我最后的做法是在centos7 的主机上直接编译安装,这样不管是 cpu 的利用率还是磁盘的利用率都非常的好,最后更新一下 grub 就好了,这里我们把 centos 7 安装的时候采用的是标准分区安装不使用 lvm 的方式去做,lvm涉及到另外的问题,这里简化操作了。安装 centos 7 的时候空余出 20G 的空间即可,这 20 G 的空间留着不用。安装完系统以后再划分使用。如果你用了虚拟机,那么请再添加一个 20 G 的硬盘出来。
0x01 继续做准备工作
我自己留了 50 G 实际上 20 G 就做够了,我之所以留这么多是因为后面还要做别的实验用,如果只是做 LFS 没必要这么大。
先 fdisk /dev/sda
分出了 2 个分区 sda3
和 sda4
这两个分别用作 /
分区和 swap
分区。
格式化这两个分区
mkfs -v -t ext4 /dev/sda3
mkswap /dev/sda4
查看硬盘的分配情况
lsblk
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 100G 0 part /
├─sda2 8:2 0 4G 0 part [SWAP]
├─sda3 8:3 0 50G 0 part
└─sda4 8:4 0 4G 0 part
0x02 添加一条环境变量
下面操作都用 root 账户来做切换用户的时候我会提到,没说之前都用 root 来做
export LFS=/mnt/lfs 写入到 .bash_profile 的最后
具体做法是
cd ~
echo "export LFS=/mnt/lfs" >> .bash_profile
source .bash_profile
# 这样以后登录就会自动的加载设置的这个环境变量了
0x03 挂载分区 下载软件
我们把创建好的分区先挂载上,在挂载之前先要建立挂载的文件夹 /mnt/lfs
以后这个文件夹就是编译安装出来的 LFS 系统的根分区的文件夹了。
mkdir -pv $LFS
mount -v -t ext4 /dev/sda3 $LFS
创建源码下载的目录
mkdir -v $LFS/sources
给目录添加其他用户可写入的权限,但是不能删除。这是粘滞模式
chmod -v a+wt $LFS/sources
下载所需要的软件包,这里极力不推荐使用官方的方法 这方法极其的不靠谱,同一个软件只有一个源,有好几个软件会过期,链接有问题下载不下来。即使侥幸去别处下载下来 md5 还不对,各种纠结。我在总结了一份软件包后,差点把总结的这份当做传家宝。这里我给出一个完全有效的方法,lfs 的官网上提供了所有的软件,你可以下载整个目录下载下来,也可以使用 lfs 打包好的软件集合的包。具体链接是 wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
http://ftp.lfs-matrix.net/pub/lfs/lfs-packages/lfs-packages-8.4.tar
也可以打开 http://ftp.lfs-matrix.net/pub/lfs/lfs-packages/
去下载你需要的软件包。
下载软件并检查
cd $LFS/sources
wget http://ftp.lfs-matrix.net/pub/lfs/lfs-packages/lfs-packages-8.4.tar
tar xf lfs-packages-8.4.tar
cd 8.4
# 把所有的源码放到 sources 的目录下面
mv * ..
cd ..
# 检查一下源码 MD5 的文件 md5sums 已经在包里面了
pushd $LFS/sources
md5sum -c md5sums
popd
创建编译工具链用的目录 tools
mkdir -v $LFS/tools
# 做一个软链接在 / 下面
ln -sv $LFS/tools /
0x04 创建 LFS 用户相关的内容
创建 lfs 用户和组,这步用的是 root 账户创建的
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
# 参数解释
#
# -s /bin/bash
# 将 bash 设置为 lfs 用户的默认 shell。shell 有好多种,常见有的 bash zsh fish ,
# bash最标准每个机器上都默认会装,有些命令在 bash 可用 zsh 上不可用
#
# -g lfs
# 这个选项将用户 lfs 添加到组 lfs 中。
#
# -m
# 为 lfs 用户创建主目录。
#
# -k /dev/null
# 这个参数通过改变输入位置为特殊的空(null)设备,以防止可能从框架目录(默认是 /etc/skel) 复制文件。
#
# lfs
# 这是创建的组和用户的实际名称。
这个命令行的详解我是取自 linux 中国 lctt 翻译的 lfs 8.4 中的内容,以后所有的参数解释不再说明具体的出处,有些参数我会加一些详细的说明。在此感谢 lctt 翻译小组。我本人也为 lctt 的一员,已经有一段时间没有翻译文章了了,我的 lctt id ivo-wang,贡献非常有限深表惭愧。
给 lfs 用户设置一个初始密码
passwd lfs
更改$LFS/tools 目录的所有者为 lfs:
chown -v lfs $LFS/tools
同上一步,更改 sources 的权限
chown -v lfs $LFS/sources
登录到 lfs 用户,后面的操作就都以 lfs 用户进行了,如果我没刻意的说,就一直用这个用户
su - lfs
0x05 设置 lfs 用户的环境
创建 bash 相关的配置文件,这样会创建一个比较干净的环境尽量与宿主不发生关系
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
这个配置文件是 bash 的,新的 shell 实例是一个 non-login 的 shell,不会读取 /etc/profile 或者 .bash_profile 文件,而是读取 .bashrc。现在,创建 .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
# set +h 最大的好处是,实时刷新新编译出来的工具,有了立马就用
# (umask)为 022,以确保新建的文件和目录只有其所有者可写,但任何人都可读可执行
# LC_ALL 变量控制某些程序的本地化,使它们的消息遵循特定国家的惯例。
# 设置 LC_ALL 为「POSIX」或「C」(两者是等价的),确保在 chroot 环境中一切能如期望的那样进行
# 把 /tools/bin 放在标准 PATH 变量的前面,这样和set +h配合,做出来新工具,就用上了新的工具,非常好
调用一下 bash 的配置文件
source ~/.bash_profile
调整一下 make 时候的 cpu 的数量,我的机器是 4核 cpu,所以make 的时候可以使用 make -j4,如果是双核建议 make -j2 可以快一些编译。这里我改个环境变量来做。
echo "export MAKEFLAGS='-j 4'" >> ~/.bash_profile
source ~/.bash_profile
0x06 关于测试
有的软件编译完了以后,一定测试一下,尤其是 gcc 与 glibc 这个对于 linux 操作系统至关重要。有需要做的我会在后面的记录里面明确的写出来。不是所有软件都需要测试,中文版的 lfs 手册里面最有意义的就是各种参数。这也是无数的人都直接忽略掉的内容,我会把一些比较重要或是比较有意义的内容从书里面粘过来。如果你好好看了书和我的操作部分,相信会有比较大的收获。