1. 程式人生 > >linux最小系統的製作(嵌入式第一節課)

linux最小系統的製作(嵌入式第一節課)

準備工作

硬體工具:
電腦(安裝了linux虛擬機器(UBuntu或者CentOS),需要提供一個平臺環境)
一塊板子(我這裡是使用訊為提供的Cortex-A9 4412精英板)

軟體工具:
1.busybox
2.linux_tools.tgz
3.arm-linux-gcc編譯器

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 gcc
sudo apt-get install gcc-c++
sudo apt-get install libncurses5-dev
sudo 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/miscutils
vim 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# ls
busybox-1.27.2  busybox-1.27.2.tar.bz2  system
root@zzz:/home/minilinux# cd system/
root@zzz:/home/minilinux/system# ls
bin  linuxrc  sbin  usr
root@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 var
root@zzz:/home/minilinux/system# ls
bin  dev  etc  lib  linuxrc  mnt  proc  sbin  sys  tmp  usr  var
root@zzz:/home/minilinux/system# 

cd到剛剛建立的etc下,在etc 目錄下使用命令vim建立eth0-setting 檔案,並在eth0-setting 檔案裡輸入下面的內容:

IP=192.168.1.230
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90

修改許可權755

chmod 755 eth0-setting 

同理,在etc目錄下建立init.d目錄,並且cd到init.d下面去,在init.d 目錄下面建立ifconfig-eth0 檔案:

[[email protected] etc]# mkdir init.d  
[[email protected] etc]# cd init.d/  
[[email protected] 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檔案

[[email protected] 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虛擬機器(UBuntu或者CentOS),需要提供一個平臺環境) 一塊板子(我這裡是使用訊為提供的Cortex-A9 4412精英板) 軟體工具:

#嵌入式Linux系統移植# yaffs2根檔案系統移植出錯記錄

busybox官網地址: 本次移植採用的busybox版本: busybox-1.26.0.tar.bz2 交叉編譯工具鏈版本: $ arm-linux-gcc -v gcc version 4.4.3 (ctng-1.6.1) 1

#嵌入式Linux系統移植# 對uboot移植和裁剪的一點點個人思考和總結

思路: 1.分析啟動流程 2.移植config檔案(smdk440_config) 3.移植包含控制條件編譯巨集的.h檔案(configs/s3c2440.h) 4.移植板級初始化.c檔案(s3c2440.c) 5.移植RAM初始化?DDR? 6.移植NorF

[嵌入式開發入門]4412開發板從零建立Linux系統

iTOP-4412開發板不僅可以執行Android,還可以執行簡單的Linux最小檔案系統。 最小Linux 系統“麻雀雖小,五臟俱全”,它不帶圖形介面的Linux 系統,剔除干擾因素便於理解,用來學習Linux系統程式設計非常合適。 另外,Linux最小系統佔用的

ZYNQ學習之路1. Linux系統構建

開發環境:window10, vivado 2017.1, ubuntu 16.04, Eclipse+cdt硬體環境:米爾科技zturn board,zynq7z010  本筆記詳細介紹了開發ZYNQ

Linux核心移植和根檔案系統製作詳細步驟精講

start_kernel是所有 Linux 平臺進入系統核心初始化後的入口函式,它主要完成剩餘的與硬體平臺相關的初始化工作,在進行一系列與核心相關的初始化後,呼叫第一個使用者程序-init 程序並等待使用者程序的執行,這樣整個 Linux 核心便啟動完畢。該函式所做的具體工作有:呼叫 setup_arch

基於itop4412在Linux系統下的 ffmpeg 的移植和測試

近期在做一個視訊監控的專案,在網上了解到如下的方案: 用的V4L2的視訊驅動,然後配合ffmpeg、x264的軟體編解碼,通過udp上傳至pc顯示,配合開源的編解碼庫,實現h.264的流編碼與傳輸。 前面我們已經實現了x264編碼庫的移植,並且做了測

Linux系統移植之早期打印CONFIG_DEBUG_LL

ace makefile add ssa ptr 終端 同時 虛擬 固件 一、幾個關鍵宏定義   CONFIG_DEBUG_LL、 CONFIG_DEBUG_LL_INCLUDE   容我慢慢道來, 首先要使能早期打印, menuconfig必須選中CONFIG_

java從《《遞迴函式》》到《《歸併排序》》再到《《和問題歸併排序的應用》》:

一:我們首先來研究一下遞迴函式(使用遞迴函式求陣列最大值): 我們開始把陣列分為兩半,分別找出最大值,那麼這個最大值就是最後的最大值:同時我們左右兩邊繼續細分,停止條件就是細分到單個數值為止。 package chapter1; //使用遞迴求出一個數組中的最小值 public class

【機器學習筆記02】二乘法多元線性迴歸模型

數學基礎 1.轉置矩陣 定義: 將矩陣A同序數的行換成列成為轉置矩陣ATA^TAT,舉例: A=(1203−11)A=\begin{pmatrix} 1 & 2 & 0 \\ 3 & -1 &

【機器學習筆記01】二乘法一元線性迴歸模型

【參考資料】 【1】《概率論與數理統計》 【2】 http://scikit-learn.org /stable/auto_examples/ linear_model/ plot_ols.html # sphx-glr-auto-examples-

Unity實戰篇:MOBA遊戲地圖製作二:細節完善

1.場景新建一個Cube,命名為Ground,scale設定為200,0.01,200。 2.建立材質球,把準備好的地圖圖片(開一把MOBA遊戲~)拖進去,然後把材質球給Ground。 我們的地

009、的映象2018-12-26 週三

參考 https://www.cnblogs.com/CloudMan6/p/6788841.html   映象的內部結構       為後面製作映象做準備,先來分析一個簡單的映象 hello-world。

二乘法自我理解+自我熟悉(1)

    最近一直在看機器學習的東西,看了好些論文,但奈何基礎實在太差,有很多東西都不懂。所以就看各種演算法。雖然當然看完覺得理解了,但一段時間過去又忘的差不多,無奈之舉,希望通過部落格來加深自己對基礎知識的理解和掌握。這次總結也是通過各種部落格和材料收集得到的,所以只能說是

字串表示法LeetCode 899. Orderly Queue

A string S of lowercase letters is given.  Then, we may make any number of moves. In each move, we choose one of the first K letters (sta

把陣列中全部數拼接組合成一個的數劍指offer筆記

題目:輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。先附上程式碼,後面具體講解一下為何這樣寫以及程式碼中涉及到的python方法# -*- cod

我的瑜伽課表:第一階段課程共8

我們在流瑜伽和ashtanga瑜伽練習中經常會使用ujjayi呼吸,主要是需要運用很強的呼吸控制幫助我們來完成體式,一般都採用胸腔呼吸,吸氣的時候胸腔向外擴張,呼氣的時候胸腔向內收縮,充分運用我們的雙肺,同時配合我們喉嚨處的控制,達到對呼吸和對身體的控制。 初學者在一開始練習ujjayi呼吸時不容

Linux就該這麽學》第一筆記

kickstart linux命令 info 服務管理 ima rhca 最有 學習網址 存儲結構 本書是由全國多名紅帽架構師(RHCA)基於最新Linux系統共同編寫的高質量Linux技術自學教程,極其適合用於Linux技術入門教程或講課輔助教材,目前是國內最值得去讀的L

PCB製作微控制器系統為例

參考連結: 第一步:安裝Altium Designer Summer 09並破解(詳情見軟體安裝) 第二步:建立工程,建立PCB工程,建立原理圖並儲存在同一目錄下 右擊工程名,儲存所有檔案在同一目錄下 第三步:放置元器件,繪製原理圖 開啟右下角system-&g

三分鐘學會用SpringMVC搭建系統超詳細

springmvc+mybatis dubbo+zookeeper restful redis分布式緩存 kafka 前言做 Java Web 開發的你,一定聽說過SpringMVC的大名,作為現在運用最廣泛的Java框架,它到目前為止依然保持著強大的活力和廣泛的用戶群。本文介紹如何用ecli