歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

使用kernel編譯+busybox定制Linux系統

在運維工作中很多時候我們需要裁剪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
Copyright © Linux教程網 All Rights Reserved