Linux 系统定制原理

虚拟根目录

我们的目标是为了完成目标系统(也就是我们要做的系统),他是一个可以独立运行的系统,不依赖雨主系统和临时系统,根据 Linux 系统的特点它需要存放在根目录下面,但是却有一个问题,主系统在制作目标系统的过程中,他是一直运行的,因为你制作过程中需要用到主系统的命令,也就是说这个主系统也是挂载在根目录下面的,两个系统都分别需要有根目录,就会出现矛盾,因为根目录只能有一个。

为了解决这个问题,就有了虚拟根目录。

Linux 内核启动时简历的根目录称为真正的根目录,虚拟根目录简单来说就是一个运行的 Linux 系统中可以存在多个运行环境,每个运行环境都有自己的根目录,这些运行环境中根目录就称为虚拟根目录,任何目录都可以被设置为某个运行环境中的根目录。

在主系统中建立一个目录,其中存放系统的基本命令,即可以将该目录作为虚拟根目录启动一个新的运行环境。

如果将主系统称为环境 A,把在 A 环境下建立的新的运行环境称为环境 B,环境 B 称为环境 A 的子环境,而 A 称为环境 B 的父环境。

这里需要着重强调的是,用于作为新运行环境中的根目录,可以是父环境中的任何目录或者目录的目录,同时也可以包括父环境中的根目录。

如何设置虚拟根目录

可以通过使用挂载分区的方法来实现。

目标系统最终是要独立于主系统而运行的,就需要将目标系统安装在一个分区中,而不是主系统的某个目录下面。

Linux 系统是通过挂载的方式来使用分区的,挂载就是将某个存储设备一某种文件系统链接到某个目录中,用户查看到目录中的文件即分区中的文件,对其中的文件进行操作与操作一般目录中的文件相同。

所以要有一个空的分区,然后将该分区格式化为主系统能够识别的文件系统,然后将其挂载到主系统上的某个目录上就可以了。

目标系统只要存放到这个目录就等于存放到该分区中,制作完成后就可以直接使用这个分区来启动目标系统,存放在目录下的第一集文件和目录就是目标系统根目录的内容。

软链接和硬链接的区别

软连接

软链接对文件的读写就如同直接对目标文件进行操作,链接文件是一个独立文件,其存在丙不依赖于目标文件。

如果删除一个软链接文件,它指向的目标文件不受影响。

如果删除了目标文件,其指向目标文件的链接文件依然存在。

软连接可以跨越磁盘分区来进行目标文件的制定。

如果软链接指向的文件具有可执行权限,则直接运行软连接等同于运行该目标文件,同时软连接文件还可以使用来指向一个目录。

软链接文件具有传递性,即有一个软连接 B 指向某个文件 A ,而另外一个软连接 C 指向软连接 B,那么访问软连接 C 等同于访问软连接 A,同样这个传递性使用与目标文件是目录的请款。

如果软连接文件指向的是一个真实的目录,那么如果要通过链接文件访问目录中的内容则需要在软连接后增加目录隔断符号「/」

硬链接

硬链接与目标文件使用同一个文件索引节点(也就是 inode),因此只能在同一个磁盘分区中使用硬链接,并且它不能离开关联文件而独立存在。

当一个硬链接被移动、重命名或者删除时,其余关联到同一个文件的硬链接不受影响。

当最后一条指向该玩呢见的硬链接被删除时,该文件内容就会消失。

需要注意的

某些命令在处理软硬链接的时候会采用不同的方式,比如复制命令,对于软连接可以仅仅复制链接文件本身,而硬链接泽辉直接复制目标链接。

不同类型的文件系统介绍

在 Linux 系统中有许多类型的文件系统,不同的文件系统作用不同。

磁盘文件系统

如 EXT2/3/4、XFS 等,这些是磁盘文件系统,这类文件系统的主要作用是更有效,安全的提取和组织数据,这类文件系统可以直接应用在软硬件存储设备上。

网络文件系统

如 NFS、CIFS 等,都是依靠某种网络协议使得网络上的数据的存取如同本机上的文件操作一样。

事务文件系统

这类文件系统大多需要简历在其他的文件系统中,用于完成一些食物处理,没中食物文件系统所处理的问题大多不一样,都具有一定的针对性。

比如 AUFS 可以将不同目录不同文件系统的文件组织到同一个目录下,但是文件实际存放还是在鸽子不同的目录中,而对于用户访问就如同在一个目录中。

内存文件系统

使用内存来模拟存储设备的文件系统,如 TmpFS ,可以从内存中划分出一块区域用于像磁盘文件系统那样存放文件和目录。

TmpFS 不会占用任何实际的磁盘空间,但是 TmpFS 文件系统中存放的内容会随着计算机内存的初始化而小时,所以重新启动后保存在其中的内容就会消失。

