前言:今天我们就根据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文件这个是我们最后启动的脚本,所以我们可以把开机启动的服务放在这里面。

最后启动虚拟终端。

wKiom1P5U_yD162sAAIKfMbNNGw761.jpg

  init在早期是个串型的init、或者说传统意义是的init、sysV风格的、这种程序启动任何服务、运行任何程序完成系统初始化时统统以串型模式进行的、所以速度非常慢、以至于后来有了并型运行的init、启动速度也比较快。centos6的启动方式就是并行的init.启动文件在/etc/init/*.conf 结尾的所有文件。

wKioL1P5VemB5bbjAAJJI3PKD7Q217.jpg


  准备工作:在虚拟机上新添加一块scsi硬盘,和下面的安装文件。

wKioL1P5V1ryx7UMAADAUvdD1Ws533.jpg

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)

wKiom1P5ZBuDf-8SAAJ4uzSGsoU629.jpg


 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


wKioL1P5akzzv_JTAADDpyWZ920018.jpg


5)给小系统提供一个rc.sysinit  

   vim  /mnt/sysroot/etc/rc.d/rc.sysinit


wKioL1P5cz-juySjAAJ9duSFFdE937.jpg

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='[\u@\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) 现在可以把宿主机挂起新建一个主机进行开机启动了。


wKiom1P5dvWin31pAADOl2Z_98I089.jpg

进去以后如果tty1进不去可以切换到tty2登入到主机   切换方式 Ctrl+alt+(F1..F6)


wKiom1P5d_Dzr74TAADfA9a35_A095.jpg



wKiom1P5gRbibSaCAAHuXlKZLmI346.jpg



 


三:安装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号端口上。

wKiom1P5kVnTQmQKAACdAtjsNFE970.jpg

现在就可以连接我们的小Linux系统了

wKiom1P5j7iRZ2PXAAG_QCvX0lM559.jpg

wKioL1P5kOGxBiUDAAL6TKkioz4696.jpg


四:安装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='[\u@\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

测试能否连接 (因为没有提供开机启动脚本需要我们手动开启


wKioL1P5mR6gV3a3AAGBXAgElhg900.jpg

服务已启动并且处在监听状态。

wKiom1P5mHXwB23AAACU910baos414.jpg


好了,我们的小系统安装完毕,整个大小也就20M。可是麻雀虽小,五脏俱全啊,可以完全提供远程连接和web服务。

 

wKiom1P7M6iDk5gJAACBDKzb8mQ202.jpg