一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

[轉(zhuǎn)]利用BusyBox ~私人定制 My LINUX~ - 姜名則

 raymoon_sure 2014-10-30
原文 http://www.cnblogs.com/xiaocen/p/3703574.html 

前言 
我在今天在這里跟大家詳細(xì)地探討一下Linux系統(tǒng)的定制過程和實(shí)現(xiàn)例如、用戶能夠遠(yuǎn)程登錄; 和Nginx能夠穩(wěn)定地運(yùn)行在我們私人定制的LINUX系統(tǒng)上 、一步一步從頭開始定制屬于我們自己的系統(tǒng)。


正文 
   首先我們先來簡單的介紹一下我們這里定制屬于自己的Linux系統(tǒng)的基本元素.

   一個(gè)定制的linux內(nèi)核+一個(gè)定制的busybox就可以定制一個(gè)小型的Linux操作系統(tǒng)了,安裝Dropbear和Nginx,Linux的組成 部分包括內(nèi)核空間和用戶空間、而用戶空間其實(shí)就是根文件系統(tǒng)、用戶空間中又包括有shell和init,busybox他能夠模擬數(shù)百個(gè)我們系統(tǒng)上帶用的 命令、當(dāng)然包括我們所需要用到的shell、init、getty、login、那定制一個(gè)Linux操作系統(tǒng)我們必須要了解的就是系統(tǒng)啟動(dòng)流程:     
   POST --> Boot Sequence(MBR) --> BootLoader --> kernel -->/sbin/init 
