製做busybox完成自制Linux系統及遠程登陸和nginx安裝測試

前言
系統定製在前面的博文中咱們就有談到過了,不過那個裁減製做有簡單了點,只是能讓系統跑起來而,沒有太多的功能,也沒的用戶登陸入口,而這裏咱們將詳細和深刻的來談談Linux系統的詳細定製過程和實現用戶例如、遠程登陸和Nginx安裝過程、一步一步從頭開始定製屬於咱們本身的系統。html

正文
首先咱們先來簡單的介紹一下咱們這裏定製屬於本身的Linux系統的基本元素,其中一些相關的信息也能夠參考我前面寫過的博文linux

一個定製的linux內核+一個定製的busybox就能夠定製一個小型的Linux操做系統了,安裝Dropbear和Nginx,Linux的組成部分包括內核空間和用戶空間、而用戶空間其實就是根文件系統、用戶空間中又包括有shell和init,busybox他可以模擬數百個咱們系統上帶用的命令、固然包括咱們所須要用到的shell、init、getty、login、那定製一個Linux操做系統咱們必需要了解的就是系統啓動流程:
POST --> Boot Sequence(MBR) --> BootLoader --> kernel -->/sbin/init
POST:加電自檢
Boot Sequence:讀到磁盤中的第一個扇區(446)的MBR。
BootLoader:找到MBR中的BootLoader引導加載器、bootloader會找到咱們選定的操做系統或內核去加載對應的內核、而這個Bootloader一般是grub。
kernel:加載內核、內核要完成初始化、bootloader負責把內核讀到內存中、內核又一般中壓縮的、因此一般內核在內存中展開、而bootloader引導內核啓動起來、讓內核從他的程序入口處開始執行、因此接下來內核要完成自身的初始化操做、或硬件探測、包括自身執行環境的準備等等都在這裏完成。
內核完成初始化的第一步就要去裝載用戶空間了、有時候爲了讓內核作得足夠小、頗有可能內核中並不具有真正的根文件系統所在設備的驅動、所以咱們要藉助於initramfs(CentOS5上被稱爲initrd)來完成去裝載真正根文件系統所在的根文件系統真正的程序、可是這個initramfs可initrf(initramfs:這是一個文件系統、CentOS6上就這麼稱呼了,initrd:ram disk 這是一個磁盤設備)是個虛擬的根文件系統、是個虛根、他不是咱們系統真正工做起來所使用的根、因此稱這個爲虛根、內核藉助於這個虛根裝載驅動以後就要去掛載真正的根設備了、kernel會自動掛載到這個跟文件下、內核會掛載真正的根到這個initramfs虛根的某個目錄下、好比說掛載到/mnt/sysroot的目錄下、然後再完成根切換、然後咱們的真正的根就能夠加載了、那咱們的內核怎麼知道掛載的根文件系統是什麼呢、那咱們的grub向內核傳遞參數root等於什麼那就是告訴系統根文件系統所在的設備。nginx

/sbin/init:他一般加載四個設備、/sbin/init、/bin/bash、若是內核找不到就去找根下的init、再找不着就去找/bin/sh、/bin/bash、按照這個順序去找、找到一個就能夠啓動系統、因此係統啓動的第一個進程就啓動了、init負責去啓動用戶空間中真正工做的進程、init自己自己只是負責去生成這些正正工做的進程和回收這些進程的、是內核的第一個、最頂級的管理進程、但不負責具體的工做、雖然init不負責具體工做、但他須要把一個用戶空間啓動爲一個真正完整意義上的用戶空間、因此init要結合他的配置文件inittab完成所謂系統初始化的。
在CentOS6上這個文件inittab之因此保留下來是爲了跟CentOS5兼容的、其實咱們用不着的、由於init大多數配置文件都位於/etc/init/*.conf目錄下全部以.conf結尾的文件、是用於各子系統之間協調的。shell

/sbin/init做用包含如下幾步:
一、設定默認運行級別:runlevel -v:查看運行級別
二、系統空間中的進一行初始化、這個要依賴於一個系統初始化腳原本完成的、這個腳本叫rc.sysinit、在有些系統上可能叫rcS、其實都是一個概念、這個初始化包含鍵盤鍵映射、初始化沒被掛載的文件系統等等。那/etc/rc.sysinit要進行哪些工做、seLinux、udev、鍵映射、交換分區的激活、掛載額外文件系統、從新以讀寫方式掛載根文件系統等等。
三、啓動指定級別下的服務、後臺的守護進程、每一個級別都有一個在/etcg下rcN.d的文件、啓動這個文件中全部以S開頭的腳本服務、關閉全部以K開頭的服務腳本、/etc/rc.local其中以S開頭的最後一個服務S99包含rc.local、有些咱們不便於本身寫腳本定義的服務能夠寫到這裏來、可是啓動以後不會關閉、因此只是執行一些命令咱們能夠在這裏執行、服務仍是建議使用服務腳本。
四、設定鍵映射
五、啓動虛擬終端、啓動這個終端會調用一個叫login的程序、在虛擬終端上打印一個登陸提示符讓咱們輸入
六、若是設備默認級別爲5的話還能夠啓動圖形終端
init在早期是個串型的init、或者說傳統意義是的init、sysV風格的、這種程序啓動任何服務、運行任何程序完成系統初始化時通通以串型模式進行的、因此速度很是慢、以致於後來有了並型運行的init、啓動速度也比較快。vim

準備工做:centos

系統裁減咱們說過、爲了可讓定製好的系統能夠放到別的機器上動行、咱們要把他作到一個獨立的硬盤上去、因此首先咱們在宿主機上添加一塊SCSI的硬盤安全

添加硬盤,重啓bash

fdisk /dev/sdb

分3個主分區
第一個主分區(作boot分區):50M
第二個主分區(作/根分區):512M
第三個主分區(作swap分區):256M服務器

n p 1  +50M n p 2  +512M n p 3  +256M t 3 82 w

mke2fs -t etx4 /dev/sdb1

mke2fs -t etx4 /dev/sdb2

mkswap /dev/sdb3

mkdir -pv /mnt/{boot,sysroot}

mount /dev/sdb1 /mnt/boot

mount /dev/sdb2 /mnt/sysroot

第一步:編譯內核或定製內核框架

一、獲取內核程序包,能夠到官網下載:http://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/

這裏咱們使用的內核版本是3.13.6的版本
解壓內核文件,這裏咱們以make allnoconfig來編譯安裝,本身選擇要編譯的功能(確保系統上的編譯環境)

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

安裝依賴包

yum install -y ncurses-devel

make menuconfig 把咱們所須要的內容整合進來

咱們把這些內容所有編譯進內核、不編譯成模塊、*號表示編譯進內核(M表示以模塊的方式裝載)

注意:如下號標識的選項必定要選擇號,不然系統沒法正常啓動

[]64-bit kernel :64位操做系統的內核
General setup --> Local version --> -MyLinux: 給內核定一個本身的版本
Processor type and features --> Processor family --> (X)Generic-x86-64:這裏是CPU類型、這個是通用x86-64
[
]Symmetric multi-processing support:選擇CPU支持多核心處理
[]Enable loadable module support:選擇內核動態模塊加載
Bus options (PCI etc.) --> [
]PCI suppor:支持PCI總線
Device Drivers --> <>SCSI device support -->[]SCSI disk support要支持SCSI硬盤
Device Drivers -->Fusion MPT device support (NEW) --> <>Fusion MPT ScsiHost drivers for SPI、<>Fusion MPT misc device (ioctl) driver、[]Fusion MPT logging facility:支持對硬盤的驅動
File systems --> <
>The Extended 4 (ext4) filesystem:支持文件系統
Executable file formats / Emulations --> []Kernel support for ELF binaries、[]Write ELF core dumps with partial segments (NEW)、 <>Kernel support for scripts starting with #!:可執行文件的格式
Device Drivers -->Input device support --> [
]Keyboards -> <>AT keyboard (NEW) []Mice:支持輸入輸出設備、好比健盤
Device Drivers > 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設備驅動
Device Drivers > Generic Driver Options > [] Maintain a devtmpfs filesystem to mount at /dev []Automount devtmpfs at /dev, after the kernel mounted the rootfs
[] Networking support ---> > Networking options[] TCP/IP networking []IP:multicasting []IP: advanced router[]IP: policy routing []IP: verbose route monitoring[] IP: kernel level autoconfiguration[]IP: DHCP support[]IP: BOOTP support[] IP: RARP support<>IP: tunneling <>Unix domain sockets<> UNIX: socket monitoring interface:支持協議
Device Drivers > 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:這個無線網、咱們去掉去、用不着

OK、到這裏保存退出、把配置文件複製一份出來、前面磁盤格式化並且都掛載好了、這裏咱們就把grub安裝到boot下::

cp .config /root/config-3.13.6-x86_64

make -j 4 bzImage

cp arch/x86/boot/bzImage /mnt/boot/

grub-install --root-directory=/mnt /dev/sdb

出現警告:
warning: Clock skew detected. Your build may be incomplete
解決辦法:
(使用date命令從新設置時間格式是:date -s "MM/DD/YYYY hh:mm:ss"):


date -s "03/09/2016 20:56:00"

hwclock -s

清除編譯產生的文件

make clean

再次執行
make -j 4 bzImage
cp arch/x86/boot/bzImage /mnt/boot/


第二步:編譯Busybox、讓busybox提供一個sh程序、busybox能夠模擬n種sh、能夠模擬bash的特性、上面咱們有介紹過了

到busybox官網下載busybox程序包:http://www.busybox.net
解壓到當前目錄下就能夠了:

yum install -y glibc-static

yum install -y libmcrypt-devel

==============================
報錯:
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile

  • base: centos.ustc.edu.cn
  • extras: centos.ustc.edu.cn
  • updates: ftp.daumkakao.com
    Setting up Install Process
    No package libmcrypt-devel available.
    Error: Nothing to do

解決方法:

yum install epel-release //擴展包更新包

yum install -y libmcrypt-devel

==============================

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):把busybox編譯也靜態二進制,不用共享庫

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

給grub提供一個配置文件

vim /mnt/boot/grub/grub.conf

default=0
timeout=5
title Mini Linux (3.13.6-MyLinux_chinasoft)
root (hd0,0)
kernel /bzImage ro root=/dev/sda2 init=/sbin/init

給小系統提供一個rc.sysinit、/mnt/sysroot/etc/rc.d/rc.sysinit、若是沒有這個目錄就本身建立、再提供一個/mnt/sysroot/etc/fstab文件

mkdir etc/rc.d -pv

vim /mnt/sysroot/etc/fstab

/dev/sda1 /boot ext4 defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 swap swap defaults 0 0

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

==============================
#!/bin/sh
#
打印系統啓動時的歡迎信息
echo -e "\tWecome to \033[34mMini\033[0m Linux"
判斷/etc/sysroot/network是否存在而且可讀、條件成立就source進來
[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network
判斷$HOSTNAME是否爲空而且$HOSTNAME==NONE、若是爲空就給個默認值
[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME=localhost
給HOSTNAME賦值爲定義好的HOSTNAME的值
/bin/hostname $HOSTNAME
掛載文件系統
echo "mounting proc filesystem..."
mount -t proc proc /proc
echo "mounting sysfs filesystem..."
mount -t sysfs sysfs /sys
自動探測各硬件設備、而且可以探測到的都裝載設備文件
mdev -s
給系統配置一個IP地址
ifconfig lo 127.0.0.1
ifconfig eth0 172.16.254.188
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

vim /mnt/sysroot/etc/inittab

==============================
::sysinit:/etc/rc.d/rc.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 :19200表示每秒鐘傳輸的速率、getty是一個串型終端、他會調用一個登陸界面讓用戶輸入登陸信息進行驗證
tty6::askfirst:/bin/sh 啓用6個虛擬終端
console::respawn:-/bin/sh 啓用一個終端,若是出錯從新啓動respawn、-表示敲一回車才能夠啓用sh
::ctrlaltdel:/sbin/reboot 定義組合鍵、按ctrl+alt+del就reboot
::shutdown:/bin/umount -a -r 若是要要關機就卸載已掛載的設備、而後關機

提供系統用戶登陸賬號文件:

useradd busybox

passwd busybox

密碼也設置爲:busybox

head -1 /etc/passwd > /mnt/sysroot/etc/passwd

tail -1 /etc/passwd >> /mnt/sysroot/etc/passwd

vim /mnt/sysroot/etc/passwd

root:x:0:0:root:/root:/bin/sh
busybox:x:502:503::/home/busybox:/bin/sh

head -1 /etc/group > /mnt/sysroot/etc/group

tail -1 /etc/group >> /mnt/sysroot/etc/group

head -1 /etc/shadow > /mnt/sysroot/etc/shadow

tail -1 /etc/shadow >> /mnt/sysroot/etc/shadow

cat /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.chinasoft.com
提供命令提示符和環境變量

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 同步數據到磁盤中去

==============================

到這裏咱們的配置有了基本框架,此時把宿主機掛起,建立一個自定義虛擬機,把咱們製做有系統的那張硬盤放到自定義的虛擬機上運行:

若是第一個終端登陸不了能夠切換到其餘終端上登陸,按ctrl+alt+F2(F3\F4\F5\F6)能夠切換到不一樣的終端上去登陸的、這裏咱們登陸成功了:

測試

啓動報錯:是由於make menuconfig處沒有選擇文件系統支持

遠程登陸和ngix訪問

OK、到這裏咱們本身定製的Linux能夠跑起來了、接下來咱們來實現遠程登陸和Nginx的訪問:
切換到宿主主上、下載dropbear-2013.58.tar.bz2和Nginx到本地:
一、解壓安裝dropbear

tar xf dropbear-2013.58.tar.bz2

cd dropbear-2013.58

./configure

make

make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

mkdir /etc/dropbear

生成兩個密鑰文件

dropbearkey -t rsa -s 1024 -f /etc/dropbear/dropbear_rsa_host_key

dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key

驗證一下生的這兩個文件

ls /etc/dropbear

二、服務腳本/etc/rc.d/init.d/dropbear

#!/bin/bash
#

description: dropbear ssh daemon

chkconfig: 2345 66 33

#
dsskey=/etc/dropbear/dropbear_dss_host_key
rsakey=/etc/dropbear/dropbear_rsa_host_key
lockfile=/var/lock/subsys/dropbear
pidfile=/var/run/dropbear.pid
dropbear=/usr/local/sbin/dropbear
dropbearkey=/usr/local/bin/dropbearkey
[ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
[ -r /etc/sysconfig/dropbear ] && . /etc/sysconfig/dropbear
keysize=${keysize:-1024}
port=${port:-22}
gendsskey() {
[ -d /etc/dropbear ] || mkdir /etc/dropbear
echo -n "Starting generate the dss key: "
$dropbearkey -t dss -f $dsskey &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
success
echo
return 0
else
failure
echo
return 1
fi
}
genrsakey() {
[ -d /etc/dropbear ] || mkdir /etc/dropbear
echo -n "Starting generate the rsa key: "
$dropbearkey -t rsa -s $keysize -f $rsakey &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
success
echo
return 0
else
failure
echo
return 1
fi
}
start() {
[ -e $dsskey ] || gendsskey
[ -e $rsakey ] || genrsakey
if [ -e $lockfile ]; then
echo -n "dropbear daemon is already running: "
success
echo
exit 0
fi
echo -n "Starting dropbear: "
daemon --pidfile="$pidfile" $dropbear -p $port -d $dsskey -r $rsakey
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
touch $lockfile
return 0
else
rm -f $lockfile $pidfile
return 1
fi
}
stop() {
if [ ! -e $lockfile ]; then
echo -n "dropbear service is stopped: "
success
echo
exit 1
fi
echo -n "Stopping dropbear daemon: "
killproc dropbear
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
rm -f $lockfile $pidfile
return 0
else
return 1
fi
}
status() {
if [ -e $lockfile ]; then
echo "dropbear is running..."
else
echo "dropbear is stopped..."
fi
}
usage() {
echo "Usage: dropbear {start|stop|restart|status|gendsskey|genrsakey}"
}
case $1 in
start)
start ;;
stop)
stop ;;
restart)
stop
start
;;
status)
status
;;
gendsskey)
gendsskey
;;
genrsakey)
genrsakey
;;
*)
usage
;;
esac

三、腳本配置文件/etc/sysconfig/dropbear

keysize=2048
port=22022

chmod +x /etc/rc.d/init.d/dropbear

chkconfig --add dropbear

vim /etc/profile.d/dropbear.sh

export PATH=/usr/local/sbin:$PATH
啓動服務並查看端口22022是否已經處於監聽狀態、並在本地嘗試鏈接登陸:

service dropbear start

ss -tnl

dropbear在本機安裝成功而且成功啓動鏈接上去了

Xshell:\> ssh 192.168.8.40 22022

將該功能移植到咱們的定製系統,以前咱們寫過一個腳本用來移植命令:

#!/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、scp、dbclient、bash、複製完後就去建立這個目錄/mnt/sysroot/etc/dropbear、然後爲移植過去的dropbear生成兩個密鑰文件:

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 是指帶鏈接的拷貝:

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/

vim /mnt/sysroot/etc/nsswitch.conf

只保留如下幾項、其餘的都不須要:
passwd: files
shadow: files
group: files
hosts: files dns

在用戶登陸時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的僞終端、這個僞終端是個僞文件系統、只要你的內核編譯時支持這個文件系統、他就可使用、固然、咱們的目標機上尚未:

vim /mnt/sysroot/etc/fstab

加一行
devpts /dev/pts devpts defaults 0 0

再建立/dev/pts這個目錄:

mkdir /mnt/sysroot/etc/profile.d

cp /etc/profile.d/dropbear.sh /mnt/sysroot/etc/profile.d/

mkdir /mnt/sysroot/dev/pts

sync

sync

OK、咱們先來測試一下dropbear遠程登陸看可不能夠登陸得上去、把宿主機掛起或關機、啓動咱們的目標機、因爲咱們的/dev/pts啓動目標機時能夠會從新掛載的問題、會把/dev/pts下的目錄給覆蓋掉、因此咱們進入目標機後能夠在/dev/下建立pts這個目錄、IP要設置在同一個網段內:

mkdir /dev/pts

mount -a

修改定製機的IP(避免和宿主機混淆)

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

ifconfig eth0 192.168.8.49
route add default gw 192.168.8.254

實現頁面Nginx訪問

這裏咱們用的版本是Nginx-1.4.二、這裏咱們以最簡單的方式進行安裝並運行服務起來:
解決依賴關係:

yum install -y pcre-devel

tar xf nginx-1.4.2.tar.gz

cd nginx-1.4.2

./configure --prefix=/usr/local --conf-path=/etc/nginx/nginx.cnf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --user=nginx --group=nginx --without-pcre --without-http_rewrite_module --without-http_geo_module --without-http_uwsgi_module --without-http_fastcgi_module --without-http_scgi_module --without-http_memcached_module

--prefix=/usr/local:指定第三方軟件安裝目錄
--conf-path=/etc/nginx/nginx.cnf:指定主配置文件的路徑
--error-log-path=/var/log/nginx/error.log:指定錯誤日誌存放路徑
--http-log-path=/var/log/nginx/access.log:指定訪問日誌
--group=nginx:以nginx用戶身份運行、反正不要以管理員的身份去運行
--group=nginx:nginx用戶組
其餘的選項都是nginx默認選項、咱們都去掉

make

make install

useradd nginx

cd /usr/local/sbin

./nginx

ss -tnl 查看80端口是否已經處於監聽狀態

接着移植nginx到目標機上去、用上面的那個複製命令的腳本:

bash cpbin.sh

Enter a command:nginx
Enter a command:consoletype
Enter a command:quit
quit!

複製nginx下的配置文件到目標機上、而啓動nginx須要nginx用戶、因此用戶也得追加到passwd文件中去、然後再給nginx添加一個測試頁面就OK了:

cp /etc/nginx/ /mnt/sysroot/etc/ -r

grep "^nginx" /etc/passwd >> /mnt/sysroot/etc/passwd

grep "^nginx" /etc/group >> /mnt/sysroot/etc/group

grep "^nginx" /etc/shadow >> /mnt/sysroot/etc/shadow

mkdir /mnt/sysroot/usr/local/html

vim /mnt/sysroot/usr/local/html/index.html

<h1>Welcome to Nginx</h1>
<h1>Shenzhen huanying nin!</h1>

給nginx提供一個服務腳本

vim /mnt/sysroot/etc/rc.d/init.d/nginx

#!/bin/sh
#

nginx - this script starts and stops the nginx daemon

#

chkconfig: - 85 15

description: Nginx is an HTTP(S) server, HTTP(S) reverse \

proxy and IMAP/POP3 proxy server

processname: nginx

config: /etc/nginx/nginx.conf

config: /etc/sysconfig/nginx

pidfile: /var/run/nginx.pid

Source function library.

. /etc/rc.d/init.d/functions

Source networking configuration.

. /etc/sysconfig/network

Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {

make required directories

user=nginx -V 2&gt;&1 | grep "configure arguments:" | sed 's/[^*]*--user=[]∗[]∗.*/\1/g' -
options=$nginx -V 2&gt;&1 | grep 'configure arguments:'
for opt in $options; do
if [ echo $opt | grep '.*-temp-path' ]; then
value=echo $opt | cut -d "=" -f 2
if [ ! -d "$value" ]; then

