编译内核+BusyBox定制一个Linux提供ssh和web服务推荐

本次试验大致规划和步骤:完全定制一个linux系统;能让其远程登录和提供web服务。

1、添加一块空闲磁盘

2、下载编译内核

3、并为空闲磁盘安装grub

前提准备:

[root@soul ~]# fdisk /dev/sdb 分区Command (m for help): pDisk /dev/sdb: 10.7 GB, 10737418240 bytes255 heads, 63 sectors/track, 1305 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x4e977ad9 Device Boot Start End Blocks Id System/dev/sdb1 1 7 56196 83 Linux/dev/sdb2 8 73 530145 83 Linux/dev/sdb3 74 107 273105 82 Linux swap / Solaris#格式化操作[root@soul ~]# mke2fs -t ext4 /dev/sdb1[root@soul ~]# mke2fs -t ext4 /dev/sdb2[root@soul ~]# mkswap /dev/sdb3[root@soul ~]# mkdir -pv /mnt/{boot,sysroot}[root@soul ~]# mount /dev/sdb1 /mnt/boot/[root@soul ~]# mount /dev/sdb2 /mnt/sysroot/[root@soul ~]# grub-install --root-directory=/mnt /dev/sdb 安装grub[root@soul ~]# ls /mnt/boot/grub lost+found[root@soul ~]# 上述信息显示安装成功

其中需要一个脚本来移植命令和所依赖的库文件:

#脚本可能不完善;不过可用#!/bin/bashaimDir=/mnt/sysrootcmdInput() { if which $cmd /dev/null;then cmdPath=`which --skip-alias $cmd` else echo "No such command." return 5cpCmd() { cmdDir=`dirname $cmdPath` [ -d ${aimDir}${cmdDir} ] || mkdir -p ${aimDir}${cmdDir} [ -f $cmdPath ] cp $cmdPath ${aimDir}${cmdDir}cpLib() { for libPath in `ldd $cmdPath | grep -o "/[^[:space:]]\{1,\}"`;do libDir=`dirname $libPath` [ -d ${aimDir}${libDir} ] || mkdir -p ${aimDir}${libDir} [ -f $libPath ] cp $libPath ${aimDir}${libDir} doneecho "You can input [q|Q] quit."while true;do read -p "Enter a command: " cmd if [[ "$cmd" =~ \(|q|Q|\) ]];then echo "You choose quit." exit 0 cmdInput [ $? -eq 5 ] continue cpCmd cpLib [ $? -eq 0 ] echo -e "\033[36mCopy successful.\033[0m"done

一、编译内核

下载地址:https://www.kernel.org/

[root@soul ~]# lsanaconda-ks.cfg install.log install.log.syslog linux-3.13.8.tar.xz[root@soul ~]# 这里下载的是目前最新的稳定版[root@soul ~]# tar xf linux-3.13.8.tar.xz -C /usr/src/[root@soul ~]# ln -sv /usr/src/linux-3.13.8/ /usr/src/linux 创建链接`/usr/src/linux' - `/usr/src/linux-3.13.8/'[root@soul ~]# cd /usr/src/linux[root@soul linux]#[root@soul 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/confscripts/kconfig/conf --allnoconfig Kconfig# configuration written to .config[root@soul linux]# make menuconfig#下面的选择没办法列出来;给个大概1、选择CPU类型2、支持动态模块装载3、PCI总线支持4、硬盘驱动5、文件系统6、可执行文件格式7、I/O驱动;USB驱动8、devtmpfs支持9、选择网络支持以及网卡驱动#结束后备份下配置文件;然后编译成bzImage格式[root@soul linux]# cp .config /root/config-3.13.8-x86_64[root@soul linux]# make bzImage[root@soul linux]# cp arch/x86/boot/bzImage /mnt/boot/

二、安装BusyBox

BusyBox 是一个遵循GPL协议、以自由软件形式发布的应用程序。Busybox在单一的可执行文件中提供了精简的Unix工具集(例如shell、init、getty、login…),可运行于多款POSIX环境的操作系统,例如Linux(包括Android)、Hurd、FreeBSD等等。

1、安装;官方下载地址:http://www.busybox.net/

