《构建根文件系统(四)编译配置busybox》
1.配置编译busybox
busybox的官方网站是:http://www.busybox.net/
打开busybox中的INSTALL文档,里面详细说明了如何配置编译busybox。
The BusyBox build process is similar to the Linux kernel build:
make # This creates the "busybox" executable
生成两个可执行文件busybox和busybox_unstripped。
会在当前目录生成_install文件。
cd _install
(1)我们在busybox设置的是动态链接库,而且编译器是arm-linux-gcc,找到安装arm-linux-gcc的安装路径
which arm-linux-gcc
/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc上面是我的路径,/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib,这个就是要复制出来的动态库的路径,把里面的动态链接文件复制到filesystem文件夹下
(2)复制动态链接文件
cp /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib/.so* ./lib -d(因为我们只需要动态库) (-d:若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身)
以上就已经配置完成一个最小的根文件系统,可以使用nfs直接挂载到开发板上。也可以制作成映像文件烧录到开发板中。
3.完善根文件系统
::sysinit:/etc/init.d/rcS //在控制台初始化之前执行rcS,是一个初始化配置脚本。首先被运行。
ttySAC0::askfirst:-/bin/sh //在shell前加一个'-'前缀表示是一个登陆shell,指定登陆到哪个tty。
::ctrlaltdel:-/sbin/reboot //按下组合键“ctrl+alt+del”,重启Linux系统
::shutdown:/bin/umount -a -r //系统关机时,卸载所有文件系统
::restart:/sbin/init //重启init进程
2.创建/etc/init.d/rcS
这是一个脚本文件,可以在里面添加想自动执行的命令。
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin #初始化环境变量PATH,操作系统执行程序默认到PATH指定的目录下寻找该程序 runlevel=S #将系统设置为单用户模式 prevlevel=N #将系统设置为单用户模式 umask 022#指定当前用户在创建文件时的默认权限 export PATH runlevel prevlevel #导出环境变量 mount -a #挂载/etc/fstab文件中指定的文件系统 echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s #生成相应的/dev目录下的设备文件 #从/etc/sysconfig/HOSTNAME文件中读取主机名,命令行下运行hostname即可显示当前系统的主机名 /bin/hostname -F /etc/sysconfig/HOSTNAME
手工创建/etc/sysconfig/HOSTNAME文件,并在其中写入主机名。
xxxLinux //自定义主机名
(5)mdev -s
在rcS文件中添加以下与mdev有关的2行配置项后,
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
再次启动系统后发现/dev目录下生成了很多的设备驱动文件。
/dev目录下的设备驱动文件就是mdev生成的,这就是mdev的效果和意义。
在sysconfig/下创建 HOSTNAME,直接输入主机名:Aliya
重启,发现没有显示用户名和hostname ,怎么解决?
注意:不设置HOSTNAME,默认的是一个ip地址,在我实验的时候是 192.168.1.10
添加profile文件后,即可显示用户名和hostname
3.创建/etc/fstab
“执行mount -a”命令后挂载proc、sysfs、tmpfs文件系统
# /etc/fstab: static file system information. # # Use 'vol_id --uuid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /var tmpfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0
为保证挂载成功,在根目录下手工创建/proc、/sys、/var、/tmp、/dev目录。
4.创建/etc/profile
# Ash profile # vim: syntax=sh # No core files by default ulimit -S -c 0 > /dev/null 2>&1 USER="`id -un`" LOGNAME=$USER PS1='[\u@\h \W]\# ' PATH=$PATH HOSTNAME=`/bin/hostname` export USER LOGNAME PS1 PATH
之前添加了/bin/hostname在/etc/sysconfig/HOSTNAME文件中定义了一个hostname(Aliya210),实际效果是:命令行下hostname命令查到的host名字确实是Aliya210。但是问题就是命令行的提示符是没有显示的。
这个问题的解决就要靠profile文件。将提供的profile文件放入/etc/目录下即可。
添加了之后的实验现象:命令行提示符前面显示:[@Aliya210]#
结论是:第一,profile文件起了作用,hostname显示出来了。
还有个问题,登录用户名没显示出来。
原因就是我们直接进入了命令行而没有做登录。等我们添加了用户登录功能,并且成功登陆后这个问题就能解决。
profile文件工作原理是:profile文件也是被busybox(init进程)自动调用的,所以是认名字的。
5.添加用户登录文件(passwd、shadow文件)
passwd文件中存储的是用户的密码设置,shadow文件中存储的是加密后的密码。
直接复制ubuntu系统中的/etc/passwd和/etc/shadow文件到当前制作的根目录下,然后再做修改即可。
修改后passwd文件内容如下:
root:x:0:0:root:/root:/bin/sh #登录成功后,进入/root目录
修改后passwd文件内容如下:
root::17680:0:99999:7::: #root用户密码为空
在根目录下创建/root目录。重新启动即可使用 root 登录,登录后使用 passwd root 命令设置用户密码。
6.如何看到用户登录界面
因为我们之前intttab中有一个配置项 ::askfirst:-/bin/sh,这个配置项作用就是当系统启动后就去执行/bin/sh,执行这个就会出现命令行。因此我们这样的安排就会直接进入命令行而不会出现登录界面。
我们要出现登录界面,就不能直接执行/bin/sh,而应该执行一个负责出现登录界面并且负责管理用户名和密码的一个程序,busybox中也集成了这个程序(就是/bin/login和/sbin/gettty),因此我们要在inittab中用/bin/login或者/sbin/getty去替代/bin/sh。