Linux根文件系统的制作--下

Linux根文件系统的制作--下

参考朱有鹏Uboot全集

1、profile文件和用户登录理论

(1)之前添加了/bin/hostname在/etc/sysconfig/HOSTNAME文件中定义一个hostname,实际效果是:命令行下的hostname查到的命令host确实是lhh_210

(2)这个问题解决就要靠profile文件,将提供的profile文件放入/etc/目录即可。

(3)profile文件的工作原理是:profile文件也是被busybox(init进程)自动调用的,所以也是认名字的。

2、如何在自己的根文件系统中设置用户名和登录界面

(1)linux中有一个原则就是用一个小程序来完成一个功能,如果我们产品确实需要很复杂的综合型的功能,我们倾向于使用很多个小程序去完成其中的一个功能。然后我们再将这些小程序,使用条件来按顺序执行。

(2)这种集成很多个小程序来完成一个很大的功能,有很多种技术实现,比如shell脚本,还有一些别的技术:比如Linux中的inittab.

(3)因为我们之前inittab中有一个配置项:-/bin/sh,
这个配置项作用就是当系统启动后就会去执行/bin/sh,执行这个就会出现命令行。因为我们这样的安排是不会出现用户名和登录密码的。

(4)我们要出现登录的界面,就不能直接去执行/bin/sh,而是去执行一个负责出现登录界面的并且负责管理用户名和密码的一个程序。
busybox中也集成了这个程序,(/bin/login和sbin/getty)
因此我们要在inittab中用/bin/login或者/sbin/getty去替代/bin/sh

2.2、添加passwd和shadow文件
(1)为什么用户名和密码的输入不正确?因为我们根本没有为root用户设置密码。
(2)Linux系统中用来描述用户名和密码的文件都是passwd和shadow文件。
这两个都是在/etc目录下面。passwd文件存储的是用户的密码设置,shadow文件中存储的是加密后的密码。

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

(4)/etc/passwd和/etc/shadow修理好后,shadow中默认有一个加密的密码口令,像我的ubuntu中的root用户的密码就是root,因此复制过来后登陆的密码还是root。

2.3、重置密码实践
(1)Ubuntu刚装好的时候默认登陆是用普通用户登录的,默认的root用户是关闭的,普通用户的密码是在装系统的时候设置的。普通用户登录后可以使用su passwd root给root用户设置密码。
设置了密码后root用户才可以登录。

(2)busybox中因为没有普通用户,所以做法是,默认root用户如果加密口令是空的话,则默认无密码直接登录,等我们登录之后还是可以用passwd root给root用户设置密码。

(3)平时我们忘记了自己的操作系统的密码,怎么办?
有一种解决方法就是用其他系统(window PE,系统或者Ubuntu的单用户模式等。。。)来引导启动,启动后挂载到我们的硬盘上,然后找到/etc/shadow文件,去掉密文密码后保存。

3、动态链接库的拷贝

在上面的根文件系统已经制作好的情况下,我们可以使用根文件系统进行文件的操作读写。

3.1、静态编译链接helloworld程序并且执行
(1)任务:自己写一个helloworld程序,然后进行交叉编译链接,然后丢到开发板根文件系统中,开机后去运行。

PS:小问题:
(2)C程序如果使用gcc来编译则可以在主机Ubuntu中运行,但是不能再开发板运行;要在开发板运行需要使用arm-linux-gcc来交叉编译,但是这时候就不能再主机Ubuntu中运行了。

这里我们需要注意的是,开发板需要使用交叉编译工具链来运行。而根文件系统就是他支持的使用平台。

对于上面的一些情况,我们可以使用file xx命令来查看一个elf可执行程序是哪个架构的。

(3)静态连接:arm-linux-gcc hello.c -o hello_static -static
实验结果表明,静态编译的程序可以直接在根文件系统中运行。

因为静态编译是把编译所需要的所有的库文件都编译进来。

(4)使用动态编译的连接的话,helloworld程序并且执行。
4.1/动态连接:arm-linux-gcc hello.c -o hello_dynamic

运行的时候提示找不到文件,其实可执行文件都在那里面,因为在开发板的根文件系统里面没有找到需要支持的编译所需要的库文件。

解决方法:
将arm-linux-gcc的动态连接库文件复制到开发板rootfs的/lib目录下面即可解决。

4、开机自启动与主流的rcS格式介绍

4.1、修改rCS实现开机自启动
(1)开机自启动指的是让一些应用程序能够开机后自动执行。
(2)开机自启动的实现原理就是在开机的自动执行的脚本rcS中添加执行某个程序的语句代码即可。

4.2、前台运行&后台运行
(1)一般的程序运行都是默认是在前台运行的。

(2)让一个程序使用后台运行:./xxx &

4.3、实际中开发使用的rootfs的rcS部分来分析
(1)我们以X210开发板九鼎科技做的rootfs中rcS部分来分析
(2)分析inittab发现:sysinit执行rcS,shutdown时执行rcK。
(3)分析/etc/init.d/rcS和rcK文件发现,rcS和rcK都是去遍历执行/etc/init.d/
目录下的S开头的脚本文件,区别是rcS传参是start,rcK传参是stop。
(4)由此可以分析出来,正式产品中的rcS和rcK都是一个引入,而不是真正干活的。
真正干活的配置脚本是/etc/init.d/S??*。这些文件中肯定有一个判断参数是start还是stop,
然后start时去做一些初始化,stop时做一些清理工作。

5、制作添加了以上功能的根文件系统

制作根文件系统的步奏:
1、制作原始的可以用nfs启动的根文件系统
2、制作一个空的镜像,并绑定到一个文件夹中
3、把可以用nfs启动的根文件系统挂载到镜像绑定的文件夹中
4、卸载挂载的文件夹,这样nfs文件夹里面的内容就到我们的镜像里面去了。

5.2、动手制作ext2格式的镜像
(1)
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/

制作一个空的根文件系统,挂载到一个空的文件夹上面

(2)向./rootfs中复制内容,用cp ../rootfs/* ./ -rf
把我们的所有的文件拷贝到感刚刚制作好的根文件系统的文件夹上面。

(3)umount /dev/loop1
losetup -d /dev/loop1

解除挂载,然后得到一个镜像,里面有我们刚刚制作好的文件系统。

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

你可能感兴趣的:(嵌入式:根文件系统)