#因为稍后需要编译busybox为静态二进制程序;所以需要实现安装glibc-static和libmcrypt-devel;#glibc-static在安装光盘的第二张光盘上;可以挂在安装;也可以到网上下载[root@soul busybox-1.22.1]# mount /dev/cdrom /media/mount: block device /dev/sr0 is write-protected, mounting read-only[root@soul busybox-1.22.1]# yum -y install /media/Packages/glibc-static-2.12-1.132.el6.x86_64.rpm[root@soul ~]# lsanaconda-ks.cfg config-3.13.8-x86_64 install.log.syslogbusybox-1.22.1.tar.bz2 install.log linux-3.13.8.tar.xz[root@soul ~]#[root@soul ~]# tar xf busybox-1.22.1.tar.bz2[root@soul ~]# cd busybox-1.22.1 #安装可以查看INSTALL文件说明[root@soul busybox-1.22.1]# make menuconfigBusybox Settings ---  Build Options ---  [*] Build BusyBox as a static binary (no shared libs) #选中这项#其他选项都不需要改动了[root@soul busybox-1.22.1]# makeperl: warning: Setting locale failed.perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LANG = "en"#根据提示设置下[root@soul busybox-1.22.1]# export LANGUAGE=en_US.UTF-8[root@soul busybox-1.22.1]# export LANG=en_US.UTF-8[root@soul busybox-1.22.1]# export LC_ALL=en_US.UTF-8[root@soul busybox-1.22.1]# make 再次make通过[root@soul busybox-1.22.1]# make install--------------------------------------------------You will probably need to make your busybox binarysetuid root to ensure all configured applets willwork properly.--------------------------------------------------[root@soul busybox-1.22.1]#[root@soul busybox-1.22.1]# ls _install/bin linuxrc sbin usr[root@soul busybox-1.22.1]# cp -a _install/* /mnt/sysroot/[root@soul busybox-1.22.1]# cd /mnt/sysroot/[root@soul sysroot]# lsbin linuxrc lost+found sbin usr[root@soul sysroot]# mkdir -pv etc/rc.d var/log root proc sys srv boot mnt tmp home dev lib lib64

2、提供一个grub.conf文件

[root@soul sysroot]# vim /mnt/boot/grub/grub.confdefault=0timeout=5title Mini Linux (3.13.8-soul) root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init#完成后sync同步下;挂起宿主机;然后创建一个新的虚拟机使用之前添加的磁盘#即可测试启动

测试基本启动以正常。但是提示没有脚本文件。

测试可以配置IP地址;也能ping网关。

3、提供rc脚本

[root@soul sysroot]# vim etc/fstab/dev/sda1 /boot ext4 defaults 0 0proc /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0/dev/sda2 / ext4 defaults 0 0/dev/sda3 swap swap defaults 0 0[root@soul sysroot]# mkdir etc/init.d[root@soul sysroot]# vim etc/rc.d/rc.sysinit#!/bin/shecho -e "\tWelcome to \033[36mMini Linux\033[0m Soul"mount -amdev -sifconfig lo 172.0.0.1ifconfig eth0 172.16.40.2[root@soul sysroot]# chmod +x etc/rc.d/rc.sysinit[root@soul sysroot]# vim etc/inittab::sysinit:/etc/rc.d/rc.sysinitconsole::respawn:-/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount -a -r[root@soul sysroot]#sync#测试启动

测试启动正常。

三、实现密码登陆;且可以ssh远程连接

1、提供虚拟终端;更改之前的inittab文件

