当前位置: 首页 > news >正文

新手玩Linux ---- 从Linux From Scratch开始学习Linux (四)

为什么80%的码农都做不了架构师?>>>   hot3.png

为了让安装时软件包过程中方便访问,我们最好建立一个目录来解压和编译源码包。我们在我们的工作目录/mnt/lfs中建立一个名字为sources的目录 既可以用来存储软件包和补丁,也可以作为工作目录。使用这个目录的好处是,所有需要的部件都在 LFS 分区上,构建过程中的所有步骤都可以访问到。

要创建这个目录,在开始下载之前用 root 用户登录,并运行下面的命令:

mkdir -v $LFS/sources

把目录设置为可写和 sticky 模式,这里"Sticky"的意思是虽然某个目录对于多个用户有写入的权限,但这个目录中的文件只有其所有者才能删除。请运行下面的命令使目录可写,并设置 sticky 模式:

chmod -v a+wt $LFS/sources
下边编译的所有程序都将安装到 $LFS/tools 目录下,以便与后边教程中编译的程序隔离开来。这里编译的程序只是临时使用的工具,不是最终 LFS 系统的组成部分。把这些程序放到一个单独的目录下,在使用过之后简单的删除掉就可以了。这样做也可以防止这些程序与系统中相同的程序混淆(新手很容易出现这样的事情)。相关知识点:chmod a+wt是将目录或文件的属性设置为1777,这样任何人都可以对其进行读写。root 用户运行下面的命令来创建所需的目录:
mkdir -v $LFS/tools
下一步是在宿主系统上创建一个 /tools 符号链接,指向 LFS 分区上新创建的目录,这个命令同样要作为 root 用户运行:
ln -sv $LFS/tools /

注意:ln -sv $LFS/tools执行后应该会提示
`/tools' -> `/mnt/lfs/tools'
表示正确。


相关知识点:
上面这两句就建立了神奇的工具链目录(是工具链目录不是工具链),这样的创建方式是为了在创建工具链和使用工具链创建目标系统的时候对于工具链的位置都是/tools,这样可保证工具链的正常使用

添加 LFS 用户

root 用户登录的时候,如果出现操作错误就足以损坏甚至摧毁系统,因此,我们推荐使用一个无特权的用户来编译和安装软件包。建议您新建一个名为 lfs 的组,并在其中添加一个名为 lfs 的用户,我们将在安装过程中使用这个用户。以 root 用户运行下列命令来添加新用户:

groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs

命令行选项的含义:

-s /bin/bash 指定 bash 作为 lfs 用户的默认 shell -g lfs lfs 用户添加到 lfs -m lfs 用户创建 home 目录 -k /dev/null 这个参数通过修改输入位置为特殊的空设备来防止从框架目录(默认为 /etc/skel)拷贝文件 lfs 这是所创建的组和用户的实际名字

为了可以使用 lfs 用户登录(与从 root 用户切换到 lfs 用户不同,这种切换不需要 lfs 用户有一个密码),必须先为 lfs 用户设置一个密码(设置lfs密码,设置为空就行了,也就是输入密码的时候直接回车就成。):

passwd lfs

通过把 lfs 用户设置为 $LFS/tools 目录的所有者来授予 lfs 用户对该目录的完全访问权限:

chown -v lfs $LFS/tools

如果您依照建议创建了独立的工作目录,请将该目录的所有权赋予 lfs 用户:

chown -v lfs $LFS/sources

接下来,以 lfs 用户登录。您可以通过一个虚拟控制台,或者通过显示管理器,或者用下面的切换用户命令:

su - lfs

"-" 参数指示 su 开启一个登陆Shell(login shell)而不是非登陆Shell(non-login shell),这两种 shell 的不同之处请参考 bash(1) 和 info bash 。这时候你会发现命令行提示符已经由#改为了$


设置工作环境

通过给 bash shell 创建两个新的启动文件来设置一个良好的工作环境。用 lfs 用户登录,输入下面的命令来创建一个新的 .bash_profile 文件:

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

作为 lfs 用户登录的时候,初始 shell 通常是一个登陆shell(login shell),它会首先读取当前系统的 /etc/profile 文件(可能包含一些设置和环境变量),然后继续读取 .bash_profile 文件来完成登录初始化。.bash_profile 文件中的 exec env -i.../bin/bash 命令用完全空的环境来取代当前的环境(除了继承 HOME, TERM, PS1 变量外)。这样能保证我们的编译环境不会被当前系统中不必要的或者有潜在危险的环境变量所影响,从而确保获得一个干净的工作环境。

