嵌入式Linux开发环境搭建

2023-11-19

嵌入式Linux开发环境搭建

工欲善其事,必先利其器。嵌入式Linux开发之路的开端,就是搭建开发环境。有了完善的开发环境,后面的学习之路就会方便很多。
开发环境也是一个很浪费时间的过程,环境的搭建也非常多坑,希望大家能够快速搭建好环境,能够专心进入学习状态,不要把精力浪费在开发环境的折腾上面。
环境工具的深入学习,在大家正式走上自主开发之路后,会慢慢接触到。至于现在,最正确的就是对着网上的教程,按部就班,快速搭建好环境。下面正式进入:

1、windows下VMware安装

此为Windows下的虚拟机软件,我们可以将Linux操作系统安装在VMware里,这样我们就可以在一台电脑上同时使用Windows和Linux了。
嵌入式Linux开发的过程需要我们在Windows,Linux,开发板直接来回切换。所有VMware给我们提供了非常方便的工具。
因为是Windows下的工具安装,不会有什么坑,这里就不详述。
在这里插入图片描述

2、Linux操作性同安装

转换VMware后,就该安装Linux操作系统了,我选择的是ubuntu系统,去官网下载一个iso映像文件,参照网上的教程安装就好,这里不会有什么错误和坑,这里不详述。

3、VIM安装

安装好Linux后,这里就正式进入开发环境搭建了。
VIM是Linux环境下一个非常重要的文本编辑工具,刚开始使用肯定不习惯。用熟了会觉得非常好用。
后面的安装均在使用Terminal命令行的情况下安装。
安装命令如下

sudo apt install vim
4、安装SSH服务

SSH是 Secure Shell 的意思。是我们在远程操作Linux系统的重要通道工具。
安装命令如下

sudo apt install openssh-server

查看SSH服务器是否启动

 ps -ef | grep ssh

在这里插入图片描述

安装好后,我们就可以不再切换回WMware的操作界面来操作Linux,而是使用SSH客户端使用命令行在任何地方远程操作Linux了,只需要将WMware中的Linux系统保持运行状态就可以了。
我在Windows下使用SecureRT软件,此软件可以同时链接开发板的串口打印,链接Linux的SSH服务器等,是软件开发人员的重要工具。

在这里插入图片描述

5、搭建TFTP服务器

FTP是用来下载远程文件的最简单网络协议,在嵌入式开发中,由于嵌入式开发板资源有限,不能进行文件编译,因此我们都是将写好都代码在宿主机(Linux虚拟机)上进行调试编译好后生成二进制文件,然后通过ftp或NFS来进行传输到开发板上运行。也就是, 使用虚拟机 Ubuntu来当做服务器,ARM开发板当做客户端,通过get,put等命令操作文件传输。
同时,u-boot支持通过TFTP的方式加载内核,ubuntu上运行TFTP服务器,u-boot向服务器请求其参数指定的文件,主机收到请求后将TFTP传输目录下的相应文件通过网络传输给u-boot。这需要主机具有TFTP环境。
安装命令如下:

sudo apt install tftp-hpa tftpd-hpa

安装好后,我们可以在服务器上专门建立一个名为tftpboot文件夹来给uboot请求内核,以及传输文件。
首先,我们在/home/user/下建立一个名为work的文件夹,作为今后开发工作专用的文件夹。
注意,这里的user是你自己在ubuntu系统下的用户名,也就是登录用的用户名。后面都这样替代。

cd /home/user 	#进入自己的用户目录
mkdir work    	#创建名为work的文件夹
cd work       	#进入work文件夹
mkdir tftpboot	#创建名为tftpboot的文件夹

文件夹准备好后,就可以对tftp服务器做配置,将服务器的默认传输目录指向tftpboot文件夹。

chmod a=rwx tftpboot 	#因为该文件夹需要被开发板操作,因此需要将其授权给所有用户对其操作
sudo vim /etc/default/tftpd-hpa   #通过VIM工具修改tftp服务器的配置文件,需要使用root权限,所以用sudo

文件内容改成如下:

# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="home/user/work/tftpboot"   #注意,这里一定指向正确的完全路径,否则后面启动服务会出错
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s --secure"                                                                                                                                                                   

其中TFTP_DIRECTORY=“home/user/work/tftpboot”,一定要指向正确的完全路径,否则后面启动服务会出错
编辑好后,使用wq保存退出,然后使用下面命令重启服务器:

service tftpd-hpa restart

如果重启失败,会报错,可根据提示命令查看具体错误原因。
重启后,测试服务

cd /work/tftpboot   #进入到/work/tftpboot文件夹
vim b.txt			#在/work/tftpboot文件夹中创建一个名为b.txt的文件,内容随便填,然后退出
cd ../				#退回到/work文件夹下
vim a.txt			#在/work文件夹中创建一个名为a.txt的文件,内容随便填,然后退出
tftp localhost		#使用tftp服务,因为是本地服务,所以服务名为localhost

进入tftp服务后,命令行会变成如下形式,输入操作:

tftp> get b.txt    #此时在/work目录下,获取tftpboot下的b.txt文件
tftp> put a.txt	   #此时在/work目录下,将a.txt推送到tftpboot下
tftp> q			   #退出tftp服务

完成操作后,我们分别在/work文件夹和/work/tftpboot文件夹下使用ls命令,查看,是否都有a.txt文件和b.txt文件,如果有,说明tftp服务器正常工作。

6、搭建NFS服务器

NFS 就是 Network FileSystem 的缩写。NFS可以让你的开发板将NFS 服务器共享出来的文件mount到自己的系统中,使用NFS的远端文件就象是在使用本地文件一样。
使用NFS可以使应用程序的开发变得十分方便, 客户端不需要大容量的存储器,更不需要进行映像文件的烧录和下载,只要mount到服务器端的特定目录下,然后运行该目录下的程序即可观察到结果。
嵌入式项目中常用nfs来挂载文件系统。

 sudo apt install nfs-kernel-server rpcbind

安装好后,配置NFS服务器

sudo vim /etc/exports

打开后文件中只有注释,没有任何实际内容,添加内容如下:

/home/user/work/nfs_root *(rw,sync,no_root_squash)

意思是NFS的共享文件夹为==/home/user/work/nfs_root,注意,请填写完整路径==访问者将获得的权限如下
在这里插入图片描述
配置好后退出,重启服务:

 sudo /etc/init.d/nfs-kernel-server restart

对搭建好的NFS进行测试:

cd /home/user/work/nfs_root	#进入前面建好的共享文件夹
vim test.txt				#创建一个文件
cd /mnt						#进入根文件目录下的mnt文件夹
sudo mkdir rootfs			#创建一个文件夹,作为挂载点
sudo mount -t nfs localhost:/home/user/work/nfs_root /mnt/rootfs #把nfs_root挂在到rootfs上
cd /mnt/rootfs				#进入/mnt/rootfs文件夹
ls							#查看/mnt/rootfs文件夹下的内容,会发现刚才创建的test.txt出现在该文件夹下,说明挂载成功

测试如果成功,可以取消挂载:

cd ../						#退出/mnt/rootfs文件夹,回到/mnt文件夹
sudo umount /mnt/rootfs		#取消挂载
sudo rm -r rootfs			#删除刚才创建的rootfs文件夹
7、搭载samba服务器

因为我们是在windows上开发,然后用Ubuntu编译。因此windwows之间的文件共享是非常重要的。通常有两种方式:samba服务器或者共享文件夹。

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。它可以实现windows和Unix-Like两个平台之间互相分享文档和数据。 Samba服务器的工作原理是:客户端向Samba服务器发起请求,请求访问共享目录,Samba服务器接收请求,查询smb.conf文件,查看共享目录是否存在,以及来访者的访问权限,如果来访者具有相应的权限,则允许客户端访问,最后将访问过程中系统的信息以及采集的用户访问行为信息存放在日志文件中。
安装samba服务器命令:

sudo apt install samba

安装完成后,配置samba服务器:

cd /work						#进入/home/user/work文件夹
mkdir sambashare             	#创建一个sambashare文件夹,作为我们以后共享的文件夹
cd /etc/samba/					#进入/etc/samba文件夹
sudo cp smb.conf smb.cong.bkp   #备份samba配置文件
sudo vim smb.conf 				#编辑samba配置文件

在smb.conf文件的最后添加如下内容:

 [share]
  comment=samba
  path=home/user/work/sambashare   #注意这里填写完整路径
  public=yes
  create mask=0777
  directory mask=0777
  writable=yes
  available=yes
  forceuser=root
  forcegroup=root

== path=home/user/work/sambashare #注意这里填写完整路径==
配置好后,重启samba服务器

 sudo /etc/init.d/smbd restart

如果成功,你在Windows的资源管理器中输入你的Linux系统的IP\:xx.xx.xx.xx,就会看到里面有个share文件夹,点进去,就能看到/home/user/work/sambashare里面的内容。
从windows往里面放文件,在/home/user/work/sambashare中也能看到。

8、交叉编译工具链

因为我们在X86的Windows平台上开发,然后在X86的Linux内编译,最后在ARM的芯片上运行。编译平台和运行平台不同,所以叫交叉编译。

安装build-essential软件包,build-essential作用是提供编译程序必须软件包的列表信息:

 sudo apt install build-essential

安装bison、flex,它们分别是语法、词法分析器:

 sudo apt install bison flex

安装C函数库的man手册,这样就可以通过类似"man read"命令查看函数的作用:

 sudo apt install manpages-dev

安装交叉编译环境arm-linux-gcc

sudo apt install gcc-arm-linux-gnueabihf  #安装ARM GCC,针对嵌入式LINUX的版本,gnueabihf中hf表示支持硬浮点运算的平台使用
sudo apt install g++-arm-linux-gnueabihf  #安装ARM G++,针对嵌入式LINUX的版本,gnueabihf中hf表示支持硬浮点运算的平台使用
9、安装调试工具gdb
sudo apt install gdb
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式Linux开发环境搭建 的相关文章

  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 我应该使用哪个 Linux 发行版作为 Xen 主机? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我为家庭办公室订购了一台服务器 我想用 Xen 对其进行分区 我认为这将使事情保持干净并且更容易维护 我将运行 MySQL PostgreSQL
  • 错误:NVIDIA-SMI 失败,因为无法与 NVIDIA 驱动程序通信

    NVIDIA SMI 抛出此错误 NVIDIA SMI 失败 因为无法与 NVIDIA 通信 司机 确保安装了最新的 NVIDIA 驱动程序并且 跑步 我清除了 NVIDIA 并按照提到的步骤重新安装了它here https askubun
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 为 Linux 安装 R 包时出错

    我试图在 R 3 3 上安装一个名为 rgeos 的包 但是当我输入 install packages rgeos 但它返回给我以下错误 其他包也会发生同样的情况 但不是所有包 gt installing source package rg
  • 如何从 Linux 命令行获取视频文件的分辨率(宽度和高度)?

    我一直在挖掘 mplayer mencoder 和 ffmpeg 文档 但我似乎无法想出anything 我对输出格式不是特别挑剔 因为我可以使用正则表达式将其拉出来 我只是似乎无法首先获取数据 Use ffprobe https ffmp
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • 通过将密码与命令一起传递,使用 powerShell 脚本进行 ssh

    如果我输入 我可以从 PowerShell ssh 到服务器 ssh 用户名 主机 这会提示输入密码 我输入有效的密码 但我试图编写一个脚本 通过 ssh 进入服务器执行一些脚本并返回 所以我必须传递密码和命令我该怎么做 关于 shell
  • 如何记录 ssh 调试信息?

    我需要将 ssh 调试信息的输出写入文件中 这 ssh v email protected cdn cgi l email protection gt result txt ssh v email protected cdn cgi l e
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何

随机推荐

  • 对象的知识点补充

    认识对象 对象 object 是 键值对 的集合 表示属性和值的映射关系 JS中 大括号表示对象 var xiaoming 属性名 键名 key name 小明 age 12 sex 男 hobbies 足球 编程 对象的语法 k和v之间用
  • 进程间通信的方式总结(特点,以及code demo)

    进程间通信 IPC InterProcess Communication 是指在不同进程之间传播或交换信息 一 简单的进程间通信 命令行 父进程通过exec函数创建子进程时可以附加一些数据 环境变量 父进程通过exec函数创建子进程顺便传递
  • MOS管之增强型和耗尽型

    Depletion and enhancement modes In field effect transistors FETs depletion mode and enhancement mode are two major trans
  • 通过路由器端口映射实现外网IP访问内网服务器

    1 确认路由器的公网IP是不是真的公网IP 特别重要 如果不是可以不用看后面的了 通过www ip138 com网站可以查询当前网络的公网IP 再进入路由器控制界面查看wan口IP和公网IP是否相同 如果不同 大概率是私网IP 服务商在公网
  • cookie格式化

    字符串转成字典 使用场景 selenium尝试试用cookie登陆时 Network中cookie是一段字符串 需要转成字典使用 使用split和列表解析式 str thor 8954F43 Id d32def3ffSNw pn adsad
  • 数据结构---二叉查找树(二叉搜索树)

    二叉查找树 特性 插入 删除 待删除节点没有子节点 待删除节点有一个子节点 待删除节点有两个子节点 JAVA实现 缺陷 二叉查找树 二叉排序树 在二叉树的基础上 增加了 如果左子树不为空 则左子树上所有节点的值都小于根节点的值 如果右子树不
  • B站粉丝数显示器,播放数、获赞数失效解决。

    之前在B站看见很多人做B站粉丝数显示器 于是便在网上买了一块ESP8266的开发版回来尝试着折腾一个出来 便在网上搜索适合买回来的开发板和0 96 oled显示器的代码 显示部分的主要代码是在 果果小师弟的博客上找到的 然后自己又找了个可以
  • WORD中字号没有中文编号的解决办法

    今天一同事反映说 WORD中没有像 五号 四号 之类的字号 只有数字字号如 8 72 解决过程如下 一 删除office中normal dot模版文件 不行 二 开始 gt 程序 gt Microsoft Office 工具 gt Mics
  • 参数与超参数

    写在前面 关于训练深度学习模型最难的事情之一是你要处理的参数的数量 无论是从网络本身的层宽 宽度 层数 深度 连接方式 还是损失函数的超参数设计和调试 亦或者是学习率 批样本数量 优化器参数等等 这些大量的参数都会有网络模型最终的有效容限直
  • ftp的主动模式active mode和被动模式 passive mode的配置和区别

    共同点 客户端先发起命令连接 不同点 主动模式 服务端发起数据连接 客户端生成随机数据端口 被动模式 客户端发起数据连接 客户端和服务端都是随机数据端口 客户端与服务器的命令连接 服务器返回命令 PORT 2024 告诉客户端 服务器 用哪
  • SpringData使用ES报错 org.elasticsearch.index.mapper.MapperParsingException: No type specified for field

    原因就像mysql的字段要跟Java基本类型对应一样 ES的字段也要与Java的基本类型相对应 一 而且这个最好新建一个ES索引库 否则可能会有问题 我用Restful操作初始化了一个ES索引库 并增加数据 再用Java操作的时候 Spri
  • 父组件传来的值和子组件自己定义的data的值有什么区别?

    props和data的区别 1 data中的数据是组件内自己的数据 状态 可以随意修改data中的值 2 props的数据是父组件传递过来的数据 是只读的 只能供子组件使用 不能随意修改 下面进行演示 1 首先创建一个父组件HomeView
  • Windows Server 2019下搭建FTP服务器

    在服务器管理器中选择 添加角色和功能 连续点击下一步 跳过开始之前和安装类型界面 在服务器选择界面中 选择从服务器池中选择服务器 默认选中一台服务器 选中web服务复选框 点击下一步 选中FTP服务器复选框 点击安装 安装完毕后 可以在Wi
  • [YOLOv8/YOLOv7/YOLOv5系列算法改进NO.5]改进特征融合网络PANET为BIFPN(更新添加小目标检测层yaml)

    前 言 作为当前先进的深度学习目标检测算法YOLOv5 已经集合了大量的trick 但是在处理一些复杂背景问题的时候 还是容易出现错漏检的问题 此后的系列文章 将重点对YOLOv5的如何改进进行详细的介绍 目的是为了给那些搞科研的同学需要创
  • 从 微信 JS-SDK 认识 JSBridge

    前言 前段时间由于要实现 H5 移动端拉取微信卡包并同步卡包数据的功能 于是在项目中引入了 微信 JS SDK jweixin 1 相关包实现功能 但也由此让我对其产生了好奇心 于是打算好好了解下相关的内容 通过查阅相关资料发现这其实属于
  • [Linux-进程控制] 进程创建&进程终止&进程等待&进程程序替换&简易shell

    Linux 进程控制 进程创建 进程终止 进程等待 进程程序替换 简易shell 进程创建 fork函数回顾 双返回值 为什么要给子进程返回0 给父进程返回子进程的pid 如何理解fork会有两个返回值 调用fork之后 fork常规用法
  • Mac(M1)安装VMware虚拟机及Linux系统

    Mac M1 安装VMware虚拟机及Linux系统 网上大部分版本都是基于Intel芯片的 按照步骤安装后 M1芯片的Mac会报错 以下是M1芯片的Mac安装VMware虚拟机及Linux系统方法 1 安装VMware Fusion ht
  • python中的集合(Set)

    python中的集合 Set 在Python中 集合 Set 是一种无序 无重复元素的数据结构 集合通过花括号 或者使用 set 函数进行创建 与其他容器类型 如列表和字典 不同 集合中的元素是不可变的 不可被修改 且没有固定的顺序 特点
  • linux服务器上tomcat设置路径

    tomcat配置通过域名访问项目 是修改conf server xml里面的配置信息实现 具体如下 1 修改Connector节点的port属性值
  • 嵌入式Linux开发环境搭建

    嵌入式Linux开发环境搭建 工欲善其事 必先利其器 嵌入式Linux开发之路的开端 就是搭建开发环境 有了完善的开发环境 后面的学习之路就会方便很多 开发环境也是一个很浪费时间的过程 环境的搭建也非常多坑 希望大家能够快速搭建好环境 能够