码迷,mamicode.com
首页 > Web开发 > 详细

浅谈编译kernel+busybox构建拥有远程ssh登录和web功能最小linux系统

时间:2015-09-21 15:59:24      阅读:429      评论:0      收藏:0      [点我收藏+]

标签:硬件   intel   linux   空间   bridge   

实验环境win7+VM11.1


本文的源码的版本了

dropbear-2013.58.tar.bz2   

busybox-1.21.1.tar.bz2

linux-3.13.6.tar.xz 

nginx-1.4.7



大致过程总揽

1,硬件准备以及查看硬件设备型号(不用担心,这些都是VM虚拟出来的)

2,编译环境的配置以及下载内核源码以及编译内核

3,编译busybox,以及提供系统正常运行的配置文件,初步运行linux系统

4,编译安装dropbear提供ssh服务

5,安装nginx;提供web服务


一,硬件准备以及查看硬件设备型号

技术分享技术分享

由于编译后的系统占用的空间很小,所以不需要多大的空间。

注意添加虚拟磁盘的时候,一定要选择创建单个文件,不然之后你将这块硬盘添加到另一个寄生机的时候,会不好选择,如上右图


硬件准备完毕。接下来查看参数

[root@mysql ~]# 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)
00:11.0 PCI bridge: VMware PCI bridge (rev 02)

大概了解下就可以。我们只是走一下步骤。因为这是虚拟机,设备都是假的。但是在真实环境这一步还是很重要的。

分区格式化挂载以及安装grub

 1,分区

[root@mysql linux]# fdisk /dev/sdb
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-130, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130): +200M  
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (27-130, default 27): 
Using default value 27
Last cylinder, +cylinders or +size{K,M,G} (27-130, default 130): 
Using default value 130
Command (m for help): w
The partition table has been altered!

2,格式化

[root@mysql linux]# mke2fs -t ext4 /dev/sdb1 
[root@mysql linux]# mke2fs -t ext4 /dev/sdb2

3,创建挂载目录并且挂载之创建目录

[root@mysql linux]# mkdir -pv /mnt/{boot,sysroot}
mkdir: 已创建目录 "/mnt/boot"
mkdir: 已创建目录 "/mnt/sysroot"
[root@mysql linux]# mount /dev/sdb1 /mnt/boot/
[root@mysql linux]# mount /dev/sdb2 /mnt/sysroot/

4,安装grub

[root@mysql linux]# 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是否安装成功了对此检验一下

[root@mysql mnt]# cd /mnt/boot/
[root@mysql boot]# ls
grub  lost+found

可以得知已经安装成功



二,编译环境的配置以及下载内核源码以及编译内核

 1, yum安装编译环境

yum groupinstall -y "Development Tools"

 2,为了防止在编译安装配置.config文件时无法启用tui界面,同时也要安装ncurses,以及ncurses-devel

 yum install -y ncurses ncurses-devel

 3,下载内核源码包和解压到/usr/src目录并且通过软连接的形式链接到linux

[root@mysql ~]# tar xf linux-3.13.6.tar.xz -C /usr/src/
[root@mysql ~]# cd /usr/src/
[root@mysql src]# ln -sv linux-3.13.6/ linux
"linux" -> "linux-3.13.6/"
[root@mysql src]# cd linux

 4,清空所有配置选择,

[root@mysql linux]# 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,执行内核配置(注意,我们是直接将系统功能驱动都是直接编译进内核的,所以,我们配置选项都是选择*号)

[root@mysql linux]# make menuconfig


技术分享 

技术分享

简单介绍下我们用到的配置选项

1,第一项,此项设置该系统为64位的操作系统(此项必须选择,如果编译32位系统,那么库文件可能出现不兼容的现象)


2,第二项,为通用设置选择并且进入进行配置,配置方式如下

技术分享

选项一表示自定义系统内核的名称,(回车后就可以进入设置了,我定义了终结者的型号T800,你懂的)

选项二表示支持进程间通信。这个也是必须开启的


3,第三项,为启动加载模块支持选项。进入并且选择。相应选项。选项如下图。

技术分享

意思是支持模块卸载以及强制卸载模块(这里解释一下,为什么要支持这个功能,我们明明都是将所有功能都直接配置到了内核为什么还要启动这个模块功能呢,答案是为了以后可以更好的扩展,假如有新的硬件添加进来呢,那我们岂不是有点难为自己了,又要重新编译内核一遍。)


4,第四项,此项表示开启块设备支持,此项默认打开。其他版本的内核源码默认没有打开,需要自己打开。不然的话,无法支持块存储设备。比如我们接下来要设置的scsi接口的块存储设备。


5,第五项,此项表示选择cpu的架构以及调整一些cpu的参数。

技术分享

第一项是开启对称多处理器

