3.4.3 安装shell
在安装C库后,构建基本的应用程序的基础已经具备了,接下来我们需要为内核准备用户空间的程序了。在Linux中,专门负责启动的软件包,如System V init和Systemd等都提供一个二进制程序作为第一个进程执行的用户空间的程序,但是为简单起见,我们使用bash shell。安装bash的命令如下:
这里有一点需要解释一下,我们虽然定义了环境变量DESTDIR为$SYSROOT,但是由于bash的Makefile中有如下脚本:
而Makefile中的这个定义优先级要比环境变量的高,所以我们还需要通过命令行参数再次指定安装目录为$SYSROOT。
使用如下命令将bash安装到rootfs中:
除了安装程序bash外,当然还需要安装bash依赖的动态库。因此,为了检查可执行程序或动态库的依赖,我们编写了一个脚本ldd:
并为该脚本增加了可执行权限:
使用ldd脚本查看bash依赖的动态库:
根据脚本ldd的输出可见,bash依赖动态库libdl、libc和libgcc_s.so.1,而这几个库都包含在C库中,我们都已经安装了。
在3.3.7节我们看到,如果用户没有通过内核命令行参数"init"指定第一个进程运行的用户空间的程序,则内核依次尝试执行目录/sbin、/etc、/bin下的init,最后尝试执行目录/bin下的sh。因此,我们在目录/bin下建立一个指向bash的符号链接sh,而且,这个符号链接也是FHS标准要求的。