最小Linux系统“麻雀虽小,五脏俱全”,虽不带图形界面效果,但是用来学习Linux系统编程帮助是很大的,接下来的教程就是如何制作一个最小Linux系统:
首先工欲善其事必先利其器,我们得准备好相关需要的工具:
硬件工具:电脑(安装了虚拟机(虚拟机里面安装了UBuntu或者CentOS),或者直接就是Linux系统,主要 是需要提供一个平台环境)
一块板子(我这里是使用讯为提供的Cortex-A9 4412精英板)
软件工具:也就是前面提到的Linux系统平台环境
Busybox工具(https://busybox.net/)(目前的最新版本是:busybox-1.27.1.tar.bz2)
上面提到的东西这里没有下载地址提供的说明在我的其他博客里面都有提供下载地址,如果你不知道的话。其他工具基本上不需要介绍,Busybox工具就是一个集成了100多个Linxu常用命令和工具 的软件,可以称为Linux里面的瑞士军刀吧,它是开源的,同时在不断更新,我们接下来就是用它来搭建我们的最小Linux系统。
最小系统烧写的话前面的博客讲过了,不懂可以看看,这里主要讲制作;板子板运行一个完整的操作系统需要四个文件“u-boot-iTOP-4412.bin”,“zImage”,“ramdisk-uboot.img”,“system.img”,文件“u-boot-iTOP-4412.bin”不用烧写,出厂前就有的,是通用的。如果你是不同板子估计也有类似东西。
接下来还是讲如何使用Busybox配置最小Linux系统吧:
我这里是使用远程工具Secure-CRT和WinSCP控制Linux主机,并不影响大体操作步骤,这俩工具也推荐给大家,蛮好用的,网上可以下载,也可以找我索取;
我这里用的是CentOS7平台来制作这个最小Linux系统,首先在你的home或者其他方便的目录下面新建一个目录:
mkdir minilinux
使用WinSCP软件将前面下载好的busybox-1.27.1.tar.bz2拷贝到/home/Madman/Practice/minilinux下:
WinSCP是非常好用和人性化的,远程登陆之后直接拖取就OK啦,如下图:
接下来我们可以使用Secure-CRT看一下是否真的过来了:
看看是不是感觉很方便呢?
接下来解压它:
tar -jxv -f busybox-1.27.1.tar.bz2
通过最后的ls命令我们可以看到解压缩成功了,哈哈
接下来cd到busybox-1.27.1里面去,并ls:
[Madman@promote minilinux]$ cd busybox-1.27.1
[Madman@promote busybox-1.27.1]$ ls
可以看到这么多的文件都是我们解压缩之后可以看到的,
下面开始配置Busybox:
[Madman@promote minilinux]$ make menuconfig
此时可能会报错,原因是我们没装gcc编译器,yum装好就��
[root@promote ~]# yum install gcc
[root@promote ~]# yum install gcc-c++
[root@promote busybox-1.27.1]# yum -y install ncurses-devel
选中Busybox Settings,然后按回车进入到Busybox Settings 界面,如下图:
在Busybox Settings 配置选项里面需要修改两个地方,第一个是Build Optiions-> CrossCompiler prefix,它是指定用什么编译器来编译Busybox,选中Build Options 如下图:
然后按回车,进入到Build Options 配置界面,选中Build Options 配置界面的Cross Compiler prefix然后回车;如下图:
输入使用的交叉编译工具arm-none-linux-gnueabi-,如下图:
然后按回车返回到Build Options 配置界面,这时可以看到刚才设置的交叉编译工具,如
下图:
然后使用键盘的左右按键选中Exit,并且回车;如下图:
回到Busybox Settings 设置界面,如下图:
选中Installation Options ,然后按回车,进入Installation Options 配置界面,如下图:
选中BusyBox installation prefix 如上图所示,然后按回车进入BusyBox installationprefix 配置界面(这个界面是设置编译完Busybox,把最终生成的二进制文件安装到哪个目录下面),修改为../system(system”(最终生成的二进制文件会安装到当前目录的上一级目录下的system 目录里面),如下图:
然后回车,回到上一界面Busybox Settings:
接下来继续Tab键选择Exit,然后按回车,返回到Busybox Configuration:
继续使用键盘向右的方向键移动光标到“Exit”,然后回车选择yes保存:
点击yes后如果没有报错就成功了,但是我的报错了:
也就是缺少ARM-Linux交叉编译工具,哈哈,接下来我们把它安装好再试:
大家可以直接去官网下载,也可以看我其他博客,我会上传资源都的,后面把下载方法再写到此处吧;
同理是使用WinSCP拖到Linux中,使用tar -jxv -f arm-2009q3.tar.bz2解压缩
接下来要修改交叉编译工具的路径,即环境变量:
[root@promote minilinux]# cd /root
[root@promote minilinux]# ls -a
[root@promote minilinux]# vim .bashrc
如下图:
然后在“.bashrc”文件中的最后一行添加如下信息:“export PATH=$PATH:/usr/local/arm/arm-2009q3/bin”;如下图所示:
注意版本不同会有所改变,尽量和我一样就好,出错好解决;上图Esc保存ZZ退出后,继续下一步
上图有一点错误,我是自定义的文件夹,在/home/Madman/Practice/minilinux/arm-2009q3下,所以需要改为:
上图有个小技巧就是你cd到arm-2009q3/bin下之后使用pwd就可以看到完整路径了,然后在Ctrl+Alt+C copy过去,哈哈,是不是很方便。
执行以下命令刷新环境变量配置,使其生效:
[root@promote bin]# source /root/.bashrc
接下来我们需要验证一下arm是否可用,直接在命令行敲arm,然后空格,然后连续敲击两次Tab键,就会看到自动补全,说明我们成功了;如下图:
接下来继续前面的make menuconfig,然后Exit,然后点击yes,此时发现还有错,草泥马:
看来还得折腾啊,哈哈,上面错误的原因是我在64位系统中运行32位程序却没有安装32位的库,好吧,接下来继续安装,这个安装就很简单了:
[root@promote busybox-1.27.1]# yum -y install glibc.i686
执行上面命令后会很快安装好,然后再次在busybox-1.27.1目录下执行: make menuconfig,可以看到这次终于没有任何错误了:
这篇博客确实是太长太长了,哈哈,不过我是从新装的CentOS7全程录制步骤,应该是全网最详细了,希望能帮到大家,大家对其中使用到的软件有需要找不到的都可以直接找我吧:QQ1370085531
下面我们继续吧,接下来是编译和安装Busybox了,因为前面我们花了那么久终于配置好了:
busybox-1.27.1目录下执行: make
[root@promote busybox-1.27.1]# make
接下来又很搞笑了,草泥马出错在:MTD_FILE_MODE_RAW出现在本机的/usr/include/mtd/mtd-abi.h头文件中:
此时我的内心就是一万个草泥马奔腾而过,应该是当时把Busybox版本选择太新了,哎,要干最新的当然要付出代价,但是我们还是要冷静,继续干下去,像征服妹子一样征服它,哈哈:
到/busybox-1.27.1/miscutils下找到nandwrite.c,执行
[root@promote miscutils]# vim nandwrite.c +54
如上图,加入头文件包含,同时需要执行下面命令:
[root@promote busybox-1.27.1]# cd include
[root@promote busybox-1.27.1]# cp /usr/include/mtd-abi.h mtd-abi.h
上面命令就是
MTD_FILE_MODE_RAW在/usr/include/mtd/mtd-abi.h中定义,直接在nandwrite.c中包含<mtd/mtd-abi.h>编译仍无法通过。将/usr/include/mtd/mtd-abi.h拷贝到busybox的include文件中,然后包含该头文件:
再次make之后,此时出现如下错误:
解决办法:
BLKSECDISCARD在/usr/include/linux/fs.h中定义,方法如上所述,将/usr/include/linux/fs.h拷贝到busybox的util-linux文件中,然后修改blkdiscard.c中头文件包含:
修改:#include <linux/fs.h>为
#include "fs.h"
[root@promote include]# cp /usr/include/linux/fs.h fs.h
继续make,继续出现错误:
解决办法:
make menuconfig
Linux System Utilities--->nsenter,去掉该选项,重新编译make,又出现如下错误:
解决办法:和前面很类似了,其实这些错误我们应该会很熟悉的,都是这些乱七八糟的错误,慢慢解决就好:
make menuconfig
Coreutils--->sync选项去掉,保存退出,
然后再去make编译试试:
接下来不要虚,就是干,"敢为人先,争创一流":
接下来我们需要把编译生成的二进制文件安装到刚才我们指定的../system 目录里面,使用命令“make install”命令安装二进制文件到“../system”目录,最终如下图:
至此,我们越来越开心了,虽然我从早上搞到下午(现在)还没有吃饭,但是一点也不饿,被知识填饱了,哈哈,相信大家至此也和我一样的心态对吧,我们继续吧:
如上图,到system目录下看一下我们奋斗了这么久到底搞出来什么东西,可以看到搞了快一天了也就四个文件啊,草泥马,~~~~~~
到此完了吗?没有,我们只是搭建好了最基本的,相当于框架吧,接下来我们继续完善属于我们自己的最小Linux系统:
我们需要添加最小系统要用的网络文件,用户文件,库等,这样才完美。
刚刚去吃了个饭回来,精力充沛,那我们就继续搞吧:
完善最小Linux系统:
首先制作的文件系统还需要dev,etc,lib,mnt,proc,sys,tmp,var 文件夹,使用命令“mkdir dev etc lib mnt proc sys tmp var”创建上述所有目录,然后ls查看:
[root@promote system]# mkdir dev etc lib mnt proc sys tmp var
[root@promote system]# ls
bin dev etc lib linuxrc mnt proc sbin sys tmp usr var
cd到刚刚创建的etc下,在etc 目录下使用命令vim建立eth0-setting 文件,并在eth0-setting 文件里输入下面的内容:
按Esc进入命令模式使用ZZ保存并退出
使用chmod权限修改命令将上面的文件改为可执行文件:
[root@promote etc]# chmod 755 eth0-setting
[root@promote etc]# ls
eth0-setting
[root@promote etc]# ls -lh
总用量 4.0K
-rwxr-xr-x. 1 root root 94 8月 3 17:22 eth0-setting
同理,在etc目录下创建init.d目录,并且cd到init.d下面去,在init.d 目录下面创建ifconfig-eth0 文件:
[root@promote etc]# mkdir init.d
[root@promote etc]# cd init.d/
[root@promote init.d]# vim ifconfig-eth0
#!/bin/bash
echo -n Try to bring eth0 interface up......>/dev/ttySAC2
if [ -f /etc/eth0-setting ]
then
source /etc/eth0-setting
if grep -q "^/dev/root / nfs " /etc/mtab
then
echo -n NFS root ... > /dev/ttySAC2
else
ifconfig eth0 down
ifconfig eth0 hw ether $MAC
ifconfig eth0 $IP netmask $Mask up
route add default gw $Gateway
fi
echo nameserver $DNS > /etc/resolv.conf
else
if grep -q "^/dev/root / nfs " /etc/mtab
then
echo -n NFS root ... > /dev/ttySAC2
else
/sbin/ifconfig eth0 192.168.1.106 netmask 255.255.255.0 up
fi
fi
echo Done > /dev/ttySAC2
操作及内容如上图,截图如下图:
同理修改其权限:
[root@promote init.d]# ls
ifconfig-eth0
[root@promote init.d]# chmod 755 ifconfig-eth0
[root@promote init.d]# ls
ifconfig-eth0
同理,再次在init.d目录下面创建rcs文件:
代码如下:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
"rcS" 70L, 1898C 1,1 顶端
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
#/bin/hotplug
# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
#/bin/mount -n -t ramfs none /tmp
#/bin/mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
ln -sf /dev/ttyS2 /dev/tty2
ln -sf /dev/ttyS2 /dev/tty3
ln -sf /dev/ttyS2 /dev/tty4
syslogd
/etc/rc.d/init.d/netd start
echo " " > /dev/tty1
echo "Starting networking..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/httpd start
#echo " " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/leds start
#echo " " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo " "
#sleep 1
#echo "*************************************" > /dev/ttySAC2
#echo " http://www.topeet.com.cn " > /dev/ttySAC2
#echo "*************************************" > /dev/ttySAC2
#echo "*************************************"
#echo " http://www.topeet.com.cn "
#echo "*************************************"
mkdir /mnt/disk
sleep 1
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0
修改权限:
[root@promote init.d]# chmod 755 rcS
cd ..回到etc目录下:
[root@promote init.d]# cd ..
接下来在etc目录下建立passwd文件:
[root@promote etc]# vim passwd
root::0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
保存修改并退出后和前面一样改权限为755
[root@promote etc]# chmod 755 passwd
接下来在etc 目录建立profile 文件:
[root@promote etc]# vim profile
# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[$USER@$HOSTNAME]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
同理修改权限:
[root@promote etc]# chmod 755 profile
在etc 目录下创建rc.d目录:
[root@promote etc]# mkdir rc.d
cd进入rc.d目录下,创建init.d目录,cd到init.d目录下:
在此时init.d目录下创建netd文件:
[root@promote init.d]# vim netd
#!/bin/sh
base=inetd
# See how we were called.
case "$1" in
start)
/usr/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
和前面一样修改权限为755:
[root@promote init.d]# chmod 755 netd
接下来cd ../../../返回到system目录下面:
cd到lib目录下面:
因为使用的交叉编译环境和编译内核的相同,所以编译器是/home/Madman/Practice/minilinux/arm-2009q3,
Busybox 编译生成的二进制文件十一动态链接库的形式运行,所以我们需要拷贝编译器里面的
库文件到lib 目录,使用下面的命令:
“cp /home/Madman/Practice/minilinux/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ./”;即:
[root@promote lib]# cp /home/Madman/Practice/minilinux/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ./
执行结果如下图:
上面需要注意pwd,可能你的路径和我不同;
拷贝完成后返回到system目录,cd到var目录:
使用“mkdir lib lock log run tmp”命令在var 目录下建立lib,lock,log,run,
tmp 五个目录:
[root@promote var]# mkdir lib lock log run tmp
到此,文件系统所需文件都建立好了,cd回到system目录的上一级目录:
[root@promote var]# cd ..
[root@promote system]# cd ..
[root@promote minilinux]# ls
arm-2009q3 arm-2009q3.tar.bz2 busybox-1.27.1 busybox-1.27.1.tar.bz2 system
可以看到我们用到过的文件都在此,
接下来就是接近尾声了,
安装打包工具make_ext4fs,它可以把文件系统制作成二进制文件,这个工具你可以直接网上下载就有,或者找我也行,需要注意的是要在根目录下面去解压才行,比如下面就是有错的
[root@promote minilinux]# ls
arm-2009q3 busybox-1.27.1 linux_tools.tgz
arm-2009q3.tar.bz2 busybox-1.27.1.tar.bz2 system
[root@promote minilinux]# tar -vx -f linux_tools.tgz
usr/
usr/local/
usr/local/bin/
usr/local/bin/mkimage
usr/local/bin/make_ext4fs
如上图,解压成功后用cd命令进入到minilinux目录下:当然我这里就是在此目录下:
接下来使用如下命令system”生成system.img文件系统镜像:
所以我们重新在根目录下解压它,
再次执行上面的操作,制作system.img镜像:
当然我这里又出错了,你没错就跳过这一步,原因是我Linux系统是64位,共享库报错,解决方案如下:
首先使用:
[root@promote minilinux]# yum whatprovides libstdc++.so.6
上面命令会提示哪个安装包有这个库文件:
接下来就直接yum安装吧:
[root@promote minilinux]# yum -y install libstdc++-4.8.5-11.el7.i686
最终如下图安装完毕:
继续在当前minilinux目录下执行:
[root@promote minilinux]# make_ext4fs -s -l 314572800 -a root -L linux system.img system
出现下图:
从上图可以看到我们终于成功了,呵呵哈哈哈~~~~~~~
使用ls命令查询一下是否真的存在system.img了:
[root@promote minilinux]# ls
这下就放心了。
现在已经完成了linux 文件系统的制作,最终生成二进制文件,到这里就算结束了,烧写的话我的另外一篇博客有详细讲解,步骤都差不多。
从上面我们可以看出一路下来我都是不知道下一步会发生什么,都是一步一步搞下来,可能会遇到n多错误,但是都不是事儿,总会解决它,最终我们成功了,当然由于步骤太多,你如果不想尝试的话可以直接找我索取最终文件,你如果去尝试的话需要什么文件都可以找我,不管还是建议大家首先先自己区网上找相关软件等资料,相信你如果坚持下拉一定能成功,其实我不用写这么多的,用别人搭建后的Linux系统来搞的话,但是我是用一个全新的CentOS7系统加速最新Busybox给大家做这样一个教程,长是长了点,不过应该是全网最详细的了,希望大家喜欢;