本次试验大致规划和步骤:完全定制一个linux系统;能让其远程登录和提供web服务。
1、添加一块空闲磁盘
2、下载编译内核
3、并为空闲磁盘安装grub
前提准备:
[root@soul ~]# fdisk /dev/sdb 分区 Command (m for help): p Disk /dev/sdb: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk 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/bash aimDir=/mnt/sysroot cmdInput() { if which $cmd &> /dev/null;then cmdPath=`which --skip-alias $cmd` else echo "No such command." return 5 fi } cpCmd() { 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} done } echo "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 fi cmdInput [ $? -eq 5 ] && continue cpCmd cpLib [ $? -eq 0 ] && echo -e "\033[36mCopy successful.\033[0m" done
一、编译内核
[root@soul ~]# ls anaconda-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/conf scripts/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 ~]# ls anaconda-ks.cfg config-3.13.8-x86_64 install.log.syslog busybox-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 menuconfig Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs) #选中这项 #其他选项都不需要改动了 [root@soul busybox-1.22.1]# make perl: 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 binary setuid root to ensure all configured applets will work 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]# ls bin 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.conf default=0 timeout=5 title 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 0 proc /proc proc defaults 0 0 sysfs /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/sh # echo -e "\tWelcome to \033[36mMini Linux\033[0m Soul" mount -a mdev -s ifconfig lo 172.0.0.1 ifconfig 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.sysinit console::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 #更改默认shell root:x:0:0:root:/root:/bin/sh soul: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/network HOSTNAME=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/sh # echo -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/profile mdev -s mount -a ifconfig lo 172.0.0.1 ifconfig eth0 172.16.40.2 [root@soul sysroot]# vim etc/issue Welcome to Mini Linux Soul kernel \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 2222 tcp LISTEN 0 20 :::2222 :::* tcp LISTEN 0 20 *:2222 *:* [root@soul dropbear-2013.58]# 测试是否可以登陆 #用脚本来复制命令和依赖的库文件到Mini系统上 [root@soul ~]# sh cp.sh You can input [q|Q] quit. Enter a command: dropbear Copy successful. Enter a command: dropbearkey Copy successful. Enter a command: scp Copy successful. Enter a command: bash Copy successful. Enter a command: q You 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.sysinit mdev -s #这个下面添加一行 mkdir /dev/pts mount -a [root@soul sysroot]# vim etc/fstab /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
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 33 # 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=1024 port=22 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 0 ]; then success echo return 0 else failure echo return 1 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 0 ]; then success echo return 0 else failure echo return 1 fi } start() { [ -e $dsskey ] || gendsskey [ -e $rsakey ] || genrsakey if [ -e $lockfile ]; then echo -n "dropbear daemon is already running: " success echo exit 0 fi 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 1 fi } stop() { if [ ! -e $lockfile ]; then echo -n "dropbear service is stopped: " success echo exit 1 fi echo -n "Stopping dropbear daemon: " killproc dropbear RETVAL=$? echo if [ $RETVAL -eq 0 ]; then rm -f $lockfile $pidfile return 0 else return 1 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 $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; gendsskey) gendsskey ;; genrsakey) genrsakey ;; *) usage ;; esac [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]# ll total 8 lrwxrwxrwx. 1 root root 15 Apr 2 22:09 dropbear.k -> init.d/dropbear lrwxrwxrwx. 1 root root 15 Apr 2 22:09 dropbear.s -> init.d/dropbear #查看是否连接成功 [root@soul etc]# vim rc.d/rc.sysinit mkdir /dev/pts #下面加一行 /etc/rc.d/*.s start
7、提供关机服务脚本
[root@soul etc]# vim rc.d/rc.sysdown #!/bin/sh # sync sleep 5 /etc/rc.d/*.k stop /bin/umount -a -r poweroff [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.2 Connecting to 172.16.40.2:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. [root@Soul ~]#ifconfig eth0 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 80 tcp LISTEN 0 128 *:80 *:* [root@soul nginx-1.4.2]# 在浏览器测试下
2、移植nginx
[root@soul ~]# sh cp.sh You can input [q|Q] quit. Enter a command: nginx Copy successful. Enter a command: q You 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} # Define variable nginx=/usr/local/sbin/nginx pidfile=/usr/local/logs/nginx.pid PROGRAM=`basename $0` nginx_conf=/etc/nginx/nginx.conf alog=/var/log/nginx/access.log elog=/var/log/nginx/error.log VERSION=1.4.2 # Functions 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" fi } 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..." fi } 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..." fi } status(){ if [ -e $pidfile ];then echo "Nginx is running..." else echo "Nginx is stopped..." fi } case $1 in start) start ;; stop) stop ;; restart) stop sleep2 start ;; reload) reload ;; status) status ;; --help) usage ;; --version) version ;; *) usage esac [root@soul ~]# chmod +x /mnt/sysroot/etc/rc.d/init.d/nginx [root@soul ~]# cd /mnt/sysroot/etc/rc.d/ [root@soul rc.d]# ls dropbear.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 -s mkdir /dev/pts mount -a mount -n -o remount,rw / /etc/rc.d/dropbear.s start /etc/rc.d/nginx.s start
Xshell:\> ssh 172.16.40.2 Connecting to 172.16.40.2:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. [root@Soul ~]#su - soul [soul@Soul ~]$ #测试ssh登陆和切换账户都是没有问题的。
到此;本实验结束;且需要的功能都以实现;关于程序的开机启动和关机关闭的问题;这个问题也琢磨了很长时间;个人感觉应该是次顺问题;所以如需实现;可能需要更改启动/关闭脚本文件。
如有错误;恳请纠正。