系统移植 2-Debian 系统的移植

警告
本文最后更新于 2020-04-27,文中内容可能已过时。

Debian 系统的移植总分四部分:u-boot 的编译与烧录,Linux 内核的编译与烧录,Debian 基本根文件系统的制作、配置与烧录,开发板设置。

对应于 EMSYM 的 blurr 开发板的 u-boot 项目使用 GitHub 进行开源维护,下载地址,我的编译环境为 Ubuntu16.04 LTS 系统

方法一:在链接打开后的项目界面依次选择 clone or download—>Download ZIP,将源码下载到 PC 中相应的文件夹(记得解压…..)

方法二:采用 git 命令(须事先安装 git)

1
$ git clone https://github.com/EMSYM/U-boot.git

注:该链接在选中 clone or download 后可看到

在下载好的 u-boot 项目目录下打开虚拟终端,创建并切换分支

1
$ git checkout -b v4.1 origin/blurr-4.1.15

创建并切换分支

gcc-arm-linux-gnueabi 是我们用到的交叉编译器

1
2
$ sudo apt install gcc-arm-linux-gnueabi
$ sudo apt-get install build-essential gcc

注:Ubuntu 缺省情况下,并没有提供 C/C++ 的编译环境,因此还需要手动安装。如果单独安装 gcc 以及 g++ 比较麻烦,幸运的是,为了能够编译 Ubuntu 的内核,Ubuntu 提供了一个 build-essential 软件包。因为依赖关系的问题,安装了该软件包,编译 c/c++ 所需要的软件包也都会被安装。因此如果想在 Ubuntu 中编译 c/c++ 程序,只需要安装该软件包就可以了。

build-essential的依赖关系

指定核心类型

1
$ ARCH=arm

