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 命令。