linux最小系统的制作(嵌入式第一节课)
来源:互联网 发布:白袍巫师甘道夫知乎 编辑:程序博客网 时间:2024/05/29 23:47
准备工作
硬件工具:
电脑(安装了linux虚拟机(UBuntu或者CentOS),需要提供一个平台环境)
一块板子(我这里是使用讯为提供的Cortex-A9 4412精英板)
软件工具:
1.busybox
2.linux_tools.tgz
3.arm-linux-gcc编译器
其中busybox可以到官网下载,linux_tools.tgz 可到我网盘下载
网盘链接:http://pan.baidu.com/s/1c2IU8Nm
arm-linux-gcc编译器的安装和配置可以按照我的另一篇文章来配置
文章链接:http://blog.csdn.net/coolwriter/article/details/77775847
busybox介绍
Busybox工具(https://busybox.NET/):目前的最新版本是:busybox-1.27.2.tar.bz2(2017年8月17日)
Busybox工具就是一个集成了100多个Linxu常用命令和工具的软件,可以称为Linux里面的瑞士军刀吧,它是开源的,同时在不断更新,我们接下来就是用它来搭建我们的最小Linux系统。
网址:https://busybox.net/
BusyBox combines tiny versions of many common UNIX utilities into a single small executable. It provides replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. The utilities in BusyBox generally have fewer options than their full-featured GNU cousins; however, the options that are included provide the expected functionality and behave very much like their GNU counterparts. BusyBox provides a fairly complete environment for any small or embedded system.
百度机器翻译:BusyBox结合许多常见的UNIX工具小版本到一个单一的小的可执行文件。它提供了你最经常发现在GNU FileUtils,shellutils公用事业等替代,BusyBox的事业通常比功能齐全的GNU的表兄弟更少的选择;然而,选项,包括提供预期的功能和行为很像他们的GNU同行。BusyBox为小或嵌入式系统提供了比较完善的环境。
板子板运行一个完整的操作系统需要四个文件“u-boot-iTOP-4412.bin”,“zImage”,“ramdisk-uboot.img”,“system.img”,文件“u-boot-iTOP-4412.bin”不用烧写,出厂前就有的,是通用的。如果你是不同板子估计也有类似东西。
下载解压busybox
进入网址网址:https://busybox.net/ 官网下载busybox
下载好的busybox-1.27.2.tar.bz2拷贝到ubuntu系统的/home/minilinux下:我用的是virtualbox 装的ubantu16.04,拷贝文件用的共享文件夹。接下来解压它,
sudo tar -xvf busybox-1.27.2.tar.bz2
解压成功,cd到该文件夹里
cd busybox-1.27.2/
配置busybox
下面开始配置Busybox:
make menuconfig
进入失败可能是没有sudo,没有安装gcc编译器,没有安装ncurses-devel.在ubuntu中ncurses-devel的名字叫libncurses5-dev
解决方法
sudo apt-get install gccsudo apt-get install gcc-c++sudo apt-get install libncurses5-devsudo make menuconfig
配置之前 su root进入root省去不少麻烦。
选中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 目录里面),如下图:
回车,回到上一界面Busybox Settings:
接下来继续Tab键选择Exit,然后按回车,返回到Busybox Configuration:
继续使用键盘向右的方向键移动光标到“Exit”,然后回车选择yes保存:
没有报错的情况下,结果是这个
报错的原因一般是没有安装arm-linux-gcc编译器。
安装安装arm-linux-gcc编译器教程我下期再说,因为单单安装arm-linux-gcc编译器需要很长篇幅。
编译busybox
下面我们继续吧,接下来是编译和安装Busybox了,因为前面我们花了那么久终于配置好了:
busybox-1.27.2目录下执行: make
编译报错:
解决方法
MTD_FILE_MODE_RAW在/usr/include/mtd/mtd-abi.h中定义,于是将/usr/include/mtd/mtd-abi.h拷贝到busybox的include文件中,然后在nandwrite.c文件中包含该头文件
cd /usr/include/mtd/sudo cp mtd-abi.h /home/minilinux/busybox-1.27.2/include (配图没有给权限sudo,普通用户需要权限执行cp,root用户不用)
到/busybox-1.27.1/miscutils下找到nandwrite.c
编辑nandwrite.c的代码
cd /home/minilinux/busybox-1.27.2/miscutilsvim nandwrite.c或者是 gedit nandwrite.c
添加头文件#include “mtd-abi.h” 保存并关闭
注意 #include “mtd-abi.h” 的位置顺序,in出路头文件顺序不能错,#include “mtd-abi.h” 在中间
三个#include顺序必须与上图一样,顺序不一样还是错误。比如三行include让#include “mtd-abi.h”加到最后还是出错,需要加到中间。
cd .. 然后继续make 编译
继续报错:util-linux/blkdiscard.c: In function ‘blkdiscard_main’:
解决办法:
BLKSECDISCARD在/usr/include/linux/fs.h中定义,方法如上所述,将/usr/include/linux/fs.h拷贝到busybox的include文件夹中,然后修改util-linux/blkdiscard.c中头文件包含:
cd /usr/include/linux/sudo cp fs.h /home/minilinux/busybox-1.27.2/include
退回目录cd .. 执行make ,重新编译
接着继续出错
解决办法:
make menuconfig
Linux System Utilities—>nsenter,去掉该选项,重新编译make。
重新编译,妈的智障,又双叒叕出错了。
解决办法:和前面很类似了,其实这些错误我们应该会很熟悉的,都是这些乱七八糟的错误,慢慢解决就好:
make menuconfig
Coreutils—>sync选项去掉,保存退出,
make重新编译
编译成功,松一口气。别高兴太早,还没结束呢,后面还有好多步骤呢。
安装生成system
接下来我们需要把编译生成的二进制文件安装到刚才我们指定的../system 目录里面,
使用命令“make install”命令安装二进制文件到“../system”目录。
root@zzz:/home/minilinux/busybox-1.27.2# cd ..root@zzz:/home/minilinux# lsbusybox-1.27.2 busybox-1.27.2.tar.bz2 systemroot@zzz:/home/minilinux# cd system/root@zzz:/home/minilinux/system# lsbin linuxrc sbin usrroot@zzz:/home/minilinux/system#
完善最小系统
接下来开始很关键的完善最小Linux系统:
首先制作的文件系统还需要dev,etc,lib,mnt,proc,sys,tmp,var 文件夹,使用命令“mkdir dev etc lib mnt proc sys tmp var”
创建上述所有目录,然后ls查看:
root@zzz:/home/minilinux/system# mkdir dev etc lib mnt proc sys tmp varroot@zzz:/home/minilinux/system# lsbin dev etc lib linuxrc mnt proc sbin sys tmp usr varroot@zzz:/home/minilinux/system#
cd到刚刚创建的etc下,在etc 目录下使用命令vim建立eth0-setting 文件,并在eth0-setting 文件里输入下面的内容:
IP=192.168.1.230Mask=255.255.255.0Gateway=192.168.1.1DNS=192.168.1.1MAC=08:90:90:90:90:90
修改权限755
chmod 755 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
把它们的权限修改为755。
chmod 755 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
修改权限755
在etc 目录下创建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
接下来cd ../../../返回到system目录下面:
cd到lib目录下面:
因为使用的交叉编译环境和编译内核的相同,所以编译器是/home/minilinux/arm-2009q3,(编译器arm-2009q3是拷贝过去的)
Busybox 编译生成的二进制文件十一动态链接库的形式运行,所以我们需要拷贝编译器里面的
库文件到lib 目录,使用下面的命令:
“cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ./”
cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ./
即从arm-linux-gcc编译器库里把所有库文件/*拷贝库到最小系统lib库(system/lib)里面。
拷贝完成后返回到system目录,cd到var目录:
使用“mkdir lib lock log run tmp”命令在var 目录下建立lib,lock,log,run,
tmp 五个目录:
mkdir lib lock log run tmp
到此,文件系统所需文件都建立好了,cd回到system目录的上一级目录:
到了这一步,制作好的文件夹“system”,可以在视频教程对应的目录下找到。如果发现
后面的操作命令出现了问题,可以对照着修改文件,看看问题出在什么地方。
打包和编译
打包工具 make_ext4fs 可以文件系统制作成二进制文件,先来安装一下 make_ext4fs 工
具。这个工具是在第一步准备工作的网盘里“linux_tools.tgz”压缩文件。
拷贝压缩包“linux_tools.tgz”到 Ubuntu 系统的“/”目录下,注意目录是“/” 。
使用解压命令“tar -vxf linux_tools.tgz”解压 。
tar -vxf linux_tools.tgz
安装好打包编译工具“make_ext4fs”之后。
使用命令“cd /home/minilinux/”进入目录“/home/minilinux/”,
使用命令“make_ext4fs -s -l 314572800 -a root -L linux system.img system”生成 system.img文件系统镜像 。
cd /home/minilinux/make_ext4fs -s -l 314572800 -a root -L linux system.img system
报错:
解决方法:安装lib32stdc++6
apt-get install lib32stdc++6
然后在/home/minilinux下重新输入
make_ext4fs -s -l 314572800 -a root -L linux system.img system
接着可以使用 ls 命令查看一下生成的 system.img 。
到此为止,已经完成了 linux 最小文件系统的制作 。
撒花!
- linux最小系统的制作(嵌入式第一节课)
- Linux系统第一节课
- Linux的第一节课
- 为什么选择嵌入式开发(嵌入式系统第一节课讲稿)
- 嵌入式开发制作最小的linux文件系统
- 【制作最小Linux系统】
- Linux最小系统制作
- 最小的Linux系统制作过程详解(转)
- 最小的Linux系统制作过程详解
- 最小的Linux系统制作过程详解
- 最小的Linux系统制作过程详解
- 基于嵌入式Linux平台的最小文件系统的制作
- 汇编的第一节课
- 第一节课的笔记
- CSDN的第一节课
- 龙年的第一节课
- C#的第一节课
- 关于贺利坚老师的取款机系统第一节课
- java中main()方法里面的String[] args;String args[]
- JavaScript 的使用基础总结③
- Java NIO系列教程(十二) Java NIO与IO
- WebService开发(一)
- Codeforces 849C From Y to Y【思维】
- linux最小系统的制作(嵌入式第一节课)
- js trim用法
- WebView 入坑
- 将.sql文件导入Oracle数据库
- 利用背包问题解决的双核处理问题
- MySQL分布式集群之MyCAT的配置文件schema.xml详解
- Python中的random模块
- int.Parse()与int.TryParse()
- toml使用中容易遇到的问题