[root@soul 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[root@soul sysroot]# sync

2、提供密码文件

#这里以原有的机器上的密码文件追加到新的系统文件里[root@soul sysroot]# head -1 /etc/passwd /mnt/sysroot/etc/passwd[root@soul sysroot]# grep soul /etc/passwd /mnt/sysroot/etc/passwd[root@soul sysroot]# vim /mnt/sysroot/etc/passwd#更改默认shellroot:x:0:0:root:/root:/bin/shsoul:x:500:500::/home/soul:/bin/sh[root@soul sysroot]# head -1 /etc/group /mnt/sysroot/etc/group[root@soul sysroot]# grep soul /etc/group /mnt/sysroot/etc/group[root@soul sysroot]# head -1 /etc/shadow /mnt/sysroot/etc/shadow[root@soul sysroot]# grep soul /etc/shadow /mnt/sysroot/etc/shadow[root@soul sysroot]# chmod 400 /mnt/sysroot/etc/shadow#sync后直接测试;一般tty1登陆是有问题的。

测试登陆成功。

3、提供主机名等信息

[root@soul sysroot]# mkdir etc/sysconfig[root@soul sysroot]# vim etc/sysconfig/networkHOSTNAME=Soul.com[root@soul etc]# vim profile 设置环境变量export PS1='[\u@\h \W]\$'export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/usr/local/bin[root@soul sysroot]# vim etc/rc.d/rc.sysinit#!/bin/shecho -e "\tWelcome to \033[36mMini Linux\033[0m Soul"[ -r /etc/sysconfig/network ] . /etc/sysconfig/network[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] HOSTNAME=localhost/bin/hostname $HOSTNAME[ -r /etc/profile ] . /etc/profilemdev -smount -aifconfig lo 172.0.0.1ifconfig eth0 172.16.40.2[root@soul sysroot]# vim etc/issueWelcome to Mini Linux Soulkernel \r

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

[root@soul ~]# tar xf dropbear-2013.58.tar.bz2[root@soul ~]# cd dropbear-2013.58[root@soul dropbear-2013.58]# ./configure[root@soul dropbear-2013.58]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"[root@soul dropbear-2013.58]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install[root@soul dropbear-2013.58]# mkdir /etc/dropbear[root@soul dropbear-2013.58]# dropbearkey -t rsa -s 1024 -f /etc/dropbear/dropbear_rsa_host_key[root@soul dropbear-2013.58]# dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key[root@soul dropbear-2013.58]# dropbear -p 2222[root@soul dropbear-2013.58]# ss -tunl | grep 2222tcp LISTEN 0 20 :::2222 :::*tcp LISTEN 0 20 *:2222 *:*[root@soul dropbear-2013.58]# 测试是否可以登陆#用脚本来复制命令和依赖的库文件到Mini系统上[root@soul ~]# sh cp.shYou can input [q|Q] quit.Enter a command: dropbearCopy successful.Enter a command: dropbearkeyCopy successful.Enter a command: scpCopy successful.Enter a command: bashCopy successful.Enter a command: qYou choose quit.[root@soul ~]#[root@soul ~]# cp -d /lib64/libnss_files* /mnt/sysroot/lib64/[root@soul ~]# cp -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64/[root@soul ~]# cp -d /usr/lib64/libnss_files.so /mnt/sysroot/usr/lib64/[root@soul ~]# cp /etc/nsswitch.conf /mnt/sysroot/etc/[root@soul ~]# vim /mnt/sysroot/etc/shells#安全shell/bin/sh/bin/hush/sbin/nologin/bin/bash/bin/ash#在Mini系统生成key文件[root@soul ~]# mkdir /mnt/sysroot/etc/dropbear[root@soul ~]# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key[root@soul ~]# dropbearkey -t rsa -s 1024 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key[root@soul ~]# mkdir /mnt/sysroot/var/run 存放pid文件

5、挂载pts

[root@soul sysroot]# vim etc/rc.d/rc.sysinitmdev -s #这个下面添加一行mkdir /dev/ptsmount -a[root@soul sysroot]# vim etc/fstab/dev/sda1 /boot ext4 defaults 0 0proc /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0#下面加一行devpts /dev/pts devpts defaults 0 0

6、提供dropbear的启动脚本

[root@soul sysroot]# mkdir etc/rc.d/init.d[root@soul sysroot]# vim etc/rc.d/init.d/dropbear#!/bin/bash# description: dropbear ssh daemon# chkconfig: 2345 66 33dsskey=/etc/dropbear/dropbear_dss_host_keyrsakey=/etc/dropbear/dropbear_rsa_host_keylockfile=/var/lock/subsys/dropbearpidfile=/var/run/dropbear.piddropbear=/usr/local/sbin/dropbeardropbearkey=/usr/local/bin/dropbearkey[ -r /etc/rc.d/init.d/functions ] . /etc/rc.d/init.d/functions[ -r /etc/sysconfig/dropbear ] . /etc/sysconfig/dropbearkeysize=1024port=22gendsskey() { [ -d /etc/dropbear ] || mkdir /etc/dropbear echo -n "Starting generate the dss key: " $dropbearkey -t dss -f $dsskey /dev/null RETVAL=$? if [ $RETVAL -eq 0 ]; then success echo return 0 else failure echo return 1genrsakey() { [ -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 0 ]; then success echo return 0 else failure echo return 1start() { [ -e $dsskey ] || gendsskey [ -e $rsakey ] || genrsakey if [ -e $lockfile ]; then echo -n "dropbear daemon is already running: " success echo exit 0 echo -n "Starting dropbear: " daemon --pidfile="$pidfile" $dropbear -p $port -d $dsskey -r $rsakey RETVAL=$? echo if [ $RETVAL -eq 0 ]; then touch $lockfile return 0 else rm -f $lockfile $pidfile return 1stop() { if [ ! -e $lockfile ]; then echo -n "dropbear service is stopped: " success echo exit 1 echo -n "Stopping dropbear daemon: " killproc dropbear RETVAL=$? echo if [ $RETVAL -eq 0 ]; then rm -f $lockfile $pidfile return 0 else return 1status() { if [ -e $lockfile ]; then echo "dropbear is running..." else echo "dropbear is stopped..."usage() { echo "Usage: dropbear {start|stop|restart|status|gendsskey|genrsakey}"case $1 in start) start ;; stop) stop ;; restart) stop start status) status gendsskey) gendsskey genrsakey) genrsakey usageesac [root@soul sysroot]# chmod +x etc/rc.d/init.d/dropbear[root@soul sysroot]# cp /etc/rc.d/init.d/functions etc/rc.d/init.d/#做启动脚本链接文件[root@soul ~]# cd /mnt/sysroot/etc/rc.d/[root@soul rc.d]# ln -sv init.d/dropbear dropbear.s[root@soul rc.d]# ln -sv init.d/dropbear dropbear.k`dropbear.k' - `init.d/dropbear'[root@soul rc.d]# lltotal 8lrwxrwxrwx. 1 root root 15 Apr 2 22:09 dropbear.k - init.d/dropbearlrwxrwxrwx. 1 root root 15 Apr 2 22:09 dropbear.s - init.d/dropbear#查看是否连接成功[root@soul etc]# vim rc.d/rc.sysinitmkdir /dev/pts#下面加一行/etc/rc.d/*.s start

7、提供关机服务脚本

[root@soul etc]# vim rc.d/rc.sysdown#!/bin/shsleep 5/etc/rc.d/*.k stop/bin/umount -a -rpoweroff[root@soul etc]# chmod +x rc.d/rc.sysdown[root@soul etc]# vim inittab#更改下面这行为执行脚本::shutdown:/etc/rc.d/rc.sysdown#测试启动远程连接

测试tty1也可以正常登陆;只是需要等待一会在登陆即可

Xshell:\ ssh 172.16.40.2Connecting to 172.16.40.2:22...Connection established.To escape to local shell, press 'Ctrl+Alt+]'.[root@Soul ~]#ifconfigeth0 Link encap:Ethernet HWaddr 00:0C:29:38:36:2B inet addr:172.16.40.2 Bcast:172.16.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:67 errors:0 dropped:0 overruns:0 frame:0 TX packets:28 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:6415 (6.2 KiB) TX bytes:3538 (3.4 KiB) Interrupt:19 Base address:0x2000#测试开机可以自动启动dropbear;并可以远程登陆

四、安装nginx;提供web服务

1、安装;下载地址:http://nginx.org/

[root@soul ~]# cd nginx-1.4.2[root@soul nginx-1.4.2]# ./configure --prefix=/usr/local --conf-path=/etc/nginx/nginx.conf --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[root@soul nginx-1.4.2]# make make install[root@soul nginx-1.4.2]# useradd nginx[root@soul nginx-1.4.2]# nginx[root@soul nginx-1.4.2]# ss -tunl | grep 80tcp LISTEN 0 128 *:80 *:*[root@soul nginx-1.4.2]# 在浏览器测试下

2、移植nginx

[root@soul ~]# sh cp.shYou can input [q|Q] quit.Enter a command: nginxCopy successful.Enter a command: qYou choose quit.[root@soul ~]#[root@soul ~]# cp /etc/nginx/ /mnt/sysroot/etc/ -r[root@soul ~]# grep "^nginx" /etc/passwd /mnt/sysroot/etc/passwd[root@soul ~]# grep "^nginx" /etc/group /mnt/sysroot/etc/group[root@soul ~]# grep "^nginx" /etc/shadow /mnt/sysroot/etc/shadow[root@soul ~]# mkdir /mnt/sysroot/usr/local/html[root@soul ~]# vim /mnt/sysroot/usr/local/html/index.html h1 Welcome to Nginx /h1 [root@soul ~]#

3、提供服务脚本

#由于nginx的脚本如调用functions函数;可能会导致依赖其他redhat系统独有的函数;会导致开机无法自启动;也会影响其他程序导致无法启动;所以需要自行写个脚本。[root@soul ~]# vi /mnt/sysroot/etc/rc.d/nginx#!/bin/sh# Startup script for the Nginx# chkconfig: - 88 63# description: Nginx is a free,open-source,high-performance HTTP Server and reverse proxy.# program:/usr/local/sbin/nginx# config:/etc/nginx/nginx.conf# pidfile:/usr/local/logs/nginx.pid# Synopsis:# nginx [--help] [--version] {start|stop|restart|reload|status}usage(){ echo "Usage: $PROGRAM [--help] [--version] {start|stop|restart|reload|status}"version(){ echo "Version:$VERSION"start(){if [ -e $pidfile ] then echo "Nginx already running..." else [ -f $alog ] || touch $alog [ -f $elog ] || touch $elog echo -e "Starting Nginx:\t\t\t\t\t\t\t\c" $nginx -c $nginx_conf touch $pidfile echo -e "[ \c" echo -e "\033[0;32mOK\033[0m\c" echo -e " ]\c" echo -e "\r"stop(){if [ -e $pidfile ] then echo -e "Stopping Nginx:\t\t\t\t\t\t\t\c" /usr/bin/killall $PROGRAM /dev/null rm -f $pidfile echo -e "[ \c" echo -e "\033[0;32mOK\033[0m\c" echo -e " ]\c" echo -e "\r" else echo "Nginx already stopped..."reload(){if [ -e $pidfile ] then echo -e "Reloading Nginx:\t\t\t\t\t\t\c" kill -HUP `pidof $PROGRAM` echo -e "[ \c" echo -e "\033[0;32mOK\033[0m\c" echo -e " ]\c" echo -e "\r" else echo "Nginx is not running..."status(){ if [ -e $pidfile ];then echo "Nginx is running..." else echo "Nginx is stopped..."case $1 in start) start stop) stop restart) stop sleep2 start reload) reload status) status --help) usage --version) version usage[root@soul ~]# chmod +x /mnt/sysroot/etc/rc.d/init.d/nginx[root@soul ~]# cd /mnt/sysroot/etc/rc.d/[root@soul rc.d]# lsdropbear.k dropbear.s init.d rc.sysdown rc.sysinit[root@soul rc.d]# ln -sv init.d/nginx nginx.s`nginx.s' - `init.d/nginx'[root@soul rc.d]# ln -sv init.d/nginx nginx.k`nginx.k' - `init.d/nginx'

4、开机测试

这里可能由于没有启动的先后顺序;如按照之前的启动方式会导致都无法开机自动启动;这里更改了开机启动脚本:

[root@soul sysroot]# vim etc/rc.d/rc.sysinit#下面是分开启动的;否则会启动失败mdev -smkdir /dev/ptsmount -amount -n -o remount,rw //etc/rc.d/dropbear.s start/etc/rc.d/nginx.s start

Xshell:\ ssh 172.16.40.2Connecting to 172.16.40.2:22...Connection established.To escape to local shell, press 'Ctrl+Alt+]'.[root@Soul ~]#su - soul[soul@Soul ~]$#测试ssh登陆和切换账户都是没有问题的。

到此;本实验结束;且需要的功能都以实现;关于程序的开机启动和关机关闭的问题;这个问题也琢磨了很长时间;个人感觉应该是次顺问题;所以如需实现;可能需要更改启动/关闭脚本文件。

如有错误;恳请纠正。

这一秒不放弃,下一秒就会有希望。

编译内核+BusyBox定制一个Linux提供ssh和web服务推荐

相关文章:

你感兴趣的文章:

标签云: