Raspberry Pi(树莓派)上从零开始构建Linux系统(简称PiLFS)(一)
一. 准备工作
1. 装有Linux宿主系统的树莓派主板,可参考 Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)
2. 一张大小至少8G的U盘,PiLFS系统将安装在上面
3. 参考网址:Linux From Scratch on the Raspberry Pi
4. 参考网址:Linux From Scratch V7.10
5. 中文版参考网址:Linux From Scratch Version 7.7-systemd (简体中文版)
6. 参考文档:LFS-BOOK-7.10.pdf
7. 参考网址:Raspberry Pi
二. PiLFS 目标架构
PiLFS主要支持 ARM(64位)的目标架构。
假如按照本文的默认方式构建,那么你将得到一个“纯” 64 位系统————这意味着你仅能够执行64 位的程序。
三. 宿主系统需求
1. 如果未设置root密码,先设置,再以root用户登录
sudo passwd root
su - root
2. 请执行以下命令,查看宿主机的各个软件包的版本以及编译环境是否准备妥当:
cat > version-check.sh << "EOF" #!/bin/bash # Simple script to list version numbers of critical development tools export LC_ALL=C bash --version | head -n1 | cut -d" " -f2-4 MYSH=$(readlink -f /bin/sh) echo "/bin/sh -> $MYSH" echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash" unset MYSH echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3- bison --version | head -n1 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 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 awk 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 'int 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 EOF bash version-check.sh
a. 如果宿主系统是Raspbian,你会发现缺少了四个包,使用命令行增加:
apt-get update
apt-get install bison gawk m4 texinfo
b. 同时,/bin/sh 是指向dash,使用命令行修改指向bash:
ln -sf bash /bin/sh
3. 同时,还请进行库文件的一致性检查,这些文件应该要么都在或者是都缺失,而不应该只有一两个。
cat > library-check.sh << "EOF" #!/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 EOF bash library-check.sh
如果宿主系统是Raspbian,这些库文件都是缺失的,不用管它
四. 创建新分区
1. 宿主系统下安装分区工具 gparted,命令:
apt-get install gparted
2. 利用 gparted 重新划分TF卡,我的TF卡是分为:
/dev/mmcblk0p1 64M VFAT boot分区
/dev/mmcblk0p2 26.9G EXT4 宿主系统分区
/dev/mmcblk0p3 2G Swap 交换分区
3. 利用 gparted 划分U盘,划出一个LFS系统分区,我的U盘是分为:
/dev/sda1 100M FAT32 boot分区
/dev/sda2 7.3G EXT4 LFS系统分区
五. 挂载新分区
export LFS=/mnt/lfs mkdir -pv $LFS mount -v -t ext4 /dev/sda2 $LFS # 如果你正在使用交换分区,用 swapon 命令确保它已经启用 /sbin/swapon -v /dev/mmcblk0p3
六. 软件包与补丁
1. 以 root
用户执行下面的命令创建$LFS/sources目录
mkdir -v $LFS/sources
2. 设置目录的写权限和粘滞模式
chmod -v a+wt $LFS/sources
“粘滞模式”意思是就算有多个用户对某个目录有写权限,仍然只有该文件的主人能删除一个粘滞目录里的文件。
3. 下载构建PiLFS需要的软件包和补丁
wget http://www.intestinate.com/pilfs/scripts/wget-list
wget -i wget-list -P $LFS/sources
七. 最后的准备工作
1. 创建 $LFS/tools 文件夹
# 编译的临时工具会安装到 $LFS/tools 文件夹,不会成为最终 LFS 系统的一部分。 mkdir -v $LFS/tools
2. 在宿主系统中创建 /tools
的符号链接,将其指向$LFS/tools
# 创建的符号链接使得编译的工具链总是指向 /tools 文件夹。
ln -sv $LFS/tools /
3. 添加lfs用户
groupadd lfs # 添加新组 useradd -s /bin/bash -g lfs -m -k /dev/null lfs # 添加新用户 passwd lfs # 为用户设置密码 chown -v lfs $LFS/tools # 赋予了访问 $LFS/tools 文件夹的所有权限 chown -vR lfs $LFS/sources # 赋予了访问 $LFS/sources 文件夹及子文件的所有权限 su - lfs # 切换用户
4. 设置环境
# 以 lfs 用户登录运行以下两个命令,为 bash shell 创建两个开机启动的文件。 # 当以 lfs 用户身份登录时,初始 shell 通常是一个可登录的 shell # 它先读取宿主机的 /etc/profile 文件(很可能包括一些设置和环境变量),然后是 .bash_profile 文件 # .bash_profile 文件使用完全空环境的 shell 代替运行中的 shell cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOF # 新的 shell 实例是一个非登录 shell,不会读取 /etc/profile 或者 .bash_profile 文件,而是读取 .bashrc 文件 cat > ~/.bashrc << "EOF" set +h umask 022 LFS=/mnt/lfs LC_ALL=POSIX LFS_TGT=$(uname -m)-lfs-linux-gnueabihf PATH=/tools/bin:/bin:/usr/bin export LFS LC_ALL LFS_TGT PATH EOF # 启用配置文件 source ~/.bash_profile