4.1 busybox的配置********
linux
首先到网上下载一个稳定的BusyBox版本,我用的版本是busybox-1.0.1,而后解压到工做目录下。busybox的配置方法和标准的linux内核的配置方法很是类似,咱们只要切换到busybox的根目录下,使用make menuconfig就会轻松定制出适合特定用途的一组应用程序。shell
#make menuconfig (不知道的选项看看help就能够了)安全
#makebash
#make install服务器
注意busybox默认是安装到根目录下的_install文件文件夹。网络
#cd _installdom
#lsssh
你会发现bin目录下只有一个busybox二进制文件,其它的命令,bin,sbin以及tcp
usr/bin,usr/sbin目录下的都是指向busybox的连接文件。牛逼吧,这么多命令一个应用程序就搞定了,咱们看看busybox有多大ide
#du -k bin/busybox
420
这是我定制出来的busybox的大小,够小的吧。
4.2 安装busybox到文件系统
在busybox的根目录下编译好二进制程序以后。
#make install PREFIX=/mnt/usb
这样,应用程序就会安装到指定位置,切换到/mnt/rootfs下看看,bin目录,sbin目录,usr/bin目录,usr/sbin目录下是否是出现了不少的应用程序。
busybox安装好以后,看看它依赖的动态连接库
4.3 busybox的init
除了基本的命令以外,BusyBox还支持init功能,如同其它的init同样,busybox的init也是完成系统的初始化工做,关机前的工做等等,咱们知道在Linux的内核被载入以后,机器就把控制权转交给内核,linux的内核启动以后,作了一些工做,而后找到根文件系统里面的init程序,并执行它,BusyBox的init进程会依次进行如下工做:(参考<<构建嵌入式LINUX系统>> p201)
1.为init设置信号处理过程
2.初始化控制台
3.剖析/etc/inittab文件
4.执行系统初始化命令行,缺省状况下会使用/etc/init.d/rcS
5.执行全部致使init暂停的inittab命令(动做类型:wait)
6.执行全部仅执行一次的inittab(动做类型:once)
一旦完成以上工做,init进程便会循环执行如下进程:
1. 执行全部终止时必须从新启动的inittab命令(动做类型:once)
2. 执行全部终止时必须从新启动但启动前必须询问用户的inittab命令(动做类型:askfirst)
初始化控制台以后,BusyBox会检查/etc/inittab文件是否存在,若是此文件不存在,BusyBox会使用缺省的inittab配置,它主要为系统重引导,系统挂起以及init重启动设置缺省的动做,此外它还会为四个虚拟控制台(tty1到tty4)设置启动shell的动做。若是未创建这些设备文件,BusyBox会报错。
inittab文件中每一行的格式以下所示:(busybox的根目录下的example文件夹下有详尽的inittab文件范例)
id:runlevel:action:process
尽管此格式与传统的Sytem V init相似,可是,id在BusyBox的init中具备不一样的意义。对BusyBox而言,id用来指定启动进程的控制tty。若是所启动的进程并非能够交互的shell,例如BusyBox的sh(ash),应该会有个控制tty,若是控制tty不存在,Busybox的sh会报错。BusyBox将会彻底忽略runlevel字段,因此空着它就好了,你也许会问既然没用保留着它干嘛,我想大概是为了和传统的Sytem V init保持一致的格式吧。process字段用来指定所执行程式的路径,包括命令行选项。action字段用来指定下面表中8个可应用到process的动做之一。
sysinit
为init提供初始化命令行的路径
respawn
每当相应的进程终止执行便会从新启动
askfirst
相似respawn,不过它的主要用途是减小系统上执行的终端应用程序的数量。它将会促使init在控制台上显示“Please press Enter to active this console”的信息,并在从新启动以前等待用户按下enter键
wait
告诉init必须等到相应的进程完成以后才能继续执行
once
仅执行相应的进程一次,并且不会等待它完成
ctratldel
当按下Ctrl+Alt+Delete组合键时,执行相应的进程
shutdown
当系统关机时,执行相应的进程
restart
当init从新启动时,执行相应的进程,一般此处所执行的进程就是init自己
如下是个人usblinux的inittab文件
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty 38400 tty1
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/bin/umount -a -r
这个inittab执行下列动做
1.将/etc/init.d/rcS设置成系统的初始化文件
2.在38400 bps的虚拟终端tty1上启动一个登录会话 (注意getty的用法)
3.在虚拟终端tty2和tty3上启动askfirst动做的shell
4.若是init从新启动,将/sbin/init设置成它会执行的程序
5.告诉init,在系统关机的时候执行umount命令卸载全部文件系统,而且在卸载失败时用只读模式冲新安装以保护文件系统。
4.6 系统的配置文件
/etc/init.d/rcS文件
配置文件通常放在/etc/目录下,5.5.3节说了init初始化命令行的文件是/etc/init.d/rcS,下面是个人rcS文件
#!/bin/sh
/bin/mount -n -t proc /proc /proc
/bin/mount -n -o remount,rw /
/bin/mount -av
/bin/hostname usblinux
/etc/init.d/rc.nic
/etc/init.d/rc.network
/etc/init.d/rc.usb
/etc/init.d/rc.local
安装proc文件系统,可是不写入/etc/mtab文件(mtab文件是df命令读取的文件)
以读写模式从新挂载根文件系统(须要/etc/fstab文件)
mount -av 挂载全部在/etc/fstab里面列出的文件系统
主机名命名为cflinux
依次执行rc.nic(自动检测网卡),rc.network(配置网络),rc.usb(加载usb模块),rc.local(执行本地的一些服务)
/etc/fstab
上面使用mount命令的时候已经涉及到了fstab文件,下面是个人fstab文件
/dev/ram0 / ext2 defaults 0 0
proc /proc proc defaults 0 0
关于fstab配置文件的语法能够man fstab
其实rcS里面的mount -av没有必要加上去。
/etc/mtab
这个文件里面的内容是动态变化的,当mount一个文件系统的时候,若是mount 没有加上-n参数,那么安装信息就会写入mtab文件,df命令读取的就是这个文件。
/etc/profile
这个文件是sh用的,当用户得到一个shell后,sh就会根据这个文件配置用户的登录环境,下面是个人profile文件。
PATH=/bin:/sbin:/usr/bin:/usr/sbin
PS1='[u@h W]$ '
HOSTNAME='/bin/hostname'
export PATH HOSTNAME PS1
alias l.='ls -d .[a-zA-Z]* --color=tty'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH
其中PATH环境变量指定当用户键入一个命令时,sh寻找这个命令的路径。
PS1指定sh提示符的格式
其它的export命令,alias命令不用说了吧,busybox里面的ash和bash很是类似,所以只要熟悉bash就会不成问题。
/etc/ld.so.conf 与 /etc/ld.so.cache
这两个文件是与lib库有关的,它们用来指定应用程序寻找lib库的路径。
个人ld.so.conf文件内容以下。
/lib
/usr/lib
/usr/local/lib
ld.so.cache里面的内容是由是ldconfig命令生成的,ldconfig根据ld.so.conf配置文件生成ld.so.cache里面的内容,应用程序读取的是ld.so.cache文件,所以若是变更了ld.so.conf文件,须要运行一次ldconfig才能是新的配置生效,另外若是新加了lib库文件,也须要ldconfig。
/etc/passwd,/etc/shadow,/etc/group
group里面存放的是用户组的信息。
个人group文件内容以下:
root:x:0:root
ftp:x:50:
passwd里面存放的是用户的信息
个人passwd文件内容以下:
root:x:0:0:root:/root:/bin/sh
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
sshd:x:74:74:piviledge-separated SSH:/var/empty/sshd:/sbin/nologin
注意,group和passwd里面的每一行都不是多余的。
shadow文件是pam认证用到的密码存放文件
/etc/services
网络应用程序用到的标准服务端口映射表
个人services文件以下:
tcpmux 1/tcp
tcpmux 1/udp
ftp-data 20/tcp
ftp 21/tcp
ssh 22/tcp
ssh 22/udp
telnet 23/tcp
nameserver 42/tcp name
syslog 514/udp
auth 113/tcp authentication tap ident
由于我须要开启sshd,syslogd服务,同时会使用ftp,ssh,telnet应用程序。因此就会加上上面的东西,可是注意并非全部的网络应用程序都会依赖与services文件,好比telnet,可是也许telnetd须要。
/etc/nsswitch.conf
这个文件的做用很大,没有它不少程序都不能正常运行,关于它的具体做用仍是用man nsswitch.conf看看吧。
个人nsswitch.conf文件内容以下:
passwd: files
shadow: files
group: files
hosts: files dns
ethers: files
netmasks: files
networks: files
protocols: files
services: files
netgroup: files
publickey: files
automount: files
aliases: files
注意hosts这一行必定要加上dns,否则即便有resolv.conf文件,域名也不能解析,注意nsswitch.conf是对应一组lib库的,这里咱们用了files,dns,所以须要拷贝相应的lib库到/lib目录下.
#cd /mnt/rootfs
#cp -dpR /lib/libnss_files* ./lib
#cp -dpR /lib/libnss_dns* ./lib
/etc/hosts,/etc/ host.conf, /etc/resolv.conf
个人hosts文件内容以下,不用说也应该清楚什么意思了,不清楚的man hosts
127.0.0.1 localhost:localdomain localhost
host.conf和resolv.conf是域名解析的时候用到的配置文件,其中resolv.conf里面是域名服务器的ip地址,host.conf里面放的是主机的查找规则。不了解的仍是man host.conf和man resolv.conf
个人host.conf与resolv.conf文件内容分别以下:
#cat /mnt/rootfs/etc/host.conf
order hosts,bind
#cat /mnt/rootfs/etc/resolv.conf
nameserver 202.112.20.131
/etc/syslog.conf
syslogd服务程序读取的配置文件。
个人文件内容以下:
Log all kernel messages to the console.
Logging much else clutters up the screen.
#kern.* /dev/console
Log anything (except mail) of level info or higher.
#Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
#The authpriv file has restricted access.
authpriv.* /var/log/secure
#Save boot messages also to boot.log
local7.* /var/log/boot.log
5.6 虽然busybox支持大多数应用程序,可是每每咱们须要的程序它并不支持,这时候咱们就只有copy咱们的宿主机上的了,第一章说了,咱们的usblinux须要可以fdisk存储设备,可以mkfs文件系统,可以使用grub安装grub到指定存储设备。busybox有fdisk,可是mkfs.*在我使用的busybox版本里面还不支持,另外ldconfig这个必须的应用程序busybox里面好像也没有。另外咱们也许想在usblinux里面临时使用一下ftp服务器,用来传输文件用,调试的时候strace是必不可少的工具,加进硬盘检测工具smartmontools也是不错的主意,充当网关服务器sshd必不可少吧,虽然能够用其它的好比telnetd等代替,可是它们并无sshd来的安全,所以我仍是选择了sshd。