• LFS(Linux From Scratch)构建过程全记录(七):进入Chroot并构建临时工具


    写在前面

    本章将完成临时系统构建的最后缺失部分和各种包构建所需的工具。

    解决了所有循环依赖关系后,就可以使用与主机操作系统完全隔离的“chroot”环境进行构建。

    注意:接下来的指令,需要切换回root权限下执行

     

    改变所有者

    我们需要将$LFS下文件的所有者设置为root,命令如下

    chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
    case $(uname -m) in
     x86_64) chown -R root:root $LFS/lib64 ;;
    esac

    随后,我们需要创建即将用来挂在文件系统的目录,命令如下

    mkdir -pv $LFS/{dev,proc,sys,run}

     

    安装和填充/dev

    我们需要将宿主系统中的/dev挂载到$LFS下的dev中,命令如下

    mount -v --bind /dev $LFS/dev

    执行后会获得如下输出:

     

    挂载虚拟内核文件系统

    挂载剩下的虚拟内核文件系统

    mount -v --bind /dev/pts $LFS/dev/pts
    mount -vt proc proc $LFS/proc
    mount -vt sysfs sysfs $LFS/sys
    mount -vt tmpfs tmpfs $LFS/run

    在某些主机系统中,/dev/shm是到/run/shm的符号链接。上面挂载了/run tmpfs,在本例中需要创建shm目录,命令如下

    if [ -h $LFS/dev/shm ]; then
     mkdir -pv $LFS/$(readlink $LFS/dev/shm)
    fi

     

    进入Chroot环境

    现在,构建其余所需工具所需的所有包都已在系统中,是时候进入chroot环境来完成其余临时工具的安装了。

    我们切换到chroot环境下正式构建LFS系统了,运行以下命令进入当前仅使用临时工具的环境

    复制代码
    chroot "$LFS" /usr/bin/env -i \
     HOME=/root \
     TERM="$TERM" \
     PS1='(lfs chroot) \u:\w\$ ' \
     PATH=/usr/bin:/usr/sbin \
     /bin/bash --login
    复制代码

     

    输入后,我们可以看到以下开头信息:

    警告:在这之后的处理中,都是在chroot下进行的,如果出现机器重启的情况,需要重新“挂载和激活/dev” 和“挂载虚拟文件系统”以及“创建shm目录”

     

    建立文件夹

    我们创建一些根目录集

    mkdir -pv /{boot,home,mnt,opt,srv}

    通过以下命令在根级别以下创建所需的子目录集

    复制代码
    mkdir -pv /etc/{opt,sysconfig}
    mkdir -pv /lib/firmware
    mkdir -pv /media/{floppy,cdrom}
    mkdir -pv /usr/{,local/}{include,src}
    mkdir -pv /usr/local/{bin,lib,sbin}
    mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
    mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
    mkdir -pv /usr/{,local/}share/man/man{1..8}
    mkdir -pv /var/{cache,local,log,mail,opt,spool}
    mkdir -pv /var/lib/{color,misc,locate}
    ln -sfv /run /var/run
    ln -sfv /run/lock /var/lock
    install -dv -m 0750 /root
    install -dv -m 1777 /tmp /var/tmp
    复制代码

    第一个install确保了不是所有人都可以进入/根目录

    第二个install确保任何用户都可以写入/tmp和/var/ tmp目录,但不能从其中删除其他用户的文件

     

    创建符号连接

    创建符号连接的命令如下

    ln -sv /proc/self/mounts /etc/mtab

    我们创建/ect/hosts文件,命令如下

    cat > /etc/hosts << EOF
    127.0.0.1 localhost $(hostname)
    ::1 localhost
    EOF

    为了让root用户能够登录并识别“root”名称,在/etc/passwd和/etc/group文件中必须有相关的条目

    创建/etc/passwd文件,命令如下

    复制代码
    cat > /etc/passwd << "EOF"
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/dev/null:/usr/bin/false
    daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
    messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
    uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false
    nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false
    EOF
    复制代码

    创建/etc/group文件

    复制代码
    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:
    input:x:24:
    mail:x:34:
    kvm:x:61:
    uuidd:x:80:
    wheel:x:97:
    users:x:999:
    nogroup:x:65534:
    EOF
    复制代码

    我们添加一个用户tester,并在第8章删除该账号,添加命令如下

    echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
    echo "tester:x:101:" >> /etc/group
    install -o tester -d /home/tester

    我们发现,有一句I have no name的提示,如图所示:

    由于我们已经创建了/etc/passwd和/etc/group,因此,我们可以让I have no name的提示消失

    消失的方法:开多一个终端,进入lfs chroot,然后输入以下指令

     

    exec /usr/bin/bash --login

     

    效果如图

     

    我们可以发现no name的提示已消失

     

    添加日志文件

    Login,Agetty和init需要使用一系列的日志文件来记录系统的操作,我们需要创建三个日志文件

     

    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

     

    /var/log/wtmp会记录登入登出的动作

    /var/log/lastlog会记录最后一次登陆的信息

    /var/log/btmp记录的是失败的登陆尝试

     

    程序安装

    第七章中也有很多程序需要安装

    注意:安装的方式和之前有一定的区别

    一定要在chroot下进行安装!!!(否则你会和我一样白做两个快照)

    可以看下面这张截图来确定路径

     

    我们直接按照LFS-BOOK进行安装即可

     

    文件清理

    在第七章的末尾,我们需要进行一系列的文件清理

    注意,此时我们需回到chroot下

    我们需要清理掉/usr/share下info,man,doc三个目录下的所有文件

    LFS-BOOK上写到:清理这些文件将节约约35M的空间,这三个目录里下的文件,实际空间占用如下:

    我们可以通过rm -rf指令对其文件进行删除

    rm -rf /usr/share/{info,man,doc}/*

    我们需要删除若干个.la文件,指令如下:

    find /usr/{lib,libexec} -name \*.la -delete

    由于/tools目录将不再被使用,因此可以将其删除,并释放约1GB空间,指令如下:

    rm -rf /tools

     

    文件备份

    在LFS-BOOK中,介绍了对这些文件进行备份或恢复的方法。

    但由于VMware提供了强大的快照功能,我们因此将采用简单粗暴的办法进行备份和恢复。

    因此,本章不进行讲解

  • 相关阅读:
    2022云栖现场|体验阿里巴巴工作数字化实践
    【CycleISP: Real Image Restoration via Improved Data Synthesis】ISP论文--1(个人笔记,勿喷)
    python urllib open 头部信息错误
    设计模式 -- 策略模式(Strategy Pattern)
    文件被删除怎么办?恢复数据,电脑小白也能操作!
    【Python】pyecharts 模块 ② ( 命令行安装 pyecharts 模块 | PyCharm 安装 pyecharts 模块 )
    Git基本操作
    Python爬虫技术与反爬虫策略
    Leetcode_47:全排列 II
    服务器配置Java开发环境(五)之安装redis
  • 原文地址:https://www.cnblogs.com/alphainf/p/16688894.html