忘了介紹本文的源碼的版本了
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 #倒數一二行表示,開機讀取主機名的腳本,程序,不解釋,我想應該能看的懂。
成功上圖。
唉,可以實現登錄了把,但是居然爆出一個錯誤,I have no name! 我們明明已經設置了啊,
為什么沒有呢。其實我們用的bash,bash是利用nsswitch來進行用戶名對應UID實現名稱解析
的。但是你還記得,我們之前提到的,busybox默認的shell是ash。我們切換成ash試試。o
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的配置文件,其實不用這個也行。我沒有移植,寄生機也是可用的我不知道原因,但是大家最 #好別這么干。還是復制過來的好。以防出現其他的不知名錯誤。
顯然已經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. #會爆出客戶端這個錯誤
我們開始查看服務器日志
這個錯我也無法理解。但是我想到了解決辦法。
#首先在這臺啟動的機器實施本地登錄然后passwd重新修改下密碼就可以了 [root@mysql ~]#passwd Changing password for root New password: Retype password: Password for root changed by root
然后就可以實現本地登錄了。到此解決了,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 :::*
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
到此全部結束。
下面是本次實驗中用到的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
友情提示:格式好的博文更吸睛哦~
@Vicky:唉,新手啊,文檔能力還有待提高,我會更加努力的。