首页 > 系统相关 >QEMU虚拟开发板 与 嵌入式Linux装机步骤

QEMU虚拟开发板 与 嵌入式Linux装机步骤

时间:2022-12-04 10:44:22浏览次数:60  
标签:git 100ask 开发板 repo book Linux imx6ull QEMU arm

2、下面是使用QEMU虚拟开发板,安装的工具

http://wiki.100ask.org/Qemu

A、安装KVM

可选的(注意,如果想要有更快的效果,在ubuntu下可以安装KVM):
安装kvm加速qemu运行,在终端下执行如下命令:
$ sudo apt-get update
$ sudo apt-get install qemu qemu-kvm libvirt-bin bridge-utils virt-manager

B、下载和解压QEMU镜象文件

我们只提供ubuntu 16.04和ubuntu 18.04系统的QEMU镜象文件。
ubuntu-18.04开发环境下qemu imx6ul系统镜像下载页面
book@100ask:~$ git clone https://e.coding.net/weidongshan/ubuntu-18.04_imx6ul_qemu_system.git

②ubuntu-18.04解压操作步骤
$tar -xvf weidongshan-ubuntu-18.04_imx6ul_qemu_system-release.tgz
然后进入ubuntu-18.04_imx6ul_qemu_system目录执行后文介绍的命令。

C、运行QEMU系统

假设你已经按照上文下载、解压好了QEMU镜像文件,你需要进入QEMU的目录,执行下列命令。

首次运行需要安装SDL环境

使用脚本自动解压安装:
$./install_sdl.sh // 提示输入用户密码,等待安装完成

运行带GUI的imx6ul模拟器

①模拟百问网imx6ull-qemu开发板
$./qemu-imx6ull-gui.sh // 启动后,登录名是root,无需密码

运行不带GUI的imx6ul模拟器

$./qemu-imx6ull-nogui.sh // 启动后,登录名是root,无需密码

D、更新QEMU

我们使用QEMU来模拟IMX6ULL开发板,目的是学习嵌入式Linux系统。随着我们课程的陆续发布,我们也会给QEMU添加更多的功能。比如后面要讲到触摸屏时,就会修改QEMU让它支持触摸屏。
所以你需要不断地更新QEMU,有3个方法。

D.1、下载最新的release包

从下面2个地址就可以下载到最新的release包,解压开后即可使用:
①ubuntu-18.04开发环境下qemu imx6ul系统镜像下载地址:
http://wiki.100ask.org/Download_ubuntu-18.04_imx6ul_qemu
book@100ask:~$ git clone https://e.coding.net/weidongshan/ubuntu-18.04_imx6ul_qemu_system.git
注意:如果你之前对内核、设备树或是文件系统进行过修改,想继续使用这些修改过的文件的话,需要用它们来覆盖release包中解压出来的对应文件。

D.2、下载最新的qemu-system-arm可执行程序及配置文件

如果你不想下载整个release包,可以只替换其中的某些文件。
可以打开下面的某个网址(根据你的ubuntu版本号选择):
https://dev.tencent.com/u/weidongshan/p/ubuntu-16.04_imx6ul_qemu_system/git
https://dev.tencent.com/u/weidongshan/p/ubuntu-18.04_imx6ul_qemu_system/git
以ubuntu 18.04为例,进入下图所示的bin、etc目录:

对于bin目录,只需要下载其中的qemu-sysmte-arm;对于etc目录,里面所有的bmp文件都要下载。
你之前在Ubuntu中曾经安装过我们提供的QEMU,你用下载的文件覆盖QEMU中的对应文件即可。

D.3、下载最新的qemu源码并编译

请参考后续章节,这属于对QEMU的开发了。对于嵌入式Linux初学者,没必要研究QEMU,使用我们提供的可执行程序即可。
至此,虚拟的IMX6ULL开发板安装好了,对于虚拟的开发板使用 repo 下载内核及工具链配置步骤和下面的步骤是一样的,但配置的命令,即下载的文件不同。需要使用这些命令:
IMX6ULL_QEUM版
book@100ask:~$ git config --global user.email "[email protected]"
book@100ask:~$ git config --global user.name "Your Name"

先用git clone下载repo工具,再用repo工具下载源码:
book@100ask:~$ git clone https://e.coding.net/codebug8/repo.git
book@100ask:~$ mkdir -p 100ask_imx6ull-qemu && cd 100ask_imx6ull-qemu
book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo init -u https://e.coding.net/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify
book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo sync -j4
如果一切正常,你在/home/book目录下创建了一个100ask_imx6ull-qemu目录,里有如下内容:

E、在Ubuntu上安装、配置NFS服务

(作用是将编译好的arm-gcc执行文件传到开发板上)
<1.>NFS的安装
apt-get install nfs-kernel-server

<2.>查看nfs的端口是否打开
netstat -tl

❤️.>再重启一下nfs服务
sudo /etc/init.d/nfs-kernel-server restart

<4.>创建nfs共享目录 /home/bruce/nfsdoc ,在里面新建一个文件a.c来共享

<5.>修改nfs配置文件/etc/exports
在Ubuntu Linux系统中,/etc/exports是nfs服务器的全局配置文件。配置文件中一行即为一条配置项,用于指明网络中“哪些客户端”共享“哪些目录资源”。将创建的共享目录添加到其中,后面加上
*(rw,nohide,insecure,no_subtree_check,async,no_root_squash)参数 (用这里面的参数,不用下面图里比较少的参数)

再重启一下nfs服务: sudo /etc/init.d/nfs-kernel-server restart

<6.>将该共享目录挂在到本地的/mnt/hgfs下(每次开机,都要重新挂载)
可以通过mount命令在客户机端挂载nfs服务器端的共享资源。mount命令的一般语法格式是:
mount nfssrvname:/Share-Directory /mnt-Point
nfssrvname表示nfs服务器主机名,也可用IP地址,就是Ubuntu的IP地址;
Share-Directory表示nfs服if务器导出的共享资源目录,必须用 绝对路径,与nfssrvname用”:”号隔开;
mnt-Point表示共享资源将挂载到客户端主机上的位置,在挂载前一定要确保挂载目录已经存在。
可以在Ubuntu上通过NFS挂载自己,验证一下NFS可用:如下命令:
sudo mount -t nfs -o nolock,vers=3 192.168.159.133:/home/bruce/nfsdoc /mnt/hgfs
ls /mnt
查看:showmount -e

<7.>卸载共享资源
在使用完nfs服务器共享资源后,建议即刻卸载nfs文件系统。卸载命令umount一般语法格式是:
umount /mnt-Point
其中mnt-Point表示共享资源在客户端的挂载点。
注意:当有用户在使用某个已加装的共享目录上的文件时(在挂载点下要退出才能卸载),则不能卸载在文件系统。如果用户确认无误,可使用"umount -f"命令强行卸载共享的目录。

<8.>开发板获取IP地址
(前面几步都是在Ubuntu 上设置,下面在开发板上进行设置)
1.QEMU运行时,Ubuntu是Host即宿主机,QEMU给它分配的IP是192.168.159.133。QEMU模拟的imx6ull板子是Guest即客户机,它会自动获取IP,也可以自己设置。
2.Guest可以通过192.168.159.133访问Host,Host不能访问Guest。
3.Guest中可以使用ifconfig命令查看IP,如果没有IP,可以如下设置:
[root@qemu_imx6ul:~]# ifconfig eth0 10.0.2.15
<9>挂载主机nfs目录 (每次开机,都要重新挂载)
QEMU模拟的imx6ull开发板,可以去访问192.168.159.133,比如使用NFS挂载:
[root@qemu_imx6ul:~]# mount -t nfs -o nolock,vers=3 192.168.159.133:/home/bruce/nfsdoc /mnt
如果一切正常,在开发板上就可以通过/mnt目录访问Ubuntu的/home/bruce/nfsdoc目录了。
至此,可以将在Ubuntu上使用arm-linux-gnueabihf-gcc编译的文件传到QEMU开发板中执行了。

3、嵌入式Linux装机步骤(配置上位机)

1、在VMware虚拟机上安装号Ubuntu后,安装VMware Tools
Ubuntu 16.04 下安装VMware Tools(三行命令搞定,亲测好使):
第一行命令:sudo apt-get upgrate
第二行命令:sudo apt-get install open-vm-tools-desktop -y
第三行命令:sudo reboot

2、在Ubuntu上安装 SSH,SSH连接-SSH服务安装与开机自动启动
sudo apt-get install openssh-client
sudo apt-get install openssh-server
下开启SSH服务
sudo dpkg-reconfigure openssh-server

然后使用FileZilla,进行和虚拟机的文件传输。理由和PuTTY用汉化版一样——无需设置直接UTF-8编码,中文名文件上传树莓派不乱码。
官网下载: http://filezilla-project.org/download.php?type=client

3、 使用 GIT 下载源码
下载到 Windows 中,再用 FileZilla 上传到 Ubuntu;也可以在 Ubuntu 下用 GIT 直接下载。
在 Windows 下启动“Git bash”后执行以下命令:
$ git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git
在 Ubuntu 下打开终端后,可以直接执行上述命令。
下载成功后,将会得到一个名为“01_all_series_quickstart”的目录,里面含有源码。

4、 使用 repo 下载内核及工具链等
我们使用 repo 管理多个 GIT 仓库,里面含有工具键、u-boot、内核、Buildroot 等。使用 repo 时,会把这些所有内容都一起下载下来。
不同开发板的 repo 地址不一样,下面分开介绍,请根据你的开发板阅读对应内容。

4.1、只属于IMX6ULL的开发板 
  1. 配置 repo
    下载repo工具前需要设置git的邮箱和用户名,git邮箱和用户名请根据个人情况进行配置。
    book@100ask:~$ git config --global user.email "[email protected]"
    book@100ask:~$ git config --global user.name "100ask"
    注意: 请先配置git邮箱和用户名,否则会导致下载失败(如下为参考示例图)。
    4.2、 下载源码
    通过repo管理多个git仓库中的源码,可以及时更新最新代码,以方便开发者学习使用。
    对于不同版本的IMX6ULL开发板,要执行不同的命令下载源码。
    (1) IMX6ULL全功能版
    执行以下4条命令,为方便大家复制,第3条是很长的命令,使用了很小的字体:
    book@100ask:~$ git clone https://e.coding.net/codebug8/repo.git
    book@100ask:~$ mkdir -p 100ask_imx6ull-sdk && cd 100ask_imx6ull-sdk
    book@100ask:~/100ask_imx6ull-sdk$ ../repo/repo init -u https://e.coding.net/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask_imx6ull_linux4.9.88_release.xml --no-repo-verify
    book@100ask:~/100ask_imx6ull-sdk$ ../repo/repo sync -j4
    注意:下载成功后,可以看到名为Linux-4.9.88的目录,可以在Ubuntu压缩它,再传回Windows。
    在Windows下解压后,用source insight建立工程,这样就可以很方便地阅读源码了。

1、配置交叉编译工具链
1、在友善之臂官方网站http://www.arm9.net/download.asp下载arm-linux-gcc4.4.3

2、对新版本arm-linux-gcc-4.4.3进行解压。
[root@localhost ~]# tar xzvf arm-linux-gcc-4.3.2.tar.gz  -C /
根据这个压缩包里的文件名称,默认解压在/usr/local/arm/4.4.3/bin目录下。
3、将bin文件通过这个路径(解压后的位置)/usr/local/arm/4.4.3/bin添加到配置文件中,即将arm-linux-gcc添加到环境变量中。(配置文件有好几种,在下方有介绍)
打开设置文件: [root@localhost opt]# vi /etc/profile
在文件末尾添加:export PATH=$PATH:/usr/local/arm/4.4.3/bin
保存退出
4、使新的环境变量立即生效,不用重启电脑
[root@localhost opt]#  source /etc/profile
[root@localhost opt]#
5、检查是否将路径加入到PATH:
[root@localhost opt]# echo $PATH
显示的内容中有/usr/local/arm/4.4.3/bin,说明已经将交叉编译器的路径加入PATH。至此,交叉编译环境安装完成。
6、测试是否安装成功
首先,执行find命令查询一下arm-linux-gcc的位置
[root@localhost ~]# find / -name arm-linux-gcc
/opt/arm/toolschain/4.4.3/bin/arm-linux-gcc
[root@localhost ~]#
可以看到arm-linux-gcc的位置与环境变量中设定的路径一致,接下来查询arm-linux-gcc的版本
[root@localhost bin]# arm-linux-gcc -v
这句命令后,经常会出现问题:
/usr/local/arm/4.3.2/bin/arm-linux-gcc: 行 3: /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: 没有那个文件或目录
解决办法是需要安装32位或64位的lib**z1
[root@localhost bin]#sudo apt-get install lib64z1

/etc/bashrc(或/etc/bash.bashrc),用户目录下.bashrc有什么区别?
/etc/bashrc是针对整个系统所有用户的, /etc/bashrc修改了以后要重启系统才生效,
用户目录下.bashrc是针对特定用户的, 而用户目录下.bashrc修改了以后重新登录就生效

/etc/profile与/etc/bashrc的区别?
/etc/profile:
主要用来设置一些系统变量,比如JAVA_HOME等等,
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:
主要用来保存一些bash的设置.
为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile:
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该
文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc:
该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.

ARCH
即architecture,就是选择编译哪一种cpu architecture,也就是编译arch/目录下的哪一个子目录。如指定make ARCH=arm就是编译arch/arm下的代码。如果不指定,make将使用本机(用什么机器编译就是什么)的cpu作为缺省ARCH.注意:arch/arm下不但有arm体系架构特有的代码,还有arm特有的kconfig,也就是配置选项,所以在make menuconfig,make xxxx_defconfig的时候也必须指定ARCH=arm。

CROSS_COMPILE
即交叉编译器的前缀(prefix),也就是选择将代码编译成目标cpu的指令的工具,如指定make CROSS_COMPILE=arm-none-linux-gnueabi-就是使用arm-none-linux-gnueabi-gcc, arm-none-linux-gnueabi-ld等工具将代码编译成arm的可执行指令。如果不指定CROSS_COMPILE参数,make时将认为prefix为空,即使用gcc来编译。这里cross_compile的设置,是假定所用的交叉工具链的gcc程序名称为arm-linux-gcc。如果实际使用的gcc名称是some-thing-else-gcc,则这里照葫芦画瓢填some-thing-else-即可。总之,要省去名称中最后的gcc那3个字母。

5.1、IMX6ULL开发板修改用户配置文件
交叉编译工具链用来在Ubuntu主机上编译应用程序,
而这些应用程序是在ARM等其他平台上运行。
设置交叉编译工具主要是设置PATH, ARCH和CROSS_COMPILE三个环境变量,下面介绍具体设置方法。
设置这3个环境变量有多种方法,任意选择其中一种方法即可,建议使用“永久生效”的方法。录制视频时我会使用多种开发板,所以在视频里我总是使用“临时生效”的方法。
5.1.1. 永久生效
如需永久修改,请修改用户配置文件。
注意:如果不会使用vim命令,可以使用图形化的编辑工具,执行:
gedit ~/.bashrc
vim ~/.bashrc
IMX6ULL全功能版,在文末添加或修改,加上下面几行(第 3 行很长,这里使用小字体方便大家复制)添加成功后输入 :wq
保存并退出 vim 返回:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
设置完毕后,要执行 source ~/.bashrc 命令使其生效,这条命令是加载这些设置的环境变量。

5.1.2. 临时生效
也可以手工执行“export”命令设置环境变量,该设置只对当前终端有效(另开一个终端需要再次设置)。
IMX6ULL全功能版,执行以下3个命令,第3个命令很长,这里使用小字体方便大家复制:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
设置完毕后,要执行 source ~/.bashrc 命令使其生效,这条命令是加载这些设置的环境变量。

5.2. 测试交叉编译工具链
(1) 测试环境变量:
book@100ask:~$ echo $ARCH
arm
book@100ask:~$ echo $CROSS_COMPILE
arm-linux-gnueabihf-
(2) 测试交叉编译器:
执行以下命令,结果见后图:
book@100ask:~$ arm-linux-gnueabihf-gcc -v

6、 使用 Source Insight 阅读 Linux 内核源码
在后面开发驱动程序时,驱动程序中用到的函数都是来自内核,所以可以先在 Windows 下创建内核的
Source Insight 工程。
如果你不想学习驱动开发,那么可以不创建内核的工程。但是以后学习大型 APP 时,也可以使用 Source
Insight 来阅读、编写代码,可以借鉴本节讲解的 Source Insight 用法。

4、嵌入式Linux装机步骤(配置开发板)

一、下载内核源码
git config --global user.email "[email protected]"
git config --global user.name "100ask"
git clone https://e.coding.net/codebug8/repo.git
mkdir -p 100ask_imx6ull-sdk && cd 100ask_imx6ull-sdk
../repo/repo init -u https://e.coding.net/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask_imx6ull_linux4.9.88_release.xml --no-repo-verify
../repo/repo sync -j4

二、编译内核
book@100ask:~/100ask_imx6ull-sdk$ cd Linux-4.9.88
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make mrproper
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make 100ask_imx6ull_defconfig
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make zImage -j4
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make dtbs
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ cp arch/arm/boot/zImage ~/nfs_rootfs
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs
三、编译内核模块
book@book-virtual-machine:~$ cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ sudo make ARCH=arm INSTALL_MOD_PATH=/home/bruce/nfs_rootfs modules_install
命令是把模块安装到 /home/bruce/nfs_rootfs 目 录 下 备 用 , 会 得 到/home/bruce/nfs_rootfs/lib/modules目录
四、安装内核和模块到开发板上
假设:执行上述命令后,在Ubuntu的/home/book/nfs_rootfs目录下已经有了zImage或uImage、dtb文件,并且有lib/modules子目录(里面含有各种模块)。
下面,要把这些文件复制到开发板上。

