宠文网

深度探索Linux操作系统

宠文网 > 科普学习 > 深度探索Linux操作系统

第6章 构建根文件系统

书籍名:《深度探索Linux操作系统》    作者:王柏生
    《深度探索Linux操作系统》章节:第6章 构建根文件系统,宠文网网友提供全文无弹窗免费在线阅读。!


在第3章中,我们通过手工的方式展示了从零构建根文件系统的过程。在本章中,我们将构建一个相对完善的根文件系统,但是我们不再从零开始,毕竟一旦熟悉了原理后,余下的就是简单的重复了。第2章编译工具链时曾通过参数"--with-sysroot"指定了目标系统的文件安装的目录,后续所有的为目标系统编译的文件全部安装到了这个目录下。因此,在本章中,我们就基于这个目录下的文件构建运行在真实系统上的根文件系统。

为了更高效地开发调试,我们首先打通了目标系统的网络,建立了宿主系统与目标系统的桥梁,包括配置内核支持网络协议以及网卡驱动,并安装了用户空间的网络配置工具。如此,我们就可以远程登录到目标系统上进行调试,并且可以动态更新文件(除内核和initramfs外)而不必再每次都重启系统。

几乎所有的现代操作系统都提供图形用户界面,Linux也不例外。麻省理工的开发者们为UNIX系统开发了X窗口系统(X  Window  System,简称X或者X11)作为图形环境。除了X外,另外一个需要关注的图形环境是Wayland。虽然Wayland的目标是替代X,并且开源社区也支持Wayland向着这个方向发展,但是Wayland距广泛使用还有一段路要走。因此,在本章中,我们依然以目前广泛使用的X构建基础的图形环境,并安装了GTK作为更上层的图形库。事实上,Wayland更像是X的一次整合或者重构,在第8章探讨Linux的图形原理时,我们会拿出一点篇幅讨论Wayland,在那里我们会看到,Wayland和X之间并无本质区别。



6.1 初始根文件系统

因为我们使用的是vita用户进行编译过程,所以$SYSROOT目录下的所有文件的属主和属组都是vita,如果对安全问题有顾虑,在最终将其作为根文件系统时,可以将该目录下的所有文件,包括目录的属主和属组,更改为root。

另外,为简单起见,我们也没有考虑文件系统的大小。如果是为一个真实的系统制作根文件系统,那么可以考虑进行一些优化,比如对二进制文件和动态库使用命令strip删除一些运行时不需要的信息和符号表等;删除那些只是在编译时使用的头文件和静态库;等等。

上面讨论的都不是必须的,如果仅作为一个用于测试的系统,完全可以不必理会,下面是必须要做的几件事。

(1)安装GCC库

在前面编译GCC时,我们已经看到,GCC也将部分底层函数封装到库中,很多程序会使用GCC的这些库,因此,我们也将这部分程序安装到根文件系统中。我们只安装运行时使用的动态库及对应的运行时符号链接,当然,系统中并不一定会用到全部这些库,但是简单起见,这里全部安装了:



(2)建立相关目录

在前面讨论从initramfs切换到根文件系统时,我们看到,切换程序将最初挂载到文件系统rootfs中的/dev、/run、/proc和/sys目录移动到真正的根文件系统,因此,我们需要在根文件系统上建立这几个目录。另外我们也为root用户建立一个属主root目录:



(3)构建程序/sbin/init

在内核初始化的最后,启动的第一个进程要装载用户空间的程序从而切入用户空间,通常这个程序是/sbin目录下的init,因此我们要准备这个程序。为简单起见,我们也使用shell脚本编写:



init启动了一个交互式的shell。其中传递的参数"-l"是告诉bash以登录方式启动,这样可以使bash读取在/etc/profile、~/.profile等文件中定义的环境变量。同时要确保init程序具有可执行权限:



为了让shell提示符看上去友好一些,更重要的是为了后面当从宿主系统远程登录到vita系统时,方便区分本地终端和登录到vita的终端,我们在全局范围的profile文件中定义了环境变量PS1来控制shell提示符的显示内容和风格:



其中,"\u"告诉shell显示当前用户名;"\w"告诉shell显示完整的工作路径;我们将主机名直接硬编码为vita,为了便于区分是本地的终端还是登入vita的终端;接下来我们给提示符加一点漂亮的颜色,"\e["与"m"之间的内容表示颜色值,在它们之外包围的“\[”与“\]”是保证其内的非打印字符,不占用任何空间。颜色设置的格式为"\[\e[F;B;Cm\]",其中F是前景色,B是背景色,C是一些表示特殊效果的代码,如下划线、闪烁等。

具体到我们这个例子,其中31表示红色,因此,“用户名@vita”将以红色显示;35表示洋红,因此工作路径将以洋红色显示。最后,在提示符结束的位置,我们通过"\e[0m"将颜色值设定为零,也就是通知终端将前景、背景重置为它们的默认值,以使后续的文字以非彩色显示。

接下来将$SYSROOT目录整个复制到虚拟机,因为命令scp会跟随符号链接,所以我们采用先压缩、再复制的办法,相关命令如下:



在虚拟机上执行如下命令解压根文件系统: