1. 程式人生 > >制作busybox完成自制Linux系統及遠程登錄和nginx安裝測試

制作busybox完成自制Linux系統及遠程登錄和nginx安裝測試

sockets 總結 足夠 comm 設備驅動 ... loading ade 一個用戶

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

正文
首先我們先來簡單的介紹一下我們這裏定制屬於自己的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等於什麽那就是告訴系統根文件系統所在的設備。

/sbin/init:他通常加載四個設備、/sbin/init、/bin/bash、如果內核找不到就去找根下的init、再找不著就去找/bin/sh、/bin/bash、按照這個順序去找、找到一個就可以啟動系統、所以系統啟動的第一個進程就啟動了、init負責去啟動用戶空間中真正工作的進程、init本身本身只是負責去生成這些正正工作的進程和回收這些進程的、是內核的第一個、最頂級的管理進程、但不負責具體的工作、雖然init不負責具體工作、但他需要把一個用戶空間啟動為一個真正完整意義上的用戶空間、所以init要結合他的配置文件inittab完成所謂系統初始化的。
在CentOS6上這個文件inittab之所以保留下來是為了跟CentOS5兼容的、其實我們用不著的、因為init大多數配置文件都位於/etc/init/*.conf目錄下所有以.conf結尾的文件、是用於各子系統之間協調的。

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

準備工作:

系統裁減我們說過、為了可以讓定制好的系統可以放到別的機器上動行、我們要把他做到一個獨立的硬盤上去、所以首先我們在宿主機上添加一塊SCSI的硬盤

添加硬盤,重啟

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

第一步:編譯內核或定制內核

1、獲取內核程序包,可以到官網下載: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到本地:
1、解壓安裝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

2、服務腳本/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

3、腳本配置文件/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.2、這裏我們以最簡單的方式進行安裝並運行服務起來:
解決依賴關系:

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已完成,可以根據實際情況繼續增加功能

總結下主要步驟:

1、準備目標磁盤
2、提供bzImage
3、提供busybox
建議靜態編譯:事先安裝glibc-static
4、準備根文件系統
(1) 復制編譯安裝完成的busybox
(2) 補全所需要的其它目錄
5、為init提供配置文件
etc/inittab
etc/rc.d/rc.sysint
6、提供虛擬終端,同時帳號密鑰等文件
(1)編輯etc/inittab
::respawn:/sbin/getty 19200 tty1
::respawn:/sbin/getty 19200 tty2
(2)為目標系統提供passwd, group, shadow
7、主機名和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/issue
Welcome to MageEdu MiniLinux
kernel \r
8、提供ssh服務
(1)
9、提供nginx服務
(1) 編輯安裝並移植nginx
(2) 為目標系統上的nginx提供配置文件
(3) 提供測試網頁

制作busybox完成自制Linux系統及遠程登錄和nginx安裝測試