利用busybox制作根文件系统---参考朱有鹏嵌入式视屏(下)

简介: 利用busybox制作根文件系统---参考朱有鹏嵌入式视屏(下)

3、再次开机,可以看到输入如下

此时在Ubuntu中可以看到proc目录是空的,但是在SecureCRT中看到proc目录不是空的。

注意:执行【mkdir proc sys tmp var dev】之后,重新开机,

(1)在SecureCRT中可以看到proc与sys目录中直接就有内容,但是在Ubuntu底下看是没有任何内容的

(2)新创建的/dev目录下本来也是没有东西的,但是在/etc/init.d/rcS中加了mdev相关的代码之后,就是下面截图的代码,再在SecureCRT中查看/dev,可以看到/dev目录下有很多东西。

 

4、在/root/porting_x210/rootfs/rootfs/etc目录下,执行【mkdir sysconfig】,然后进入sysconfig,执行【vim HOSTNAME】,在打开的文本中键入主机名(yum9193),保存退出。

问什么要在这个路径下新建这个文件?因为etc/init.d/rcS文件中

 

六、Profile

0、在etc目录下【mkdir sysconfig】,进入sysconfig之后,再【vim HOSTNAME】,键入yum9193,保存退出。

1、之前添加了/bin/hostname 在/etc/sysconfig/HOSTNAME 文件中定义了一个 hostname

(aston210),实际效果是:命令行下 hostname 命令查到的 host 名字确实是 yum9193。但是问题就是命令行的提示符是没有显示的。

2、这个问题的解决就要靠 profile 文件。将朱老师提供的 profile 文件放入/etc/目录下即可。

3添加了之后的实验现象:命令行提示符前面显示: [@yum9193 ]#

 

七、用户登陆及密码设置

打开inittab文件可以看到

1、之前 intttab 中有一个配置项 ::askfirst:-/bin/sh,这个配置项作用就是当系统启动后就去执行/bin/sh,执行这个就会出现命令行。因此我们这样的安排就会直接进入命令行而不会出现登录界面。

2、我们要出现登录界面,就不能直接执行/bin/sh,而应该执行一个负责出现登录界面并且负责管理用户名和密码的一个程序, busybox 中也集成了这个程序(就是/bin/login 和

/sbin/gettty),因此我们要在 inittab 中用/bin/login 或者/sbin/getty 去替代/bin/sh。

3、修改inittab文件

(1)注释掉【::askfirst:-/bin/sh】

在这一行的下面添加【::sysinit:/bin/login】

实验结果:其启动开发板,可以发现确实出现了用户名、密码登陆界面,但是因为我们没有设置账户名密码,所以无法登陆。

4、修改inittab文件设置登录名密码

(1)linux 系统中用来描述用户名和密码的文件是 passwd 和 shadow 文件,这两个文件都在etc 目录下。 passwd 文件中存储的是用户的密码设置, shadow 文件中存储的是加密后的密码。

vim /etc/passwd,截图如下

(2)我们直接复制 ubuntu 系统中的/etc/passwd 和/etc/shadow 文件到当前制作的 rootfs/etc 目录下,然后再做修改即可。

具体操作,

(I)在/root/porting_x210/rootfs/rootfs/etc目录下,vim passwd,只保留第一行

(II)退到/root/porting_x210/rootfs/rootfs/目录下,【mkdir root】,创建root目录是为了,将来执行passwd的时候可以调到root目录

(III)/root/porting_x210/rootfs/rootfs/etc目录下,【vim passwd】,修改成这样

(IV)/root/porting_x210/rootfs/rootfs/etc目录下,【vim shadown】,修改成这样

(V)/root/porting_x210/rootfs/rootfs/etc目录下,【vim inittab】,修改成这样

注意:【s3c2410_serial2::respawn:/sbin/getty –L s2c2410_serial2 115200 vt100】,这里是修改成了getty的格式【实际项目中多用getty的格式,而不是/bin/login格式】。

 

做了上面的修改之后,是没有密码的,直接输入登录名root,然后没有密码就可以进入/root目录下。

(VI)设置新密码

可以在etc/shadow中看到该文件中已经有内容了

再次重启,可以看到要输入登录名,同时要输入密码,才可以进来

PS:我这里登陆名是root,密码也是root。

 

八、动态库连接

(一)静态编译链接Helloworld程序

1、任务:自己写一个 helloworld 程序,然后交叉编译连接,然后丢到开发板根文件系统中,开机后去运行。

(1)进入/root/porting_x210/rootfs/rootfs/root,【vim hello.c】,写一个最简单的helloworld程序。

为什么要建立在root路径下,因为开机就进入root。

(2))C 程序如果使用 gcc 来编译则可以在主机 ubuntu 中运行,但是不能在开发板运行;要在开发板运行需要用 arm-linux-gcc 来交叉编译,但是这时候就不能在主机 ubuntu 中运行了。我们可以用 file xx 命令来查看一个 elf 可执行程序是哪个架构的。

在Ubuntu中用【gcc hello.c –o hello】,编译之后生成hello,【file hello】可以看到

这个文件是Intel 80386架构的,所以不能在arm架构上运行。

我们启动开发板,尝试在开发板上运行hello可执行程序,可以看到报错

C语言不能跨平台运行。

(3)静态链接: arm-linux-gcc hello.c -o hello_satic -static

(4)实验结果:静态编译连接后生成的 hello_satic 已经可以成功运行。

PS:关于动态文件与静态文件,文件大小的问题

静态文件明显比动态文件大很多,这是因为静态文件将程序中所包含的头文件等包含进来了,所以整体较大,而动态文件不需要包含所引用的文件,在需要的时候去动态调用即可。

 

(二)动态编译连接 helloworld 程序并执行

(1)动态链接: arm-linux-gcc hello.c -o hello_dynamic

(2)实验结果: -sh: ./hello_dynamic: not found 运行时提示找不到程序。

(3)错误分析:动态连接的 hello 程序中调用到了 printf 函数,而 printf 函数在动态连接时要在运行时环境(开发板的 rootfs)中去寻找对应的库文件(开发板 rootfs 中部署的动态链接库中包含了 printf 函数的那个库文件)。如果找到了则 printf 函数就会被成功解析,然后hello_dynamic 程序就会被执行;如果找不到则程序就不能被执行,命令行会提示错误信息-sh: ./hello_dynamic: not found

(4)解决方案:将 arm-linux-gcc 的动态链接库文件复制到开发板 rootfs 的/lib 目录下即可解决。

arm-linux-gcc动态库文件路径:

/urs/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib目录下所有的.so文件均为动态文件。

将上面路径上的动态文件复制到/root/porting_x210/rootfs/rootfs/lib/

到/urs/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/目录下,执行复制命令: cp lib/*so* /root/porting_x210/rootfs/rootfs/lib/ -rdf。此处加rdf参数是为了复制符号连接。

此时再去执行./hello_dynamic发现可以运行了。

(5)使用 strip 工具去掉库中符号信息

在/root/porting_x210/rootfs/rootfs/lib/目录下,执行arm-Linux-strip *so*

发现文件大小减少了0.8M

 

九、开机自启动

1、开机自启动的实现原理就是在开机会自动执行的脚本 rcS 中添加上执行某个程序的语句

代码即可。

例如,这里实现开机自动去执行 hello_dynamic

只需要在etc/init.d/rcS文件中最后一行代码加上 ./hello_dynamic

 

十、前台运行与后台运行

1、在/root目录下执行【vim /etc/inittab】,注释登陆的那一行代码,添加开机直接进入命令行的代码。

2、在/root目录下新建一个test.c文件

3、前台运行与后台运行的概念

(1)程序运行时占用了当前的控制台,因此这个程序不结束我们都无法使用控制台,这就叫前

台运行。默认执行程序就是前台运行的。

(2)后台运行就是让这个程序运行,并且同时让出控制台。这时候运行的程序还能照常运行而

且还能够不影响当前控制台的使用。

(3)让一个程序后台运行的方法就是 ./xxx &【在执行程序后面加上 & 符号】

 

十一、将文件夹格式的根文件系统制作成镜像文件

1、设置 bootargs 为 nfs 启动方式,然后从主机 ubuntu 中做好的文件夹格式的 rootfs 去启动,然后看启动效果,作为将来的参照物。

2、动手制作 ext2 格式的镜像

(1)在Ubuntu中,进入/root/porting/rootfs,执行【mkdir ext2_rootfs】,创建ext2_rootfs文件夹作为挂载点,在/root/porting/rootfs目录下执行下面指令。

 

dd if=/dev/zero of=rootfs.ext2 bs=1024 count=10240

 

losetup /dev/loop1 rootfs.ext2

 

mke2fs -m 0 /dev/loop1 10240

 

mount -t ext2 /dev/loop1 ./ext2_rootfs/

执行完上面的操作之后,进入ext2_rootfs目录,ls,可以看到

说明挂载成功。

 

(2)向./rootfs 中复制内容,在/root/porting_x210/rootfs/ext2_rootfs目录下执行

【cp ../rootfs/* ./ -rf】

(3)卸载,退到/root/porting_x210/rootfs目录,执行

umount /dev/loop1

 

losetup -d /dev/loop1

(4)完成后得到的 rootfs.ext2 就是我们做好的 rootfs 镜像。拿去烧录即可。

 

3、烧录镜像并设置合适的 bootargs

(0)将Ubuntu中制作好的rootfs.ext2镜像文件拷贝到WinShare中,将镜像文件复制到fastboot(D:fastboot顶层目录)目录中。

(1)使用 fastboot 烧录制作好的 rootfs.ext2 到开发板 inand 中

fastboot flash system rootfs.ext2

烧录完成后重启系统

(2)设置 bootargs 为: set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw

init=/linuxrc rootfstype=ext2

(3)启动后发现现象和之前 nfs 方式启动挂载 rootfs 后一样的,至此 rootfs 制作实验圆满完成。

set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext2

 

制作好的根文件源文件已上传,可下载。https://download.csdn.net/download/weixin_42445727/10686771

相关文章
|
机器人 Docker 容器
【傻妞+青龙+MairARK安装教程】
【傻妞+青龙+MairARK安装教程】
922 0
|
8月前
|
人工智能 安全 物联网
解析 OpenHarmony、HarmonyOS 与 HarmonyOS Next:优雅草卓伊凡的观点
解析 OpenHarmony、HarmonyOS 与 HarmonyOS Next:优雅草卓伊凡的观点
343 4
解析 OpenHarmony、HarmonyOS 与 HarmonyOS Next:优雅草卓伊凡的观点
|
存储 安全 虚拟化
虚拟化技术:实现资源高效利用和灵活管理的利器
虚拟化技术作为实现资源高效利用和灵活管理的重要手段,在数字化时代背景下,正逐步改变传统IT架构模式。本文概述了虚拟化技术的概念、原理及其在数据中心管理、云计算平台、企业信息化建设、科研教育及医疗行业的应用,并探讨了其面临的挑战与未来发展趋势。
662 3
|
存储 缓存 网络协议
深入理解Linux网络——内核是如何发送网络包的
一、相关实际问题 1. 查看内核发送数据消耗的CPU时应该看sy还是si 2. 在服务器上查看/proc/softirqs,为什么NET_RX要比NET_TX大得多 3. 发送网络数据的时候都涉及那些内存拷贝操作 4. 零拷贝到底是怎么回事 5. 为什么Kafka的网络性能很突出
|
Linux 数据安全/隐私保护
进程间通信之共享内存及其shm函数的使用【Linux】
进程间通信之共享内存及其shm函数的使用【Linux】
771 2
|
安全 Java API
ELK运维文档
ELK运维文档
239 2
|
测试技术
三种等待方式(‌线程等待、‌隐式等待、‌显式等待)
三种等待方式(‌线程等待、‌隐式等待、‌显式等待)
668 4
|
Linux Shell API
深入探索 `dbus-run-session`:Linux下的D-Bus会话管理工具
`dbus-run-session`是Linux下管理D-Bus会话的工具,它确保桌面环境和应用间的通信。当登录图形桌面时,D-Bus会话自动创建,支持应用和服务间的消息传递。通常不需要直接使用,但在特定情况下,可以通过`dbus-run-session bash`启动shell会话运行D-Bus相关命令。注意避免重复启动会话,勿以root运行,确保环境变量正确,可使用`--verbose`选项进行调试。了解其工作原理有助于解决D-Bus相关问题。
|
Linux 数据处理
Linux命令中的tic:深入了解与高效应用
`tic`是Linux中用于处理 Tektronix 4015 终端文本解释的命令,源于troff文本格式化系统。尽管现代系统不再常见该终端,`tic`仍用于特定数据处理,尤其是与troff配合,将troff输出转换为特定格式。使用时注意兼容性、输入格式和参数调整,如`-a`设定宽高比。通过`man tic`可获取更多详情。示例:`troff document.tr | tic`。了解这些能更好地处理特定文本格式任务。
|
存储 运维 监控
八大生产故障 排查思路(通用版)
八大生产故障 排查思路(通用版)