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