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


至此配置完畢。本文是本身的理解,若有偏離和錯誤,歡迎指正。

相關文章
相關標籤/搜索