淺談編譯kernel+busybox構建擁有遠程ssh登錄和web功能最小linux系統(二)

忘了介紹本文的源碼的版本了

dropbear-2013.58.tar.bz2   

busybox-1.21.1.tar.bz2

linux-3.13.6.tar.xz 

nginx-1.4.7

基于上文,我們還差group文件沒有寫

root@mysql etc]# vi group 
root:x:0:
mayershi:x:500:    #不解釋,你懂的。

我們已經解決了本地登錄的問題。要想模仿的更像我們要設置一下,

PS1的變量還有,以及主機名和用戶支持上,不知道的可以腦補。

[root@mysql etc]# echo "export PS1=$PS1" > /mnt/sysroot/etc/profile 
[root@mysql etc]# cat profile 
export PS1=[\u@\h \W]\$                #此段結束表示開機時自動加載PS1的變量到環境變量中

[root@mysql etc]# vi rc.d/rc.sysinit 
[root@mysql etc]# cat !$
cat rc.d/rc.sysinit
#!/bin/bash
#
mount -n -o remount,rw /dev/sda2 /
mount -a
mdev -s
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && hostname localhost || hostname $HOSTNAME
#倒數一二行表示,開機讀取主機名的腳本,程序,不解釋,我想應該能看的懂。

成功上圖。

QQ截圖20150920164011.png

唉,可以實現登錄了把,但是居然爆出一個錯誤,I have no name! 我們明明已經設置了啊,

為什么沒有呢。其實我們用的bash,bash是利用nsswitch來進行用戶名對應UID實現名稱解析

的。但是你還記得,我們之前提到的,busybox默認的shell是ash。我們切換成ash試試。o

QQ截圖20150920164414.png

bingo,成功的解決了。其實是bash依賴名稱解析功能,而我們又缺少名稱解析的庫。所以bash

也就無能為力的給你爆出一個他沒有名字的名字了。接下來我們開始著手解決bash的nsswitch的問題,

讓其能夠實現有 name的功能。

[root@mysql sysroot]# mkdir /mnt/sysroot/usr/lib64
[root@mysql sysroot]# cp -a -d /lib64/libnss_files* lib64/
[root@mysql sysroot]# cp -a -d /usr/lib64/{libnss_files.so,libnss3.so,\
libnssutil3.so,libnsssysinit.so,libnsspem.so} usr/lib64/
[root@www sysroot]# ls lib64/
ld-linux-x86-64.so.2  libcap.so.2  libnss_files-2.12.so  librt.so.1
libacl.so.1           libc.so.6    libnss_files.so.2     libselinux.so.1
libattr.so.1          libdl.so.2   libpthread.so.0       libtinfo.so.5
###以上都是nss所依賴的庫文件
[root@www sysroot]# ls usr/lib64/
libnss3.so  libnsspem.so  libnsssysinit.so  libnssutil3.so #第一個是nss的核心文件,其余的三個
是nss自帶的常用工具。
[root@www sysroot]# cp /etc/nsswitch.conf /mnt/sysroot/etc/
##nss的配置文件,其實不用這個也行。我沒有移植,寄生機也是可用的我不知道原因,但是大家最
#好別這么干。還是復制過來的好。以防出現其他的不知名錯誤。

QQ截圖20150920172254.png

顯然已經ok了。bash也是支持的名稱解析了。(注意不要用第一虛擬終端登錄,容易卡住,目前不知道什么原因。通過ctrl+alt+f[2~6])

到此為止,我們實現了本地登錄的功能,接下來可以開始對ssh登錄的支持了。

編譯安裝dropbear

 安裝到此結束

[root@mysql ~]# tar xf dropbear-2013.58.tar.bz2 -C /usr/src
[root@mysql ~]# cd /usr/src/dropbear-2013.58/
[root@mysql dropbear]# ./configure 
[root@mysql dropbear]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
[root@mysql dropbear]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

生成密鑰文件

[root@mysql dropbear]# dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key  
#生成私鑰信息
[root@mysql dropbear]# dropbearkey -t rsa -s 2048 -f /etc/dropbear/dropbear_rsa_host_key
#生成公鑰信息

測試dropbear是否可以啟動和正常使用

