获取系统内核编译文件image

[root@php5_6 src]# pwd    将包解压到/usr/src目录下

/usr/src

[root@php5_6 src]# ln -sv linux-3.13.6/ linux

[root@php5_6 src]# ls

debug  kernels  linux  linux-3.13.6    ==>创建一个软链接

进入linux目录,创建一个 .config文件,

[root@php5_6 linux]# make allnoconfig

image

最小化配置

[root@php5_6 linux]# make menuconfig  

1,配置系统信息

image

定义版本信息, 主机名, 支持systemv风格的进程通讯

image

2,支持动态装载模块,进入后选择动态卸载模块

image

支持动态卸载模块

image

3,支持使用块层

image

选择

image

4 处理器类型和特性 [cpu]

image

画圈处进入选择, 我的电脑是intel的,所以选择下面一项

image

5选择总线控制

image

选择支持PCI总线

image

6,可执行文件类型和格式

image

让其支持 ELF,以及#!的脚本文件

image

7网络支持

image

image

选择tcp/ip ,里面的具体需要,具体选择, 比如tpc多播,高级路由等 Unix domain sockets ==>支持套接字地址

image

image

8,设置驱动

image

1)配置网卡驱动

image

网络支持要有

image

以太网驱动支持也要有

image

image

我的是intel的网卡,所以只保留intel的 pro/1000, 不确定是PCI  OR PCI-E ,所以都编译进来

无线网不要

image

2) SCSI硬盘驱动

image

image

3)SCSI相关

image

image

4)支持USB驱动

image

USB驱动选择如下

image

5)输入设备选择

image

选择鼠标,键盘

image

9,文件系统支持

1)

image

选择ext4编译到系统内核

image

2)支持挂载设备

image

image

image

选择完毕,开始编译

将硬盘分区

[root@php5_6 ~]# fdisk /dev/sdb

sdb1 50M  sdb2 512M

[root@php5_6 ~]# mke2fs -t ext4 /dev/sdb1

[root@php5_6 ~]# mke2fs -t ext4 /dev/sdb2

mnt上新建两目录

[root@php5_6 ~]# mkdir /mnt/{boot,sysroot}

将刚才分的两个区,分别挂载到新建的目录下

[root@php5_6 ~]# mount /dev/sdb1 /mnt/boot [root@php5_6 ~]# mount /dev/sdb2 /mnt/sysroot

建立grub引导, --root-directory所指的目录下,一定要有一个boot的目录, 并指定建立在哪块磁盘上

[root@php5_6 linux]# grub-install --root-directory=/mnt /dev/sdb

操作系统需要用到各种操作命令,我们使用一个busybox的东西来模拟提供

下载busybox,

image

编译busybox需要用到 glibc-static 的库

[root@php5_6 busybox-1.22.1]# yum install glibc-static -y

配置编译菜单

[root@php5_6 busybox-1.22.1]# make menuconfig

image

image

image

上述内容选择好了以后,执行make   make install执行安装

[root@php5_6 busybox-1.22.1]# make 

[root@php5_6 busybox-1.22.1]# make install

[root@php5_6 _install]# pwd

/root/busybox-1.22.1/_install    ==>编译安装完成后,把生成的_install目录下的所有文件都拷到/mnt/sysroot目录中

[root@php5_6 _install]# cp -a ./* /mnt/sysroot

 

很幸运,能启动

image

继续完善

[root@php5_6 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

::respawn:/sbin/getty 19200 tty5

::respawn:/sbin/getty 19200 tty6

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

 image

因为 busybox模拟的,只有getty 这一种终端,没办法,只好选择这个.

image

意思是说tty将会启动 /bin/login 的程序,让你输入用户名密码,进行登陆认证

[root@php5_6 sysroot]# vim etc/fstab

/dev/sda1 /boot ext4 defaults 0 0

/dev/sda2 /        ext4 defaults 0 0

sysfs          /sys sysfs defaults 0 0

proc          /proc proc defaults 0 0

[root@php5_6 sysroot]# vim etc/rc.d/rc.sysinit ==>中间缺少一个目录,可以先创建

#!/bin/sh

#

echo -e "welcome to custom linux"

echo "remounting root filesystem"

mount -n -o remount ,rw /dev/sda2 /     # ==>让其支持以读写方式挂载文件系统

手动添加 etc/passwd 文件 etc/shadow文件 etc/group文件

[root@php5_6 sbin]# openssl passwd -l -salt `openssl rand -hex 4`

创建 /etc/profile 文件          

加入一个环境变量,就能让控制的字符界面更好看些,以显示用户名,主机名,以及现在所处的操作路径

export PS1="[\u@\h \W]\\$"

image

image

用户要使用 bash要依赖于一些库文件 [bash 是 依赖于 nsswitch 文件中的库提供名称解析的]

注: nsswitch 是一个名称解析框架

包括

/lib64/libnss_files-2.12.so /lib64/libnss_files.so.2 -> libnss_files-2.12.so =>这是当前目录下的一个链接s

把这个文件和它的链接一并拷到 制作的系统下来

image

还有/usr/lib64 下也有要依赖的库文件,也一并拷过去

/usr/lib64/libnss3.so

/usr/lib64/libnss_files.so -> ../../lib64/libnss_files.so.2 ==>这个链接文件,链接到刚才拷到lib64的目录下了

/usr/lib64/libnsspem.so /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so

将这5个文件,拷到 /mnt/sysroot/usr/lib64 目录下

[root@php5_6 lib64]# cp -a -d /usr/lib64/libnss3.so /usr/lib64/libnss_files.so /usr/lib64/libnsspem.so /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so ../usr/lib64/

拷贝 /etc/nsswitch 到 /mnt/sysroot/etc/nsswitch

在文件中,这些内容之后的内容可以删除 [当然保留也没问题 ]

passwd: files shadow: files group: files #hosts: db files nisplus nis dns hosts: files dns

一切准备工作完成,挂起宿主机,开启定制的系统登陆, 非常顺利,OK了!

image

这仅能在本地登陆,要实现远程登陆,要为其提供 sshd服务,但是sshd所依赖的库太多,会使系统变得很大,

为节约资源空间,我们使用dropbeer,可用资源少,这是一个很好的解决方案

dropbear: 更小环境下,提供简单ssh远程连接服务,不仅如此,和ssh一样,可以加密的在主机之间进行交互,

通讯的安全也能得到保证

我们在宿主机上,下载dropbear,解压到/tmp目录下

image

[root@php5_6 dropbear-2013.58]# less INSTALL  ==>查看安装说明文档

(If using a non-tarball copy, "autoconf; autoheader")

./configure      (optionally with --disable-zlib or --disable-syslog, or --help for other options) 

Now compile:

make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"  =>安全通讯所使用到的make选项

[root@php5_6 dropbear-2013.58]# ./configure =>配置及检测编译环境

[root@php5_6 dropbear-2013.58]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"  执行编译

其实上面一步已经是编译好了的 ,   下面一步只是把编译好的文件移个位置,并修改权限 

[root@php5_6 dropbear-2013.58]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

安装好dropbear后,使用它的dropbearkey工具生成 密钥文件

[root@php5_6 bin]# dropbearkey -t dss -f /etc/dropbear/ddh_key

[root@php5_6 bin]# dropbearkey -t rsa 2048 -f /etc/dropbear/drh_key

[root@php5_6 sbin]# dropbear -p 22022  =>启动dropbear, 因为22号端口已让ssh占用,所以要换一个端口启动服务

[root@php5_6 sbin]# ss -tnp

State      Recv-Q Send-Q         Local Address:Port           Peer Address:Port

ESTAB      0      0                172.16.26.6:22022         172.16.26.176:51977  users:(("dropbear",5635,5)) ==>经查看,22022端口已启动

image

另开一个窗口,远程连接试试

image

OK,没问题, 那么我们可以把这个程序利用脚本拷到自定义的系统上了

注脚本会将程序文件所要依赖的库一并拷到自定义的系统相应位置, 查看程序文件需要的库,用命令 ldd 如 "ldd dropbear"

[root@php5_6 ~]# ls /usr/local/bin/ dbclient dropbearconvert dropbearkey scp    =>文件需要拷到相应的位置上 /mnt/sysroot/usr/local/bin

[root@php5_6 ~]# ls /usr/local/sbin/ dropbear   =>文件需要拷到相应的位置上  /mnt/sysroot/usr/local/sbin

[root@php5_6 ~]# ./cpsh.sh dbclient [root@php5_6 ~]# ./cpsh.sh dropbear [root@php5_6 ~]# ./cpsh.sh dropbearkey

[root@php5_6 ~]# ldd /usr/local/bin/scp ==>因为ssh本身也有一个scp程序, 我们单独查看一下它所依赖的库是什么, linux-vdso.so.1 => (0x00007fffdd56a000) libc.so.6 => /lib64/libc.so.6 (0x0000003809800000) /lib64/ld-linux-x86-64.so.2 (0x0000003809000000) =>很幸运,这些库我们的自定义系统上,在前面的操作中,都提供了

为目标系统创建 dropbear密钥文件

[root@php5_6 ~]# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key

[root@php5_6 ~]# dropbearkey -t rsa -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key

因为在目标系统上,dropbear运行时,需要在/etc/run创建一个pid文件,我们得在目标系统上,为其创建一个目录

[root@php5_6 ~]# mkdir /mnt/sysroot/var/run

需要注意的是dropbear运行,要依赖于 libnss 库,不过我们在为用户提供bash时,已经将这个问题解决,如果没有提供,拷贝解决,

请参照上面为用户提供bash时,解决libnss的过程

在dropbear远程登陆时,会检查用户所使用的shell是否为安全shell, 安全shell是 在系统 /etc/shells文件中所列出来的shell,

才认为是安全shell,我们将这个文件拷到目标系统上

[root@php5_6 ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

远程登陆需要一个伪终端, 伪终端是由devpts控制的, 是在/dev/pts下 提供一个数字文件实现的,所以我们要在系统自动挂载项里,添加这一项

在目录系统中添加如下一行

devpts /dev/pts devpts defaults 0 0

但是要挂载文件系统,需要有相应的目录,现在创建在系统启动时,会执行mdev -s 以创建/dev, 又会将 /dev/pts隐藏,

所以这执行的先后次序很关键,

#!/bin/sh # echo -e "welcome to custom linux" echo "remounting root filesystem" mount -n -o remount ,rw /dev/sda2 / # create dev file echo "create dev file" mdev -s     ==>创建 /dev文件系统    1

# mount all syssb echo "mount sys" mkdir /dev/pts    =>创建/dev/pts [与伪终端相关的目录]    2

mount -a     ==>挂载开机需要自动挂载的目录    3

ifconfig lo 127.0.0.1 netmask 255.0.0.0     ==>为网卡添加ip地址

ifconfig eth0 172.16.26.50 netmask 255.255.0.0    =>以方便工作

提供ngnix服务

image

在解压目录中进行编译配置

[root@php5_6 nginx-1.4.7]# useradd nginx   =>首先创建nginx用户,等会指定nginx以这个用户名来运行[如不指定,会以nobody身份来运行]

[root@php5_6 nginx-1.4.7]# ./configure --user=nginx --group=nginx --conf-path=/etc/nginx/nginx.conf --without-pcre --without-http_rewrite_module

[root@php5_6 nginx-1.4.7]# make && make install

[root@php5_6 nginx-1.4.7]# cp /etc/nginx/ /mnt/sysroot/etc/nginx/

[root@php5_6 nginx-1.4.7]# cp /usr/local/nginx/ /mnt/sysroot/usr/local/nginx/

[root@php5_6 nginx-1.4.7]# vim /mnt/sysroot/etc/passwd     =>手动在该文件下添加用户 nginx

nginx:x:500:500:nginx:/nginx:/sbin/nologin

[root@php5_6 nginx-1.4.7]# vim /mnt/sysroot/etc/group     ==>手动在该文件下添加用户组 nginx

nginx:x:500:

关闭宿主机, 开启自定义系统主机,登陆后,执行nginx主程序,

[root@custom ~]# /usr/local/nginx/sbin/nginx

/usr/local/nginx/sbin

image

ok,完成

image