1、这里采取在Centos 6.5 X86_64的VMware的虚拟机上制作一个超小的Linux内核
2、然后在这个内核上提供一个busybox
3、然后制作用户可登录系统且有密码验证
4、最后在Centos 6.5 X86_64的VMware虚拟机上编译Nginx再移植到这个超小的Linux系统上
准备工作、在Centos虚拟机上新加一块硬盘,然后再新建一个Linux虚拟机
注意新建虚拟机的硬盘不是新建硬盘哦是共用已有Centos6.5虚拟机上新加的硬盘
然后在在Centos6.5虚拟机上对这个新加的硬盘进行分区和挂载
[[email protected] ~]# fdisk /dev/sdb << EOF n p 1 +50M n p 2 +512M w EOF [[email protected] ~]# mke2fs -t ext4 /dev/sdb1 [[email protected] ~]# mke2fs -t ext4 /dev/sdb2 [[email protected] ~]# mkdir -p /mnt/{boot,sysroot} [[email protected] ~]# mount /dev/sdb1 /mnt/boot [[email protected] ~]# mount /dev/sdb2 /mnt/sysroot ###下面是对新硬盘安装grub,不然等下Mini Linux都没办法启动。。。。 [[email protected] ~]# grub-install --root-directory=/mnt /dev/sdb ###下面是我的Grub启动配置文件 [[email protected] ~]# cat /mnt/boot/grub/grub.conf default=0 timeout=5 title Mini Linux (Linux-3.13.6-LookBack-MiNi-01) root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init quiet ###也可以用下面的命令直接下载我的 [[email protected] ~]# wget http://www.dwhd.org/wp-content/uploads/2014/08/grub.conf -O /mnt/boot/grub/grub.conf
一、编译个精简的Linux内核出来,本文使用的是linux-3.13.6.tar.xz这个版本的内核。
[[email protected] ~]# wget http://www.dwhd.org/ruanjian/linux-3.13.6.tar.xz [[email protected] ~]# tar xf linux-3.13.6.tar.xz -C /usr/src [[email protected] ~]# cd /usr/src/linux-3.13.6 [[email protected] linux-3.13.6]# mkae menuconfig ###可以参照下面的截图来选择menuconfig的选项 ###如果不想这么麻烦可以直接下载我这边弄的.config文件到内核源码的目录下再适当修改也可以 [[email protected] linux-3.13.6]# wget http://www.dwhd.org/wp-content/uploads/2014/08/old.config -O /usr/src/linux-3.13.6/.config ###上面的config文件是没有无线模块的 [[email protected] linux-3.13.6]# wget http://www.dwhd.org/wp-content/uploads/2014/08/new.config -O /usr/src/linux-3.13.6/.config ###上面的config文件有启用了无限模块和所有无线网卡的驱动 ####================================================================================================================================ ###上面的步骤做好了就可以来编译了 [[email protected] linux-3.13.6]# make -j 4 ###结束后会生成这个文件的/usr/src/linux-3.13.6arch/x86/boot/bzImage [[email protected] linux-3.13.6]# cp /usr/src/linux-3.13.6/arch/x86/boot/bzImage /mnt/boot/
二、编译busybox,和配置一些基础文件
2.1编译busybox
[[email protected] linux-3.13.6]# cd ~/ [[email protected] ~]# wget http://busybox.net/downloads/busybox-1.22.1.tar.bz2 [[email protected] ~]# tar xf busybox-1.22.1.tar.bz2 [[email protected] ~]# cd busybox-1.22.1 [[email protected] busybox-1.22.1]# make menuconfig ###注意 需要选择 静态库的编译方法 ###这里也需要选择 配置一些选项 如果图方便可以用这里已经生成的.config文件 然后直接编译 ###如果用我的.config文件 就不用运行上面的make menuconfig这个命令了 [[email protected] busybox-1.22.1]# wget http://www.dwhd.org/wp-content/uploads/2014/08/busybox.config -O ~/busybox-1.22.1/.config [[email protected] busybox-1.22.1]# make -j 4 && make install ###编译好之后 会把所有的结果都存放在/mnt/sysroot目录下了
2.2 配置基础文件
[[email protected] busybox-1.22.1]# cd /mnt/sysroot/ [[email protected] sysroot]# mkdir {boot,dev,etc/rc.d,home,lib64,meida,mnt,proc,root,sys,tmp,var,usr/lib64} [[email protected] sysroot]# touch etc/fstab [[email protected] sysroot]# touch etc/inittab [[email protected] sysroot]# touch etc/rc.d/rc.sysinit [[email protected] sysroot]# chmod +x etc/rc.d/rc.sysinit
下面来编辑/mnt/sysroot/etc/ 下的 fstab inittab rc.d/rc.sysinit文件
####下面是我的3个文件内容, [[email protected] sysroot]# cat etc/fstab /dev/sda2 / ext4 defaults 0 0 /dev/sda1 /boot ext4 defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 [[email protected] sysroot]# cat etc/inittab ::sysinit:/etc/rc.d/rc.sysinit console::respawn:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r [[email protected] sysroot]# cat etc/rc.d/rc.sysinit #!/bin/sh ######################################################################### # File Name: rc.sysinit # Author: LookBack # Email: [email protected] # Version: # Licence: GNU General Public Licence # Created Time: Fri 22 Aug 2014 11:31:23 PM CST ######################################################################### echo "" echo -e "\033[31mWelcome\033[0m \033[36mTo\033[0m \033[32mLookBack\033[0m \033[31mMiNi\033[0m \033[36mLinux\033[0m" echo "" echo -e "\033[36mMount proc /proc\033[0m" mount -n -t proc proc /proc echo "" echo -e "\033[33mMount /dev/sda2 / \033[0m" mount -n -o remount,rw /dev/sda2 / echo ""
这时候我们关闭当前的Centos6.5 虚拟机 然后去启动那个新建的Mini Linux 虚拟机,来看看效果
grub启动菜单界面
系统启动界面
直接按回车 进入系统试试(这里我还没有做login,等做了就需要帐号和密码才能进入系统了)
来看看top命令
来看看du命令
下面来配置下网络
然后看看是否有效,可以和其他主机进行联通了
三、配置可以登录的Mini Linux
[[email protected] ~]# cp -a /etc/passwd /etc/shadow /etc/group /mnt/sysroot/etc/ [[email protected] ~]# cd /mnt/sysroot/etc/ [[email protected] etc]# ls -l total 24 -rw-r--r-- 1 root root 128 Aug 22 21:50 fstab -rw-r--r-- 1 root root 804 Jul 1 20:14 group -rw-r--r-- 1 root root 112 Aug 22 21:48 inittab -rw-r--r--. 1 root root 1578 Jun 30 21:31 passwd drwxr-xr-x 2 root root 4096 Aug 22 23:31 rc.d ----------. 1 root root 900 Jun 30 21:31 shadow [[email protected] etc]# sed -i '2,$d' group passwd shadow [[email protected] etc]# cat passwd group shadow root:x:0:0:root:/root:/bin/sh root:x:0: root:$6$CGsqab6d$Cd.PnnWtlL5XZAyr9J2zoMqyJH1QodcDp1pQp0uZ1f0Cq4eq9.TMkSQU6IfpvYZEYc32.lmF0lKuQwavnC49a0:16251:0:99999:7::: [[email protected] etc]# sed -i 's@/bin/bash@/bin/sh@' passwd [[email protected] etc]# cat passwd root:x:0:0:root:/root:/bin/sh ###这里说明下 经过证实 busybox支持SHA512的密码加密验证登录 ###/mnt/sysroot/etc/inittab这个文件内容修改成下面这样的 [[email protected] ~]# cat > /mnt/sysroot/etc/inittab << EOF ::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 EOF
下面来为这个Mini Linux 编译个bash去
[[email protected] ~]# mkdir -pv /mnt/sysroot/usr/share/ [[email protected] ~]# wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz [[email protected] ~]# tar xf bash-4.3.tar.gz [[email protected] ~]# cd bash-4.3 [[email protected] bash-4.3]# ./configure --prefix=/mnt/sysroot --bindir=/mnt/sysroot/bin --sbindir=/mnt/sysroot/sbin --datadir=/mnt/sysroot/usr/share/ --enable-static-link --enable-alias --without-bash-malloc ####这里采取静态编译 直接将bash编译进MiniLinux 系统下 [[email protected] bash-4.3]# make -j 4 && make install [[email protected] bash-4.3]# echo "export PS1='[\\u@\\h \\W]\\\$ '" >> /mnt/sysroot/etc/profile [[email protected] bash-4.3]# mkdir -pv /mnt/sysroot/etc/sysconfig [[email protected] bash-4.3]# echo "HOSTNAME=LookBack.linux.05hd.com" > /mnt/sysroot/etc/sysconfig/network cat > /mnt/sysroot/etc/rc.d/rc.sysinit << EOF #!/bin/sh # echo "" echo -e "\033[31mWelcome\033[0m \033[36mTo\033[0m \033[32mLookBack\033[0m \033[31mMiNi\033[0m \033[36mLinux\033[0m" #echo "" #echo -e "\033[36mMount proc /proc\033[0m" #mount -n -t proc proc /proc echo "" echo -e "\033[33mMount /dev/sda2 / \033[0m" mount -n -o remount,rw /dev/sda2 / echo "" mount -a mdev -s echo "" [ -r /etc/sysconfig/network ] && source /etc/sysconfig/network [ -z "\$HOSTNAME" -o "\$HOSTNAME" == '(none)' ] && hostname localhost || hostname \$HOSTNAME EOF
四、为Mini Linux 添加远程登录的功能
4.1编译dropbear并移植到Mini Linux上
[[email protected] ~]# wget https://matt.ucc.asn.au/dropbear/dropbear-2014.65.tar.bz2 ###如果官方的地址下载不了就用下面的地址下载吧 [[email protected] ~]# wget http://www.dwhd.org/wp-content/uploads/2014/08/dropbear-2014.65.tar.bz2 [[email protected] ~]# tar xf dropbear-2014.65.tar.bz2 [[email protected] ~]# cd dropbear-2014.65 [[email protected] dropbear-2014.65]# mkdir -p /mnt/sysroot/usr/local [[email protected] dropbear-2014.65]# ./configure [[email protected] dropbear-2014.65]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install [[email protected] dropbear-2014.65]# mkdir -p /mnt/sysroot/{var/run/,etc/dropbear} [[email protected] dropbear-2014.65]# dropbear -V Dropbear v2014.65 ###至此 编译好了dropbear [[email protected] ~]# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key Generating key, this may take a while... Public key portion is: ssh-dss AAAAB3NzaC1kc3MAAACBAL5mRj170CQeiu0/GVRQmpfdjvIb6Y8hP/kbRGtewziRtyCsH5enJbC7XFfNAgEy7T/ASLZEpoTWDcBs4/ic8PIKRH8wVWQWUmzcs03AXl/3RRa8mpEVtXRyR0k1Wub6wYhSBVRtzqpUEuLUcLzHhzHm1s6RyrIr49ZlCVQQCxijAAAAFQCTC8zXFoudiQdLU6iE2n6J+IRaZQAAAIB46U1b6eCOKbdypKTyzNAQY+HHsor8FFIT4YCSnWFsfFWFHGu3C2f0m49delD2KcMALnXwHbnC0HY8NkeRcC+j/7GOH6rxHrIizO9alBdZDNT95gEobH+ovYv9ycb5rNWwFTaNwp+PIYu+bA7pSJpRER4PWkT7jZXEspwsL+ZCuQAAAIAAs7nRtkdLX1aaMj0B+QAz37cHAFP9e5bDpAYce3rpoqjBgITCLM2RBRe0zQjEew6p9YMCvD5Tjg+wITECFhq0CX8AH5/4N6z4opDVKoWblhjISvYgvUoIr3XnOKQ/FCMqlHz4UQeYIH7CvXpV8fCvaLF9AjXSYxtCd0NgT68ddw== [email protected] Fingerprint: md5 71:67:ae:79:7c:dd:20:20:15:40:f0:5c:68:54:6b:85 [[email protected] ~]# dropbearkey -t rsa -s 2048 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key Generating key, this may take a while... Public key portion is: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCkyfZZYwdDkJ89NJY88tHs18c7yz+dqJ6eDb68YH8uC30FC+6Q9X7TJKqRp/xQO0QFblzoIqGgmftJ2O7n+6j7j3iv3mRkJaotWT7Avs8Ukko0PowPPSDXQ7Pz9UKHIPFQMDyyR4+M7ncdUTuVLKbIDBa+nDJF3ibdLX+eUEWSGa79lhviq8vBI0thSAg9Qd/wO0nEI2hyO/efaKFh92ZQImyYoDMsphh7WaO92GhyZuR4qZMSJzLRnlnboMi7wbYC/iStsD1q64PL84zeHqj7Q263B9e0OIRMm8JGM/VevweyVfQbP3Tgy6NXqXDSdP/9oas0kJop7yNjPzxu+Rgr [email protected] Fingerprint: md5 d8:4a:5b:83:4b:8f:20:81:f2:58:87:ce:9c:33:27:87
###下面我们在真机上测试下
[[email protected] ~]# mkdir /etc/dropbear [[email protected] ~]# cp -a /mnt/sysroot/etc/dropbear/dropbear_* /etc/dropbear/ [[email protected] ~]# dropbear -p 22022 [[email protected] ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:52523 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 *:111 *:* LISTEN 0 128 :::80 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::443 :::* LISTEN 0 128 :::56093 :::* LISTEN 0 100 :::22022 :::* LISTEN 0 100 *:22022 *:*
4.2在Centos 6.5的虚拟机上已经可以运行dropbear了,现在我们来做程序移植
这里给出一份程序移植用的bash脚本,
脚本功能:能把当前系统上的程序执行文件 和依赖的库都转移到目标系统上的对应位置,脚本中默认位置是/mnt/sysroot(因为此文是将Mini Linux的根分区挂载在这个位置的)
###下载地址 wget http://www.dwhd.org/wp-content/uploads/2014/08/bincp.sh ###下面是脚本源码 #!/bin/bash ######################################################################### # File Name: bincp.sh # Author: LookBack # Email: [email protected] # Version: # Licence: GNU General Public Licence # Created Time: Sat 23 Aug 2014 16:04:44 CST ######################################################################### target=/mnt/sysroot/ [ -d $target ] || mkdir $target preCommand() { if which $1 &> /dev/null; then commandPath=`which --skip-alias $1` return 0 else echo "No such command." return 1 fi } commandCopy() { commandDir=`dirname $1` [ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir} [ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir} } libCopy() { for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do libDir=`dirname $lib` [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir} [ -f ${target}${lib} ] || cp $lib ${target}${libDir} done } read -p "Plz enter a command: " command until [ "$command" == 'quit' ]; do if preCommand $command ; then commandCopy $commandPath libCopy $commandPath fi read -p "Plz enter a command: " command done
4.3我们挂起当前的Centos 6.5 虚拟机,再去启动这个Mini Linux
可以登录了,同时证明了 busybox 和dropbear 都是支持sha512加密存储密码的功能
五、编译并移植nginx到Mini Linux上
[[email protected] ~]# wget http://nginx.org/download/nginx-1.6.1.tar.gz [[email protected] ~]# tar xf nginx-1.6.1.tar.gz [[email protected] ~]# cd nginx-1.6.1 [[email protected] nginx-1.6.1]# useradd -s /sbin/nologin nginx [[email protected] nginx-1.6.1]# ./configure --user=nginx --group=nginx --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 --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 --with-http_flv_module --with-http_mp4_module --without-http_proxy_module --without-http_gzip_module --with-http_ssl_module --with-http_spdy_module [[email protected] nginx-1.6.1]# make && make install
编译好了之后 用上面的程序移植脚本 移植nginx
2015年7月27日 下午3:19 1F
大哥,我想知道如何用这样的Linux实现上网功能?我有一个类似的项目:https://github.com/Diaob/minimal
但是貌似不支持上网啊,一旦ping www.baidu.com就显示bad address。别人说要将busybox和uclibc一起编译,可是我还是不会弄。
来请教一下,博客不做多多支持!
2015年7月27日 下午5:30 1B
@ Diaob 可以实现上网,这地方的busybox是做移植的,就是因为没uclibc,如果确实需要,可以自己交叉编译出uclibc,然后再编译busybox吧