echo "creating" $value

mkdir -p $value && chown -R $user $value

fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

而在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/

sync

OK、咱們啓動定製的目標系統、再啓動dropbear和nginx、而服務也能夠正常啓動了、測試咱們的nginx吧、若是服務腳本使用不了那就是裏面能夠有一些依賴函數或一些命令沒有全都移植到目標機上、不過沒關係、咱們能夠手動啓動服務器、這個問題都不大、最後測試完沒什麼就poweroff關機吧、若是nginx啓動不了就從新把文件系統掛載爲可讀寫就OK了:

nginx

nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (30: Read-only file system)
2016/03/10 19:22:02 [emerg] 78#0: mkdir() "/usr/local/client_body_temp" failed (30: Read-only file system)

mount -o remonut,rw /

至此,咱們的定製linux已完成,能夠根據實際狀況繼續增長功能

總結下主要步驟:

一、準備目標磁盤二、提供bzImage三、提供busybox建議靜態編譯:事先安裝glibc-static四、準備根文件系統(1) 複製編譯安裝完成的busybox(2) 補全所須要的其它目錄五、爲init提供配置文件etc/inittabetc/rc.d/rc.sysint六、提供虛擬終端,同時賬號密鑰等文件(1)編輯etc/inittab::respawn:/sbin/getty 19200 tty1::respawn:/sbin/getty 19200 tty2(2)爲目標系統提供passwd, group, shadow七、主機名和banner(1) /etc/sysconfig/network文件編輯rc.sysinit,添加[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME="localhost"/bin/hostname $HOSTNAME(2) 編輯/etc/issueWelcome to MageEdu MiniLinuxkernel \r八、提供ssh服務(1) 九、提供nginx服務(1) 編輯安裝並移植nginx(2) 爲目標系統上的nginx提供配置文件(3) 提供測試網頁

相關文章
相關標籤/搜索