特殊文件系统

特殊文件系统就是具有特殊功能的文件系统,如内核文件系统,proc 和 sysfs 都属于这种文件系统。

proc 和 sysfs 会将内核中各种信息都已文件的形式表现出来,用户可以通过这些文件来读取并且控制内核的运作。

一般 proc 需要关联在 /proc 目录中,sysfs 需要挂载 /sys 目录中,对其中文件的操作可以直接使用普通文件操作方式,不是所有文件都具有全部的操作功能,比如 /proc/cpuinfo 文件中存放了当前计算机的 CPU 信息,可以使用打开文件的命令来显示其中的内容,但是无法往该文件中写入任何信息。

proc 和 sysf 提供了非常丰富的接口使得很多对内核的操作都可以使用命令来进行操作。

文件系统的使用

文件系统在 Linux 系统中是以挂载的方式来使用的,通常的挂载命令是 mount。

目录映射

为什么要有目录映射这项技术?

因为子环境中的运行方式所使用的内核是主系统中的内核,因此目标系统和主系统的内核就应当尽量保持兼容,这样就可以利用主系统中相应目录中的内容来补充目标系统中这些目录中的内容。

想要让主系统和目标系统对应目录中的内容保持一直,最容易想到的方法就是复制目录,但是复制的方式对于 /proc 目录并不适合,因为该目录中的内容是内核当前状况的反应,复制过来就不能随着系统运行而变化了,所以不能采用复制的方法。

那么尝试一下使用软连接的方式?

但是软连接文件的一个问题是目标文件或者目录必须存在且能够被当前的运行环境所访问。

来看一个例子:

在住系统的根目录下存在 /proc 这个目录,现在系统在 /opt 目录下简历一个 proc_a 链接文件并且指向 /proc ,当前运行环境中访问 /opt/proc_a 中的内容就如同访问 /proc 中的内容,单如果将 /opt 作为虚拟根目录来启动一个心得饿运行环境时,原先的 /opt/proc_a 将变成 /proc_a ,它指向的 /proc 无法在这个运行环境中被访问到,因为这是一个虚拟根目录下的 proc ,这样子就导致了链接失效。

为了解决这个问题,就诞生了目录映射技术。

目录映射技术是什么?

被映射的源目录和映射陌路内容上保持一致,对他们中任何一方目录内的改动都将直接导致另一方同样的修改。

与链接文件处理方式不同,源目录和映射目录都必须是实际的目录而不是链接文件,目录映射丙不原来源目录的存在为止,即使在建立好目录映射后,改变源目录的名称或者位置都不会影响到映射目录的内容,因此使用映射方式来建立的目录一致性将在进入新的运行环境中继续产生作用。

调整工具链

工具链从内部依赖转为外部依赖,不同外部依赖的转换,外部依赖转内部依赖都属于调整工具链。

调整工具链不存在内部依赖转为内部依赖的情况。

调整工具链的实质

调整工具链的实质就是用新的 Glibc 代替工具链中原来的 Glibc ,两个 Glibc 存放在不同目录中。

为了达到改变 Glibc 的目的,只需要修改两个地方:

GCC 的编译配置和 Binutils 中 ld 命令的数据库查询目录。

GCC 的编译默认配置是被编译进 GCC 的相关文件中的,但 GCC 中的 gcc 命令在使用配置时会有两种方式:一种是使用外部的配置文件,另一种是使用内部默认配置。

gcc 命令优先使用内部配置的方式,所以我们只要修改配置文件就可以了。

如何修改 GCC 的配置文件?

GCC 的配置文件比较复杂不建议重新编写,可以采用 gcc 命令将默认配置导出的功能,修改相应的内容并且保存到特定文件中。

gcc 命令的导出默认配置的方式如下。

gcc -dumpspecs

该命令将默认配置显示在屏幕上,我们需要将其存放到 gcc 读取配置文件的目录中,gcc 读取外部配置文件的目录可以使用如下命令来活的:

dirname $(gcc -print-libgcc-file-name)

该命令会读取配置文件的目录名,只要在这个目录中创建一个名为 specs 的文件,丙将我们需要的配置存放在该文件中就可以了,使用如下命令:

gcc -dumpspecs > $(dirname $gcc -print-libgcc-file-name))/specs

配置文件已经准备好了,目前这个文件中的内容和 GCC 的默认配置问安全一样,我们只要修改文件中的内容就可以了,该文件以文本内容存放,可以使用一般的文本编辑工具修改,比如 vim ,当然也可以使用文本编辑的命令过来进行修改,如 sed 命令。

《手把手教你构建自己的 Linux 系统》学习笔记(2)的更多相关文章

  1. JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

    null.NaN.undefined三者的区别是什么? 在初次接触到JavaScript的时候,傻傻的分不清null.NaN.undefined三者到底区别何在,在实际的项目开发中也因为这个问题而困惑 ...

  2. JavaScript高级程序设计第三版-读书笔记(1-3章)

    这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript   提供核心语言功能 DOM     提供访问 ...

  3. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  4. javascript权威指南第6版学习笔记

    javascript权威指南第6版学习笔记 javascript数组.函数是特殊对象 看一点少一点. 3.1.4 hello.js内容是 var x=.3-.2;var y=.2-.1 console ...

  5. JavaScript 高级程序设计 (第4版) 思维导图/脑图 All In One

    JavaScript 高级程序设计 (第4版) 思维导图/脑图 All In One JavaScript 高级程序设计 (第4版) 思维导图下载 JavaScript 高级程序设计 (第4版) 脑图 ...

  6. 《JavaScript高级程序设计》(第二版)

    这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量, ...

  7. 《JavaScript高级程序设计 第3版》-学习笔记-2

    P31-P82页 1.相等不相等与全等不全等 相等不相等:先转换后比较.对于只有一个对象,调用valueOf方法得到基本类型值再按基本类型转换:如果两个都是对象,则比较他们是否是同一个对象(引用或指针 ...

  8. 《JavaScript高级程序设计 第3版》-学习笔记-1

    P1-P30页 1.<script>标签的属性 async:async(html)  | async="async"(xhtml),表示立即下载脚本,但不马上执行(执行 ...

  9. 《JavaScript高级程序设计 第3版》-学习笔记-3

    P84-P137页, 这一章看的真久,这个月事太多了.有些内容在代码注释里没提出来了 1.JS强大的数组类型,元素类型任意,提供了非常多的操作数组的方法和属性 /* 数组类型 */ //stack v ...

  10. 再次精读《javascript高级程序设计第3版》学习笔记(1)

    第一次拿起这本书是2016年暑假,时隔2年,又一次开始研读这本经典书籍.每次读,都是对之前的一次沉淀和总结,每次都会有新的收获.

随机推荐

  1. 上线前一个小时,dubbo这个问题可把我折腾惨了

    前因 那是一个月黑风高的夜晚,不管有没有圆圆的月亮,都无法解救要加班的我.这就是苦涩的人生啊! 那天正好是春节回家的日子,定了晚上的票,然后还是上线的日子. 测试在做回归测试的时候,发现一个老功能报错 ...

  2. 最小环(floyd以及dijkstra实现+例题)

    最小环定义 最小环是指在一个图中,有n个节点构成的边权和最小的环(n>=3). 一般来说,最小环分为有向图最小环和无向图最小环. 最小环算法: 直接暴力: 设\(u\)和\(v\)之间有一条边长 ...

  3. Dwz/Jquery--使用Ajax提交表单时调用表单设置的校验

    案例 今天有一个需求就是点击按钮时,使用ajax方式提交表单,而且不是直接用form表单下的submit按钮提交,表单中用的校验是dwz 自带的校验方式,表单模板如下: <li><d ...

  4. python sqlalchemy mysql 自动映射

    SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作 简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果 ...

  5. File流与IO流 看这一篇就够了

    主要内容 File类 递归 IO流 字节流 字符流 异常处理 Properties 缓冲流 转换流 序列化流 打印流 学习目标 [ ] 能够说出File对象的创建方式 [ ] 能够说出File类获取名 ...

  6. Python黑客编程知识点整理

    Python转义字符 转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \ ...

  7. javaIO编码详解

    原创 输出流 有哪些构造方法可以在参数上设置编码格式 PrintStream(File file, String csn) PrintStream(String fileName, String cs ...

  8. C#中? 和 ??的区别

    背景 最近在调试C#项目的时候,发现一个比较关于??的特殊用法,当时把我给惊到了,所以特意用这篇短短的笔记来记录一下我的解惑过程: 示例代码: showsomething(isNameNull ?? ...

  9. 构建一个学生Student,根据类Student的定义,创建五个该类的对象,输出每个学生的信息,计算并输出这五个学生Java语言成绩的平均值,以及计算并输出他们Java语言成绩的最大值和最小值。

    定义一个表示学生信息的类Student,要求如下: (1)类Student的成员变量: sNO 表示学号: sName表示姓名: sSex表示性别: sAge表示年龄: sJava:表示Java课程成 ...

  10. Linux学习2-云服务器上安装java和tomcat环境

    在linux上部署java的项目,首先要安装JDK和Tomcat,具体要求怎么操作呢,我们一起来学习吧! JDK的安装步骤如下: 1.首先我们从官网下载jdk-8u231-linux-x64.rpm安 ...