第二项是cpu的型号选择回车如下图,表示cpu是英特尔酷睿系列的,当然了你要是amd的cpu就依靠自己了

第三项是第一项一旦开启此项就会默认开启,此项便是开启多核心调度

技术分享

6,第六项,总线支持的配置选择并进入

技术分享


这三项分别代表的意思是,开启pci总线支持,开启pci-e的支持。这个不要多做解释,你懂的,我想。


7,第七项,表示默认可执行文件的格式。(这项很重要,不开启那么就ELF二进制程序就不支持)

技术分享

主要选择这三项,如果选择第一项,默认第二项会被选择

解释一下,第一项和第二项表示内核支持ELF二进制可执行程序,第三项,(这个很重要)这个表示支持以#!开头脚本文件。其实就是shell脚本。没有这个,你的脚本写出来,内核无法理解。


8,第八项,表示网络功能的开启。这项是支持网络功能的必备选项。linux系统最强大的功能之一网络功能。这项也是非常重要的。空格键选中为*号,回车进入配置内核网络功能。

技术分享

第一项,是网络功能的选项,等会进入进行设置,主要是开启tcp/ip的支持。

第二项,这个无线网的支持,默认是开启的,但是我们要把它关闭,因为咱们这个是虚拟机,没有无线网卡,开启这个选项,很增加编译负担,既然是最小化编译,那么就应该只买合用的不买没有的。


进入第一项的二级子目录,开始配置tcp/ip的支持。

技术分享技术分享

技术分享

技术分享

下面开始做一下简介:

第一项,这是必须的,肯定要支持,tcp/ip networking

第二项,此项表示支持,开启路由扩展支持

第三项,此项表示,是对路由扩展功能的设置,这里我们选择的是,支持策略路由。

第四项,此项表示,在内核上支持,网络属性的自动配置,旗下有很多的子选项,可以看见,dhcp协议,bootp协议的支持等等。但是这项我们并不开启,我只是做个简单的介绍,我们可是动手能力非常强的攻城狮,为什么要autoconfig呢。本着,内核最小化的原则。所以还是不要选择了。

第五项,此项表示支持,tcp syn的支持,

第六项,此项表示,去掉ipv6的支持。因为不需要支持ipv6、

第七项,此项表示,开启基于UNIX域的进程通信。不同主机进程利用tcp/ip 来支持通信,而内部则是利用UNIX domain来实现。因为内部的进程通信如果还是基于tcp/ip 那么未必有点,二逼了,消耗系统资源不说,还降低了进程的通信的效率。


我们跳过第九项先来介绍第十项,为什么呢,因为前八项都是属于,内核功能的配置,第九项属于,硬件驱动的配置。我们还是归一下类,容易区分和理解。


10,第十项,这是开启内核对于文件系统的支持。

技术分享

这里我们开启对ext4文件系统的支持。


9,第九项,配置内核支持,各种硬件设备,选择回车进入查看,配置相应的设备对应的驱动程序


技术分享技术分享

技术分享

技术分享

分别进行介绍

第一项,通用设置进入后选择如下选项,

技术分享

选择第一项表示,自动生成设备文件,在内核挂载根文件系统之后,同时挂载设备文件系统到/dev目录下


第二项,表示支持,scsi设备的支持,进入后选择

技术分享


第三项,开启对 FUSION MPT设备的支持,这主要是对scsi硬盘一些功能上的支持。

技术分享

表示支持主机驱动的spi。以及启用Fusion MPT logging facility"。MPT代表"Message Passing Technology"(消息传递技术)。Fusion驱动是由LSI Logic公司开发。MPT一种进程间使用的特定消息策略。


第四项,主要是网络设备的支持。选择进入,关闭wireless,只选择以太网设备的驱动,选择如下图。

技术分享

技术分享技术分享

操作如图,没有什么好解释的,默认配置不要动,只需要把这些贴出来的图,你选中就可以了。


第五项,主要是输入设备的设备配置,没有什么好解释的,直接上图

技术分享


第六项,主要是usb接口的设置,直接上图。

技术分享

技术分享技术分享

到此内核编译的配置过程已经ok了。

然后

[root@host linux]#make   bzImage     ##只编译核心
[root@mysql linux]# cp arch/x86/boot/bzImage /mnt/boot/ #把内核拷贝到boot目录下
[root@mysql ~]# cd /mnt/boot/grub/
[root@mysql grub]# vim grub.conf   ##配置grub.conf文件
timeout 5
default 0
title T800.1
root (hd0,0)
kernel /bzImage ro root=/dev/sda2



三,编译busybox,以及提供系统正常运行的一些配置文件,初步运行linux系统


一,安装配置编译环境,这里需要glibc-static包的支持,还有libmcrpt-devel的支持,以及下载busybox解压源码包

    实施安装过程。

