在運維工作中很多時候我們需要裁剪Linux系統,減少系統性能的消耗,提升系統服務的性能,以往通過光盤安裝的Linux都是比較臃腫的,但出現這樣的需求後,我可以對Linux進行重新編譯再busybox工具移植即可實現,接下來我們一步一步實現kernel編譯+busybox定制Linux系統--實現ssh遠程登錄+web服務:
實現過程如下:
一.規劃子主機的磁盤存儲規劃1.添加一個大小為10G的硬盤
2.查詢系統硬件信息參數:
# lspci
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10)
00:0f.0 VGA compatible controller: VMware SVGA II Adapter
00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
#在真實生產環境中執行內核編譯之前我們必須了解系統硬件參數信息。
3.分區格式化掛載以及安裝grub
創建3個分區大小為:50M 512M 256M(swap)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1305, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +50M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (8-1305, default 8):
Using default value 8
Last cylinder, +cylinders or +size{K,M,G} (8-1305, default 1305): +512M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (74-1305, default 74):
Using default value 74
Last cylinder, +cylinders or +size{K,M,G} (74-1305, default 1305): +256M
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 82
Changed system type of partition 3 to 82 (Linux swap / Solaris)
格式化分區
# mke2fs -t ext4 /dev/sdb1
# mke2fs -t ext4 /dev/sdb2
# mkswap /dev/sdb3
創建掛載目錄並掛載
# mkdir -p /mnt/{boot,sysroot}
# mount /dev/sdb1 /mnt/boot/
# mount /dev/sdb2 /mnt/sysroot/
# cd /mnt/sysroot/
# mkdir -p etc/rc.d/init.d bin sbin root home dev proc sys lib lib64 var/log usr/{local,share,lib64} boot etc/sysconfig media mnt tmp
安裝grub
# grub-install --root-directory=/mnt/ /dev/sdb
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt//boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
驗證bootloader是否安裝成功
# cd /mnt/boot/
# ls
grub lost+found
有以上文件證明安裝成功。
二.內核編譯環境的配置以及下載內核源碼包至系統中編譯內核1.yum安裝編譯環境開發組包# yum -y groupinstall "Development tools"
2.防止在編譯安裝配置.config
文件時無法啟用tui界面,同時也要安裝ncurses
,以及ncurses-devel
# yum -y install ncurses-devel
3.解壓內核源碼至/usr/src目錄並且創建軟連接為linux,方便後期編譯使用# tar xf linux-3.13.6.tar.xz -C /usr/src/
# cd /usr/src/
# ln -sv linux-3.13.6 linux
`linux' -> `linux-3.13.6'
# cd linux
4.清空內核編譯所有配置選擇# make allnoconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
scripts/kconfig/conf --allnoconfig Kconfig
#
# configuration written to .config
#
5.編譯內核選擇配置# make menuconfig
內核編譯選項介紹:1.第【1】項,此項設置該系統為64位的操作系統(此項必須選擇,如果編譯32位系統,那麼庫文件可能會出現不兼容的現象)2.第【2】項,為通用設置選擇並進入進行配置,配置如下:
選項1表示自定義系統內核的名稱,(回車後就可以進入設置了,我定義了opensamlee-201109)
選項2表示支持進程間通信。這個也是必須開啟的3.第【3】項,為啟動加載模塊支持選項。進入並且選擇。相應選項。選項如下:
意思是支持模塊卸載以及強制卸載模塊(這裡解釋一下,為什麼要支持這個功能,我們明明都是將所有功能都直接配置到了內核為什麼還要啟動這個模塊功能呢,答案是為了以後可以更好的擴展,假如有新的硬件添加進來呢,那我們豈不是有點難為自己了,又要重新編譯內核一遍)4.[b]第【4】項,此項表示開啟塊設備支持,此項默認打開。其他版本的內核源碼默認沒有打開,需要自己打開。不然的話,無法支持塊存儲設備。比如我們接下來要設置的scsi接口的塊存儲設備。[/b]
[b]5.[b]第【5】項,此項表示選擇cpu的架構以及調整一些cpu的參數。[/b][/b]
[b][b]
[/b][/b]
選項1是開啟對稱多處理器支持選項2是cpu的型號品牌選擇進入選擇如下圖,表示cpu是AMD系列的,如果不清楚cpu類型及品牌就可以選擇"Generic-x86-64" (操作系統版本為:64所示)選項3是第一項一旦開啟此項就會默認開啟,此項便是開啟多核心調度6.第【6】項是總線支持的配置選擇並進入
這3項分別代表的意思是,開啟pci總線支持,開啟pci-e的支持7,第【7】項,表示默認可執行文件的格式。(這項很重要,不開啟那麼就ELF二進制程序就不支持)
## 主要選擇這三項,如果選擇第一項,默認第二項會被選擇
## 第一項和第二項表示內核支持ELF二進制可執行程序,
## 第三項,(這個很重要)這個表示支持以#!開頭腳本文件。
## 其實就是shell腳本。沒有選擇這個,你的腳本寫出來,內核無法解釋。8.第【8】項,表示網絡功能的開啟。這項是支持網絡功能的必備選項。
第1項,是網絡功能的選項,等會進入進行設置,主要是開啟tcp/ip的支持。
第2項,這個無線網的支持,默認是開啟的,但是我們要把它關閉,因為咱們這個是虛擬機,沒有無線網卡,開啟這個選項,很增加編譯負擔,既然是最小化編譯,那麼就應該只買合用的不買沒有的。
進入第一項的二級子目錄,開始配置tcp/ip的支持。
選項1:開啟基於UNIX域的進程通信。不同主機進程利用tcp/ip 來支持通信,而內部則是利用UNIX domain來實現。選項2:開啟tcp/ip networking網絡支持。選項3:開啟路由擴展支持選項4:是對路由擴展功能的設置,這裡我們選擇的是,支持策略路由。選項5:在內核上支持,網絡屬性的自動配置,旗下有很多的子選項,可以看見,dhcp協議,bootp協議的支持。
選項6:開啟tcp syn的支持選項7:關閉ipv6協議支持9.第【9】項,配置內核支持各種硬件設備。選項應用介紹:選項1:通用設置進入後如下所示:
選項1:自動生成設備文件,在內核掛載根文件系統之後,同時掛載設備文件系統到/dev目錄下。[b][b]選項2:開啟支持scsi設備的支持,進入選項後如下:[/b][/b]
[b]
[/b]
[b]選項3:開啟對 Fusion MPT設備的支持,這主要是對scsi硬盤一些功能上的支持。[/b]
[b]
[/b]
表示支持主機驅動的spi。以及[b]啟用Fusion MPT logging facility"。MPT代表"Message Passing Technology"(消息傳遞技術)。Fusion驅動是由LSI Logic公司開發。MPT一種進程間使用的特定消息策略。[/b]
選項4:主要是網絡設備的支持。選擇進入,關閉wireless,只選擇以太網設備的驅動,選擇如下:
[b]選項5:主要是輸入設備的設備配置。[/b]
[b]
[/b]
[b][b][b][b]選項6:[/b]主要是usb接口的設置[/b][/b][/b]
[b][b]
[/b][/b]
[b][b][b]10.第【10】項,這是開啟內核對於文件系統的支持。[/b][/b][/b]
[b][b][b]
[/b][/b][/b]
[b][b][b][b]到此內核編譯的配置過程已經好了![/b][/b][/b][/b]
開始編譯過程:# make bzImage #只編譯核心
配置子主機配置文件:# cp arch/x86/boot/bzImage /mnt/boot/ #把內核復制到boot目錄下
# cd /mnt/boot/grub/ #建立grub配置文件
# vim grub.conf
default=0
timeout=3
title opensamlee-201109
root (hd0,0)
kernel /bzImage ro root=/dev/sda2
三,編譯busybox,以及提供系統正常運行的一些配置文件,運行子linux系統:安裝配置編譯環境,這裡需要glibc-static包的支持,還有libmcrpt-devel的支持,以及下載busybox解壓源碼包
實現過程如下:
# yum -y install libmcrypt-devel glibc-static
# tar xf busybox-1.22.1.tar.bz2 -C /usr/src/
# cd /usr/src/busybox-1.22.1/
# make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
#只要配置這一項就可以了,其他的都不要動。這個表示編譯成靜態可執行程序,
#簡單說就是不需要依賴系統上的#一些庫,因為我們是最小化的系統,
#這個系統很多庫文件是沒有的。如果不設置這個選項,依賴動態庫的話,這
#個程序很有可能因為系統上缺少某類庫而無法正常運行,甚至是不能運行。
# make && make install
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
-------------------------------------
#以上表示編譯成功
# cp -a -d _install/* /mnt/sysroot/
# cd !$
# ls
bin linuxrc lost+found sbin usr
# rm -f linuxrc
#因為這是鏈接文件,在sbin目錄下,有個init文件同樣也是鏈接指向busybox的,
#所以這個不需要。我們只需要init就可以做系統啟動時所要的文件了。
# vim /mnt/boot/grub/grub.conf #開始測試一下busybox是否可用
timeout 5
default 0
title T800-kernel.1.version
root (hd0,0)
kernel /bzImage ro root=/dev/sda2 init=/sbin/init
#sync;sync;sync;sync
#同步文件到磁盤上
掛起主機,啟動子主機測試:
子主機啟動結果如下:
##基本的命令都可以使用,ls,ifconifg,等等常用命令都是可以的了。說明我們的busybox已經可以使用了,但是執行ifconfig的時候出現了一個錯誤,這是網絡設備在內核中沒有生成,後面我們會設置通過mdev -s來自動生成設備文件。
接下來我們通過創建系統配置文件:grub.conf,fstab,inittab,rc.d/rc.sysinit,完善子系統功能:編輯grub.conf的文件去掉init這個選項,再編寫了rc.sysinit初始化腳本程序
:[root@mysql etc]# vim /mnt/boot/grub/grub.conf
default=0
timeout=3
title opensamlee-201109
root (hd0,0)
kernel /bzImage ro root=/dev/sda2 quiet # 去掉init選項利用下面的rc.sysinit來初始化,加上quiet減少初始化信息輸出
# 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 "\tWelcome to \033[34mopensamlee Mini System\033[0m Linux"
echo "mounting sysfs filesystem....."
mount -n -o remount,rw /dev/sda2 /
echo "mounting proc filesystem....."
mount -t proc proc /proc
echo "mounting sysfs filesystem....."
mount -t sysfs sysfs /sys
mdev -s # 自動生成設備文件
ifconfig lo 127.0.0.1
ifconfig eth0 172.16.100.8
mount -a
mount
# chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit #賦予執行權限
創建系統初始化配置inittab文件:
# vim /mnt/sysroot/etc/inittab
::sysinit:/etc/rc.d/rc.sysinit
console::respawn:-/bin/sh
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
創建腳本復制程序命令腳本,用於復制命令至子系統中:
腳本內容如下:
[root@localhost ~]# vim bincp.sh
#!/bin/bash
#
target=/mnt/sysroot
clearCmd() {
if which $cmd &> /dev/null; then
cmdPath=`which --skip-alias $cmd`
else
echo "No such command"
return 5
fi
}
cmdCopy() {
cmdDir=`dirname $1`
[ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
[ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}
libCopy() {
for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
libDir=`dirname $lib`
[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
[ -f ${target}${lib} ] || cp $lib ${target}${libDir}
done
}
while true; do
read -p "Enter a command: " cmd
if [ "$cmd" == 'quit' ] ;then
echo "quit"
exit 0
fi
clearCmd $cmd
[ $? -eq 5 ] && continue
cmdCopy $cmdPath
libCopy $cmdPath
done
# ./bincp.sh #這是一個腳本程序,這個程序的功能是復制可執行程序同時也會復制依賴
Enter a command: bash #bash的庫
Enter a command: quit #這裡表示移植bash程序。busybox裡面是沒有bash的但是兼容bash
#默認支持的是ash,所以bash還是要移植的。
檢測子主機使用環境是否有錯誤:
# chroot /mnt/sysroot/
bash-4.1# pwd
/
bash-4.1# ls
bin dev home lib64 media proc sbin tmp var
boot etc lib lost+found mnt root sys usr
bash-4.1# ifconfig
ifconfig: /proc/net/dev: No such file or directory
eth0 Link encap:Ethernet HWaddr 00:0C:29:23:35:1B
inet addr:172.16.100.7 Bcast:172.16.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
bash-4.1# exit
exit
#以上檢測無錯誤顯示,說明是正常的!
啟動子主機,如下所示:
看到此景,證明我們已經完成了一個簡單Linux系統定制了!嘻嘻編譯安裝dropbear提供遠程ssh登錄方式[b]1.實現ssh登錄的前提,你最起碼要支持本地登錄吧。所以首先得實現本地登錄。配置如下:[/b]
[b]#創建用戶數據庫文件:passwd,密碼影子文件:shadow,用戶組文件:group[/b]
# touch /mnt/sysroot/etc/{passwd,shadow,group}
# vim /mnt/sysroot/etc/passwd
root:x:0:0:root:/root:/bin/bash
opensamlee:x:500:500:samlee test:/home/samlee:/bin/bash
#生成用戶密碼
# openssl passwd -1 -salt `openssl rand -hex 4`
Password:
$1$c4a375d4$e53cXyHuwv4E3O.MI07de0
# openssl passwd -1 -salt `openssl rand -hex 4`
Password:
$1$44b86f2b$8FzshSRcyoI9RtOZsmvL/.
# vim /mnt/sysroot/etc/shadow
root:$1$c4a375d4$e53cXyHuwv4E3O.MI07de0:16690:0:99999:7:::
opensamlee:$1$44b86f2b$8FzshSRcyoI9RtOZsmvL/.:16990:0:99999:7:::
# chmod go= /mnt/sysroot/etc/shadow
# vim /mnt/sysroot/etc/group
root:x:0:
opensamlee:x:500
# vim /mnt/sysroot/etc/sysconfig/network #設置主機名
HOSTNAME=www#samlee#com # #號代表.
# vim /mnt/sysroot/etc/inittab #添加控制台程序
::sysinit:/etc/rc.d/rc.sysinit
::respawn:/sbin/getty 19200 tty1 #必須調用getty實現login登錄。
::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
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
設置PS1變量,顯示開機提示符歡迎信息,在命令行顯示主機名:
# vim /mnt/sysroot/etc/profile
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PS1='[\u@\h \W]\$'
-------------------------------------------------------------------------------
# vim /mnt/sysroot/etc/issue
OpenSamlee Mini System(201109)
Kernel \r on an \m
Welcome to my Opensamlee Home!!
--------------------------------------------------------------------------------
# vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/sh
#
echo -e "\tWelcome to \033[34mopensamlee Mini System\033[0m Linux"
echo "mounting sysfs filesystem....."
mount -n -o remount,rw /dev/sda2 /
echo "mounting proc filesystem....."
mount -t proc proc /proc
echo "mounting sysfs filesystem....."
mount -t sysfs sysfs /sys
mdev -s
ifconfig lo 127.0.0.1
ifconfig eth0 172.16.100.8
mount -a
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && hostname localhost || hostname $HOSTNAME
#倒數一二行表示,開機讀取主機名的腳
掛起宿主機,啟動子主機,第1個tty1無法登錄,我們需要切換其他tty登錄:實現登陸了,但是有個報錯,I have no name,剛才我已經在network中設置了主機名,怎麼會沒有呢?其實是我們登陸使用的是bash,bash是利用nsswitch來進行用戶名對應UID實現名稱解析,busybox弄人支持shell是ash,我們卻換至ash環境:
接下來我們給bash提供依賴名稱解析功能,補充缺少的名稱解析庫,通過bash的nsswitch實現主機名解析功能:
# cp -d /lib64/libnss* /mnt/sysroot/lib64/
# cp -d /usr/lib64/libnss* /mnt/sysroot/usr/lib64/
# ls /mnt/sysroot/usr/lib64/ /mnt/sysroot/lib64/
/mnt/sysroot/lib64/:
ld-linux-x86-64.so.2 libnss_compat.so.2 libnss_files.so.2 libnss_nisplus-2.12.so libnss_winbind.so.2
libc.so.6 libnss_dns-2.12.so libnss_hesiod-2.12.so libnss_nisplus.so.2 libnss_wins.so.2
libdl.so.2 libnss_dns.so.2 libnss_hesiod.so.2 libnss_nis.so.2 libtinfo.so.5
libnss_compat-2.12.so libnss_files-2.12.so libnss_nis-2.12.so libnss_sss.so.2
/mnt/sysroot/usr/lib64/:
libnss3.so libnss_compat.so libnss_files.so libnsspem.so libnss_wins.so
libnssckbi.so libnssdbm3.chk libnss_hesiod.so libnsssysinit.so
libnss_compat_ossl.so.0 libnssdbm3.so libnss_nisplus.so libnssutil3.so
libnss_compat_ossl.so.0.0.0 libnss_dns.so libnss_nis.so libnss_winbind.so
# cp /etc/nsswitch.conf /mnt/sysroot/etc/
為用戶提供家目錄:
# mkdir /mnt/sysroot/home/samlee
掛起主機,啟動子主機:
到此為止說明我們已經成功實現Linux本地登錄了。
編譯安裝dropbear
安裝:
# wgethttp://matt.ucc.asn.au/dropbear/releases/dropbear-2013.58.tar.bz2 # tar xf dropbear-2013.58.tar.bz2
# cd dropbear-2013.58
# ./configure
# make PROGRAMS="dropbear dbclient dropbearkey scp"
# make PROGRAMS="dropbear dbclient dropbearkey scp" install
生成dropbear密鑰文件
# mkdir /etc/dropbear
# dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
#生成私鑰信息
# dropbearkey -t rsa -s 2048 -f /etc/dropbear/dropbear_rsa_host_key
#生成公鑰信息
測試dropbear是否可以啟動
[root@iptablesrouter ~]# dropbear -p 22022 -F -E #開啟程序然後在前台監測運行信息
[31503] Apr 25 15:39:43 Not backgrounding #標准輸出在前台監聽22022端口
[31507] Apr 25 15:40:03 Child connection from 172.16.0.1:57811
[31507] Apr 25 15:40:14 Password auth succeeded for 'root' from 172.16.0.1:57811
# ss -tnl | grep 22022 #端口監聽正常
LISTEN 0 20 :::22022 :::*
LISTEN 0 20 *:22022 *:*
移植dropbear至子主機:
# ./bincp.sh
Enter a command: dropbear
Enter a command: dropbearkey
Enter a command: dhclient
Enter a command: quit
# cp /usr/local/bin/scp /mnt/sysroot/usr/local/bin/
# mkdir /mnt/sysroot/etc/dropbear
# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key
# dropbearkey -t rsa -s 2048 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key
# mkdir /mnt/sysroot/var/run #創建dropbear運行時生成的pidfile存放的目錄
# vim /mnt/sysroot/etc/shells #因為dropbear在登錄的時候會檢查合法shell
/bin/ash
/bin/bash
/bin/hush
/sbin/nologin
/bin/sh
##dropbear是需要nsswitch支持,因為前面我們已經移植nsswitch依賴庫及配置文件。
# tty
/dev/pts/5 #遠程登錄的會在/dev/pts下生成以數字命名的偽終端設備,現在需要實現該功能。
# vim /mnt/sysroot/etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts defaults 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 swap swap defaults 0 0
#默認情況下/dev/pts不存在的,在系統初始化時mdev -s 後讓其生成此目錄。
修改系統初始化配置文件--添加mkdir /dev/pts:
# vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/sh
#
echo -e "\tWelcome to \033[34mopensamlee Mini System\033[0m Linux"
echo "mounting sysfs filesystem....."
mount -n -o remount,rw /dev/sda2 /
echo "mounting proc filesystem....."
mount -t proc proc /proc
echo "mounting sysfs filesystem....."
mount -t sysfs sysfs /sys
mdev -s
mkdir /dev/pts
ifconfig lo 127.0.0.1
ifconfig eth0 172.16.100.8
mount -a
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && hostname localhost || hostname $HOSTNAME
for i in /etc/rc.start/*;do
$i start
done #開機初始化基本程序
復制函數庫:
# cp /etc/init.d/functions /mnt/sysroot/etc/rc.d/init.d/
# mkdir /mnt/sysroot/etc/init.d/
創建dropber啟動腳本程序。
# vim /mnt/sysroot/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
賦予腳本執行權限,創建dropbear程序配置文件:
# chmod +x /mnt/sysroot/etc/rc.d/init.d/dropbear
dropbear配置文件:
# vim /mnt/sysroot/etc/sysconfig/dropbear
keysize=2048
port=22
創建鏈接系統配置文件鏈接:
# cd /mnt/sysroot/etc/init.d/
# cp /etc/rc.d/init.d/functions /mnt/sysroot/etc/rc.d/init.d/
# mkdir /mnt/sysroot/etc/rc.d/rc3.d
# cd /mnt/sysroot/etc/rc.d/rc3.d
# ln -sv ../init.d/dropbear S70dropbear
# cd /mnt/sysroot/etc/rc.d/
# ln -sv init.d/dropbear dropbear.start
# ln -sv init.d/dropbear dropbear.stop
------------------------------------------------------------------------------------------
# vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/sh
#
echo -e "\tWelcome to \033[34mopensamlee Mini System\033[0m Linux"
echo "mounting sysfs filesystem....."
mount -n -o remount,rw /dev/sda2 /
echo "mounting proc filesystem....."
mount -t proc proc /proc
echo "mounting sysfs filesystem....."
mount -t sysfs sysfs /sys
mdev -s
mkdir /dev/pts
ifconfig lo 127.0.0.1
ifconfig eth0 172.16.100.8
mount -a
mount -n -o remount,rw /
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && hostname localhost || hostname $HOSTNAME
/etc/rc.d/*.start start
------------------------------------------------------------------------------------------
# vim /mnt/sysroot/etc/rc.d/rc.sysdown
#!/bin/sh
#
sync
sleep 2
sync
/etc/rc.d/*.stop stop
/bin/umount -a -r
poweroff
# chmod +x /mnt/sysroot/etc/rc.d/rc.sysdown
-----------------------------------------------------------------------------------------
# vim /mnt/sysroot/etc/inittab
::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
::ctrlaltdel:/bin/reboot
::shutdown:/etc/rc.d/rc.sysdown
dropbear開機自動啟動設置成功,這樣的話我們開機就可以直接使用ssh連接子主機。實現子主機nginx服務web功能首先配置好/mnt/sysroot/etc/rc.d/rc.sysinit文件如下:# vim /mnt/sysroot/etc/rc.d/rc.sysinit
#!/bin/sh
#
echo -e "\tWelcome to \033[34mopensamlee Mini System\033[0m Linux"
echo "mounting sysfs filesystem....."
mount -n -o remount,rw /dev/sda2 /
echo "mounting proc filesystem....."
mount -t proc proc /proc
echo "mounting sysfs filesystem....."
mount -t sysfs sysfs /sys
mdev -s
mkdir /dev/pts
ifconfig lo 127.0.0.1
ifconfig eth0 172.16.100.8
mount -a
mount -n -o remount,rw /
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && hostname localhost || hostname $HOSTNAME
for i in /etc/rc.d/*.start;do
$i stop
sleep 1
done
for i in /etc/rc.d/*.start;do
$i start
sleep 1
done
編譯安裝nginx# yum -y install pcre-devel
# tar xf nginx-1.4.7.tar.gz
# groupadd -r nginx
# useradd -r -g nginx nginx
# cd nginx-1.4.7
# ./configure --prefix=/usr/local --conf-path=/etc/nginx/nginx.conf --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
# make && make install
# /usr/local/sbin/nginx #啟動nginx程序
# ss -tnl | grep 80 #查看監聽端口
移植nginx至子主機# cp -r /etc/nginx/ /mnt/sysroot/etc/
# cp -r /usr/local/nginx/ /mn
# sync
# 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
# mkdir /mnt/sysroot/var/log/nginx/
# mkdir /mnt/sysroot/usr/local/logs/
# mkdir /mnt/sysroot/var/lock/subsys/
# vim /mnt/sysroot/usr/local/html/index.html
<h1>Welcome to my opensamlee home!!</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>&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
# chmod +x /mnt/sysroot/etc/rc.d/init.d/nginx #給腳本賦予執行權限
# cd /mnt/sysroot/etc/rc.d/
# ln -sv init.d/nginx nginx.start
# ln -sv init.d/nginx nginx.stop
# cd /mnt/sysroot/etc/rc.d/
# ln -sv init.d/nginx nginx.start
# ln -sv init.d/nginx nginx.stop
# ./bincp.sh
Enter a command: nginx
Enter a command: consoletype
以上步驟完成後,我們掛起主機,開啟子主機瞧瞧:
我們可以看到dropbear和nginx服務都已經啟動了
測試如下:以上是使用kernel編譯+busybox定制Linux系統--實現ssh遠程登錄+web服務的迷你主機所有內容還可以移植至樹莓派中使用的啊!嘻嘻本文出自 “Opensamlee” 博客,請務必保留此出處http://gzsamlee.blog.51cto.com/9976612/1768791