另一个新的 shell 实例是非登陆shell(non-login shell),它不读取 /etc/profile 或 .bash_profile 文件,而是读取 .bashrc 文件。现在创建 .bashrc 文件:

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF

set +h 命令关闭 bash 的 hash 功能,hash 通常是一个有用的特性:bash 使用一个 hash 表来记录可执行文件的完整路径,以避免为了找到同一个可执行文件而反复搜索 PATH 里的目录。然而,新工具装好之后就要立即使用,通过关闭 hash 功能,当要运行程序的时候,shell 将总是搜索 PATH 里的目录,这样新工具一编译好,shell 就可以在 $LFS/tools 目录里找到,而不是执行所记忆的其它地方的旧版本程序。

将用户文件创建掩码(umask)设为 022 ,使得新创建的文件和目录只有所有者可写,其他用户只能读取和运行(open(2) 系统调用的默认模式是新文件权限 644,新目录权限 755)。

LFS 环境变量应该设为所选择的挂载点。

LC_ALL 环境变量控制着某些程序的本地化,使其显示的信息遵循指定国家的惯例。如果当前系统使用的 Glibc 版本低于 2.2.4,将 LC_ALL 环境变量设置为"POSIX"或"C"以外的值(在本章中)可能会在您退出虚根环境后再想返回的时候出现问题。请把 LC_ALL 设置为"POSIX"或"C"(这两者是等价的)以确保在虚根环境中的所有东西都像预期的那样正常工作。

通过把 /tools/bin 放在 PATH 的最前面,当所有的程序安装好后,就可以立即被 shell 运行。将这一点和关闭 hash 功能结合起来,预防了当前系统的旧程序在不该运行的时候却被运行了的风险。

最后,为了完全准备好编译临时工具的工作环境,导入刚刚创建的 profile 文件:

source ~/.bash_profile
这里利用了bash的环境变量的设置文件将lfs的环境设置为符合编译工具链要求的最少的环境参数
  这里面最重要的就是PATH这个参数,目的是为了能够利用工具链里面的工具制作工具链:首先查找/tools/bin下是否有需要的命令,如果没有再到/bin和/usr/bin下找,然后用/bin或/usr/bin下面的命令来帮助生成需要的命令并放在/tools/bin下,这样此消彼涨,最终可完成一个自给自足的工具链。   到此为止就可以开始工具链的制作了,不过制作LFS是一个漫长而浩大的工程,所以要一直开机直到完成有时候比较困难,特别是在机器速度比较慢的情况下,能够重新启动到最后工作的状态是很重要的。在不同的阶段重新启动并恢复状态的步骤不完全相同,所以本文会在不同的阶段讨论重新启动恢复到工作状态的方法和步骤。

转载于:https://my.oschina.net/gdfz/blog/30408

相关文章:

  • 艾伟:WCF从理论到实践(1):揭开神秘面纱
  • PS快捷键大全收藏
  • OAF—如何设计Page导航
  • 一起谈.NET技术,带你走进缓存世界
  • LLBL Gen 3.x 源代码追踪与解析 认识框架结构
  • win7 64位创建wifi热点
  • Celine Dion - A New Day Has Come
  • gns小技巧
  • 李开复谈开放平台时代的创业机会
  • 为什么oracle在AIX有空闲内存的情况下使用SWAP
  • 配置WANem限制网络(点对点)
  • linux下如何挂接(mount)光盘镜像文件、移动硬盘、U盘、Windows网络共享和NFS网络共享...
  • ubuntu下的软件安装
  • HTML5是否已为实际应用做好准备?
  • IE9相比IE8丢失了什么?
  • FineReport中如何实现自动滚屏效果
  • in typeof instanceof ===这些运算符有什么作用
  • Java超时控制的实现
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux gpio口使用方法
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • node 版本过低
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • vue中实现单选
  • win10下安装mysql5.7
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端面试题总结
  • 强力优化Rancher k8s中国区的使用体验
  • 听说你叫Java(二)–Servlet请求
  • 项目实战-Api的解决方案
  • 一个SAP顾问在美国的这些年
  • # .NET Framework中使用命名管道进行进程间通信
  • #### go map 底层结构 ####
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (13):Silverlight 2 数据与通信之WebRequest
  • (C++17) optional的使用
  • (层次遍历)104. 二叉树的最大深度
  • (二)linux使用docker容器运行mysql
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (已解决)什么是vue导航守卫
  • (转)重识new
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • *上位机的定义
  • ../depcomp: line 571: exec: g++: not found
  • .bashrc在哪里,alias妙用
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .Net下的签名与混淆