POST: 加電自檢 
Boot Sequence: 讀到磁盤中的第一個(gè)扇區(qū)(446)的MBR。 
BootLoader: 找到MBR中的BootLoader引導(dǎo)加載器、bootloader會(huì)找到我們選定的操作系統(tǒng)或內(nèi)核去加載對應(yīng)的內(nèi)核、而這個(gè)Bootloader通常是grub。 
kernel: 加 載內(nèi)核、內(nèi)核要完成初始化、bootloader負(fù)責(zé)把內(nèi)核讀到內(nèi)存中、內(nèi)核又通常中壓縮的、所以通常內(nèi)核在內(nèi)存中展開、而bootloader引導(dǎo)內(nèi)核 啟動(dòng)起來、讓內(nèi)核從他的程序入口處開始執(zhí)行、所以接下來內(nèi)核要完成自身的初始化操作、或硬件探測、包括自身執(zhí)行環(huán)境的準(zhǔn)備等等都在這里完成。 
   內(nèi)核完成初始化的第一步就要去裝載用戶空間了、有時(shí)候?yàn)榱俗寖?nèi)核做得足夠小、很有可能內(nèi)核中并不具備真正的根文件系統(tǒng)所在設(shè)備的驅(qū)動(dòng)、因此我們要借助于 initramfs(CentOS5上被稱為initrd)來完成去裝載真正根文件系統(tǒng)所在的根文件系統(tǒng)真正的程序、但是這個(gè)initramfs可 initrf(initramfs:這是一個(gè)文件系統(tǒng)、CentOS6上就這么稱呼了,initrd:ram disk 這是一個(gè)磁盤設(shè)備)是個(gè)虛擬的根文件系統(tǒng)、是個(gè)虛根、他不是我們系統(tǒng)真正工作起來所使用的根、所以稱這個(gè)為虛根、內(nèi)核借助于這個(gè)虛根裝載驅(qū)動(dòng)之后就要去掛 載真正的根設(shè)備了、kernel會(huì)自動(dòng)掛載到這個(gè)跟文件下、內(nèi)核會(huì)掛載真正的根到這個(gè)initramfs虛根的某個(gè)目錄下、比如說掛載到/mnt /sysroot的目錄下、而后再完成根切換、而后我們的真正的根就可以加載了、那我們的內(nèi)核怎么知道掛載的根文件系統(tǒng)是什么呢、那我們的grub向內(nèi)核 傳遞參數(shù)root等于什么那就是告訴系統(tǒng)根文件系統(tǒng)所在的設(shè)備。 
   /sbin/init:他通常加載四個(gè)設(shè)備、/sbin/init、/bin/bash、如果內(nèi)核找不到就去找根下的init、再找不著就去找/bin /sh、/bin/bash、按照這個(gè)順序去找、找到一個(gè)就可以啟動(dòng)系統(tǒng)、所以系統(tǒng)啟動(dòng)的第一個(gè)進(jìn)程就啟動(dòng)了、init負(fù)責(zé)去啟動(dòng)用戶空間中真正工作的進(jìn) 程、init本身本身只是負(fù)責(zé)去生成這些正正工作的進(jìn)程和回收這些進(jìn)程的、是內(nèi)核的第一個(gè)、最頂級的管理進(jìn)程、但不負(fù)責(zé)具體的工作、雖然init不負(fù)責(zé)具 體工作、但他需要把一個(gè)用戶空間啟動(dòng)為一個(gè)真正完整意義上的用戶空間、所以init要結(jié)合他的配置文件inittab完成所謂系統(tǒng)初始化的。     
   在CentOS6上這個(gè)文件inittab之所以保留下來是為了跟CentOS5兼容的、其實(shí)我們用不著的、因?yàn)閕nit大多數(shù)配置文件都位于/etc/init/*.conf目錄下所有以.conf結(jié)尾的文件、是用于各子系統(tǒng)之間協(xié)調(diào)的。 
   /sbin/init作用包含以下幾步: 
       1、設(shè)定默認(rèn)運(yùn)行級別:runlevel -v:查看運(yùn)行級別 
       2、系統(tǒng)空間中的進(jìn)一行初始化、這個(gè)要依賴于一個(gè)系統(tǒng)初始化腳本來完成的、這個(gè)腳本叫rc.sysinit、在有些系統(tǒng)上可能叫rcS、其實(shí)都是一個(gè)概 念、這個(gè)初始化包含鍵盤鍵映射、初始化沒被掛載的文件系統(tǒng)等等。那/etc/rc.sysinit要進(jìn)行哪些工作、seLinux、udev、鍵映射、交 換分區(qū)的激活、掛載額外文件系統(tǒng)、重新以讀寫方式掛載根文件系統(tǒng)等等。 
       3、啟動(dòng)指定級別下的服務(wù)、后臺的守護(hù)進(jìn)程、每個(gè)級別都有一個(gè)在/etcg下rcN.d的文件、啟動(dòng)這個(gè)文件中所有以S開頭的腳本服務(wù)、關(guān)閉所有以K開 頭的服務(wù)腳本、/etc/rc.local其中以S開頭的最后一個(gè)服務(wù)S99包含rc.local、有些我們不便于自己寫腳本定義的服務(wù)可以寫到這里來、 但是啟動(dòng)之后不會(huì)關(guān)閉、所以只是執(zhí)行一些命令我們可以在這里執(zhí)行、服務(wù)還是建議使用服務(wù)腳本。 
       4、設(shè)定鍵映射 
       5、啟動(dòng)虛擬終端、啟動(dòng)這個(gè)終端會(huì)調(diào)用一個(gè)叫l(wèi)ogin的程序、在虛擬終端上打印一個(gè)登錄提示符讓我們輸入 
       6、如果設(shè)備默認(rèn)級別為5的話還可以啟動(dòng)圖形終端 
       init在早期是個(gè)串型的init、或者說傳統(tǒng)意義是的init、sysV風(fēng)格的、這種程序啟動(dòng)任何服務(wù)、運(yùn)行任何程序完成系統(tǒng)初始化時(shí)統(tǒng)統(tǒng)以串型模式進(jìn)行的、所以速度非常慢、以至于后來有了并型運(yùn)行的init、啟動(dòng)速度也比較快。 
準(zhǔn)備工作: 
   前面的系統(tǒng)裁減我們說過、為了可以讓定制好的系統(tǒng)可以放到別的機(jī)器上動(dòng)行、我們要把他做到一個(gè)獨(dú)立的硬盤上去、所以首先我們在宿主機(jī)上添加一塊SCSI 的硬盤、這些步驟參考前面的博文,總結(jié)之:CentOS 6.4系統(tǒng)裁減詳解及裝載網(wǎng)卡步驟http://tanxw.blog.51cto.com/4309543/1368801、這里不再詳細(xì)說明、給出命 令、添加好后進(jìn)行分區(qū)格式化操作。    

# fdisk /dev/sdb
  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

第一步:編譯內(nèi)核或定制內(nèi)核

   1、獲取內(nèi)核程序包,可以到官網(wǎng)下載:https://www./、這里我們使用的內(nèi)核版本是3.13.6的版本: 
   解壓內(nèi)核文件、這里我們以make allnoconfig來編譯安裝、自己選擇要編譯的功能(讓確保系統(tǒng)上的編譯環(huán)境)    

# 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 把我們所需要的內(nèi)容整合進(jìn)來

   我們把這些內(nèi)容全部編譯進(jìn)內(nèi)核、不編譯成模塊、*號表示編譯進(jìn)內(nèi)核

[*]64-bit kernel :64位操作系統(tǒng)的內(nèi)核
General setup --> Local version --> -MyLinux: 給內(nèi)核定一個(gè)自己的版本
Processor type and features --> Processor family --> (X)Generic-x86-64:這里是CPU類型、這個(gè)是通用x86-64
[*]Symmetric multi-processing support:選擇CPU支持多核心處理
[*]Enable loadable module support:選擇內(nèi)核動(dòng)態(tài)模塊加載
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:支持對硬盤的驅(qū)動(dòng)
File systems --> <*>The Extended 4 (ext4) filesystem:支持文件系統(tǒng)
Executable file formats / Emulations --> [*]Kernel support for ELF binaries、[*]Write ELF core dumps with partial segments (NEW)、 <*>Kernel support for scripts starting with #!:可執(zhí)行文件的格式
Device Drivers -->Input device support --> [*]Keyboards -> <*>AT keyboard (NEW) [*]Mice:支持輸入輸出設(shè)備、比如健盤
Device Drivers > USB support  > <*>UHCI HCD (most Intel and VIA) support、<*>OHCI HCD (USB 1.1) support、<*>EHCI HCD (USB 2.0) support:USB設(shè)備驅(qū)動(dòng)
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:支持協(xié)議
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的、其他的他都去掉、這是選擇網(wǎng)卡設(shè)備的驅(qū)動(dòng)程序
[ ]Wireless:這個(gè)無線網(wǎng)、我們?nèi)サ羧?、用不?/span>

   OK、到這里保存退出、把配置文件復(fù)制一份出來、前面磁盤格式化而且都掛載好了、這里我們就把grub安裝到boot下::    

# cp .config /root/config-3.13.6-x86_64
# make bzImage
# cp arch/x86/boot/bzImage /mnt/boot/
# grub-install --root-directory=/mnt /dev/sdb

BusyBox 的誕生

BusyBox 最初是由 Bruce Perens 在 1996 年為 Debian GNU/Linux 安裝盤編寫的。其目標(biāo)是在一張軟盤上創(chuàng)建一個(gè)可引導(dǎo)的 GNU/Linux 系統(tǒng),這可以用作安裝盤和急救盤。一張軟盤可以保存大約 1.4-1.7MB 的內(nèi)容,因此這里沒有多少空間留給 Linux 內(nèi)核以及相關(guān)的用戶應(yīng)用程序使用。

BusyBox 揭露了這樣一個(gè)事實(shí):很多標(biāo)準(zhǔn) Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如 grep 和 find ) 都需要在目錄中搜索文件的代碼。當(dāng)這些工具被合并到一個(gè)可執(zhí)行程序中時(shí),它們就可以共享這些相同的元素,這樣可以產(chǎn)生更小的可執(zhí)行程序。實(shí)際 上,BusyBox 可以將大約 3.5MB 的工具包裝成大約 200KB 大小。這就為可引導(dǎo)的磁盤和使用 Linux 的嵌入式設(shè)備提供了更多功能。我們可以對 2.4 和 2.6 版本的 Linux 內(nèi)核使用 BusyBox。

BusyBox 編譯選項(xiàng)

BusyBox 包括了幾個(gè)編譯選項(xiàng),可以幫助為我們編譯和調(diào)試正確的 BusyBox。

表 1. 為 BusyBox 提供的幾個(gè) make 選項(xiàng)

make 目標(biāo)說明
help顯示 make 選項(xiàng)的完整列表
defconfig啟用默認(rèn)的(通用)配置
allnoconfig禁用所有的應(yīng)用程序(空配置)
allyesconfig啟用所有的應(yīng)用程序(完整配置)
allbareconfig啟用所有的應(yīng)用程序,但是不包括子特性
config基于文本的配置工具
menuconfigN-curses(基于菜單的)配置工具
all編譯 BusyBox 二進(jìn)制文件和文檔(./docs)
busybox編譯 BusyBox 二進(jìn)制文件
clean清除源代碼樹
distclean徹底清除源代碼樹
sizes顯示所啟用的應(yīng)用程序的文本/數(shù)據(jù)大小

在定義配置時(shí),我們只需要輸入 make 就可以真正編譯 BusyBox 二進(jìn)制文件。例如,要為所有的應(yīng)用程序編譯 BusyBox,我們可以執(zhí)行下面的命令:

$ make allyesconfig
$ make

編譯Busybox 、讓busybox提供一個(gè)sh程序、busybox可以模擬n種sh、可以模擬bash的特性、上面我們有介紹過他了。 
   到busybox官網(wǎng)下載busybox程序包:http://www.、我們這里用busybox-1.22.1版本的、 要先安裝上glibc-static 、這里我的附件提供有哦。 
   解壓到當(dāng)前目錄下就可以了:    

# yum -y install libmcrypt-devel
# rpm --install glibc-static-2.12-1.132.el6.x86_64.rpm
# tar xf busybox-1.22.1.tar.bz2
# cd busybox-1.22.1
# make menuconfig
# make
# make install

   make menuconfig時(shí)就選擇這項(xiàng)就可以了、其他的都使用默認(rèn)的吧: 
   Busybox Settings -->Build Options -->[*] Build BusyBox as a static binary (no shared libs):把busybox編譯也靜態(tài)二進(jìn)制、不用共享庫    wKiom1M-W1TzkK0pAAKOiImqTAM554.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
給grub提供一個(gè)配置文件
# vim /mnt/boot/grub/grub.conf 
default=0
timeout=5
title Mini Linux (3.13.6-MyLinux)
    root (hd0,0)
    kernel /bzImage ro root=/dev/sda2 init=/sbin/init

   給小系統(tǒng)提供一個(gè)rc.sysinit、/mnt/sysroot/etc/rc.d/rc.sysinit、如果沒有這個(gè)目錄就自己創(chuàng)建、再提供一個(gè)/mnt/sysroot/etc/fstab文件    

# 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

   # mkdir -p /mnt/sysroot/etc/rc.d/rc.sysinit

#!/bin/sh
#
打印系統(tǒng)啟動(dòng)時(shí)的歡迎信息
echo -e "\tWecome to \033[34mMini\033[0m Linux"
判斷/etc/sysroot/network是否存在并且可讀、條件成立就source進(jìn)來
[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network
判斷$HOSTNAME是否為空并且$HOSTNAME==NONE、如果為空就給個(gè)默認(rèn)值
[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME=localhost
給HOSTNAME賦值為定義好的HOSTNAME的值
/bin/hostname $HOSTNAME
掛載文件系統(tǒng)
echo "mounting proc filesystem..."
mount -t proc proc /proc
echo "mounting sysfs filesystem..."
mount -t sysfs sysfs /sys
自動(dòng)探測各硬件設(shè)備、并且能夠探測到的都裝載設(shè)備文件
mdev -s
給系統(tǒng)配置一個(gè)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表示每秒鐘傳輸?shù)乃俾?、getty是一個(gè)串型終端、他會(huì)調(diào)用一個(gè)登錄界面讓用戶輸入登錄信息進(jìn)行驗(yàn)證
tty6::askfirst:/bin/sh 啟用6個(gè)虛擬終端
console::respawn:-/bin/sh 啟用一個(gè)終端,如果出錯(cuò)重新啟動(dòng)respawn、-表示敲一回車才可以啟用sh
::ctrlaltdel:/sbin/reboot 定義組合鍵、按ctrl+alt+del就reboot
::shutdown:/bin/umount -a -r 如果要要關(guān)機(jī)就卸載已掛載的設(shè)備、然后關(guān)機(jī)

   提供系統(tǒng)用戶登錄賬號文件:    

# useradd busybox
# passwd busybox
密碼也設(shè)置為: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
提供一個(gè)登錄歡迎信息、創(chuàng)建一個(gè)issue文件
# vim /mnt/sysroot/etc/issue
MyLinux is CentOS release 6.5
Kernel \r on an \m
提供主機(jī)名
# mkdir /mnt/sysroot/etc/sysconfig
 # vim /mnt/sysroot/etc/sysconfig/network
HOSTNAME=mylinux.tanxw.com
提供命令提示符和環(huán)境變量
# 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  同步數(shù)據(jù)到磁盤中去

   到這里我們的配置算是有個(gè)大概了、那就把宿主機(jī)掛起、創(chuàng)建一個(gè)自定義虛擬機(jī)、把我們制作有系統(tǒng)的那張硬盤放到自定義的虛擬機(jī)上運(yùn)行: 
wKioL1M-XobC4l3eAAUFyd8qnoU936.jpg

   如果第一個(gè)終端登錄不了可以切換到其他終端上登錄,按ctrl+alt+F2(F3\F4\F5\F6)可以切換到不同的終端上去登錄的、這里我們登錄成功了:

wKioL1M-XuSQxTjpAAG9drsjG4Q282.jpg

wKiom1M-Xw6BgVnIAAN2Mt2ZE6I490.jpg


=================================遠(yuǎn)程登錄和ngix訪問==============================     
   OK、到這里我們自己定制的Linux可以跑起來了、接下來我們來實(shí)現(xiàn)遠(yuǎn)程登錄和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
生成兩個(gè)密鑰文件
# dropbearkey -t rsa -s 1024 -f /etc/dropbear/dropbear_rsa_host_key
# dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
驗(yàn)證一下生的這兩個(gè)文件
# ls /etc/dropbear

   2、服務(wù)腳本/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
啟動(dòng)服務(wù)并查看端口22022是否已經(jīng)處于監(jiān)聽狀態(tài)、并在本地嘗試連接登錄:
# service dropbear start
 # ss -tnl

   

   OK了、dropbear在本機(jī)安裝成功并且成功啟動(dòng)連接上去了、

wKiom1M-Ynyga0ifAAGFaoOo9hQ896.jpg

   那我們就移植到我們的定制系統(tǒng)上去吧、之前我們寫過一個(gè)腳本用來移植命令的:    

#!/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


   把這三個(gè)命令移植過去就可以了:dropbear、dropbearkey、scp、dbclient、bash、復(fù)制完后就去創(chuàng)建這個(gè)目錄/mnt/sysroot/etc/dropbear、而后為移植過去的dropbear生成兩個(gè)密鑰文件:

wKioL1M-Yoei_oTqAABV1dSQn-c398.jpg

# 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要認(rèn)證用戶、而認(rèn)證用戶要用到名稱解析、這就意味著libnss庫要復(fù)制過去、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/
# vim /mnt/sysroot/etc/nsswitch.conf
只保留以下幾項(xiàng)、其他的都不需要:
    passwd:     files
    shadow:     files
    group:      files 
    hosts:      files dns

   在用戶登錄時(shí)dropbear認(rèn)為用戶的默認(rèn)shell并不在/etc/shells下所在的用戶shell中的話、他是不允許登錄的、那我們就得給dropbear提供一個(gè)安全shell的配置文件了:    

# vim /etc/shells
/bin/sh
/bin/hush
/bin/ash
/sbin/nologin
/bin/bash

   要知道、dropbear啟動(dòng)時(shí)在/var/run/下會(huì)生成一個(gè)pid文件、而這個(gè)目錄我們還沒有創(chuàng)建、 
   # mkdir /mnt/sysroot/var/run 
   到這里我們定制的系統(tǒng)還不能遠(yuǎn)程登錄、當(dāng)你遠(yuǎn)程登錄時(shí)、所登錄的終端都是遠(yuǎn)程/dev/pts的偽終端、這個(gè)偽終端是個(gè)偽文件系統(tǒng)、只要你的內(nèi)核編譯時(shí)支持這個(gè)文件系統(tǒng)、他就可以使用、當(dāng)然、我們的目標(biāo)機(jī)上還沒有: 
  

# vim /mnt/sysroot/etc/fstab
  加一行
  devpts			 /dev/pts		  devpts  defaults		  0 0

  再創(chuàng)建/dev/pts這個(gè)目錄:
  # mkdri /mnt/sysroot/etc/profile.d
  # cp /etc/profile.d/dropbear.sh /mnt/sysroot/etc/profile.d/
  # mkdir /mnt/sysroot/dev/pts
  # sync


   OK、我們先來測試一下dropbear遠(yuǎn)程登錄看可不可以登錄得上去、把宿主機(jī)掛起或關(guān)機(jī)、啟動(dòng)我們的目標(biāo)機(jī)、由于我們的/dev/pts啟動(dòng)目標(biāo)機(jī) 時(shí)可以會(huì)重新掛載的問題、會(huì)把/dev/pts下的目錄給覆蓋掉、所以我們進(jìn)入目標(biāo)機(jī)后可以在/dev/下創(chuàng)建pts這個(gè)目錄、IP要設(shè)置在同一個(gè)網(wǎng)段 內(nèi): 
   # mkdir /dev/pts 
   # mount -a

wKiom1M-YvuzKyfOAAHAlcw4eZo106.jpg

wKioL1M-ZErxsvFvAAMwMg8Cg6w580.jpg


實(shí)現(xiàn)頁面Nginx訪問 
   這里我們用的版本是Nginx-1.4.2、這里我們以最簡單的方式進(jìn)行安裝并運(yùn)行服務(wù)起來: 
   解決依賴關(guān)系:    

# yum -y install pcre-devel
# tar xf nginx-1.4.2.tar.bz
# 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:指定錯(cuò)誤日志存放路徑
--http-log-path=/var/log/nginx/access.log:指定訪問日志
--group=nginx:以nginx用戶身份運(yùn)行、反正不要以管理員的身份去運(yùn)行
--group=nginx:nginx用戶組
其他的選項(xiàng)都是nginx默認(rèn)選項(xiàng)、我們都去掉
# make
# make install
# useradd nginx
# cd /usr/local/sbin
# ./nginx
# ss -tnl 查看80端口是否已經(jīng)處于監(jiān)聽狀態(tài)

wKioL1M-Zs2SLNHIAAGnVyXisjY011.jpg

   接著移植nginx到目標(biāo)機(jī)上去、用上面的那個(gè)復(fù)制命令的腳本: 
   # ./cpCommad.sh 
   Enter a command:nginx 
   Enter a command:consoletype 
   Enter a command:quit 
   quit!

   復(fù)制nginx下的配置文件到目標(biāo)機(jī)上、而啟動(dòng)nginx需要nginx用戶、所以用戶也得追加到passwd文件中去、而后再給nginx添加一個(gè)測試頁面就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 /usr/loca/html/index.html
<h2>Wecome to Nginx</h2>
<h3>This is MyLinux</h3>

   給nginx提供一個(gè)服務(wù)腳本 
   # 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>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   options=`$nginx -V 2>&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啟動(dòng)時(shí)需要依賴于日志目錄和pid文件目錄、所以我們要事先給nginx創(chuàng)建這兩目錄先、還給創(chuàng)建鎖文件:      

# 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、我們啟動(dòng)定制的目標(biāo)系統(tǒng)、再啟動(dòng)dropbear和nginx、而服務(wù)也可以正常啟動(dòng)了、測試我們的nginx吧、如果服務(wù)腳本使用不了那就是里 面可以有一些依賴函數(shù)或一些命令沒有全都移植到目標(biāo)機(jī)上、不過不要緊、我們可以手動(dòng)啟動(dòng)服務(wù)器、這個(gè)問題都不大、最后測試完沒什么就poweroff關(guān)機(jī) 吧、如果nginx啟動(dòng)不了就重新把文件系統(tǒng)掛載為可讀寫就OK了:# mount -o remonut,rw /wKioL1M-ZxKDrj4yAAQWzC3HPbg791.jpg
wKioL1M-ZzjzbRmCAADsps5dhXY318.jpg
結(jié)束: 
   到此我們的定制過程就全都完成了、后續(xù)如果我們還需要添加什么功能的話可以自己慢慢添加上去的哦、如果我們有個(gè)樹梅派的話可以把我們的小系統(tǒng)放到樹梅派 上去跑起來的哦、那也成了一以linux電腦了、是不是很爽呀、好吧、就這樣吧、如果大神有什么指出的話歡迎留言交流、謝謝關(guān)注了!

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲美女国产精品久久| 国产精品视频第一第二区| 蜜桃传媒视频麻豆第一区| 日韩一区中文免费视频| 国产情侣激情在线对白| 午夜小视频成人免费看| 日本少妇中文字幕不卡视频| 欧美一区二区三区五月婷婷| 国产内射在线激情一区| 日韩一区二区三区久久| 正在播放玩弄漂亮少妇高潮| 日韩一本不卡在线观看| 欧美有码黄片免费在线视频| 亚洲日本韩国一区二区三区| 好骚国产99在线中文| 日本久久精品在线观看| 国产又粗又猛又大爽又黄| 日本国产欧美精品视频| 日韩中文字幕欧美亚洲| 99久久免费中文字幕| 日本欧美在线一区二区三区| 国产精品香蕉在线的人| 欧美日韩黑人免费观看| 日韩人妻少妇一区二区| 国产无摭挡又爽又色又刺激| 国产免费一区二区三区av大片| 蜜桃传媒视频麻豆第一区| 欧美日韩综合综合久久久| 国产欧美亚洲精品自拍| 国产乱久久亚洲国产精品| 九九九热在线免费视频| 成人亚洲国产精品一区不卡 | 人妻少妇av中文字幕乱码高清| 日韩一区二区三区在线欧洲| 欧美一区二区不卡专区| 国产永久免费高清在线精品| 中国美女草逼一级黄片视频| 成人精品亚洲欧美日韩| 欧美日不卡无在线一区| 欧美一区二区在线日韩| 国产精品视频久久一区|