前言:今天我们就根据BusyBox+linux内核定制一个属于自己的Linux,还可以加上dropbear和nginx来实现远程登录和web服务器功能。要想定制一个小型的Linux系统首先要对Linux开机启动流程有所了解。
POST --> Boot Sequence(MBR) --> BootLoader --> kernel -->/sbin/init
POST:加电自检。
Boot Sequence(MBR):读取磁盘第一个扇区的446个字节。
BootLoader:找到MBR中的BootLoader引导加载器、bootloader会找到我们选定的操作系统或内核去加载对应的内核、而这个Bootloader通常是grub。
kernel:加载内核。这个内核是我们通过计算机的硬件特性编译来的,在编译内核的时候我们已经把所有的硬件驱动给编译进去了包括文件系统等,所以这次在grub中就不用写入虚拟文件系统来实现文件加载启动了。
/sbin/init:启动第一个程序。
通过init来加载inittab判断是通过那种方式进行开机,开机方式分为0-6级。centos6虽然和centos5都有inittab文件,但只是为了和centos5兼容。
0级:关机
1级:单用户模式
2级:类似下面的3级别但没有NFS服务
3级:文本模式
4级:没用
5级:图形界面
6级:重新启动。
根据开机方式去加载/etc/rc.d/rc.sysinit系统初始化脚本.通过这个脚本。这个初始化脚本包括键盘映射,和没有被初始化文件系统,重新以读写的方式挂载根文件系统。
在根据开机方式读取/etc/rc.d/rc.N(N为哪种方式开机的级别)里的以S开头的启动脚本,关闭以K开头的启动脚本。这些脚本都放在当前init.d目录下,最后加载rc.local文件这个是我们最后启动的脚本,所以我们可以把开机启动的服务放在这里面。
最后启动虚拟终端。
init在早期是个串型的init、或者说传统意义是的init、sysV风格的、这种程序启动任何服务、运行任何程序完成系统初始化时统统以串型模式进行的、所以速度非常慢、以至于后来有了并型运行的init、启动速度也比较快。centos6的启动方式就是并行的init.启动文件在/etc/init/*.conf 结尾的所有文件。
准备工作:在虚拟机上新添加一块scsi硬盘,和下面的安装文件。
1)给磁盘分区格式化。
fdisk /dev/sdb n p 1 +50M n p 2 +512M w# mke2fs -t etx4 /dev/sdb1 mke2fs -t etx4 /dev/sdb2 mkdir -pv /mnt/{boot,sysroot} mount /dev/sdb1 /mnt/boot mount /dev/sdb2 /mnt/sysroot cd /mnt/sysroot grub-install --root-directory=/mnt/dev/sdb
2)编译内核和定制内核
tar xf linux-3.13.6.tar.xz -C /usr/src/# cd /usr/src ln -sv linux-3.13.6 linux cd linux make allnoconfig make menuconfig 把我们所需要的内容整合进来 [*]64-bit kernel :64位操作系统的内核 General setup --> Local version --> -MyLinux: 给内核定一个自己的版本 [*]system VIPC [*]Enable loadable module support:选择内核动态模块加载 [*]module unloading Enable the block layer [*]Block layer sgsupport v4 Processor type and features --> Processor family (X)Generic-x86-64 这里是CPU类型、这个是通用x86-64 [*]Symmetric multi-processing support:选择CPU支持多核心处理 Bus options (PCI etc.) --> [*]PCI suppor:支持PCI总线 Executable file formats / Emulations --> [*]Kernel support for ELF binaries <*>Kernel support for scripts starting with Device Drivers --> <*>SCSI device support [*]SCSI disk support要支持SCSI硬盘 -->Fusion MPT device support (NEW) --> <*>Fusion MPT ScsiHost drivers for SPI [*]Fusion MPT logging facility:支持对硬盘的驱动 USB support <*>SUPPORT FOR HOST-SIDE USB <*>UHCI HCD (most Intel and VIA) support <*>OHCI HCD (USB 1.1) support <*>EHCI HCD (USB 2.0) support:USB设备驱动 Input device suppor --> [*]Keyboards <*>AT keyboard (NEW) [*]Mice:支持输入输出设备、比如健盘 Generic Driver Options [*] Maintain a devtmpfs filesystem to mount at /dev [*]Automount devtmpfs at /dev, after the kernel mounted the rootfs Network device support Ethernet driver support [*]Intel devices (NEW) <*>Intel(R) PRO/1000 Gigabit Ethernet support <*>Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support:只要Intel的、其他的他都去掉、这是选择网卡设备驱动 [ ]Wireless:这个无线网、我们去掉去、用不着 Networking support Networking options [*] TCP/IP networking [*]IP:multicasting [*]IP: advanced router [*]IP: policy routing [*]IP: verbose route [*]IP: kernel level autoconfiguration [*]IP: DHCP support[*]IP: BOOTP support [*]IP: RARP support<*>IP: tunneling <*>Unix domain sockets <*>UNIX: socket monitoring interface:支持协议 File systems <*>The Extended 4 (ext4) filesystem:支持文件系统 开始编译内核了 make -j 2 #j后面跟的为内核数量(数量越多编译速度越快) cp arch/x86/boot/bzImage /mnt/boot/ #编译的内核复制到新加系统磁盘上
3)编译BusyBox
BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。一张软盘可以保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核以及相关的用户应用程序使用.
首先安装依赖文件
要先安装上glibc-static,libmcrypt-devel
解压busybox进行编译安装。
tar xf busybox-1.22.1.tar.bz2 cd busybox-1.22.1 make menuconfig make make install
make menuconfig时就选择这项就可以了、其他的都默认:
Busybox Settings
-->Build Options
-->[*] Build BusyBox as a static binary (no shared libs)
cp -a _install/* /mnt/sysroot/ cd /mnt/sysroot/ mkdir -pv /etc/rc.d var/log root home lib lib64 dev proc sys boot mnt media tmp srv etc 给grub提供一个配置文件 vim /mnt/boot/grub/grub.conf default=0 timeout=5 title My Linux (3.13.6-MyLinux) root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init #因为在编译内核时已经把文件系统编译进去所以本次grub引导不 需要虚拟文件系统。
4)给系统提供一个/mnt/sysroot/etc/fstab文件
vim /mnt/sysroot/etc/fstab
5)给小系统提供一个rc.sysinit
vim /mnt/sysroot/etc/rc.d/rc.sysinit
6)停供inittab文件
vim /mnt/sysroot/etc/inittab
::sysinit:/etc/rc.d/rc.sysinit ::respawn:/sbin/getty 19200 tty1 ::respawn:/sbin/getty 19200 tty2 ::respawn:/sbin/getty 19200 tty3 ::respawn:/sbin/getty 19200 tty4 ::respawn:/sbin/getty 19200 tty5 ::respawn:/sbin/getty 19200 tty6 ::ctrlaltdel:/sbin/reboot 定义组合键、按ctrl+alt+del就reboot ::shutdown:/bin/umount -a -r 如果要要关机就卸载已挂载的设备、然后关机
7)提供系统用户登录帐号文件
head -1 /etc/passwd > /mnt/sysroot/etc/passwd root:x:0:0:root:/root:/bin/sh #改为/bin/sh head -1 /etc/group > /mnt/sysroot/etc/group #提供组 head -1 /etc/shadow > /mnt/sysroot/etc/shadow #提供组密码 提供一个登录欢迎信息、创建一个issue文件 vim /mnt/sysroot/etc/issue MyLinux is CentOS release 6.5 Kernel \r on an \m 提供主机名 mkdir /mnt/sysroot/etc/sysconfig vim /mnt/sysroot/etc/sysconfig/network HOSTNAME=Mylinux 提供命令提示符和环境变量 vim /mnt/sysroot/etc/profile export PS1=‘[\[email protected]\h \A \W]\$ ‘PATH="/usr/local/sbin:/usr/local/bin:/sbin/:/bin:/usr/sbin:/ usr/bin:$PATH" chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit sync 同步数据到磁盘中去 #这不很重要 如果不能同步成功的话 打开新虚拟机会出错
由于安装的BusyBox里已经提供了/sbin/init 所以就不用写入/sbin/init 内容了
8) 现在可以把宿主机挂起新建一个主机进行开机启动了。
进去以后如果tty1进不去可以切换到tty2登入到主机 切换方式 Ctrl+alt+(F1..F6)
三:安装dropbear
dropbear可以为小linux提供远程连接功能。
tar xf dropbear-2013.58.tar.bz2 cd dropbear-2013.58 ./configure make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install mkdir /etc/dropbear 生成两个密钥文件 dropbearkey -t rsa -s 1024 -f /etc/dropbear/dropbear_rsa_host_key #必须为1024位 dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key 验证一下生的这两个文件 ls /etc/dropbear
也可以为此dropbear提供开机启动服务脚本,此次实验我们用手动打开dropbear就不再停供开机启动服务脚本。
脚本配置文件/etc/sysconfig/dropbear
为dropbear提供端口和加入到环境变量中。把端口改为22222避免跟已经使用的22号端口重复
keysize=2048 port=22222 端口号 export PATH=/usr/local/sbin:$PATH #加入到变量中这样进入系统就可以手动输入dropbear启动了
在宿主机上测试能否连接上去可以的话就把文件复制到我们的新建系统硬盘上吧。
先提供一个cp文件的脚本,这个脚本可以把文件所依赖的库文件一并复制过去。
#!/bin/bash # dirPath=/mnt/sysroot clearcmd(){ if which $1 &> /dev/null;then cmdPath=`which --skip-alias $1` else echo "Command not exist!" return 4 fi } cpCmd(){ dirName=`dirname $1` [ -d ${dirPath}${dirName} ] || mkdir -p ${dirPath}${dirName} [ -f ${dirPath}${cmdPath} ] || cp $1 ${dirPath}${dirName} } cpLib(){ for i in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`;do dirLib=`dirname $i` [ -d ${dirPath}${dirLib} ] || mkdir -p ${dirPath}${dirLib} [ -f ${dirPath}$i ] || cp $i ${dirPath}${dirLib} done } while true;do read -p "Enter a command:" cmd if [ "$cmd" == ‘quit‘ ];then echo "quit!" exit 0 fi clearcmd $cmd [ $? -eq 4 ] && continue cpCmd $cmdPath cpLib $cmdPath done
把这三个命令移植过去就可以了:dropbear、dropbearkey、dbclient复制完后就去创建这个目录/mnt/sysroot/etc/dropbear、而后为移植过去的dropbear生成两个密钥文件:密钥文件是ssh连接所依赖的。
mkdir /mnt/sysroot/etc/dropbear dropbearkey -t rsa -s 1024 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key
dropbear要认证用户、而认证用户要用到名称解析、这就意味着libnss库要复制过去、libnss库框架、而后给nss提供配置文件:
cp -d /lib64/libnss_files* /mnt/sysroot/lib64 cp -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64/ cp -d /usr/lib64/libnss_files.so / mnt/sysroot/usr/lib64/ cp /etc/nsswitch.conf /mnt/sysroot/etc/
在用户登录时dropbear认为用户的默认shell并不在/etc/shells下所在的用户shell中的话、他是不允许登录的、那我们就得给dropbear提供一个安全shell的配置文件了
vim /mnt/sysroot/etc/shells /bin/sh /bin/hush /bin/ash /sbin/nologin /bin/bash
dropbear启动时在/var/run/下会生成一个pid文件所以要创建
mkdir /mnt/sysroot/var/run 再创建/dev/pts这个目录: mkdri /mnt/sysroot/etc/profile.d cp /etc/profile.d/* /mnt/sysroot/etc/profile.d/ mkdir /mnt/sysroot/dev/pts sync
OK 测试一下能否能录首先要进入系统运行界面执行dropbear 因为我们没有开机启动执行脚本,所以要手动执行启动,看监听在0.0.0.0:22号端口上。
现在就可以连接我们的小Linux系统了
四:安装nginx
yum -y install pcre-devel tar xf nginx-1.4.2.tar.bz cd nginx-1.4.2 ./configure --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --without-pc re --without-http_rewrite_module make && make install 创建nginx用户 useradd nginx 把用户复制到新建主机系统 grep "^nginx" /etc/passwd >> /mnt/sysroot/etc/passwd grep "^nginx" /etc/group >> /mnt/sysroot/etc/group grep "^nginx" /etc/shadow >> /mnt/sysroot/etc/shadow cp -r /etc/nginx/ /mnt/sysroot/etc/ cp -r /usr/local/nginx /mnt/sysroot/usr/local 最好用我们上面提供的cp脚本进行复制 而在nginx启动时需要依赖于日志目录和pid文件目录、所以我们要事先给nginx创建这两目录先、还 给创建锁文件 mkdir /mnt/sysroot/var/log/nginx mkdir /mnt/sysroot/usr/local/logs mkdir -pv /mnt/sysroot/var/lock/subsys chmod +x /mnt/sysroot/var/log/nginx chmod +x /mnt/sysroot/tmp/ vim /mnt/sysroot/etc/profiled export PS1=‘[\[email protected]\h \A \W]\$ ‘ PATH="/usr/local/sbin:/usr/local/bin:/sbin/:/bin:/usr/sbin:/usr/bin:$PATH:/usr/local/ngin x/sbin" #把/usr/local/nginx/sbin 写进去 sync sync
测试能否连接 (因为没有提供开机启动脚本需要我们手动开启)
服务已启动并且处在监听状态。
好了,我们的小系统安装完毕。