kernel+busybox+dropbear+ngnix自制Linux系统

kernel是内核,采用本身定制,最小化编译。busybox是提供rootfs,至关于用户空间。dropbear是提供远程ssh服务的,至关于openssl,可是它是轻量级的。ngnix是在定制的系统上提供的web服务。html

环境:采用VMware虚拟机 linux

1、编译内核

前提:查看本身的cpu类型,pci类型,内核只编译所需的驱动就能够。

例如:查看cpu类型,不一样的机器可能不一样nginx

1

查看pci类型:web

2

3

开始编译:

一、下载内核源代码,下载地址是 kernel.org。这里使用的内核版本是 3.13.6shell

二、解压内核文件并配置vim

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  # 须要依赖ncusres-devel
make

编译完成。centos

在make menuconfig时选择对应的选项,经常使用的以下:(都是直接编译进内核)安全

4

5

6

7

 

8

9

10

11

12

13

14

15

16 

选择上面的选项编译完成后,会在当前目录下提供生成arch/x86/boot/bzImage内核映像压缩文件,做用等同于系统中vmlinuz文件。bash

2、编译busybox

一、获取busybox源码包  这里使用的版本是:busybox-1.22.1ssh

二、开始编译

tar xf busybox-1.22.1.tar.bz2
cd  busybox-1.22.1
make menuconfig
make
make install

对于make menuconfig的选项说明:

17

18

 

注意:在执行make时,可能会出现 以下错误:

/usr/bin/ld: cannot find -lcrypt
collect2: ld returned 1 exit status
make: *** [busybox_unstripped] Error 1

出现这个错误的缘由是由于在配置busybox的时候,一般配置为静态编译,因此编译后在最后的连接阶段须要连接crypt的静态库文件(libcrypt.a),而非动态库文件(libcrypt.so*),该库文件由glibc提供,一般系统中只安装了glibc,而没有安装glibc-static。

解决方法:

安装glibc-static包   yum install glibc-static

安装完成后,会在当前目录下生成一个_install目录,里面文件以下,实际上就生成一个busybox二进制程序,其余都是他的连接文件,主要的目的是模拟Linux的各类命令。可是咱们发现里面,没有bash,可是这里sh兼容bash。

功能至关强大啊,就一个命令。看看这个文件的大小:

20

19

3、准备系统的启动盘

大体原理以下:

21

模拟实现系统启动盘

# 一、在虚拟机中添加块新的磁盘(在VMware中模拟实现)。划分2个主分区,大小分别为50M、512M,并格式化。

# 二、建立模拟boot目录和根文件系统,并挂载
mkdir /mnt/boot /mnt/sysroot -p
mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot

# 三、提供内核文件以及对应的grub

# 安装grub
grub-install --root-directory=/mnt  /dev/sdb

# 复制内核编译完成的bzImage文件到 /mnt/boot目录下:
cp /usr/src/linux/arch/x86_64/boot/bzImage /mnt/boot/

# 提供grub的配置文件
# vim /mnt/grub/grub.conf,文件内容以下:
# 这里不须要initramfs,由于这里内核能够直接挂载根文件系统
timeout=3
default=0
title Mini Linux Cl5
    root (hd0,0)
    kernel /bzImage ro root=/dev/sda2 init=/sbin/init

# 四、提供rootfs
###############################################################################################
# 复制命令
cp -a /root/busybox-1.22.1/_install/* /mnt/sysroot/

# 建立必要的目录
mkdir /mnt/sysroot/{root,boot,proc,sys,dev,usr,lib64}
#################################################################################################

##################################################################################################
# 提供配置文件,busybox在执行init程序时须要配置文件inittab
# vim /mnt/sysroot/etc/inittab ,内容以下:
# init 程序会以inittab文件为配置文件,格式以下:

#读取/etc/rc.d/rc.sysinit配置文件(在这里是/mnt/sysroot/etc/rc.d/rc.sysinit)
::sysinit:/etc/rc.d/rc.sysinit
# 开启4个虚拟终端,执行getty命令,此命会调用login程序登录,respawn是退出时从新执行login,
# 因此此时须要进行用户认证
::respawn:/sbin/getty 19200 tty1
::respawn:/sbin/getty 19200 tty2
::respawn:/sbin/getty 19200 tty3
::respawn:/sbin/getty 19200 tty4
# crtl +alt + del 键的做用
::ctrlaltdel:/sbin/reboot
# 设定关机时的动做,也比较关键。若是没有这一项的话,会出现开机后,
## 新建立的文件的内容可能会改变
::shutdown:/bin/umount -a -r
#################################################################################################

################################################################################################
# 提供用户,密码,组文件
# 密码由 openssl passwd -1 -salt `openssl rand -hex 4` 生成
# cat /mnt/sysroot/etc/passwd 
root:x:0:0:root:/root:/bin/sh
centos:x:500:500::/home/centos:/bin/sh

# cat /mnt/sysroot/etc/shadow 
root:$1$8dadd7c5$r7vRrjpLnBzq08KXzy4mA0:16296:0:99999:7:::
centos:$1$8dadd7c5$r7vRrjpLnBzq08KXzy4mA0:16307:0:99999:7:::

# cat /mnt/sysroot/etc/group 
root:x:0:
centos:x:500:
#############################################################################################

#############################################################################################
# 提供/etc/rc.d/rc.sysinit(在这里是/mnt/sysroot/etc/rc.d/rc.sysinit)文件,
## 文件内容以下:

#!/bin/sh
#
echo -e "\033[31mWelcom Mini Linux\033[0m"
mount -a     # 此选项会去读取文件/etc/fstab
mdev -s    # 是busybox提供的会自动扫描设备的命令
mount -n -o remount,rw /dev/sda2 /   # 这一项比较重要,若是没有这一项的话,
## 根文件系统是只读的

# 提供网卡地址
ifconfig lo 127.0.0.1 netmask 255.255.255.255 up
ifconfig eth0 172.16.10.14 netmask 255.255.0.0 up

# 若是编译时没有设置主机名,须要如下设置主机名
#[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network
#[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && hostname localhost || hostname $HOSTNAME
#####/etc/sysconfig/network文件内容以下:
# HOSTNAME=www.clusteLinux.com
echo -e "\033[31mEND\033[0m"
##########################################################################################

###########################################################################################
# 建立fstab文件
/dev/sda2             /                       ext4    defaults         0 0
/dev/sda1         /boot                     ext4    defaults          0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
##########################################################################################

#########################################################################################
# 用户登陆时,会去读取profile文件,在这里能够设置提示符等;
# vim  etc/profile 内容以下:

export PS1=[\u@\h \W]$
#########################################################################################

结果:

24

22

23 

26

 

4、安装dropbear

dropbear: 更小环境下,提供简单ssh远程链接服务。相似于openssh工具,可是它更轻量级。安装完dropbear后,会生成如下几个命令:

dropbear:是dropbear的服务端,相似于sshd

dbclient:是dropbear的客户端,相似于ssh

dropbearkey: 是秘钥生成工具,相似于ssh-keygen

ropbearconvert:实现openssh和dropbear之间的秘钥转换

    例如:dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear_rsa_host_key

scp:远程复制工具

安装配置dropbear

########一、安装dropbear#######################
# 下载dropbear软件,这里使用的版本是dropbear-2013.58.tar.bz2
# 开始安装

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
# dropbear默认是安装到/usr/local目录下的。./configure完成后,会生成一个option.h的文件,
## 里面定义了各类属性。例如:/var/run/dropbear.pid,因此在对应烦人磁盘上的目录要存在。

#####二、复制dropbear dbclient dropbearkey  scp到对应的虚拟根文件系统下############
# 使用bincp.sh的脚本,将命令和对应的库复制到虚拟根文件系统下,
## 脚本内容以下(具体还含义在函数博客中有详细说明)

#!/bin/bash
#
target=/mnt/sysroot/ 

[ -d $target ] || mkdir $target 

preCommand() {
    if which $1 &> /dev/null; then
    commandPath=`which --skip-alias $1`
    return 0
    else
    echo "No such command."
    return 1
    fi
} 

commandCopy() {
    commandDir=`dirname $1`
    [ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}
    [ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir}
} 

libCopy() {
    for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do
    libDir=`dirname $lib`
    [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
    [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
    done
} 

read -p "Plz enter a command: " command 

until [ "$command" == 'quit' ]; do 

  if preCommand $command ; then
    commandCopy $commandPath
    libCopy $commandPath
  fi 

  read -p "Plz enter a command: " command
done

# 须要注意的是,scp命令须要单独复制对应的命令和所依赖的库,避免和系统中的scp冲突

#####################三、定义安全的shell##########################
# vim /mnt/sysroot/etc/shells 内容以下,能够添加信任的shell,必要的
/bin/sh

#################四、移植nsswitch######################################
# 在使用ssh远程工具链接的时候,用户名的解析要借助于nsswitch。
# bash的用户名解析也是这种机制,因此若是要使用bash做为默认shell的话,移植nsswitch是必要的

cp -a -d /lib64/libnss_files-2.12.so /lib64/libnss_files.so.2  /mnt/sysroot/lib64/

cp -a -d /usr/lib64/libnss3.so /usr/lib64/libnss_files.so /usr/lib64/libnsspem.so \
/usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so /mnt/sysroot/usr/lib64/


###############五、确保pid文件所在的目录存在###################################
mkdir /mnt/sysroot/var/run

###########################六、提供服务脚本####################

# vim /mnt/sysroot/etc/init.d/dropbear 内容以下:
#####################################################################
#!/bin/sh
#
dbprog='/usr/local/sbin/dropbear'
dbkeygen='/usr/local/bin/dropbearkey'
dsskey='/etc/dropbear/dropbear_dss_host_key'
rsakey='/etc/dropbear/dropbear_rsa_host_key'
rsakeysize=2048
dbport=22 

gendsskey() {
    if [ ! -f $dsskey ]; then
        echo "Generating dss key file."
        [ -d /etc/dropbear ] || mkdir /etc/dropbear
        $dbkeygen -t dss -f $dsskey
    fi
} 

genrsakey() {
    if [ ! -f $rsakey ]; then
        echo "Generating rsa key file."
        [ -d /etc/dropbear ] || mkdir /etc/dropbear
        $dbkeygen -t rsa -s $rsakeysize -f $rsakey
    fi
} 

start() {
    gendsskey
    genrsakey 

    if ! pidof dropbear &> /dev/null; then
        echo "Starting dropbear"
        $dbprog -p $dbport
        retval=$?
    else
        echo "$dbprog is already running..."
        return 1
    fi
    if [ $retval -eq 0 ]; then
        echo "OK"
        return 0
    else
        echo "Failure"
        return 1
    fi
} 

stop() {
    if pidof dropbear &> /dev/null; then
        echo "stopping dropbear sucess..."
        killall dropbear
        retval=$?
    else
        echo "$dbprog is not running..."
        return 1
    fi    
} 

restart() {
    stop
    sleep 1
    start
} 

usage() {
    echo "Usage: `basename $0` {start|stop|restart}"
} 

case $1 in 
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    restart
    ;;
*)
    usage
    ;;
esac
##################################################################

chmod +x /mnt/sysroot/etc/init.d/dropbear


############七、提供devpts挂载文件系统并设置开机自启动########################

# /mnt/sysroot/etc/rc.d/rc.sysinit 在这个文件中,在mdev -s 以后,mount -a以前,添加:

# mdev -s
mkdir /dev/pts
# mount -a

#######在/mnt/sysroot/etc/fstab中添加#################################

devpts            /dev/pts        devpts  defaults    0 0 

#####################################################################

# 设置开机自启动
for i in /etc/rc/S* ; do
        $i start
done

#####################################################################

mkdir  /mnt/sysroot/etc/rc/
cd /mnt/sysroot/etc/rc/
ln -s   ../../etc/init.d/dropbear  ./S01dropbear

####################################################################

#################八、设置环境变量#########################

# 在 /mnt/sysroot/profile 文件中添加:
export PATH=/bin:/sbin:/usr/bin:/usr/sbin


结果:

27

28

29

30


 

5、经过安装nginx提供web服务

过程以下:

一、编译,配置ngnix
useradd nginx
./configure --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx \
--without-pcre --without-http_rewrite_module
make && make install

# 提供主页面
echo "hello" > /usr/local/nginx/html/index.html

二、复制到虚拟根文件系统下
cp -a /etc/ngnix/ /mnt/sysroot/etc
cp -a /usr/local/nginx/ /mnt/sysroot/usr/local/

三、复制nginx所依赖的库文件
#使用bincp.sh脚本完成,注意此时nginx要在PATH环境变量中

四、修改 /mnt/sysroot/etc/profile 文件,添加:
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/nginx/sbin/

在minilinix上添加ngnix用户就能够了,结果:

31

32


至此配置完毕。本文是本身的理解,若有偏离和错误,欢迎指正。

相关文章
相关标签/搜索