忘了介绍本文的源码的版本了
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.178linux.com/8276
评论列表(2条)
友情提示:格式好的博文更吸睛哦~
@Vicky:唉,新手啊,文档能力还有待提高,我会更加努力的。