6.1 初始根文件系统

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

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

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

(1)安装GCC库

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

6.1 初始根文件系统 - 图1

(2)建立相关目录

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

6.1 初始根文件系统 - 图2

(3)构建程序/sbin/init

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

6.1 初始根文件系统 - 图3

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

6.1 初始根文件系统 - 图4

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

6.1 初始根文件系统 - 图5

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

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

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

6.1 初始根文件系统 - 图6

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

6.1 初始根文件系统 - 图7