如果你使用的是VMware NAT方式,假设Windows IP为192.168.1.100,在开发板启动进入Linux后,输入root登录,然后执行以下命令(注意:必须指定port为2049、mountport为9999):
mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.1.100:/home/book/nfs_rootfs /mnt
cp /mnt/zImage /boot 或 cp /mnt/uImage /boot
cp /mnt/*.dtb /boot
cp /mnt/lib/modules /lib -rfd
sync
reboot

如果你使用的是VMware桥接方式,假设Ubuntu IP为192.168.1.100,在开发板上执行以下命令:
mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book/nfs_rootfs /mnt
cp /mnt/zImage /boot 或 cp /mnt/uImage /boot
cp /mnt/*.dtb /boot
cp /mnt/lib/modules /lib -rfd
sync
reboot
最后重启开发板,它就使用新的zImage或uImage、dtb、模块了。

五、驱动编译及运行
****************************在Ubuntu上编译
设置好工具链、配置、编译过内核之后,在01_hello_drv目录下执行make命令即可编译驱动程序及测试程序

****************************在开发板上运行
把驱动和测试程序复制到开发板上:(就是复制到板子的root文件下)
[root@board:~]# cp /mnt/hello_drv.ko ./
[root@board:~]# cp /mnt/hello_drv_test ./
然后安装驱动程序并验证是否成功:
[root@board:~]# insmod hello_drv.ko
执行“lsmod”可以看到hello_drv驱动

执行“cat /proc/devices”可以看到主设备号

执行“ls -l /dev/hello”,可以发现有这个设备节点,并且它的主设备号跟上一样

最后执行测试程序:
./hello_drv_test -w www.100ask.net
./hello_drv_test -r

如果不想看到驱动调试信息,可以先执行以下命令用来关闭内核的打印信息:
echo "1 4 1 7" > /proc/sys/kernel/printk

至此,一个驱动体验完毕。

标签:git,100ask,开发板,repo,book,Linux,imx6ull,QEMU,arm
From: https://www.cnblogs.com/Bruce-blog/p/16949498.html

相关文章

  • Linux下BMP图片截图
    Linux下BMP图片截图    MP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Wind......
  • [Linux]-----进程信号
    文章目录​​前言​​​​一、什么是信号​​​​我们是如何得知这些信号呢?​​​​我们知道对应的信号产生时,要做什么呢?​​​​二、进程信号​​​​前台进程和后台进程​......
  • LINUX安装openssl
    openssl官网下载​​https://www.openssl.org/source/old/​​1、解压openssl包:tar-xzfopenssl-1.1.1n.tar.gz2、得到openssl-1.1.1n目录,然后进入openssl-1.1.1n目录中......
  • Linux下查看电脑硬件及系统信息
    一、查看CPU信息1.查看CPU的统计信息:       lscpu2.查看CPU的详细信息:       cat/proc/cpuinfo二、内存信息1.查看内存使用情况:       ......
  • SELinux相关包
    https://github.com/SELinuxProject/selinux/wiki#SELinuxUserspaceThisistheupstreamrepositoryforthe SecurityEnhancedLinux(SELinux) userlandlibrarie......
  • 07Linux的那点事
    使用记录【闲】磁盘占用内存占用持续记录中.........
  • 在linux虚拟机中运行python
    在linux虚拟机中运行python方法1:运用python指令运行一般情况linux系统会自动安装python所以在终端中输入python3就自动进入python的交互模式输入ctrl+z退出交互模式......
  • Linux基础-学会使用命令帮助
    概述使用whatis使用man查看命令程序路径which总结参考资料概述Linux命令及其参数繁多,大多数人都是无法记住全部功能和具体参数意思的。在linux终端,面对命令......
  • 【Linux】/proc/stat解析
    一.概述1.1CPU时间cpu指标含义user用户态时间nice用户态时间(低优先级,nice>0)system内核态时间idle空闲时间iowaitI/O等待时间irq硬中断softirq 软中断iowait......
  • 太神奇,Linux中的虚拟网络
    随着平台虚拟化的迅速发展,对公司生态系统的其他部分进行虚拟化也并不稀奇。最近的之一就是虚拟化网络。平台虚拟化的早期实现创建了虚拟NICs,但是今天,网络中更大的部分......