嵌入式Linux系统移植和裁剪_10_环境搭建和测试(九)

嵌入式Linux系统移植和裁剪_10_环境搭建和测试(九),第1张

这段时间新冠肺炎疫情又波及了好几个省,下个星期又要在家办公了,哪都不能去了。不过话说回来,在城里面本来也就没什么好玩的,也没什么地方好去的。

接着上一次的内容,要从网络加载内核和设备树,以及挂载网络根文件系统,需要在UBoot里面设置 bootcmd 和 bootargs 两个环境变量如下:

set bootcmd 'tftp 41000000 uImagetftp 42000000 exynos4412-fs4412.dtbbootm 41000000 - 42000000'

set bootargs 'console=ttySAC2,115200 root=/dev/nfs rw nfsroot=192.168.1.8:/samba/nfs/rootfs,proto=tcp clk_ignore_unused /init=/linuxrc ip=192.168.1.100:192.168.1.8:192.168.1.1:255.255.255.0'

这两个参数需要根据自己的实际情况加以调整,主要是nfs和ip的一些设置。

bootcmd 是内核启动命令,其表示使用tftp协议,从TFTP文件夹下加载uImage到41000000的内存地址。然后从TFTP文件夹下加载exynos4412-fs4412.dtb到42000000的内存地址,然后执行bootm命令,从41000000的地址启动内核。

bootargs 是内核启动的参数,比如设置控制台的串口参数,指定根文件系统(这里我们使用nfs从网络上挂载根文件系统,注意协议用tcp,如果用udp的话,很可能会因为丢包而导致挂载失败)

最后需要saveenv保存设置。

就绪之后,板子重新上电,不要回车打断UBoot,让其引导Linux内核启动,结果内核启动失败。

后来在群里问了老师,他们发了内核镜像和设备树过来,让我用他们编译的试试,我一试,还真能用。本来我还怀疑是不是根文件系统的问题,后来老师让我看看设备树,说是要注释掉下面这一段。

但是我一看,本来就是注释掉的啊。。。然后就无解了,我以为可能还是根文件系统的问题,群里问老师也没有再回,就搁置了两天,这也算是中间的一个小插曲吧。然后我刚刚又在群里问,另一个老师说这一段现在不需要注释了,就是要加进来。然后我就把注释去掉了,重新编译后,果然就可以启动了。

可以看到根文件系统已经挂载成功了,那这样我们的环境搭建部分就测试OK了,我们得到了一份可以在4412板子上运行的Linux内核源码,UBoot源码和根文件系统。

所以呢,感觉培训机构的资料管理挺乱的,各个老师之间的信息不同步,资料也不同步,视频可能是很老的,配套资料也过时了,你不问还不知道,这可能也是他们需要建立大量的群来答疑的原因吧,总之,体验不佳。当然他们觉得这些步骤你不需要做啊,直接用现成的虚拟机镜像就可以了嘛,编译工具链,各种依赖库,环境变量那些都给你搞好了,干嘛要自己搞。他们这种想法就只适合那些初学驱动的人,确实,如果你只想学习驱动,那确实用他们准备好的虚拟机镜像就可以了。但是如果我要换一个芯片,环境还得自己搭,那就不好使了,或者说我自己已经有虚拟机了,再搞一个镜像其实显得很累赘。

好了,今天就到这里了,后面就开始UBoot的移植学习。

做一个嵌入式Linux系统究竟要做哪些工作

做一个嵌入式Linux系统究竟需要做哪些工作?也就是本文究竟要讲述哪些内容?我先介绍一个脉络,可以做为我们后面工作的一个总的提纲:

第一步、建立交叉编译环境

没有交叉开发经验的读者,可能一时很难接受这个概念。首先,要明白两个概念:一般我们工作的机器,称为开发机、主机;我们制作好的系统将要放到某台机器,如手机或另一台PC机,这台机我们称为目标主机。

我们一般开发机上已经有一套开发工具,我们称之为原生开发套件,我们一般就是用它们 来写程序,那么,那什么又是交叉编译环境呢?其实一点也不神秘,也就是在开发机上再安装一套开发工具,这套开发工具编译出来的程序,如内核、系统工作或者我们自己的程序,是放在目标主机上运行的。

那么或许有初学者会问,直接用原生开发工具为目标主机编译程序不就完了?至少我当 初是这么想的。一般来说,我们的开发机都是X86平台,原生开发套件开发的工具,也针对 X86平台,而我们的目标主机可能是PowerPC、IXP、MIPS……所以,我们的交叉编译环境是针对某一类具体平台的。

一般来讲,交叉开发环境需要二进制工具程序、编译器、C链接库,嵌入式开发常用的这三类软件是:

Binutils

Gcc

uClibc

当然,GNU包含的工具套件不仅于此,你还要以根据实际需要,进行选择

第二步、编译内核

开发工具是针对某一类硬件平台,内核同样也是。这一步,我们需要用第一步中建立的工具,对内核进行编译,对于有内核编译经验的人来说,这是非常简单的;

第三步、建立根文件系统

也就是建立我们平常看到的bin、dev、proc……这一大堆目录,以及一些必备 的文件;另外,我们还需要为我们的目标系统安装一些常用的工具软件,如 ls、ifconfig……当然,一个办法是找到这些工具的源代码,用第一步建立的交叉编译工具来编译,但是这些软件一是数量多,二是某些体积较大,不适合嵌入式系统,这一步,我们一般都是用busybox来完成的,包括系统引导软件init;

最后,我们为系统还需要建立初始化的引导文件,如inittab……

第四步、启动系统

在这一步,我们把建立好的目标、文件、程序、内核及模块全部拷贝到目标机存储器上, 如硬盘。然后为系统安装 bootloader,对于嵌入式系统,有许多引导程序可供我们使用。不过它们许多都有硬件平台的限制。当然,如果你是工作在X86,可以直接用lilo 来引导,事实上,本文就是采用的lilo。

做到这一步,将目标存储设备挂上目标机,如果顺利,就可以启动系统了。

当然,针对某些特别的平台,不能像硬盘这样拷贝了,需要读卡器、烧录……但是基本的方法是相通的!

第五步、优化和个性化系统

通过前四步,我们已经得到了一个可以正常工作的系统。在这一步里,就是发挥你想像的时候了……

本文的工作环境

项目根目录/home/kendo/project ------>我将它指定至PATH:$PRJROOT

子目录及说明

目录 内容

bootloader 目标板的引导加载程序,如lilo等

build-tools 建立交叉编译平台的工具源码

debug 调试工具及所有相关包

doc 项目中用到的所有文档

images 编译好的内核映像,以及根文件系统

kernel 各个版本的Linux内核源码

rootfs 制作好的根文件系统

sysapps 目标板将要用到的系统应用系统,比如thttpd,udhcpd等

tmp 存放临时文件

tools 编译好的跨平台开发工具链以及C链接库

工作的脚本

#!/usr/bin

export PROJECT=skynet

export PRJROOT=/home/${PROJECT}

export TARGET=i386-linux

export PREFIX=${PRJROOT}/tools

export TARGET_PREFIX=${PREFIX}/${TARGET}

exportPATH=${PREFIX}/bin:/bin:/sbin:/usr/bin:/usr/sbin

cd $PRJROOT

1. 更新到最新的软件包

Open up System ->Administration ->Update Manager

Click on Settings

Open the Updates Tab

Set 'Release upgrade' to 'Never'. That makes the option to upgrade to Karmic go away.

Close the settings dialog box.

Click on 'Check' to check for upgraded packages. It will look for packages that are upgraded from the version that is installed on your box.

Choose to install the upgrades. This will take a while on a freshly installed box.

2. 安装代码编辑工具

sudo apt-get install vim-gtk

3. 安装网络工具

TFTP服务器

1.安装TFTP服务器及客户端(tftp-hpa是客户端,tftpd-hpa是服务器端)

sudo apt-get install tftp-hpa tftpd-hpa

2.配制TFTP服务器,编辑/etc/default/tftpd-hpa,修改后的内容如下:

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"

TFTP_DIRECTORY="/tftpboot"

TFTP_ADDRESS="0.0.0.0:69"

TFTP_OPTIONS="-l -c -s"

3.创建TFTP目录并重启TFTP服务

sudo mkdir /tftpboot

sudo chmod 777 /tftpboot

sudo service tftpd-hpa restart

4.测试

$tftp tftp服务器地址

>get 文件名(取文件)

>put 文件名(发送文件)

>quit (退出)

5.U-boot参数

set bootcmd tftpboot $loadkernaddr image_dir/zImage\bootm loadkernaddr

例子:set bootcmd tftpboot c0008000 192.168.1.10:kernel.img\bootm c0008000

NFS服务器

1. 安装NFS服务器

sudo apt-get install nfs-kernel-server

2. 配制/etc/exports

/rootfs *(rw,sync,no_root_squash)

3. 重启NFS服务

sudo /etc/init.d/portmap restart

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

4. 显示NFS共享目录

showmount –e

挂载和卸载NFS目录

sudo mount -t nfs NFS服务器地址:/rootfs /mnt

sudo umount /mnt

5. U-boot参数

setenv bootargs "root=/dev/nfs rw nfsroot=$serverip:$rootpath ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off init=/init console=ttySAC2,115200"

例:

setenv bootargs "root=/dev/nfs rw nfsroot=192.168.1.10:/nfsboot/rootfs ip=192.168.1.199:192.168.1.10:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC1,115200"

SAMBA服务器

1:安装SAMBA服务器及客户端

sudo apt-get install samba

sudo apt-get install smbfs

sudo apt-get install system-config-samba

2:修改配制文件

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bck

sudo vim /etc/samba/smb.conf

只留下[global]

3:打开配制工具

sudo system-config-samba

配制samba用户和共享目录

4:重启SAMBA

sudo /etc/init.d/smbd restart

5:windows下 \\samba服务器地址

SSH

sudo apt-get install openssh-server openssh-client

修改主机名

sudo vim /etc/hostname


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8892496.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存