[root@mysql ~]# yum install -y libmcrypt-devel glibc-static
[root@mysql ~]# tar xf  busybox-1.21.1.tar.bz2 -C /usr/src/
[root@mysql ~]# cd !$/busybox-1.21.1/
[root@mysql  busybox]make menuconfig ##过程与内核是否有点相似。
Busybox Settings  --->
    Build Options  --->
        [*] Build BusyBox as a static binary (no shared libs)
#只要配置这一项就可以了,其他的都不要动。这个表示编译成静态可执行程序,
#简单说就是不需要依赖系统上的#一些库,因为我们是最小化的系统,
#这个系统很多库文件是没有的。如果不设置这个选项,依赖动态库的话,这
#个程序很有可能因为系统上缺少某类库而无法正常运行,甚至是不能运行。
[root@mysql busybox-1.21.1]# make && make install
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
#以上表示编译成功
[root@mysql busybox-1.21.1]# cp -a -d _install/* /mnt/sysroot/
[root@mysql busybox-1.21.1]# cd !$
[root@mysql sysroot]# ls
bin  linuxrc  lost+found  sbin  usr
[root@mysql sysroot]# rm -f linuxrc 
#因为这是链接文件,在sbin目录下,有个init文件同样也是链接指向busybox的,
#所以这个不需要。我们只需要init就可以做系统启动时所要的文件了。
[root@mysql sysroot]# mkdir -pv dev home lib64 media root sys boot   etc/{rc.d,sysconfig} lib mnt proc var tmp                 
#创建系统所需的常用目录。
[root@mysql grub]#vim grub.conf              #开始测试一下busybox是否可用
timeout 5
default 0
title T800-kernel.1.version
root (hd0,0)
kernel /bzImage ro root=/dev/sda2 init=/sbin/init
[root@mysql grub]#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 
timeout 5
default 0
title T800.1
root (hd0,0)
kernel /bzImage ro root=/dev/sda2     # 去掉init选项利用下面的rc.sysinit来初始化

[root@mysql etc]# vim 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

[root@mysql etc]# cat rc.d/rc.sysinit    ###配置开机初始化,脚本
#!/bin/bash
#
mount -n -o remount,rw /dev/sda2 /
mount -a
mdev -s                               # 自动生成设备文件
[root@mysql etc]# chmod +x rc.d/rc.sysinit ###因为是开机初始化脚本程序,所以必须给与执行权限。

[root@mysql ~]# bash bincp.sh   ###这是一个脚本程序,这个程序的功能是复制可执行程序同时也会复制依赖
Plz enter a command: bash       ###的库
Plz enter a command: quit       ###这里表示移植bash程序。busybox里面是没有bash的但是兼容bash,
###默认支持的是ash,所以bash还是要移植的。此脚本会在后面贴出来

为了检验一下使用环境有木有什么错误,那就来测试一下。

[root@mysql mnt]# chroot 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:CF:89:47  
          inet addr:192.168.199.137  Bcast:192.168.199.255  Mask:255.255.255.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:65536  Metric:1

bash-4.1# exit
从以上测试来看,应该是没有问题的。

好了,在挂起宿主机,开始测试系统运行情况。

技术分享

到了这一步,我们已经完成了构建了一个可以运行的linux小系统了。而且可以支持网络。



四 ,编译安装dropbear提供远程ssh登录方式。

一 ,实现ssh登录的前提,你最起码要支持本地登录吧。所以首先得实现本地登录。配置如下

你要有passwd,shadow,group这些关乎民生东西都没有还登录个毛线。

[root@mysql etc]# touch passwd shadow group

[root@mysql etc]# vim passwd
root:x:0:0:root:/root:/bin/bash             
mayershi:x:500:500:shisheng:/home/shisheng:/bin/bash

[root@mysql etc]# openssl passwd -1 -salt `openssl rand -hex 4`
Password: 
$1$70b57fe2$A6awWahj8sdzQtzdI7hhu.###生成用户密码,基于md5加密的。

[root@mysql etc]# vim shadow
root:$1$70b57fe2$A6awWahj8sdzQtzdI7hhu.:16690:0:99999:7:::
mayershi:$1$70b57fe2$A6awWahj8sdzQtzdI7hhu.:16690:0:99999:7:::

[root@mysql etc]#chmod go= shadow

[root@mysql etc]# vi sysconfig/network #添加主机名
HOSTNAME=www#test#com           #####       #代表.
[root@mysql etc]# vi 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:/sbin/reboot
::shutdown:/bin/umount -a -r


基于上文,我们还差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目录下的所有可执行脚本。




本文出自 “Mayershi” 博客,请务必保留此出处http://mayer.blog.51cto.com/9791264/1696726

浅谈编译kernel+busybox构建拥有远程ssh登录和web功能最小linux系统

标签:硬件   intel   linux   空间   bridge   

原文地址:http://mayer.blog.51cto.com/9791264/1696726

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!