• 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 $LFS/dev/random c 1 8 
    mknod -m 444 $LFS/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
    View Code

       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}
    
    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}
    View Code

      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
    View Code

      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 {} ';'
    
    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
    View Code
  • 相关阅读:
    (剑指Offer)面试题18:树的子结构
    (剑指Offer)面试题17:合并两个排序的链表
    (剑指Offer)面试题16:反转链表
    程序员水平分级 你属于哪一类?
    Hacker
    十分钟让你看懂中国经济形势,10分钟,坚持看完,必有所获~(转载)
    人口问题,怎样的生育率才能保持正常的世代更替?
    理科和文科的区别?
    柴晓霞:做销售要学会画蓝图 (转载)
    工作,为钱还是为理想
  • 原文地址:https://www.cnblogs.com/Mr-kevin/p/6361766.html
Copyright © 2020-2023  润新知