[root@mysql dropbear]# dropbear -p 22022 -F -E   #開啟程序然后在前臺運行信息是
[6646] Sep 20 19:38:53 Not backgrounding         #標準輸出在前臺監聽22022端口
[6659] Sep 20 19:40:15 Child connection from 192.168.199.1:59998
[6659] Sep 20 19:40:24 Password auth succeeded for 'root' from 192.168.199.1:59998
檢測端口監聽狀態
[root@mysql dropbear]# ss -tnl | grep 22022  #已經監聽了
LISTEN     0      20                       :::22022                   :::*     
LISTEN     0      20                        *:22022                    *:*   
[C:\Users\Mayershi]$ ssh 192.168.199.137 22022 #可以看見已經可以登錄了
Connecting to 192.168.199.137:22022...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

現在可以開始進行該程序的移植了。

[root@mysql ~]# bash bincp.sh 
Plz enter a command: dropbear
Plz enter a command: dropbearkey
Plz enter a command: dhclient
Plz enter a command: quit
[root@mysql ~]# cp /usr/local/bin/scp /mnt/sysroot/usr/local/bin/
[root@mysql ~]# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key
[root@mysql ~]# dropbearkey -t rsa -s 2048 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key
[root@mysql sysroot]# mkdir var/run #創建dropbear運行是pidfile存放的目錄

[root@mysql sysroot]# vim etc/shells #因為dropbear在登錄的時候會檢查合法shell
/bin/ash                             #,合法shell需要定義
/bin/bash
/bin/hush
/sbin/nologin
/bin/sh

#還要注意的是dropbear是需要nsswitch支持的,因為我們之前已經移植了nsswitch所以這里
#我們就沒有在做演示了