生成配置文件(用到 Makefile,参阅 GNU make 中文手册

1
$ make mx6dl_blurr_defconfig

生成配置文件

指定交叉编译前缀,编译 u-boot

1
$ make CROSS_COMPILE=arm-linux-gnueabi- 

编译通过

执行完上述步骤后,编译即可成功

同样,对应于 blurr 开发板的 Linux 内核项目也在 GitHub 上开源维护,项目地址

github上的工程

下载源码的手段与 u-boot 类似。这里要提醒的是,最好直接 Download ZIP,不要 clone,因为下载 ZIP 只有 100 多 M,clone 会有一个多 G。而这两种手段得到的源码对之后的编译没有影响。(记得解压 zip 文件)

1
$ sudo apt-get install lzop

lzop 是最后生成时要用到的一个压缩工具,当没有安装此工具就开始编译,过程中会出现一个 lozp:not found 的错误

lozp:not fountd

进入下载好的 Linux 项目主目录,逐步执行如下命令

1
2
3
4
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabi-
$ make blurr_defconfig
$ make

前两句的意思是指定芯片的架构以及交叉编译器前缀,然后就开始编译了(之前编译 u-boot 时已装好交叉编译器),可参考 export 命令的介绍

会有一些 warning,但不碍事

要等很久…..

完成如上步骤后即可编译完成,我们需要编译得到的 zImage 文件和 imx6dl-blurr.dtb 文件位置如下:

  • zImage:linux-blurr 4.1.15—>arch—>arm—>boot

  • imx6dl-blurr.dtb:linux-blurr 4.1.15—>arch—>arm—>boot—>dts

zImage 位置如下图

imx6dl-blurr.dtb 直接从上面目录里的 dts 点进去

该部分内容主要参考官方文档 EmDebian CrossDebootstrap,方法为 QEMU/debootstrap 的方法。使用 debootstrap 工具完成根文件系统的制作,使用 QEMU 模拟器完成配置工作。

制作根文件系统的工具常用 Debootstrap 和 Multistrap,制作流程大概分为四个步骤:

1、从源里下载需要的.deb 软件包

2、解压它们到相应的目标目录

3、用 chroot 命令修改该目标目录为根目录

4、配置脚本,完成安装

通常,使用 debootstrap、cdebootstrap 或 multistrap 完成第一二阶段的工作,QEMU 完成第三四阶段的工作。

使用如下的命令安装所需要工具软件

1
$ sudo apt-get install binfmt-support qemu qemu-user-static debootstrap

debootstrap 是根文件系统制作工具,qemu 是模拟器,是为了在宿主机上模拟开发板的环境

接下来的步骤需要以 root 身份执行,因为 debootstrap 的工作以及 chroot 到建好的新系统的目录都需要 root 权限

首先选择要引导的目标架构和 Debian 版本(例如 stable、testing 或 sid), 我们选择开发板对应的 arm 架构,版本选择 Debian9.1, 叫做 stretch。

创建一个目录文件,制作好的根文件系统将放在这个目录下。需要提示以后所有对根文件系统的修改都局限在这个目录里,不会影响到宿主机,所以不用担心搞毁你的系统。为了介绍清楚,我们采用 “debian_armhf_stretch” 作为目录名,但它其实就是 rootfs,如果你这样命名的话

1
$ sudo mkdir debian_armhf_stretch

制作根文件系统,需要运行 debootstrap

1
$ sudo debootstrap --foreign --arch armhf stretch debian_armhf_stretch http://ftp.debian.org/debian/

其中 debian_armhf_stretch 是创建的目录,armhf 是目标架构,http://ftp.debian.org/debian 是 Debian 镜像,必需的.deb 包将从这里下载。可以随意选择自己喜欢的镜像,只要它有我们要用于的目标架构。可用的 Debian 镜像列表debootstrap 命令说明

会运行两次,第一次是从网上下载,第二次就是在 debian_armhf_stretch 目录下生成 bin、sbin 这些 Linux 文件系统目录了。

根文件系统已经创建完成。默认情况下,debootstrap 创建的是一个非常小的系统,所以可能需要扩展一下,这个放在后面的配置新系统。

先复制 “qemu-arm-static” 到刚构建的根文件系统中。为了能 chroot 到目标文件系统,针对目标 CPU 的 qemu 模拟器需要从内部访问

1
$ sudo cp /usr/bin/qemu-arm-static  debian_armhf_stretch/usr/bin

接下来运行 debootstrap 的第二个阶段来解压步骤 3 中安装的所有软件包

1
$ sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot debian_armhf_stretch debootstrap/debootstrap --second-stage

该命令意思是设置一些环境变量,然后切换根目录到 debian_armhf_stretch(这个操作是 chroot 做的,这个命令很有意思),执行目录 debian_armhf_stretch/debootstrap 下的命令: debootstrap –second-stage。终端上最后会打印 I: Base system installed successfully.,就说明成功了。

切换到 qemu

1
$sudo chroot debian_armhf_stretch

不过如果这样的话之后的提示都是英文的,想显示中文需要把上面的命令这样输入

1
$ sudo LANG=C.UTF-8 chroot debian_armhf_stretch

刚刚创建的新系统需要一些简单的调整以便于你运用它做一些特殊的工作。下面的步骤需要以 root 权限执行

  1. 手动在 /etc/apt/sources.list 里面添加如下条目

    1
    2
    
    deb http://ftp.debian.org/debian/ stretch main contrib non-free
    deb-src http://ftp.debian.org/debian/ stretch main contrib non-free

    源的选择是随便的,只要它支持目标平台就行,不过国内中科大的源好用一点,这时候就可以像往常一样使用 apt-get install 命令安装其它软件包了。

  2. 安装 xorg 和 KDE,KDE 新版本叫 plasma

    1
    2
    
    $ sudo apt-get install xorg
    $ sudo apt-get install plasma-desktop

    这句执行也是真的久,不要着急,中间可能会自动进入一些配置界面,根据选项自己选就行,如果乱码的话可以选第一个,其实上面设置成中文就没乱码了。

  3. 安装终端 konsole,安装浏览器 qupzilla(这是因为 Debian9 以下不支持 chrome),安装文件管理器 dolphin,网络管理器 plasma-nm

    1
    2
    3
    4
    
    $ sudo apt-get install konsole
    $ sudo apt-get install qupzilla
    $ sudo apt-get install dolphin
    $ sudo apt-get install plasma-nm
  4. 打开 etc 文件夹中的 fstab 文件,在末尾添加

    1
    
    /dev/sda / ext4 defaults 0 1
  5. root 用户下输入命令

    1
    2
    
    chown root:root /usr/bin/sudo
    chmod 4755 /usr/bin

u-boot,Linux 内核和根文件系统都是需要烧录的,下面介绍如何进行这部分工作。首先将 SD 卡格式化,准备好要烧录的文件

  • u-boot:u-boot.imx
  • 内核:zImage 和 imx6dl-blurr.dtb
  • 根文件系统:debian_armhf_stretch

SD 卡需要创建 2 个分区,并且在第一个分区之前预留一段空间用于保存 u-boot.imx;然后第一个分区设置为 fat 格式,用于保存内核编译成的两个文件;第二个分区设置为 ext4 格式,用于保存根文件系统。

在分区之前,先将 SD 卡格式化(可能 Windows 下格式化方便一点),首先在 Linux 系统下插入 SD 卡,查看挂载位置,使用 fdisk 命令

1
$ sudo fdisk -l

这个命令作用为查看磁盘使用情况的,最后那个即为我们新挂载的 SD 卡

从结果输出中可以看到 SD 卡,挂载位置是 /dev/sdb,输入命令

1
$ sudo fdisk /dev/sdb

该命令含义为进入分割硬盘模式,这个命令执行结束就可以操作分区了。

输入 m 可以获取帮助,显示所有可用命令。先用 d 命令删除原来的分区,提示 Selected partition,在后面输入要删除的分区号,回车,分区即可删除成功

输入命令 p 查看此时的分区信息,已变成一整块的磁盘未分区,接下来开始分区

n 命令新建分区,第一次输入 p 分割为主分区,分区号为 1,分区的起始位置和结束位置自己算好填上去,注意分区必以 sector 为单位,一个 sector 为 512 bytes,所以不要输不是 512 整数倍的数。

n 命令新建分区,第二次输入 e 分割分区,分区号为 2,起始位置接着上一个分区的结束位置。

p 命令查看分区信息,看是否符合预想。w 命令保存退出。弹出重新插入 SD 卡或者重新启动 Ubuntu 系统,之后再次查看分区信息,这是为了更新分区表给内核,否则看不到分好的区。

格式化新建的分区

1
$ sudo mkfs.ext4 /dev/sdb2

然后对两个分区格式化

输入 t,选择分区 1,将分区 1 格式化为 fat,这里输入 6 为 FAT16,c 为 FAT32

输入 t,选择分区 2,将分区 2 格式化为 ext4 格式,输入 83 即可

注:这里输入 83 格式化结束最后查看分区其实显示的是 83 Linux,这就已经是 ext4 格式了,不要觉得自己错了,因为 Linux 的默认格式就是 ext4

w 命令保存

执行如下命令,把 u-boot 弄到 SD 卡开头预留的那段空间

1
$ sudo dd if=u-boot.imx of=/dev/sdb  bs=512 seek=2 ;sync

dd 命令的解释,至于为什么要 seek=2,跳过头两个块我现在也不懂

把编译好的内核的两个文件 zImage 和 imx6dl-blurr.dtb 复制到第一个分区,可以直接鼠标操作

先 fdisk -l 查看第二个分区的位置,是 /dev/sdb2。把第二个分区挂载到 /mnt 下,这里执行成功后把文件放到 /mnt 下就相当于放到了 U 盘第二个分区

1
$ sudo mount /dev/sdb2 /mnt

然后就在 rootfs 的当前目录用 cp 命令复制,意思是将根文件系统的所有内容复制到挂载的目录

1
$ sudo cp -rf rootfs/.  /mnt

执行完有必要的话取消挂载

1
$ sudo umount /mnt

确保 zImage 文件和 imx6dl-blurr.dtb 文件都已放入 SD 卡第一个分区,也就是 FAT 格式的分区中;文件系统解压到 SD 卡第二个分区,也就是 ext4 格式的分区中

注:若之前已经进行到屏幕上出现两只企鹅,此时只需要将解压好文件系统的 SD 卡插入开发板,上电即可进入命令行界面,若无法进入命令行界面则继续进行下列步骤,

  1. 靠近 HDMI 接口的地方有个开关,拨动开关到 boot 一端,设置八位红色开关为 0100001

  2. 将 SD 卡插入 SD3 插槽

  3. 下好窗口调试软件 putty(windows 或 Linux 下都可),其它串口调试软件也行,用数据线连接开发板和 PC(调试),开发板与屏幕,开发板与电源,开发板与键盘

  4. 打开设备管理器,找到这个设备,这时候还没有驱动,所以右键更新驱动程序,在网络上查找,第一次可能一直是寻找中,那就关掉重新打开。直到驱动装好,从设备管理器里就可以看到相应的 COM 口。

  5. 打开 putty,选择 serial,将 COM1 改成上面设备管理器里看到的 COM 号,speed 改为 115200,然后最下面点 open

  6. 此时看到串口输出(若没有,请按开发板 HDMI 口旁边的 RESET 按钮),按回车进入调试模式,输入如下命令命令

    1
    2
    3
    4
    5
    6
    7
    8
    
    setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk2p2 init=/sbin/init'
    saveenv
    #加载镜像
    fatload mmc 1:1 12000000 zImage; #将SD卡分区一的镜像加载到内存地址0x12000000
    fatload mmc 1:1 11000000 imx6dl-blurr.dtb;
    #加载Device Tree文件
    #启动镜像
    bootz 12000000 - 11000000

开发板上电,如果 SD 卡中此时只有 u-boot 和内核,屏幕上会有两只企鹅,

显示企鹅

如果根文件系统也已经放进去了,那就会出现登录选项,连接键盘与开发板,输入 root,这个是拿到的这个根文件系统就是这个名字,之后即可使用键盘输入各种命令与开发板交互。在命令行使用如下命令可以启动 GUI,然后就进入 KDE 桌面环境了,Debian 系统哦

注:开发板获得读写权限的方法如下,如果模拟器中已完成此工作则不需要

1
$ mount rw -o remount /

  1. debian 下为 arm 开发板创建基于 debian 或 emdebian 的根文件系统

    这篇文章主要是提供一个思路,用工具来制作 Debian 的根文件系统。

  2. 创建基于 arm 的 debian 文件系统

    主要是因为上面制作的根文件系统直接弄到板子上没网,所以就没法用板子的命令行安装软件,只好借助模拟器在 PC 上装好一些东西,比如 GUI 和其它一些软件。这篇文章提供一些模拟器 QWMU 使用的借鉴

  3. Emdebian

    这个就没什么了,主要是区别一下我们用到的嵌入式 Debian 的源码版本

支付宝
微信
0%