上接:从源码开始编译一个带有WEB服务器功能的小型LINUX(上)
七、为新构建的ToyLinux启用虚拟控制台
这个可以通过宿主机来实现,也可以直接启动刚构建成功的小Linux进行配置。我们这里采用通过宿主机的方式(重新启动宿主机):
# cd /mnt/sysroot
将 etc/inittab文件改为如下内容:
::sysinit:/etc/init.d/rcS
tty1::askfirst:/bin/sh *************// askfirst 登陆前敲回车先
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
tty5::askfirst:/bin/sh
tty6::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
好了,接下来就可以测试验正六个虚拟控制台的使用了。
八、尽管上述第七步已经实现了虚拟控制台,但其仍是直接进入系统,且系统没有用户帐号等安全设施,这将不利于系统的安全性。因此,接下来的这步实现为系统添加用户帐号(这里仍然基于宿主机实现)。
1、为目标主机建立passwd帐号文件
# cd /mnt/sysroot
# vim etc/passwd
添加如下内容:
root:x:0:0::/root:/bin/sh
接下来为root用户建立“家”目录:
# mkdir root
2、为目标主机建立group帐号文件
# vim etc/group
添加如下内容:
root:x:0:
3、为目标主机建立shadow影子口令文件,这里采用直接复制宿主机的shadow文件中关于root口令行的行来实现
# grep "^root" /etc/shadow > etc/shadow
注:等目标主机启动时,root用户的口令也是宿主机的root用户的口令。
4、将 etc/inittab文件改为如下内容:
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty 38400 tty1
::respawn:/sbin/getty 38400 tty2
::respawn:/sbin/getty 38400 tty3
::respawn:/sbin/getty 38400 tty4
::respawn:/sbin/getty 38400 tty5
::respawn:/sbin/getty 38400 tty6
::shutdown:/bin/umount -a -r
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
好了,接下来就可以重新启动目标主机进行验正了。
九、在系统登录时提供banner信息
这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
# vi /etc/issue
添加如下内容:
Welcome to ToyLinux(http://marion.cublog.cn)...
Kernel \r
注:这里的内容可以根据你的需要进行修改。
十、在系统启动时为系统提供主机名称:
这个可以通过宿主机来实现,也可以直接在目标主机上进行配置。这里采用直接在目标主机上配置的方式:
1、创建保存主机名称的配置文件
# mkdir /etc/sysconfig
# vi /etc/sysconfig/network
添加如下内容:
HOSTNAME=yourhostname.example.com
2、编辑系统初始化脚本,实现开机过程中设定主机名称
# vi /etc/init.d/rcS
在文件尾部添加如下行:
HOSTNAME=
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z ${HOSTNAME} ] && HOSTNAME="localhost"
[ -x /bin/hostname ] && /bin/hostname ${HOSTNAME}
unset HOSTNAME
十一、移植宿主机的bash至目标主机,以实现在目标主机上使用bash
1、在宿主机上查看bash所依赖的库文件件,并将这些库文件复制到目标系统:
# cd /mnt/sysroot
# ldd /bin/bash (其显示可能类似如下所示:)
linux-gate.so.1 => (0x003c0000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0x00aa6000)
libdl.so.2 => /lib/libdl.so.2 (0x00604000)
libc.so.6 => /lib/libc.so.6 (0x008c8000)
/lib/ld-linux.so.2 (0x00bf8000)
2、此时,我们需要把除了第一行显示的以外的余下的所有库文件复制到目标主机的lib目录中:
# cp /lib/libtermcap.so.2 lib/
# cp /lib/libdl.so.2 lib/
# cp /lib/libc.so.6 lib/
# cp /lib/ld-linux.so.2 lib/
3、而后再把bash程序复制到目标主机的bin目录中即可:
# cp /bin/bash bin/
十二、设置root用户的默认shell为/bin/bash,并为其定义常用环境变量(本过程在目标主机上直接实现)
1、新建/etc/shells文件,标明当前系统所用可用shell类型:
# vi /etc/shells
添加如下内容:
/bin/sh
/bin/bash
2、编辑/etc/passwd,设置root用户的默认shell为/bin/bash
3、编辑/root/.bash_profile,定义PATH, PS1等环境变量
# vim /root/.bash_profile
添加如下内容:
PS1='[\u@\h \W]\$'
HISTSIZE=100
PATH=$PATH:/$HOME/bin
export PS1 HISTSIZE PATH
十三、定义名称解析方式
完成上述第十二步以后,用户的shell提示符中的用户名很可能显示为:”I have no name!“,这个主要是没有配置名称解析服务造成的。本步骤则来尝试解决此问题,并尝试实现为主机名称解析定义其解析方式。
提示:本步骤需要在宿主机上实现
1、为名称解析服务复制必要的库文件:
# cd /mnt/sysroot
# cp /lib/libnss_files* lib/
# cp /lib/libnss_dns* lib/
2、为目标主机建立名称解析文件nsswitch.conf
# vim etc/nsswitch.conf
添加如下内容:
passwd: files
group: files
shadow: files
hosts: files dns
3、为主机名称解析建立etc/hosts文件,可根据需要添加其内容
# vim etc/hosts
添加如下内容(如果本机有IP地址,也可以在此配置):
127.0.0.1 localhost
十四、为目标主机提供一个web服务器
嵌入式系统上可用的轻量级web服务器有如Boa, thttpd, lighttpd, shttpd等。我们这里选用thttpd,且只提供简单的web服务。
1、在宿主机上编译thttpd
# tar zxvf thttpd-2.25b.tar.gz
# cd thttpd-2.25b
# ./configure
# make
2、复制编译好的thttpd至目标主机
# mkdir -pv /mnt/sysroot/usr/local/sbin
# cp -p thttpd /mnt/sysroot/usr/local/sbin/
3、复制thttpd依赖的库文件至目标主机
# ldd thttpd
linux-gate.so.1 => (0x00e75000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x04f3a000)
libc.so.6 => /lib/libc.so.6 (0x00931000)
/lib/ld-linux.so.2 (0x0090e000)
请确保以上所依赖的库文件均复制到了/mnt/sysroot/lib目录中。
4、为目标主机上运行thttpd进程建立一个有效用户帐号(此用户不需要“家”目录)
# echo "www:x:1000:1000:www::/bin/bash" >> /mnt/sysroot/etc/passwd
# echo "www:x:1000:" >> /mnt/sysroot/etc/group
5、接下来启动目标主机系统,登录后创建网站目录,并创建一个测试页面
# mkdir /var/www/html
# echo '<h1>A test page.</h1>' > /var/www/html/index.html
而后启动thttpd进程:
# /usr/local/sbin/thttpd -u www -dd /var/www/html -l /var/log/thttpd.log &
接下来就可以进行测试访问了。请确保此时目标主机有合适的IP地址。
文中所用到的文件,除linux内核源码外,均可在附件中获得,内核源码可以网上获得~