zoukankan      html  css  js  c++  java
  • Linux From Scratch(从零开始构建Linux系统,简称LFS)(二)

    七. 构建临时系统

      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. 创建目录

    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) ln -sv lib /lib64
             ln -sv lib /usr/lib64
             ln -sv lib /usr/local/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}
    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

      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
  • 相关阅读:
    POJ 3041 Asteroids 最小点覆盖 == 二分图的最大匹配
    POJ 3083 Children of the Candy Corn bfs和dfs
    POJ 2049 Finding Nemo bfs 建图很难。。
    POJ 2513 Colored Sticks 字典树、并查集、欧拉通路
    POJ 1013 Counterfeit Dollar 集合上的位运算
    POJ 2965 The Pilots Brothers' refrigerator 位运算枚举
    无聊拿socket写的100以内的加法考试。。。
    POJ 1753 Flip Game
    初学socket,c语言写的简单局域网聊天
    汇编语言 复习 第十一章 标志寄存器
  • 原文地址:https://www.cnblogs.com/Mr-kevin/p/5667085.html
Copyright © 2011-2022 走看看