Linux最小系统

讯为iTOP-4412嵌入式学习。Linux最小系统制作与烧写

环境

  • ubuntu 12.04 (GCC版本降为4.4)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib gcc-4.4-multilib
    update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 100
    update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 50
    update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 100
    update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 50
    update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.4 100
    update-alternatives --install /usr/bin/cpp cpp-bin /usr/bin/cpp-4.6 50
    gcc -v

    #恢复原来的gcc版本
    update-alternatives --remove cpp-bin /usr/bin/cpp-4.4
    update-alternatives --remove g++ /usr/bin/c++-4.4
    update-alternatives --remove gcc /usr/bin/gcc-4.4
  • win 7 (烧写)
  • busybox 1.22.1 (开源,下载地址:https://busybox.net/)
  • arm交叉编译器 arm-2009q3 (将提供的arm编译器arm-2009q3解压到/usr/local/arm,并在~/.bashrc中添加环境变量 export PATH=$PATH:/usr/local/arm/arm-2009q3/bin)

制作Linux最小系统

  1. 下载busybox 1.22.1 至ubuntu,并解压。
    进入解压路径busybox-1.22.1,进行编译设置make menuconfig (图形界面设置)
  • Busybox Setting —> Build Option —> cross compiler prefix —> 填写 “arm-none-linux-gnueabi-”
  • Busybox Setting —> Installation Options —> (./__install)Busybox installation prefix —> 更改为“../system” 将系统内核文件生成在上层目录的system中
    保存设置

【tips】make menuconfig 命令依赖ncurses库的支持。如果没有安装该库会报错“scripts/kconfig/lxdialog/dialog.h:31:20: fatal error: curses.h: No such file or directory”
安装相应的库:
sudo apt-get install libncurses5-dev libncursesw5-dev
3. make 编译安装busybox.
4. make install 将编译生成的二进制文件装入../system中
5. 这时候system路径中是如下的:

1
2
3
4
5
|--system
|--bin
|--linuxrc
|--sbin
|--usr

完善Linux最小系统

制作文件系统还需要 /dev /mnt /lib /etc /proc /sys /tmp /var 等文件路径
mkdir /dev /mnt /lib /etc /proc /sys /tmp /var

配置文件/etc

  1. 建立/etc/eth0-setting文件, 并将权限改为755

    1
    2
    3
    4
    5
    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
  2. 建立/etc/init.d/ifconfig-eth0文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/bin/sh

    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.253.12 netmask 255.255.255.0 up
    fi
    fi
    echo Done > /dev/ttySAC2
  3. 建立/etc/init.d/rcS文件,更改755权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #! /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
  4. 建立/etc/passwd文件

    1
    2
    3
    4
    root::0:0:root:/:/bin/sh
    bin:*:1:1:bin:/bin:
    daemon:*:2:2:daemon:/sbin:
    nobody:*:99:99:Nobody:/:
  5. 建立/etc/profile文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 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
  6. 建立/etc/rc.d/init.d/netd, 修改755权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/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

库文件/lib

交叉编译环境与内核编译环境相同,编译器是arm-2009q3. Busybox编译生成的二进制文件以动态链接库的形式运行,所以要拷贝编译器里边的库文件到lib目录下
cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueadi/libc/lib/* [lib dir]

日志目录 /var

在该目录下建立 ./lib ./lock ./log ./run ./tmp等五个目录

到这里就制作好了文件系统

安装打包软件和编译

打包工具make_ext4fs用来将文件系统制作成二进制文件。提供的linux_tools.tgz, 解压到/目录下

在最小linux系统/system路径下,使用命令make_ext4fs -s -l 314572800 -a root -L linux system.img system 生成system.img文件系统镜像。

烧写最小系统

在win7下,通过Hyper Terminal 串口与版子进行连接,注意串口UART不支持热插拔
在Hyper Terminal下,命令

1
2
3
4
5
6
fdisk -c 0
fatformat mmc 0:1
ext3format mmc 0:2
ext3format mmc 0:3
ext3format mmc 0:4
fastboot

将板子的OTG与win7连接起来,查看电脑是否能识别android phone,如果没有的话要安装驱动(位于文件02_编译器与烧写工具/tools/usb_otg_driver中,关注自己win7的版本)

在cmd.exe中运行(注意在cmd中,更改路径为 cd /d platform_tools)

1
2
3
4
5
fastboot.exe flash kernel file/zImage
fastboot.exe flash system file/system.img
fastboot.exe flash ramdisk file/ramdisk-uboot.img
fastboot -w
fastboot reboot

交叉编译一个helloworld文件,并做进system/tmp中

代码交叉编译helloworld.c

  1. 保证环境变量将arm-2009a3/bin加进PATH
  2. arm-none-linux-gnueabi-gcc helloworld.c -o helloworld -static -static静态链接将运用到的库静态链接进入可执行文件,因为现在的linux最小系统/usr中并没有包括glibc的动态链接库。注意这个helloworld文件在ubuntu下是不能执行的,因为是按照arm指令集进行编译的,而不是x86系统下的gcc编译的。
  3. 将编译好的helloworld可执行文件cp到linux最小系统的/tmp路径下,将最小系统进行烧写。
  4. 在Hyper Terminal下运行helloworld。