前言
  我在今天在这里跟大家详细地探讨一下Linux系统的定制过程和实现例如、用户能够远程登录;和Nginx能够稳定地运行在我们私人定制的LINUX系统上、一步一步从头开始定制属于我们自己的系统。

正文
   首先我们先来简单的介绍一下我们这里定制属于自己的Linux系统的基本元素.

一个定制的linux内核+一个定制的busybox就可以定制一个小型的Linux操作系统了,安装Dropbear和Nginx,Linux的组成
部分包括内核空间和用户空间、而用户空间其实就是根文件系统、用户空间中又包括有shell和init,busybox他能够模拟数百个我们系统上带用的
命令、当然包括我们所需要用到的shell、init、getty、login、那定制一个Linux操作系统我们必须要了解的就是系统启动流程:    
   POST --> Boot Sequence(MBR) --> BootLoader --> kernel -->/sbin/init
POST:加电自检
Boot Sequence:读到磁盘中的第一个扇区(446)的MBR。
BootLoader:找到MBR中的BootLoader引导加载器、bootloader会找到我们选定的操作系统或内核去加载对应的内核、而这个Bootloader通常是grub。
kernel:
载内核、内核要完成初始化、bootloader负责把内核读到内存中、内核又通常中压缩的、所以通常内核在内存中展开、而bootloader引导内核
启动起来、让内核从他的程序入口处开始执行、所以接下来内核要完成自身的初始化操作、或硬件探测、包括自身执行环境的准备等等都在这里完成。

内核完成初始化的第一步就要去装载用户空间了、有时候为了让内核做得足够小、很有可能内核中并不具备真正的根文件系统所在设备的驱动、因此我们要借助于
initramfs(CentOS5上被称为initrd)来完成去装载真正根文件系统所在的根文件系统真正的程序、但是这个initramfs可
initrf(initramfs:这是一个文件系统、CentOS6上就这么称呼了,initrd:ram disk
这是一个磁盘设备)是个虚拟的根文件系统、是个虚根、他不是我们系统真正工作起来所使用的根、所以称这个为虚根、内核借助于这个虚根装载驱动之后就要去挂
载真正的根设备了、kernel会自动挂载到这个跟文件下、内核会挂载真正的根到这个initramfs虚根的某个目录下、比如说挂载到/mnt
/sysroot的目录下、而后再完成根切换、而后我们的真正的根就可以加载了、那我们的内核怎么知道挂载的根文件系统是什么呢、那我们的grub向内核
传递参数root等于什么那就是告诉系统根文件系统所在的设备。

/sbin/init:他通常加载四个设备、/sbin/init、/bin/bash、如果内核找不到就去找根下的init、再找不着就去找/bin
/sh、/bin/bash、按照这个顺序去找、找到一个就可以启动系统、所以系统启动的第一个进程就启动了、init负责去启动用户空间中真正工作的进
程、init本身本身只是负责去生成这些正正工作的进程和回收这些进程的、是内核的第一个、最顶级的管理进程、但不负责具体的工作、虽然init不负责具
体工作、但他需要把一个用户空间启动为一个真正完整意义上的用户空间、所以init要结合他的配置文件inittab完成所谓系统初始化的。    
   在CentOS6上这个文件inittab之所以保留下来是为了跟CentOS5兼容的、其实我们用不着的、因为init大多数配置文件都位于/etc/init/*.conf目录下所有以.conf结尾的文件、是用于各子系统之间协调的。

/sbin/init作用包含以下几步:
       1、设定默认运行级别:runlevel -v:查看运行级别
     
 2、系统空间中的进一行初始化、这个要依赖于一个系统初始化脚本来完成的、这个脚本叫rc.sysinit、在有些系统上可能叫rcS、其实都是一个概
念、这个初始化包含键盘键映射、初始化没被挂载的文件系统等等。那/etc/rc.sysinit要进行哪些工作、seLinux、udev、键映射、交
换分区的激活、挂载额外文件系统、重新以读写方式挂载根文件系统等等。
     
 3、启动指定级别下的服务、后台的守护进程、每个级别都有一个在/etcg下rcN.d的文件、启动这个文件中所有以S开头的脚本服务、关闭所有以K开
头的服务脚本、/etc/rc.local其中以S开头的最后一个服务S99包含rc.local、有些我们不便于自己写脚本定义的服务可以写到这里来、
但是启动之后不会关闭、所以只是执行一些命令我们可以在这里执行、服务还是建议使用服务脚本。
       4、设定键映射
       5、启动虚拟终端、启动这个终端会调用一个叫login的程序、在虚拟终端上打印一个登录提示符让我们输入
       6、如果设备默认级别为5的话还可以启动图形终端
       init在早期是个串型的init、或者说传统意义是的init、sysV风格的、这种程序启动任何服务、运行任何程序完成系统初始化时统统以串型模式进行的、所以速度非常慢、以至于后来有了并型运行的init、启动速度也比较快。

准备工作:
 
 前面的系统裁减我们说过、为了可以让定制好的系统可以放到别的机器上动行、我们要把他做到一个独立的硬盘上去、所以首先我们在宿主机上添加一块SCSI
的硬盘、这些步骤参考前面的博文,总结之:CentOS
6.4系统裁减详解及装载网卡步骤http://tanxw.blog.51cto.com/4309543/1368801、这里不再详细说明、给出命
令、添加好后进行分区格式化操作。

# fdisk /dev/sdb
n p +50M n p +512M n p +256M t w
# mke2fs -t etx4 /dev/sdb1
# mke2fs -t etx4 /dev/sdb2
# mkswap /dev/sdb3
# mkdir -pv /mnt/{boot,sysroot}
# mount /dev/sdb1 /mnt/boot
# mount /dev/sdb2 /mnt/sysroot
第一步:编译内核或定制内核

1、获取内核程序包,可以到官网下载:https://www.kernel.org/、这里我们使用的内核版本是3.13.6的版本:
   解压内核文件、这里我们以make allnoconfig来编译安装、自己选择要编译的功能(让确保系统上的编译环境)

# tar xf linux-3.13..tar.xz -C /usr/src/
# cd /usr/src
# ln -sv linux-3.13. linux
# cd linux
# make allnoconfig
# make menuconfig 把我们所需要的内容整合进来

我们把这些内容全部编译进内核、不编译成模块、*号表示编译进内核

[*]-bit kernel :64位操作系统的内核
General setup --> Local version --> -MyLinux: 给内核定一个自己的版本
Processor type and features --> Processor family --> (X)Generic-x86-:这里是CPU类型、这个是通用x86-
[*]Symmetric multi-processing support:选择CPU支持多核心处理
[*]Enable loadable module support:选择内核动态模块加载
Bus options (PCI etc.) --> [*]PCI suppor:支持PCI总线
Device Drivers --> <*>SCSI device support -->[*]SCSI disk support要支持SCSI硬盘
Device Drivers -->Fusion MPT device support (NEW) --> <*>Fusion MPT ScsiHost drivers for SPI、<*>Fusion MPT misc device (ioctl) driver、[*]Fusion MPT logging facility:支持对硬盘的驱动
File systems --> <*>The Extended (ext4) filesystem:支持文件系统
Executable file formats / Emulations --> [*]Kernel support for ELF binaries、[*]Write ELF core dumps with partial segments (NEW)、 <*>Kernel support for scripts starting with #!:可执行文件的格式
Device Drivers -->Input device support --> [*]Keyboards -> <*>AT keyboard (NEW) [*]Mice:支持输入输出设备、比如健盘
Device Drivers > USB support > <*>UHCI HCD (most Intel and VIA) support、<*>OHCI HCD (USB 1.1) support、<*>EHCI HCD (USB 2.0) support:USB设备驱动
Device Drivers > Generic Driver Options > [*] Maintain a devtmpfs filesystem to mount at /dev [*]Automount devtmpfs at /dev, after the kernel mounted the rootfs
Networking support > Networking options[*] TCP/IP networking [*]IP:multicasting [*]IP: advanced router[*]IP: policy routing [*]IP: verbose route monitoring[*] IP: kernel level autoconfiguration[*]IP: DHCP support[*]IP: BOOTP support[*] IP: RARP support<*>IP: tunneling <*>Unix domain sockets<*> UNIX: socket monitoring interface:支持协议
Device Drivers > Network device support > Ethernet driver support[*]Intel devices (NEW)<*>Intel(R) PRO/ Gigabit Ethernet support<*>Intel(R) PRO/ PCI-Express Gigabit Ethernet support:只要Intel的、其他的他都去掉、这是选择网卡设备的驱动程序
[ ]Wireless:这个无线网、我们去掉去、用不着

OK、到这里保存退出、把配置文件复制一份出来、前面磁盘格式化而且都挂载好了、这里我们就把grub安装到boot下::

# cp .config /root/config-3.13.-x86_64
# make bzImage
# cp arch/x86/boot/bzImage /mnt/boot/
# grub-install --root-directory=/mnt /dev/sdb

BusyBox 的诞生

BusyBox 最初是由 Bruce Perens 在 1996 年为 Debian GNU/Linux 安装盘编写的。其目标是在一张软盘上创建一个可引导的 GNU/Linux 系统,这可以用作安装盘和急救盘。一张软盘可以保存大约 1.4-1.7MB 的内容,因此这里没有多少空间留给 Linux 内核以及相关的用户应用程序使用。

BusyBox 揭露了这样一个事实:很多标准 Linux 工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如 grepfind) 都需要在目录中搜索文件的代码。当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。实际 上,BusyBox 可以将大约 3.5MB 的工具包装成大约 200KB 大小。这就为可引导的磁盘和使用 Linux 的嵌入式设备提供了更多功能。我们可以对 2.4 和 2.6 版本的 Linux 内核使用 BusyBox。

BusyBox 编译选项

BusyBox 包括了几个编译选项,可以帮助为我们编译和调试正确的 BusyBox。

表 1. 为 BusyBox 提供的几个 make 选项
make 目标 说明
help 显示 make 选项的完整列表
defconfig 启用默认的(通用)配置
allnoconfig 禁用所有的应用程序(空配置)
allyesconfig 启用所有的应用程序(完整配置)
allbareconfig 启用所有的应用程序,但是不包括子特性
config 基于文本的配置工具
menuconfig N-curses(基于菜单的)配置工具
all 编译 BusyBox 二进制文件和文档(./docs)
busybox 编译 BusyBox 二进制文件
clean 清除源代码树
distclean 彻底清除源代码树
sizes 显示所启用的应用程序的文本/数据大小

在定义配置时,我们只需要输入 make 就可以真正编译 BusyBox 二进制文件。例如,要为所有的应用程序编译 BusyBox,我们可以执行下面的命令:

$ make allyesconfig
$ make

编译Busybox、让busybox提供一个sh程序、busybox可以模拟n种sh、可以模拟bash的特性、上面我们有介绍过他了。
   到busybox官网下载busybox程序包:http://www.busybox.net、我们这里用busybox-1.22.1版本的、要先安装上glibc-static、这里我的附件提供有哦。
   解压到当前目录下就可以了:

# yum -y install libmcrypt-devel
# rpm --install glibc-static-2.12-1.132.el6.x86_64.rpm
# tar xf busybox-1.22..tar.bz2
# cd busybox-1.22.
# make menuconfig
# make
# make install

make menuconfig时就选择这项就可以了、其他的都使用默认的吧:
   Busybox Settings -->Build Options -->[*] Build BusyBox as a static binary (no shared libs):把busybox编译也静态二进制、不用共享库    

# cp -a _install/* /mnt/sysroot/
# cd /mnt/sysroot/
# mkdir -pv /etc/rc.d var/log root home lib lib64 dev proc sys boot mnt media tmp srv
给grub提供一个配置文件
# vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title Mini Linux (3.13.6-MyLinux)
root (hd0,0)
kernel /bzImage ro root=/dev/sda2 init=/sbin/init

给小系统提供一个rc.sysinit、/mnt/sysroot/etc/rc.d/rc.sysinit、如果没有这个目录就自己创建、再提供一个/mnt/sysroot/etc/fstab文件

# vim /mnt/sysroot/etc/fstab
/dev/sda1 /boot ext4 defaults
proc /proc proc defaults
sysfs /sys sysfs defaults
/dev/sda2 / ext4 defaults
/dev/sda3 swap swap defaults

# mkdir -p /mnt/sysroot/etc/rc.d/rc.sysinit

#!/bin/sh
#
打印系统启动时的欢迎信息
echo -e "\tWecome to \033[34mMini\033[0m Linux"
判断/etc/sysroot/network是否存在并且可读、条件成立就source进来
[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network
判断$HOSTNAME是否为空并且$HOSTNAME==NONE、如果为空就给个默认值
[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME=localhost
给HOSTNAME赋值为定义好的HOSTNAME的值
/bin/hostname $HOSTNAME
挂载文件系统
echo "mounting proc filesystem..."
mount -t proc proc /proc
echo "mounting sysfs filesystem..."
mount -t sysfs sysfs /sys
自动探测各硬件设备、并且能够探测到的都装载设备文件
mdev -s
给系统配置一个IP地址
ifconfig lo 127.0.0.1
ifconfig eth0 172.16.254.188
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

# vim /mnt/sysroot/etc/inittab

::sysinit:/etc/rc.d/rc.sysinit 明确指定要找/etc/rc.d/rc.sysinit文件
::respawn:/sbin/getty tty1
::respawn:/sbin/getty tty2
::respawn:/sbin/getty tty3
::respawn:/sbin/getty tty4
::respawn:/sbin/getty tty5
::respawn:/sbin/getty tty6 :19200表示每秒钟传输的速率、getty是一个串型终端、他会调用一个登录界面让用户输入登录信息进行验证
tty6::askfirst:/bin/sh 启用6个虚拟终端
console::respawn:-/bin/sh 启用一个终端,如果出错重新启动respawn、-表示敲一回车才可以启用sh
::ctrlaltdel:/sbin/reboot 定义组合键、按ctrl+alt+del就reboot
::shutdown:/bin/umount -a -r 如果要要关机就卸载已挂载的设备、然后关机

提供系统用户登录帐号文件:

# useradd busybox
# passwd busybox
密码也设置为:busybox
# head - /etc/passwd > /mnt/sysroot/etc/passwd
# tail - /etc/passwd >> /mnt/sysroot/etc/passwd
# vim /mnt/sysroot/etc/passwd
root:x:::root:/root:/bin/sh
busybox:x::::/home/busybox:/bin/sh
# head - /etc/group > /mnt/sysroot/etc/group
# tail - /etc/group >> /mnt/sysroot/etc/group
# head - /etc/shadow > /mnt/sysroot/etc/shadow
# tail - /etc/shadow >> /mnt/sysroot/etc/shadow
# cat /mnt/sysroot/etc/shadow
提供一个登录欢迎信息、创建一个issue文件
# vim /mnt/sysroot/etc/issue
MyLinux is CentOS release 6.5
Kernel \r on an \m
提供主机名
# mkdir /mnt/sysroot/etc/sysconfig
# vim /mnt/sysroot/etc/sysconfig/network
HOSTNAME=mylinux.tanxw.com
提供命令提示符和环境变量
# vim /mnt/sysroot/etc/profile
export PS1='[\u@\h \A \W]\$ '
PATH="/usr/local/sbin:/usr/local/bin:/sbin/:/bin:/usr/sbin:/usr/bin:$PATH"
# chmod +x /mnt/sysroot/etc/rc.d/rc.sysinit
# sync 同步数据到磁盘中去

到这里我们的配置算是有个大概了、那就把宿主机挂起、创建一个自定义虚拟机、把我们制作有系统的那张硬盘放到自定义的虚拟机上运行:

如果第一个终端登录不了可以切换到其他终端上登录,按ctrl+alt+F2(F3\F4\F5\F6)可以切换到不同的终端上去登录的、这里我们登录成功了:

=================================远程登录和ngix访问==============================

OK、到这里我们自己定制的Linux可以跑起来了、接下来我们来实现远程登录和Nginx的访问:
   切换到宿主主上、下载dropbear-2013.58.tar.bz2和Nginx到本地:

1、解压安装dropbear

# tar xf dropbear-2013.58.tar.bz2
# cd dropbear-2013.58
# ./configure
# make
# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
# mkdir /etc/dropbear
生成两个密钥文件
# dropbearkey -t rsa -s -f /etc/dropbear/dropbear_rsa_host_key
# dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
验证一下生的这两个文件
# ls /etc/dropbear

2、服务脚本/etc/rc.d/init.d/dropbear

#!/bin/bash
#
# description: dropbear ssh daemon
# chkconfig:
#
dsskey=/etc/dropbear/dropbear_dss_host_key
rsakey=/etc/dropbear/dropbear_rsa_host_key
lockfile=/var/lock/subsys/dropbear
pidfile=/var/run/dropbear.pid
dropbear=/usr/local/sbin/dropbear
dropbearkey=/usr/local/bin/dropbearkey
[ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
[ -r /etc/sysconfig/dropbear ] && . /etc/sysconfig/dropbear
keysize=${keysize:-}
port=${port:-}
gendsskey() {
[ -d /etc/dropbear ] || mkdir /etc/dropbear
echo -n "Starting generate the dss key: "
$dropbearkey -t dss -f $dsskey &> /dev/null
RETVAL=$?
if [ $RETVAL -eq ]; then
success
echo
return
else
failure
echo
return
fi
}
genrsakey() {
[ -d /etc/dropbear ] || mkdir /etc/dropbear
echo -n "Starting generate the rsa key: "
$dropbearkey -t rsa -s $keysize -f $rsakey &> /dev/null
RETVAL=$?
if [ $RETVAL -eq ]; then
success
echo
return
else
failure
echo
return
fi
}
start() {
[ -e $dsskey ] || gendsskey
[ -e $rsakey ] || genrsakey
if [ -e $lockfile ]; then
echo -n "dropbear daemon is already running: "
success
echo
exit
fi
echo -n "Starting dropbear: "
daemon --pidfile="$pidfile" $dropbear -p $port -d $dsskey -r $rsakey
RETVAL=$?
echo
if [ $RETVAL -eq ]; then
touch $lockfile
return
else
rm -f $lockfile $pidfile
return
fi
}
stop() {
if [ ! -e $lockfile ]; then
echo -n "dropbear service is stopped: "
success
echo
exit
fi
echo -n "Stopping dropbear daemon: "
killproc dropbear
RETVAL=$?
echo
if [ $RETVAL -eq ]; then
rm -f $lockfile $pidfile
return
else
return
fi
}
status() {
if [ -e $lockfile ]; then
echo "dropbear is running..."
else
echo "dropbear is stopped..."
fi
}
usage() {
echo "Usage: dropbear {start|stop|restart|status|gendsskey|genrsakey}"
}
case $ in
start)
start ;;
stop)
stop ;;
restart)
stop
start
;;
status)
status
;;
gendsskey)
gendsskey
;;
genrsakey)
genrsakey
;;
*)
usage
;;
esac

3、脚本配置文件/etc/sysconfig/dropbear

keysize=
port=
# chmod +x /etc/rc.d/init.d/dropbear
# chkconfig --add dropbear
# vim /etc/profile.d/dropbear.sh
export PATH=/usr/local/sbin:$PATH
启动服务并查看端口22022是否已经处于监听状态、并在本地尝试连接登录:
# service dropbear start
# ss -tnl

OK了、dropbear在本机安装成功并且成功启动连接上去了、

那我们就移植到我们的定制系统上去吧、之前我们写过一个脚本用来移植命令的:

 
#!/bin/bash
#
dirPath=/mnt/sysroot
clearcmd(){
if which $ &> /dev/null;then
cmdPath=`which --skip-alias $`
else
echo "Command not exist!"
return
fi
}
cpCmd(){
dirName=`dirname $`
[ -d ${dirPath}${dirName} ] || mkdir -p ${dirPath}${dirName}
[ -f ${dirPath}${cmdPath} ] || cp $ ${dirPath}${dirName}
}
cpLib(){
for i in `ldd $ | grep -o "/[^[:space:]]\{1,\}"`;do
dirLib=`dirname $i`
[ -d ${dirPath}${dirLib} ] || mkdir -p ${dirPath}${dirLib}
[ -f ${dirPath}$i ] || cp $i ${dirPath}${dirLib}
done
}
while true;do
read -p "Enter a command:" cmd
if [ "$cmd" == 'quit' ];then
echo "quit!"
exit
fi
clearcmd $cmd
[ $? -eq ] && continue
cpCmd $cmdPath
cpLib $cmdPath
done

把这三个命令移植过去就可以了:dropbear、dropbearkey、scp、dbclient、bash、复制完后就去创建这个目录/mnt/sysroot/etc/dropbear、而后为移植过去的dropbear生成两个密钥文件:

# mkdir /mnt/sysroot/etc/dropbear
# dropbearkey -t rsa -s -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key
# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key

dropbear要认证用户、而认证用户要用到名称解析、这就意味着libnss库要复制过去、libnss库框架、而后给nss提供配置文件:

# cp -d /lib64/libnss_files* /mnt/sysroot/lib64
# cp -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64/
# cp -d /usr/lib64/libnss_files.so /mnt/sysroot/usr/lib64/
# cp /etc/nsswitch.conf /mnt/sysroot/etc/
# vim /mnt/sysroot/etc/nsswitch.conf
只保留以下几项、其他的都不需要:
passwd: files
shadow: files
group: files
hosts: files dns

在用户登录时dropbear认为用户的默认shell并不在/etc/shells下所在的用户shell中的话、他是不允许登录的、那我们就得给dropbear提供一个安全shell的配置文件了:

# vim /etc/shells
/bin/sh
/bin/hush
/bin/ash
/sbin/nologin
/bin/bash

要知道、dropbear启动时在/var/run/下会生成一个pid文件、而这个目录我们还没有创建、
   # mkdir /mnt/sysroot/var/run

到这里我们定制的系统还不能远程登录、当你远程登录时、所登录的终端都是远程/dev/pts的伪终端、这个伪终端是个伪文件系统、只要你的内核编译时支持这个文件系统、他就可以使用、当然、我们的目标机上还没有:

  # vim /mnt/sysroot/etc/fstab
加一行
devpts /dev/pts devpts defaults 再创建/dev/pts这个目录:
# mkdri /mnt/sysroot/etc/profile.d
# cp /etc/profile.d/dropbear.sh /mnt/sysroot/etc/profile.d/
# mkdir /mnt/sysroot/dev/pts
# sync

OK、我们先来测试一下dropbear远程登录看可不可以登录得上去、把宿主机挂起或关机、启动我们的目标机、由于我们的/dev/pts启动目标机
时可以会重新挂载的问题、会把/dev/pts下的目录给覆盖掉、所以我们进入目标机后可以在/dev/下创建pts这个目录、IP要设置在同一个网段
内:
   # mkdir /dev/pts
   # mount -a

实现页面Nginx访问
   这里我们用的版本是Nginx-1.4.2、这里我们以最简单的方式进行安装并运行服务起来:
   解决依赖关系:

# yum -y install pcre-devel
# tar xf nginx-1.4..tar.bz
# cd nginx-1.4.
# ./configure --prefix=/usr/local --conf-path=/etc/nginx/nginx.cnf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --user=nginx --group=nginx --without-pcre --without-http_rewrite_module --without-http_geo_module --without-http_uwsgi_module --without-http_fastcgi_module --without-http_scgi_module --without-http_memcached_module
--prefix=/usr/local:指定第三方软件安装目录
--conf-path=/etc/nginx/nginx.cnf:指定主配置文件的路径
--error-log-path=/var/log/nginx/error.log:指定错误日志存放路径
--http-log-path=/var/log/nginx/access.log:指定访问日志
--group=nginx:以nginx用户身份运行、反正不要以管理员的身份去运行
--group=nginx:nginx用户组
其他的选项都是nginx默认选项、我们都去掉
# make
# make install
# useradd nginx
# cd /usr/local/sbin
# ./nginx
# ss -tnl 查看80端口是否已经处于监听状态

接着移植nginx到目标机上去、用上面的那个复制命令的脚本:
   # ./cpCommad.sh
   Enter a command:nginx
   Enter a command:consoletype
   Enter a command:quit
   quit!

复制nginx下的配置文件到目标机上、而启动nginx需要nginx用户、所以用户也得追加到passwd文件中去、而后再给nginx添加一个测试页面就OK了:

# cp /etc/nginx/ /mnt/sysroot/etc/ -r
# grep "^nginx" /etc/passwd >> /mnt/sysroot/etc/passwd
# grep "^nginx" /etc/group >> /mnt/sysroot/etc/group
# grep "^nginx" /etc/shadow >> /mnt/sysroot/etc/shadow
# mkdir /mnt/sysroot/usr/local/html
# vim /usr/loca/html/index.html
<h2>Wecome to Nginx</h2>
<h3>This is MyLinux</h3>

给nginx提供一个服务脚本
   # vim /mnt/sysroot/etc/rc.d/init.d/nginx

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: -
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit
nginx="/usr/local/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V >& | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V >& | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f `
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit
[ -f $NGINX_CONF_FILE ] || exit
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null >&
}
case "$1" in
start)
rh_status_q && exit
$
;;
stop)
rh_status_q || exit
$
;;
restart|configtest)
$
;;
reload)
rh_status_q || exit
$
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit
esac

而在nginx启动时需要依赖于日志目录和pid文件目录、所以我们要事先给nginx创建这两目录先、还给创建锁文件:

# mkdir /mnt/sysroot/var/log/nginx
# mkdir /mnt/sysroot/usr/local/logs
# mkdir -pv /mnt/sysroot/var/lock/subsys
# chmod +x /mnt/sysroot/var/log/nginx
# chmod +x /mnt/sysroot/tmp/
# sync

OK、我们启动定制的目标系统、再启动dropbear和nginx、而服务也可以正常启动了、测试我们的nginx吧、如果服务脚本使用不了那就是里 面可以有一些依赖函数或一些命令没有全都移植到目标机上、不过不要紧、我们可以手动启动服务器、这个问题都不大、最后测试完没什么就poweroff关机 吧、如果nginx启动不了就重新把文件系统挂载为可读写就OK了:# mount -o remonut,rw /

结束:
 
 到此我们的定制过程就全都完成了、后续如果我们还需要添加什么功能的话可以自己慢慢添加上去的哦、如果我们有个树梅派的话可以把我们的小系统放到树梅派
上去跑起来的哦、那也成了一以linux电脑了、是不是很爽呀、好吧、就这样吧、如果大神有什么指出的话欢迎留言交流、谢谢关注了!

利用BusyBox ~私人定制 My LINUX~的更多相关文章

  1. 私人定制自己的linux小系统

     私人定制自己的linux小系统 一.前言    linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个linux爱好者都为其贡献了自己的一份力,不管是在 ...

  2. 定制x86 Linux系统

    /************************************************************************************* * 定制x86 Linux ...

  3. 高级私人定制西服品牌:XUAN PRIVE 为定制而生_乐活_onlylady女人志

    高级私人定制西服品牌:XUAN PRIVE 为定制而生_乐活_onlylady女人志 高级私人定制西服品牌:XUAN PRIVE 为定制而生

  4. OSX: 私人定制Dock默认程序图标

    不论什么一个新用户第一次登陆后,OSX都会自己主动地在用户的Dock中列出系统默认的应用程序图标,这些图标随着OSX版本号的不同而不同. 系统管理员有的时候须要改变这些系统默认图标,或者加入自己的或者 ...

  5. 去英国Savile Row 做件私人定制手工西装_GQ男士网

    去英国Savile Row 做件私人定制手工西装_GQ男士网 去英国Savile Row 做件私人定制手工西装

  6. 绫致时装讲述O2O细节:野心在“私人定制” - 移动购物 - 亿邦动力网

    绫致时装讲述O2O细节:野心在"私人定制" - 移动购物 - 亿邦动力网 绫致时装讲述O2O细节:野心在"私人定制" 作者: 亿邦动力网来源: 亿邦动力网201 ...

  7. 私人定制javascript事件处理机制(浅谈)

    看到园子里关于事件监听发表的文章,我都有点不好意思写了.不过想想我的题目以私人定制作开头也就妥妥地写吧. 事件相关概念 1.事件类型 发生事件的字符串 有传统事件类型 比如表单.window事件等 D ...

  8. UWP TextBox私人定制

    这次私人定制的是背景透明的TextBox,普通的TextBox在获取焦点后,背景色就变白色了. 下面的代码可以让TextBox的背景始终是透明的. 其实很简单,就修改了 <Setter Prop ...

  9. 旅行app(游记、攻略、私人定制) | 顺便游旅行H5移动端实例

    <顺便游旅行>是一款H5移动端旅行app,提供目的地(国内.国外.周边)搜索.旅游攻略查询.游记分享.私人定制4大模块,类似携程.同程.去哪儿.马蜂窝移动端,只不过顺便游app界面更为简洁 ...

随机推荐

  1. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...

  2. Minimum Palindromic Factorization(最少回文串分割)

    Minimum Palindromic Factorization(最少回文串分割) 以下内容大部分(可以说除了关于回文树的部分)来自论文A Subquadratic Algorithm for Mi ...

  3. 002_让你的linux虚拟终端五彩缤纷(1)——LS颜色设置

  4. 修改weblogic访问路径应用名称

    第一种:在应用WEB-INF文件夹下创建weblogic.xml文件,内容如下,其中<context-root>/abc</context-root>为路径上的应用名 < ...

  5. Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f070058 android-studio 3.0 from canary 5 to canary 6

    我升级android-studio到了3.0 canary 6打包编译安装出现如下错误: 07-11 13:00:39.523 8913-8913/dcpl.com.myapplication E/A ...

  6. 转:在CentOS 7.3使用yum安装 MySql5.6.24

    按照CentOS 6.5的方法在CentOS 7上安装会失败,需要按照下文进行安装. 1.安装rpm包 Linux系统自带的repo是不会自动更新每个软件的最新版本(基本都是比较靠后的稳定版),所以无 ...

  7. 画弧线DrawArc的研究-我自己 -- 直线交接圆角

    procedure TForm4.Button7Click(Sender: TObject); var pwith: Integer; //画笔的宽度 hx1, hy1: Integer; //横线第 ...

  8. google的面试题(三维动态规划的范例)——(87)Scramble String

    转:http://www.cnblogs.com/easonliu/p/3696135.html 分析:这个问题是google的面试题.由于一个字符串有很多种二叉表示法,貌似很难判断两个字符串是否可以 ...

  9. 用WP SMTP插件实现邮件发送功能

    WordPress本身是采用mail()函数发邮件的,但是这样发出的邮件很容易被放入垃圾箱,很多主机商(特别是Windows主机)为了避免用户滥发邮件直接禁用了mail()函数,还有些云计算平台(比如 ...

  10. IEEEXtreme 10.0 - N-Palindromes

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - N-Palindromes 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...