使用 Olimex 的 Olinuxino A13/A13Micro 创建迷你 PC 或服务器

Olimex 是一家保加利亚公司,以其创新的业余爱好者产品而闻名。它拥有广泛的基于微控制器的产品,从小型的 Arduino 克隆板到功能强大的系统,后者以 Allwinner A13 微控制器作为其大脑。在本文中,我将介绍如何从头开始为 Olinuxino A13 和 Olinuxino A13Micro 创建一个可工作的 Linux 系统。

让我们首先获取并编译内核,创建 U-Boot 系统,准备根文件系统,并获取必要的软件包来创建一个舒适的 минимальный 计算环境。在本文的最后,我还将解释如何安装一个紧凑的桌面环境。

我使用 Ubuntu 12.04 (Precise Pangolin) 作为我的构建系统。任何基于 Debian 的系统用户都应该能够相对轻松地按照本文中的说明进行操作。在开始之前,您应该在您的主目录下创建一个目录来包含您的所有工作。我将我的目录命名为 "A13System"。

什么是 Arm 和 eabihf?

当您进一步阅读本文时,您将多次遇到 Arm 和 eabihf 这两个术语。让我澄清这些术语,以避免与您在决定深入研究交叉编译世界时可能遇到的其他术语混淆。

Arm 是 ARM Holdings(一家英国公司)设计的一系列微控制器架构的通用名称。您可以在大多数便携式现代设备中找到 Arm 微控制器,从手机、Nintendo DS 便携式游戏机到 Apple iPhone 和 Apple TV。ARM Holdings 不生产这些微控制器;相反,它将设计许可给其他公司。这些公司然后将他们自己的“秘方”添加到设计中,然后制造和销售成品微控制器。这就是为什么有如此多的 Arm 架构变体和如此多公司生产 Arm 微控制器的原因。

EABI 代表嵌入式应用程序二进制接口(Embedded Application Binary Interface)。它指定了嵌入式软件应用程序的低级约定。当涉及到 Arm 微控制器时,它们有许多尺寸,从非常小到大。较小的变体没有必要的内存或功率在硬件本身上处理浮点计算,因此有必要通过软件来完成。这些变体被称为 Arm 软浮点(soft float)。还有其他变体可以通过硬件处理浮点计算,例如向量浮点(vfp)。这两种 EABI(软浮点和 vfp)通常被称为 armel。一种更新的 EABI,目标是更高端的 Arm 微控制器,具有比 vfp 更高效的浮点指令,被称为硬浮点(hard float),因此是 armhf

Olimex 的 A13WiFI、A13 和 A13Micro 开发板由 Allwinner A13 Arm 微控制器驱动,后者基于 ARMv7 设计。ARMv7 以及更新的 ARMv8 完全支持 armhf。

先决条件

您可以在本文的“资源”部分找到所有必要的文件下载 URL 和其他信息。在开始构建过程之前,您需要安装以下程序

  • build-essential。

  • gcc-4.6-arm-linux-gnueabihf(版本可能因不同的发行版而异;在撰写本文时,我遇到的最新版本是 4.7)。

  • ncurses-dev。

  • uboot-mkimage。

  • git。

  • debootstrap。

  • debian-archive-keyring(如果您稍后决定使用 Debian rootfs)。

  • qemu-user-static。

完成先决条件的安装后,您需要在 gcc-4.6-arm-linux-gnueabihf 的安装目录(在我的例子中,它位于 /usr/bin)中创建几个软链接。使用 which 命令查找安装目录


$ which arm-linux-gnueabi-gcc-4.6

接下来,为 arm-linux-gnueabihf-gcc-4.6、arm-linux-gnueabihf-gcov-4.6 和 arm-linux-gnueabihf-cpp-4.6 创建软链接


$ sudo ln -s /usr/bin/arm-linux-gnueabihf-gcc-4.6 \
 /usr/bin/arm-linux-gnueabihf-gcc
$ sudo ln -s \
 /usr/bin/arm-linux-gnueabihf-gcov-4.6 \
 /usr/bin/arm-linux-gnueabihf-gcov
$ sudo ln -s /usr/bin/arm-linux-gnueabihf-cpp-4.6 \
 /usr/bin/arm-linux-gnueabihf-cpp
准备内核和 U-Boot

Linux Sunxi 的好心人慷慨地分享了为在 Allwinner 芯片上运行而定制的内核和 U-Boot 代码。您可以选择获取和编译 Linux 内核的 3.0 或 3.4 版本。编译过程类似。为了本文的目的,我使用内核版本 3.4。从 Linux Sunxi 的 GitHub 仓库获取内核和 U-Boot 源代码


$ git clone -b sunxi-3.4
 https://github.com/linux-sunxi/linux-sunxi.git
$ git clone -b sunxi
 https://github.com/linux-sunxi/u-boot-sunxi.git

让我们首先编译 U-Boot。根据目标系统(A13 或 A13Micro),转到 U-Boot 目录并执行以下命令


$ make a13-olinuxino \
 CROSS_COMPILE=arm-linux-gnueabihf-


$ make a13-olinuxinom \
 CROSS_COMPILE=arm-linux-gnueabihf-

注意: 命令末尾的破折号 (-) 不是错别字。在 make 过程完成后,如果一切顺利,您应该最终得到 u-boot.bin 和 spl/sunxi-spl.bin。

转到内核源代码目录。检查配置目录 ($KERNEL_DIR/arch/arm/configs) 中是否存在 A13 的配置文件 (a13_defconfig) 或 A13Micro 的配置文件 (a13om_defconfig)。如果您没有 A13Micro 的配置文件(通常情况是这样),您可以在“资源”部分找到下载 URL。

现在您需要检查配置文件中的特定行。我付出了惨痛的教训才知道,没有这一行,编译将会失败。如果您的配置文件中不存在以下行,请添加以下行或取消注释


CONFIG_GPIOLIB=y

再次强调,根据目标系统,执行以下命令集之一来编译内核源代码


$ make ARCH=arm a13_defconfig
$ make menuconfig


$ make ARCH=arm a13om_defconfig
$ make menuconfig

最后一步允许您自定义内核。为了避免漫长而痛苦的调试过程,始终确保您能够首先成功编译最小内核(这意味着在不添加任何选项的情况下进行编译)。一旦成功,您可以向内核添加更多选项。记下您添加到内核配置中的任何选项,因为它将帮助您找出哪些功能不起作用。

如果您正在为 A13Micro 开发板编译内核,则应遵循一个特殊步骤。您需要删除“挂起到 RAM 和待机”选项,该选项位于“电源管理选项”下。A13Micro 开发板不支持此选项。

图 1. 选择电源管理选项

图 2. 取消选中“挂起到 RAM 和待机”

如果您计划使用任何开发板的 GPIO 引脚,请确保您在“设备驱动程序”和“杂项设备”下选择“一个丑陋的 sun4i gpio 驱动程序”选项。

图 3. 在“设备驱动程序”下选择“杂项设备”

我还计划使用 Olimex 的 MOD-WIFI USB 棒模块2,它为开发板添加了 Wi-Fi 功能。为此,您需要包含该模块的驱动程序,该驱动程序称为“Realtek 8192C USB Wifi for SW”,位于“设备驱动程序/网络设备支持/无线 LAN”下。欢迎您尝试其他 Wi-Fi 设备。我可以保证我已成功地将 A13 开发板与 Netgear WG111v2 USB Wifi 棒模块一起运行。我用于此 Wi-Fi 设备的驱动程序是“Realtek 8187 和 8187B USB 支持”。

图 4. 作为模块的 Realtek 8192C 驱动程序

您还必须确保 TCP/IP 已被选中并包含在内核中。勾选“网络支持”并按 Enter 键以选择它。

图 5. 网络支持选项

进入“网络选项”,并确保已选中“TCP/IP 网络”。

图 6. 确保已选中“TCP/IP 网络”。

一旦您对配置感到满意,请保存它并返回到命令提示符。执行以下命令来编译内核并构建驱动程序


$ make ARCH=arm \
 CROSS_COMPILE=arm-linux-gnueabihf- uImage
$ make ARCH=arm \
 CROSS_COMPILE=arm-linux-gnueabihf- \
 INSTALL_MOD_PATH=out modules
$ make ARCH=arm \
 CROSS_COMPILE=arm-linux-gnueabihf- \
 INSTALL_MOD_PATH=out modules_install

当编译完成后,您将在 $KERNEL_DIR/arch/arm/boot/uImage 中得到内核镜像,在 $KERNEL_DIR/out/lib/modules/$KERNEL_VERSION 中得到模块和驱动程序。

下一步是为您的开发板准备一个最小的文件系统。到目前为止,我发现最简单的选择是使用 Debian 项目或 Ubuntu 的根文件系统,因为这两个发行版都为基本应用程序提供了 armhf 二进制文件。接下来我将解释如何准备这两种选择。

准备文件系统:Debian Wheezy

首先为您的根文件系统创建一个新目录。为了清楚起见,我将其命名为 debian-rootfs。您将使用一个名为 debootstrap 的应用程序从 Debian 存储库中拉取基本的文件系统结构。您可以自由使用更靠近您的存储库,而不是我在本示例中使用的存储库。以 root 身份或使用 sudo,在您新创建的目录中输入以下内容


# debootstrap --foreign --arch armhf wheezy \
 /home/user/A13System/debian-rootfs \
 http://ftp.debian.org/debian

请注意,结果结构仍然不是完整的文件系统。下一步是在您的新目录中创建一个 chroot 系统。对于那些不熟悉 chroot 的人来说,此命令有效地在您的“主机”系统内创建一个隔离的系统


# cp $(which qemu-arm-static) \
 /home/user/A13System/debian-rootfs/usr/bin
# mount -t proc proc \
 /home/user/A13System/debian-rootfs/proc
# chroot /home/user/debian-rootfs /bin/bash

I have no name!# ./debootstrap/debootstrap \
 --second-stage

将 qemu-arm-static 二进制文件复制到您的根文件系统的 /usr/bin 目录中。qemu-arm-static 二进制文件有助于从您的 x86/64 位系统运行 armhf 二进制文件。您还需要将主机的 proc 文件系统挂载到您的 chroot 系统中。当您第一次进入 chroot 系统时,您可能会发现一个奇怪的提示语问候您(“I have no name!”)。这不是引起关注的原因,您可以安全地忽略它。进入 chroot 系统后,再次调用 debootstrap 以完成基本系统(使用 --second-stage)。

如果您好奇您是否真的在您的 chroot 系统中运行 armhf 系统,请执行 uname 命令进行检查。如果您在输出中的某个位置看到类似 "armv7l" 的内容,则表明您的 chroot 正在运行 armhf 系统。

下一步是更新您的 apt 源列表文件。在您的 chroot 系统中,或使用构建主机的编辑器,转到并编辑位于您的根文件系统目录内的 /etc/apt/sources.list 文件。将以下行添加到此文件中(记住,您也可以使用其他 Debian 存储库)


deb http://ftp.debian.org/debian wheezy main \
 contrib non-free
deb-src http://ftp.debian.org/debian wheezy main \
 contrib non-free

deb http://ftp.debian.org/debian wheezy-updates \
 main contrib non-free
deb-src http://ftp.debian.org/debian \
 wheezy-updates main contrib non-free

deb http://security.debian.org/ wheezy/updates \
 main contrib non-free
deb-src http://security.debian.org/ \
 wheezy/updates main contrib non-free
准备文件系统:Ubuntu

如果您感觉冒险,您可以始终尝试 debootstrap 您的 Ubuntu 根文件系统,就像我在上一节中描述的那样。(您也可以在互联网上找到相关的说明。)在这里,让我们选择一种更简单的方法,只需下载 Ubuntu 提供的现成的最小根文件系统。有几个软件包可用,包括 Ubuntu 12.04、12.10 和 13.04。确保您下载的是根文件系统软件包的 armhf 版本。

为您的 Ubuntu 根文件系统创建一个目录,并将您刚刚下载的文件内容提取到其中。您的下一步应该是编辑 /etc/resolv.conf 并在其中添加您的 nameserver。此外,查看您的 /etc/apt/ 中的 sources.list 文件。您可能需要在每个 deb 和 deb-src 行的末尾添加 universemultiverse

您应该检查您的 qemu-arm-static 的版本号。Ubuntu 12.04 标准安装附带的 1.0.50 版本在我的构建系统上为 Ubuntu 根文件系统运行以下步骤时会生成错误。为了解决这个问题,我不得不编译我自己的 qemu-arm-static。我使用了 1.0.91 版本(有关源代码包的下载 URL,请参阅“资源”)。执行以下步骤来配置和编译二进制文件,并将生成的 qemu-arm 复制到您的 Ubuntu 根文件系统的 /usr/bin 目录内的 qemu-arm-static


$ ./configure \
 --prefix=/home/user/A13System/qemu-arm-static \
 --static --disable-kvm \
 --target-list=arm-linux-user

$ make
$ make install
根文件系统的最后润色

到目前为止,您所拥有的只是一个非常基本的文件系统。现在让我们改进它,以便您拥有舒适的基本计算环境所需的工具。根据您自己的区域设置更改生成的区域设置。接下来描述的所有过程都在 chroot 系统内部完成


root@host:/# apt-get update
root@host:/# apt-get install apt-utils ncurses-dev
root@host:/# apt-get install dialog locales tzdata
root@host:/# locale-gen en_AU en_AU.UTF-8
root@host:/# dpkg-reconfigure locales
root@host:/# dpkg-reconfigure tzdata
root@host:/# apt-get install iputils-ping \
 wpasupplicant dhcpcd5 sudo openssh-server ntp \
 openssh-client
root@host:/# apt-get install nano vim gettext \
 bison automake autoconf
root@host:/# apt-get install python rsyslog \
 network-manager alsa-utils

现在让我们配置 Wi-Fi 连接。我假设您正在使用 Wi-Fi USB 适配器进行连接,并且您的无线网络连接配置正在使用 WPA 进行安全保护。根据您的配置相应地更改步骤。编辑您的 /etc/network/interfaces 并添加以下行,根据需要更改值


auto wlan0
iface wlan0 inet dhcp
wpa-ssid YOUR_ESSID
wpa-psk YOUR_PASSPHRASE

接下来,如果您希望您的 bash shell 具有自动完成功能,请编辑 /etc/bash.bashrc 并取消注释某些行,使其类似于以下内容


# Commented out, don't overwrite xterm -T
# "title" -n "icontitle" by default.
# If this is an xterm set the title to
# user@host:dir
case "$TERM" in
xterm*|rxvt*)
 PROMPT_COMMAND='echo -ne \
 "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
 ;;
*)
 ;;
esac

# enable bash completion in interactive shells
if [ -f /etc/bash_completion ] && ! shopt -oq \
posix; then
    . /etc/bash_completion
fi

检查 /etc/shadow 中是否存在以下内容


root:*:15629:0:99999:7:::
daemon:*:15629:0:99999:7:::

如果您在 root 行的第一个冒号后看到星号 (*),则应将其删除。这将允许您在首次运行时自行设置 root 密码。

您已完成为您的开发板构建根文件系统的过程。接下来,让我们压缩整个根文件系统,以便您可以稍后轻松地将其部署到您的 MicroSD 卡。退出 chroot 环境并在您的根文件系统目录中执行以下操作


# umount proc
# rm ./usr/bin/qemu-arm-static
# tar -zcvf /home/user/my-rootfs.tar.gz *
准备 MicroSD 卡

我正在为我的开发板使用 4GB MicroSD 卡。我确信 2GB MicroSD 卡足以容纳您的所有文件,但是有一些空间用于其他应用程序会更好。您需要在您的空 MicroSD 卡上创建两个分区。第一个是 VFAT 分区,大约 17MB,用于 U-Boot 和内核镜像。其余部分将用于存储您的根文件系统。

挂载 MicroSD 卡。记下您的计算机为 MicroSD 卡提供的设备名称。有些计算机将该卡识别为 /dev/sdX,而另一些计算机将其称为 /dev/mmcblkX(对于本例,我假设您的卡被识别为 /dev/sdb)


# fdisk -u=sectors /dev/sdb

键入 "p" 以列出卡内的分区。如果您列出了任何分区,请按 "d" 删除它们。一旦卡为空,请按 "n" 创建一个新分区。将其作为第一个主分区。fdisk 将要求您输入起始和结束扇区号。分别键入 "2048" 和 "34815"。对第二个分区重复此过程。这次,当要求输入起始和结束扇区号时,只需按 Enter 键;fdisk 将使用默认值,这将填充卡的其余部分。

再次键入 "p" 以列出分区。您应该看到类似于图 7 中所示的内容。

图 7. 4GB MicroSD 卡上的分区列表

键入 "w" 以将更改永久写入卡中。现在,在分区上创建两种文件系统类型


# mkfs.vfat /dev/sdb1
# mkfs.ext3 /dev/sdb2

不要忘记在您为 MicroSD 卡键入的每个命令后执行 sync。Sync 确保更改被刷新并保持卡处于正确的状态。接下来,挂载分区。我假设挂载点是 /media/card1 用于 /dev/sdb1 和 /media/card2 用于 /dev/sdb2。首先,填充根文件系统并将内核模块复制到第一个分区


# cd /media/card2
# tar -xzvf /home/user/A13System/my-rootfs.tar.gz
# sync
...[THIS WILL TAKE SOME TIME]
# cp -a $KERNEL_DIR/out/lib/modules/3.4.43+/ \
 ./lib/modules/.
# sync

将 uImage 文件从您的内核目录(在 arch/arm/boot 中)复制到第一个分区,以及一个名为 script.bin 的文件。script.bin 存储 Allwinner 芯片所需的系统配置设置。如果您想编辑这些设置,请使用一个名为 bin2fex 的工具将此 .bin 文件转换为 .fex 文件。您可以使用任何文本编辑器编辑生成的文件。

对于最后一步,您需要将 U-Boot 写入卡本身。请特别注意您在此处键入的内容,因为您不会写入 /dev/sdb1 或 /dev/sdb2,而是写入 /dev/sdb


# cd /home/user/A13System/u-boot
# dd if=spl/sunxi-spl.bin of=/dev/sdb bs=1024 \
 seek=8
# dd if=u-boot.bin of=/dev/sdb bs=1024 seek=32
# sync

现在您的 MicroSD 卡已准备好使用。

首次运行

将卡插入开发板上的插槽。同时插入 Wi-Fi USB 棒、键盘和 VGA 显示器(如果需要,可以使用 USB 集线器)。插入电源线并等待登录提示符。

使用 root 帐户登录。首次运行时您应该不需要密码。进入后,为您的 root 帐户设置一个安全密码,并为您的日常使用创建一个新帐户。将此新用户添加到 sudoers 文件中。检查您是否具有网络连接。通过 SSH 连接到开发板来远程测试开发板。如果您可以成功完成所有这些操作,恭喜您!您拥有了一个出色的 минимальный PC/服务器,供您支配。

桌面环境

如果您有兴趣将此开发板与图形用户界面一起使用,则需要使用轻量级 GUI 环境,因为该开发板没有太多 RAM 可供使用。有几个选项可供选择,例如 LXDE 和 XFCE4;但是,我在这里使用一个不同的软件包,称为 Fluxbox。您还需要安装一个轻量级图形登录管理器。使用软件包管理器,安装 lightdm 和 fluxbox。是的,就是这么简单。这些命令将安装桌面环境、图形登录管理器及其所需的服务器和库


root@a13board:/# apt-get install lightdm fluxbox

图 8. 运行 Fluxbox 的 A13Micro

重启开发板。当开发板重启时,您将看到新的登录管理器。确保在登录时从 Lightdm 屏幕上的会话菜单中选择 Fluxbox。享受您的新迷你个人电脑/服务器!

资源

Debian 存储库列表:http://www.debian.org/mirror/list

A13Micro 的内核配置文件:http://goo.gl/YnZ1s

A13 和 A13Micro 开发板的 Script.bin:http://goo.gl/7QZuoU

Ubuntu 12.04 Core 根文件系统:http://goo.gl/eoALA

Ubuntu 12.10 Core 根文件系统:http://goo.gl/iLcV8

Ubuntu 13.04 Core 根文件系统:http://goo.gl/cytEY

Qemu 源代码下载:https://launchpad.net/qemu-linaro/+download

加载 Disqus 评论