[root@mysql sysroot]#tty
/dev/pts/0 #遠程登錄的會在/dev/pts/下生成一以數字命名的偽終端設備,我們也要實現這個功能
[root@mysql sysroot]# vi etc/fstab   
/dev/sda2 / ext4 defaults 0 0        
/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/pts默認是沒有的,所以我們在系統初始化,mdev -s后讓其生成這個目錄。
然后掛載這個目錄,接下來開始著手添加這個功能。
[root@mysql sysroot]# vi etc/rc.d/rc.sysinit 
#!/bin/bash
#
mount -n -o remount,rw /dev/sda2 /
mdev -s         #生成設備文件
mkdir /dev/pts  #這時候創建這個目錄,因為他是偽文件系統,所以系統關閉后就會消失
mount -a        #然后執行掛載所有文件系統,注意一下順序,不注意也沒有大問題
[ -r /etc/sysconfig/network ] && source /etc/sysconfig/network
[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && hostname localhost || hostname $HOSTNAME 
ifconfig lo 120.0.0.1 netmask 255.0.0.1
ifconfig eth0 192.168.199.55 netmask 255.255.255.0  #初始化時配置lo文件
for i in /etc/rc.start/*; do
		$i start
done   #開機初始化,基本程序。

但是需要開機啟動的腳本程序。以及支持開機自啟動。

[root@mysql etc]# mkdir /mnt/sysroot/etc/init.d
[root@mysql etc]# vim /mnt/sysroot/etc/init.d/dropbear
#!/bin/bash
#
dbprog='/usr/local/sbin/dropbear'
dbkeygen='/usr/local/bin/dropbearkey'
dsskey='/etc/dropbear/dropbear_dss_host_key'
rsakey='/etc/dropbear/dropbear_rsa_host_key'
rsakeysize=2048
dbport=22

gendsskey() {
	if [ ! -f $dsskey ]; then
		echo "Generating dss key file."
		[ -d /etc/dropbear ] || mkdir /etc/dropbear
		$dbkeygen -t dss -f $dsskey
	fi
}

genrsakey() {
	if [ ! -f $rsakey ]; then
	echo "Generating rsa key file."
	[ -d /etc/dropbear ] || mkdir /etc/dropbear
	$dbkeygen -t rsa -s $rsakeysize -f $rsakey
				fi
}

start() {
gendsskey
genrsakey

if ! pidof dropbear &> /dev/null; then
echo "Starting dropbear"
$dbprog -p $dbport
retval=$?
else
echo "$dbprog is already running..."
return 1
fi
				
if [ $retval -eq 0 ]; then
	echo "OK"
	return 0
else
	echo "Failure"
return 1
fi
}

stop() {
	echo "stopping dropbear"
				
	if pidof dropbear &> /dev/null; then
		echo "stopping dropbear"
			killall dropbear
			retval=$?
	else
		echo "$dbprog is not running..."
			return 1
			fi	
	}

restart() {
	stop
	sleep 1
	start
}

usage() {
	echo "Usage: `basename $0` {start|stop|restart}"
}

case $1 in 
start)
	start
	;;
stop)
	stop
	;;
restart)
	restart
	;;
	*)
usage
	;;
esac
[root@mysql etc]# mkdir rc.start
[root@mysql etc]# mkdir rc.stop
[root@mysql etc]# cd rc.start/
[root@mysql rc.start]# ln -sv ../init.d/dropbear 01dropbear
[root@mysql rc.stop]# ln -sv  ../init.d/dropbear  kdropbear
#需要注意的是利用相對路徑,不要使用絕對路徑
[root@mysql etc]# vi rc.d/rc.sysinit #在原來的基礎上添加如下內容
for i in /etc/rc.start/*; do
		$i start
done
[root@mysql etc]# vim inittab #修改最后一行
::shutdown:/etc/rc.d/rc.sysdown
[root@mysql etc]#chmod +x rc.d/rc.sysdown

到此我們已經dropbear遠程登錄已經搞定嗎?其實還沒有

掛起宿主機,開啟另一臺機器。

[C:\Users\Mayershi]$ ssh root@192.168.199.55
Connecting to 192.168.199.55:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Connection closed by foreign host.
#會爆出客戶端這個錯誤

我們開始查看服務器日志

QQ截圖20150921084813.png

這個錯我也無法理解。但是我想到了解決辦法。

#首先在這臺啟動的機器實施本地登錄然后passwd重新修改下密碼就可以了
[root@mysql ~]#passwd                                                       
Changing password for root
New password: 
Retype password: 
Password for root changed by root

QQ截圖20150921113353.png

然后就可以實現本地登錄了。到此解決了,ssh遠程登錄的問題。



最后一步了實現nginx的web功能

[root@mysql ~]# tar xf nginx-1.4.7.tar.gz -C /usr/src/
[root@mysql ~]# cd /usr/src/nginx-1.4.7
[root@mysql nginx-1.4.7]# useradd -m -s /sbin/nologin nginx 
[root@mysql nginx-1.4.7]# ./configure --user=nginx --group=nginx --conf-path=\
/etc/nginx/nginx.conf --without-pcre --without-http_rewrite_module
[root@mysql nginx-1.4.7]# make && make install
[root@mysql nginx-1.4.7]# /usr/local/nginx/sbin/nginx #開啟nginx
[root@mysql nginx-1.4.7]# ss -tnl
State  Recv-Q Send-Q Local Address:Port Peer Address:Port 
LISTEN   0  128  :::52672  :::*     
LISTEN   0   50  *:3306    *:*     
LISTEN   0  128  :::111    :::*     
LISTEN   0  128  *:111     *:*     
LISTEN   0  128  *:80      *:*  #端口已經打開   
LISTEN   0  128  :::22     :::*

QQ截圖20150921122242.png

ok了,接下來開始進行移植。

[root@mysql nginx-1.4.7]# cp -r /etc/nginx/ /mnt/sysroot/etc/
[root@mysql nginx-1.4.7]# cp -r /usr/local/nginx/ /mnt/sysroot/usr/local/
#以上是移植nginx的配置文件和啟動程序等等
[root@mysql sysroot]# export PATH=$PATH:/usr/local/nginx/sbin/
[root@mysql sysroot]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin/
[root@mysql sysroot]# echo /usr/local/nginx/ > /etc/ld.so.conf.d/nginx
#以上是為了方便移植nginx的所依賴的庫文件,ldd可以查看nginx啟動時所需要的庫文件。
[root@mysql ~]# bash /root/bincp.sh 
Plz enter a command: nginx
Plz enter a command: quit
到此nginx的移植結束。

 掛起宿主機可以開始啟動了另一臺。遠程鏈接ssh登錄。因為nginx服務使用nginx用戶啟動的,所以要添加用戶

[root@mysql ~]#adduser nginx   
Changing password for nginx
New password: 
Bad password: too short
Retype password: 
Password for shi changed by root
[root@mysql ~]#cd /usr/local/nginx/sbin/
[root@mysql sbin]#./nginx

 QQ截圖20150921130409.png

QQ截圖20150921124824.png

QQ截圖20150921124831.png

到此全部結束。

下面是本次實驗中用到的bincap.sh的腳本源程序

#!/bin/bash
#
target=/mnt/sysroot/

[ -d $target ] || mkdir $target

preCommand() {
    if which $1 &> /dev/null; then
	commandPath=`which --skip-alias $1`
	return 0
    else
	echo "No such command."
	return 1
    fi
}

commandCopy() {
    commandDir=`dirname $1`
    [ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}
    [ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir}
}

libCopy() {
    for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do
	libDir=`dirname $lib`
	[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
	[ -f ${target}${lib} ] || cp $lib ${target}${libDir}
    done
} 

read -p "Plz enter a command: " command

until [ "$command" == 'quit' ]; do

  if preCommand $command ; then
    commandCopy $commandPath
    libCopy $commandPath
  fi

  read -p "Plz enter a command: " command
done

總結,本次實驗中,了解到了,一個操作系統的原理,期間也遇到了不少錯誤。排查了很久。無數次嘗試,都報錯,差點都放棄了這篇博文,最后都自己獨立解決了。不足的是,我沒有提供nginx開機自啟動的腳本。但是可以按照,dropbear的腳本修改,然后在/etc/rc.start目錄下生成鏈接文件就可以了,注意鏈接的路徑,其他的都有不用管了,因為/etc/rc.d/rc.sysinit的啟動腳本中最后一段就是在系統初始化時啟動,所有/etc/rc.start目錄下的所有可執行腳本。

原創文章,作者:黃藥師,如若轉載,請注明出處:http://www.www58058.com/8276

(0)
黃藥師黃藥師
上一篇 2015-09-22 13:10
下一篇 2015-09-23 19:58

相關推薦

  • 基礎命令

    1,對于Linux的實驗環境我們要用到虛擬機,往往每次上線都要登錄,這時候如果把用戶設為自動登錄就會方便許多,接下來就介紹下設置虛擬機的自動登錄 , /etc/gdm/custom.conf 這個就是設置自動登錄的一個配置文件,我們先來使用nano打開這個文件,如下 # GDM configuration storage 這是GDM的一個配置存儲 [daem…

    2017-11-19
  • nginx_http_proxy,upstream,stream模塊簡析

    一. ngx_http_proxy_module模塊:         模塊功能: 為后端httpd服務做反向代理, 并且與Httpd 之間使用http進行通信       1、proxy_pass URL;  &nbs…

    Linux干貨 2016-10-29
  • MogileFS基于Nginx反向代理實現分布式存儲與訪問

    前言 隨著信息社會的發展,越來越多的信息被數據化,尤其是伴隨著大數據時代的來臨,數據呈爆炸式增長。傳統存儲在面對海量數據存儲表現出的力不從心已經是不爭的事實,例如:縱向擴展受陣列空間限制,橫向擴展受交換設備限制,節點受文件系統限制等。而分布式存儲的出現在一定程度上有效的緩解了這一問題,目前比較流行的分布式文件系統有:GFS、HDFS、GlusterFS、Mo…

    Linux干貨 2015-07-08
  • 第七周作業

    查看作業內容請移步此鏈接:http://www.cnblogs.com/wangenzhi/p/6403568.html

    Linux干貨 2017-02-15
  • rsync+inotify實現實時同步案例

    隨著應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步數據時,需要掃描所有文件后進行比對,進行差量傳輸。如果文件數量達到了百萬甚至千萬量級,掃描所有文件將是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步數據,…

    Linux干貨 2016-10-30
  • man,男人的使用方法

        Linux中有個很強大的男人,這個男人就是man。任何不懂得命令和或者配置文件我們都可以去man,所以請深愛這個男人;     我們輸入 man ls,它會在最左上角顯示“LS(1)”,在這里,“LS”表示手冊名稱,而“(1)”表示該手冊位于第一節章,同樣,我們輸入“ma…

    Linux干貨 2016-07-26

評論列表(2條)

  • Vicky
    Vicky 2015-09-22 13:35

    友情提示:格式好的博文更吸睛哦~

    • 黃藥師
      黃藥師 2015-09-22 13:38

      @Vicky唉,新手啊,文檔能力還有待提高,我會更加努力的。

欧美性久久久久