首页 > 代码库 > Raspberry Pi(树莓派)上从零开始构建Linux系统(简称PiLFS)(二)

Raspberry Pi(树莓派)上从零开始构建Linux系统(简称PiLFS)(二)

七. 构建临时系统

  1. 通用编译指南

    a. 确认是否正确设置了 LFS 环境变量

echo $LFS

    b. 假定你已经正确地设置了宿主系统需求和符号链接

    c. 对于每个软件包:

      (1). 确保解压软件包时你使用的是 lfs 用户

      (2). 除非特别说明,删除解压出来的目录和所有编译过程中生成的 build 目录

 

  2. 执行shell脚本,完成临时系统的构建

cd $LFS/sources
chmod +x ch5-build.sh
./ch5-build.sh

  

  3. 改变属主

    以后部分的命令都必须以 root 用户身份执行而不再是 lfs 用户。另外,再次确认下 $LFS 变量在 root 用户环境下也有定义。

  当前,$LFS/tools 目录属于 lfs 用户,通过下面的命令将 $LFS/tools 目录的属主改为 root 用户:

su - root
export LFS=/mnt/lfs
chown -R root:root $LFS/tools

 

八. 构建LFS系统

  1. 准备虚拟内核文件系统

      内核会挂载几个文件系统用于自己和用户空间程序交换信息。这些文件系统是虚拟的,并不占用实际磁盘空间,

    它们的内容会放在内存里。

mkdir -pv $LFS/{dev,proc,sys,run}
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3
mknod -m 444 /dev/random c 1 8
mknod -m 444 /dev/urandom c 1 9
mount -v --bind
/dev $LFS/dev mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620 mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run if [ -h $LFS/dev/shm ]; then mkdir -pv $LFS/$(readlink $LFS/dev/shm) fi

   2. 进入 Chroot 环境    

    从这里以后,就不再需要 LFS 变量了,因为后面所有工作都将被限定在 LFS 文件系统里。

chroot "$LFS" /tools/bin/env -i \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1=‘\u:\w\$ ‘                  PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin     /tools/bin/bash --login +h

  3. 创建目录

# 现在准备创建 LFS 文件系统里的一些目录结构。使用下面的命令创建一个标准的目录树:
# 这个目录树是基于文件系统目录结构标准(FHS)

mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -v  /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -v  /usr/libexec
mkdir -pv /usr/{,local/}share/man/man{1..8}

case $(uname -m) in
 x86_64) mkdir -v /lib64 ;;
esac

mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}

  4. 创建必需的文件和符号链接

ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
sed ‘s/tools/usr/‘ /tools/lib/libstdc++.la > /usr/lib/libstdc++.la
ln -sv bash /bin/sh
ln -sv /proc/self/mounts /etc/mtab


# root 用户的实际密码(这里的 “x” 只是占位符)将在后面创建。
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF


cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
nogroup:x:99:
users:x:999:
EOF


exec /tools/bin/bash --login +h
touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664  /var/log/lastlog
chmod -v 600  /var/log/btmp

  5. 执行shell脚本,完成LFS系统的构建

cd /sources
chmod +x ch6-build.sh
./ch6-build.sh

      master.tar.gz:交叉编译好的二进制内核、内核模块、bootloader、GPU(VideoCore)固件

    可根据脚本提示可选择的安装、升级。

  6. 再次清理无用内容

logout
chroot $LFS /tools/bin/env -i            \
    HOME=/root TERM=$TERM PS1=‘\u:\w\$ ‘     PATH=/bin:/usr/bin:/sbin:/usr/sbin       /tools/bin/bash --login
/tools/bin/find /usr/lib -type f -name \*.a \
   -exec /tools/bin/strip --strip-debug {} ‘;/tools/bin/find /lib /usr/lib -type f -name \*.so* \
   -exec /tools/bin/strip --strip-unneeded {} ‘;/tools/bin/find /{bin,sbin} /usr/{bin,sbin,libexec} -type f \
    -exec /tools/bin/strip --strip-all {} ‘;‘

  7. 清理

rm -rf /tmp/*
logout
chroot
"$LFS" /usr/bin/env -i \ HOME=/root TERM="$TERM" PS1=‘\u:\w\$ ‘ PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash --login rm -rf /tools
rm -f
/usr/lib/lib{bfd,opcodes}.a rm -f /usr/lib/libbz2.a rm -f /usr/lib/lib{com_err,e2p,ext2fs,ss}.a rm -f /usr/lib/libltdl.a rm -f /usr/lib/libfl.a rm -f /usr/lib/libfl_pic.a rm -f /usr/lib/libz.a

 

Raspberry Pi(树莓派)上从零开始构建Linux系统(简称PiLFS)(二)