手动编译内核+busybox+dropbear+nginx

我们需要先在宿主机上添加一个磁盘,然后,把这个磁盘做好分区和文件系统:

fdisk /dev/sdb

创建第一个分区:

n

p

1

+512M

创建第二个分区:

n

p

2

+10G

保存退出:

w

为分区提供文件系统:

kpartx /dev/sdb

为分区提供文件系统:

mke2fs -t ext4 /dev/sdb1
mke2fs -t ext4 /dev/sdb2

为他们在宿主机上提供目录挂载:

mkdir /mnt/boot
mkdir /mnt/sysroot

把分区挂载上:

mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot

然后,我们需要提供内核了,这时,我需要把内核进行手工编译,这个编译只是基于虚拟机上的硬件,日后需要编译,要根据自己主机的硬件情况进行选择驱动和功能模块:

tar xf linux-3.13.6.tar.xz -C /usr/src
cd /usr/src

为这个源码做上软连接:

ln -sv linux-3.13.6 linux
cd linux 
make allnoconfig(把内核编译的大多选项去掉,剩下一些基本的选项)
make menuconfig

然后,我们会进入对内核的功能和驱动进行选择:

(1)[*]64-bit kernel

(2)[*]Enable loadable module support

(3)-*-Eable the block layer

(4)Processsor type and features–>[*]Symmetric multi-processing support

                                                          [*]Multi-core scheduler support

                                                              Processor family(Core 2/newer Xeon)

(5)Bus options(PCI etc.)–>[*]PCI support

(6)Executable file formats / Emulations –> [*]Kernel support for ELF binaries

                                                                         [*]Write ELF core dumps with partial segments

                                                                        <*> Kernel support for scripts starting with #!

(7)-*-Networking support –> Networking options –> <*>Unix domain sockets (这个选项,我们过后启动nginx需要)

                                                                                            [*] TCP/IP networking

(8)Device Drivers –> SCSI device support —>[*] SCSI device support

                                                                             [*] SCSI target support

                                                                             [*] SCSI disk support 

                                                                             [*] SCSI tape support

                                    Generic Driver Options –> [*] Maintain a devtmpfs filesystem to mount at /dev

                                                                                  [*] Automount devtmpfs at /dev,after the kernel mounted the rootfs

                                    [*]Fusion MPT device support –> <*> Fusion MPT ScsiHost drivers for SPI

                                                                                             <*> Fusion MPT ScsiHost drivers for FC 

                                                                                             <*> Fusion MPT ScsiHost drivers for SAS

                                    [*] Network devcie support —>  [*] Network core driver support 

                                                                                            [*]Ethernet driver support –> [*]Intel devcies

                                                                                                                                             <*> Intel(R) PRO/1000 Gigabit Ethernet support

                                                                                                                                             <*> Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support

                                         Input device support —>  [*] Mouse interface

                                                                                      [*]Keyboards

                                                                                      [*]mice

                                       [*]USB support —>  [*] Support for Host-side USB

                                                                         <*> EHCI HCD (USB 2.0) support

                                                                         <*> OHCI HCD (USB 1.1) support

                                                                          <*>OHCI support for PCI-bus USB controllers

(9)File systems –> <*> The Extended 4 (ext4) filesystem

                                [*] Use ext4 for ext2/ext3 file systems

这些选项弄好之后,退出并把这些选项设置保存下来!

编译压缩内核:

make -j 4

把编译好的内核放到移植的boot目录下

cp arch/x86_64/boot/bzImage /mnt/boot/

好了,我们开始进行把移植的主机生成bootloder和grub

grub-install --root-directory=/mnt/ /dev/sdb
cd /mnt/boot/grub/
vim grub.conf
timeout=5
defaults=0
title bwei linux 
            root (hd0,0)
            kernel /bzImage ro root=/dev/sda2 init=/sbin/init
:wq

为移植的系统提供需要的目录:

cd /mnt/sysroot
mkdir -p bin  boot  dev  etc  home  lib64 media  mnt  proc  root  sbin  sys  usr

用busybox提供移植的系统init程序和个程序:

tar xf busybox-1.22.1.tar.bz2 -C /usr/src
cd /usr/src/busybox-1.22.1
make menuconfig
busybox settings --> Build Options --> [*]Bulid BusyBox as a static binary (no share libs)
然后我们保存设置选项!
make -j 4
make install

安装完成之后,我们把_install/中sbin bin usr目录和目录下的文件都复制到需要移植的系统的目录下:

cp _install/sbin /mnt/sysroot
cp _install /bin /mnt/sysroot
cp _install/usr /mnt/sysroot

提供/etc下的目录:

mkdir /mnt/sysroot/etc/rc.d
mkdir /mnt/sysroot/etc/rc.start
mkdir /mnt/sysroot/etc/init.d

提供inittab文件:

cd /mnt/sysroot/
vim 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
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -r -a 
(getty终端程序会把login程序调用,然后,进行用户名和密码进行验证)
:wq

提供/etc/profile给移植系统提供环境变量:

vim etc/profile 
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PS1='[\u@\h\W]\$'

:wq

给移植的系统挂载文件系统的配置文件:

vim etc/fstab
/dev/sda2       /       ext4    defaults        1 1
sysfs   /sys    sysfs   defaults        0 0
proc    /proc   proc    defaults        0 0
devpts  /dev/pts        devpts  defaults        0 0
/dev/sda1       /boot   ext4    defaults        0 0

:wq

为移植系统提供主机名:

mkdir etc/sysconfig
vim etc/sysconfig/network
HOSTNAME=www.bwei.com

提供系统初始化的脚本:

vim etc/init.d/rc.sysinit

#!/bin/bash
echo -e "\033[35mbwei linux\033[00m"
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 eth0 172.16.100.2 netmask 255.255.255.0 up
ifconfig lo 127.0.0.1 netmask 255.0.0.0 up
for i in /etc/rc.start/S*
do
        $i start
done
:wq

给登录用户提供passwd shadow group文件:

etc/passwd:
root:x:0:0:root:/root:/bin/bash
bwei:x:501:501:bwei:/home/bwei:/bin/bash
nginx:x:498:498:nginx:/home/nginx:/bin/bash
etc/shadow:
(里面的密码加密是用这个命令写的:openssl passwd -salt `openssl rand -hex 8` -1 bwei)
root:$1$15a442a4$.N192u6UQi6hAJDFC1RTp0:16674:0:99999:7:::
bwei:$1$15a442a4$.N192u6UQi6hAJDFC1RTp0:16674:0:99999:7:::
nginx:$1$15a442a4$.N192u6UQi6hAJDFC1RTp0:16674:0:99999:7:::
etc/group:
root:x:0:
bwei:x:501:
nginx:x:498:

由于login程序依赖于nsswitch库文件,验证用户名,把库文件复制一份到移植的系统上:

cp /lib64/libnss* lib64/
cp /usr/lib64/libnss* usr/lib64/

为用户提供家目录:

mkdir home/nginx
mkdir home/bwei

我们需要使用一个程序移植脚本:

cp.sh脚本:
#!/bin/bash
read -p 'plz input a bin name:' bin
binname=`which $bin`
bincp()
{
        [ ! -d /mnt/sysroot`dirname $binname` ] && mkdir -p /mnt/sysroot`dirname $binname`
        cp $binname /mnt/sysroot`dirname $binname`
}
libcp()
{
        for i in `ldd $binname | grep -o '/[^[:space:]]\{1,\}'`;do
        [ ! -d /mnt/sysroot`dirname $i` ] && mkdir /mnt/sysroot`dirname $i`
        cp $i /mnt/sysroot`dirname $i`
        done
}
while true
do
        bincp
        libcp
        read -p 'do you want to cp again:' bin
        if [ $bin == 'quit' -o $bin == 'q' ];then
        exit 0
        fi
done

我们用bash ~/cp.sh

             bash

我们把bash移植过去.


然后,我们远程登录时,还要提供安全shell的配置文件:

vim etc/shells
/bin/bash
/bin/sh

我们开始编译和安装dropbear:

tar xf ~/dropbear-2013.58.tar.bz2
cd dropbear-2013.58
./configure
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

好了,当dropbear编译和安装完成后,我们需要把他的生成的程序移植

使用上面的cp.sh的脚本来进行移植:

bash ~/cp.sh

dbclient

dropbearkey

dropbear

把上面三个程序都移植后,需要提供一个启动dropbear的脚本:

vim /mnt/sysroot/etc/init.d/dropbear
#!/bin/bash
dbkeypath=/etc/dropbear
dsskey()
{
        [ ! -d $dbkeypath ] && mkdir $dbkeypath
        [ ! -f $dbkeypath/dropbear_dss_host_key ] && dropbearkey -t dss -f $dbkeypath/dropbear_dss_host_key
}
rsakey()
{
        [ ! -d $dbkeypath ] && mkdir $dbkeypath
        [ ! -f $dbkeypath/dropbear_rsa_host_key ] && dropbearkey -t rsa -s 2048 -f $dbkeypath/dropbear_rsa_host_key
}
start()
{
        dsskey
        rsakey
        pidof dropbear &> /dev/null
        if [ $? -eq 0 ];then
        echo "dropbear already start !!"
        else
        /usr/local/sbin/dropbear -p 22
        if [ $? -ne 0 ];then
        echo "dropbear start false !!"
        else
        echo "dropbear is starting !!"
        fi
        fi
}
stop()
{
        pidof dropbear &> /dev/null
        if [ $? -ne 0 ];then
        echo "dropbear alreay stop !!"
        esle
        killall dropbear
        if [ $? -ne 0 ];then
        echo "dropbear stop false !!"
        else
        echo "dropbear is stopping !!"
        fi
        fi
}
case "$1" in
"start")
        start
        ;;
"stop")
        stop
        ;;
"restart")
        stop
        start
        ;;
*)
        echo "plz input start|stop|restart"
esac
chmod +x /mnt/sysroot/init.d/dropbear
cd /mnt/sysroot/rc.start

为该脚本提供链接启动文件:

ln -sv ../init.d/dropbear ./S01dropbear

我们再来实现编译和安装nginx:

groupadd -r nginx
useradd -r -g nginx nginx
tar xf nginx-1.6.1.tar.gz
cd nginx-1.6.1
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --without-prce --without-http_rewrite_module
make 
make install

我们安装后,先在自己的机子上进行测试,成功后,才进行移植:

/usr/local/nginx/sbin/nginx
netstat -tnlp
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1681/nginx

我们看到这个记录,证明我们的nginx成功开启了,我们移植开始:

cp -a /usr/local/nginx /mnt/sysroot/usr/local

最后,我们可以为其提供脚本启动的,这个脚本只要修改一下上面的dropbear脚本就可以了!


我们还可以对我们的做好的目录一个备份,以免我们的我们的磁盘坏了,到时我们之前做的都没有了:

cd /mnt/sysroot/
find . | cpio -H newc -o | gzip -9 -n > /root/sysroot.gz

当我们需要把这个解压时,可以这样做:

gunzip /root/sysroot.gz
cpio -i < /root/sysroot



原创文章,作者:13-广州-杨过,如若转载,请注明出处:http://www.178linux.com/8255

(0)
13-广州-杨过13-广州-杨过
上一篇 2015-09-23
下一篇 2015-09-25

相关推荐

  • sed命令及vim编辑器

    sed[option]… 'script' inputfile…选项:-n:不输出模式空间内容的自动打印-e: 多点编辑-f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本-r: 支持使用扩展正则表达式-i: 原处编辑script:'地址命令' 1.地址定界:(1) 不给地…

    Linux干货 2016-08-11
  • 计算机基础入门及Pyhton基础

    编程基础 计算机基础 程序(program识别并执行的指令 计算机是执行程序的机器 现代计算机 艾伦·麦席森·图灵奠定了现在计算机的逻辑工作方式的基础 冯·诺依曼提出计算机应该有五大部件组成:输入/输出设备、运算器、控制器、输出设备。这是现代计算机基本框架。 语言基础 计算机语言:与计算机之间交互的语言 机器语言:一定位数的二进制代码成为机器指令,指令集合则…

    2017-09-16
  • IP地址的三种表示格式及在Socket编程中的应用

       使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理。IP地址其实有三种不同的表示格式:        1)Ascii(网络点分字符串)-        2) 网络地址(32位无符号整形,网络字节序,大头) &nbsp…

    Linux干货 2015-04-10
  • ansible学习笔记

    简介:  在日常服务器维护中,从系统安装到程序部署再到发布应用,在大规模的生产环境中,如果需要手动的每台服务器进行安装配置将会给运维人员带来许多繁琐而又重复的工作。这就促使了在每个运维层次中出现了不同的自动化运维工具。 常见的自动化运维工具分类有以下几类:  系统安装运维工具(OS Provisioning):    …

    Linux干货 2015-08-17
  • 整型、浮点型在内存中的存储方式

      在学习C语言的过程中,有时候会想,数据到底是以什么样的方式在内存中存储的呢?经过一段时间的查阅资料,小编终于整理了一些…… 以VC6.0编译器为测试环境(int型为4Byte) 先简介一下大小端模式,具体资料可参考 http://blog.csdn.net/ce123_zhouwei/article/details/6971544  …

    Linux干货 2016-01-14
  • Linux的用户组和权限管理之特殊权限及ACL的使用

    用户组和权限管理 一、了解和使用批量新建用户和批量修改用户密码: ##用户创建的模板和配置文件的存放位置:/etc/default/useradd;/etc/skel/* ;/etc/login.defs## 批量新建用户(newusers):适合用于新老机器转换时,迁移系统上的用户。 使用格式: newusers  passwd  fi…

    Linux干货 2016-08-04