根文件系统构建实验及过程详解

来源:互联网 发布:一元云购作弊软件 编辑:程序博客网 时间:2024/05/22 12:05


建立一个新建一个文件夹在里面建立rootfs文件夹,并建立linuxrc文件

一、nfs方式启动自制简易文件夹形式的rootfs

配置内核以支持nfs作为rootfs;在menuconfig中配置支持nfs启动方式

(1)、配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system on NFS选项

Networking support

Networking options

TCP/IP networking

IP: kernel level autoconfiguration

[*] IP: DHCP support

[*] IP: BOOTP support

(2)、配置开启nfs服务

File systems  --->

Network File Systems  --->

<*> NFS client support

[*] NFS client support for NFS version 3                                  [*] NFS client support for the NFSv3 ACL protocol extension

[*] NFS client support for NFS version 4 (EXPERIMENTAL)

[*] NFS client support for NFSv4.1 (DEVELOPER ONLY)

[*] Root file system on NFS

 

 

1.设置nfs启动方式的bootargs

uboot中设置如下启动参数(IP根据实际使用更改)

setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/root/rootfs/rootfs ip=192.168.1.88:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off  init=/linuxrc console=ttySAC2,115200

 

注:(1)nfs方式启动相当于开发板上的内核远程挂载到主机上的rootfs

(2)nfs方式启动不用制作rootfs镜像

(3)nfs方式不适合真正的产品,一般作为产品开发阶段调试使用

 

二、.busybox的移植

1.下载busybox可以去linuxidc等镜像网站,也可以去www.busybox.net官方网站下载。

2.修改Makefile

(1) ARCH = arm

(2) CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin//arm-none-linux-gnueabi-

(3)make menuconfig进行配置

 

Busybox Settings--->

Build Options--->

[*]Build BusyBox as a static binary(no shared libs)

 

Busybox Library Tuning--->

[*]vi-style line editing commands

[*]Fancy shell prompts

Linux Module Utilities--->

[ ]Simplified modutils

[*]insmod

[*]rmmod

[*]lsmod

[*]modprobe

[*]depmod

 

Linux System Utilities--->[*]mdev

[*]Support /etc/mdev.conf

[*]Support subdirs/symlinks

[*]Support regular expressions substitutions when renaming dev

[*]Support command execution at device addition/removal

[*]Support loading of firmwares

 

 

(4)make 然后 make install(需要先设置install的目录到我们做的文件夹rootfs下)

 

三、添加必要的文件及文件夹

1.inittab文件复制到我们制作的rootfs的根目录下的/etc/目录下

了解inittab文件

第一个:#开始的行是注释

第二个:冒号在里面是分隔符,分隔开各个部分。

第三个:inittab内容是以行为单位的,行与行之间没有关联,每行都是一个独立的配置项,每一个配置项表示一个具体的含义。

第四个:每一行的配置项都是由3个冒号分隔开的4个配置值共同确定的。这四个配置值就是id:runlevels:action:process。值得注意得是有些配置值可以空缺,空缺后冒号不能空缺,所以有时候会看到连续2个冒号。

第五个:每一行的配置项中4个配置值中最重要的是actionprocessaction是一个条件/状态,process是一个可被执行的程序的pathname。合起来的意思就是:当满足action的条件时就会执行process这个程序。

注意:理解inittab的关键就是明白“当满足action的条件时就会执行process这个程序。”

 

2.rcS文件到  /etc/init.d/rcS   (开始的改成#!/bin/sh

PATH=xxx

(1)首先从shell脚本的语法角度分析,这一行定义了一个变量PATH,值等于后面的字符 串

(2)后面用export导出了这个PATH,那么PATH就变成了一个环境变量。

(3)PATH这个环境变量是linux系统内部定义的一个环境变量,含义是操作系统去执行程 序时会默认到PATH指定的各个目录下去寻找。如果找不到就认定这个程序不存在,如 果找到了就去执行它。将一个可执行程序的目录导出到PATH,可以让我们不带路径来 执行这个程序。

(4)rcS中为什么要先导出PATH?就是因为我们希望一旦进入命令行下时,PATH环境变 量中就有默认的/bin /sbin /usr/bin /usr/sbin 这几个常见的可执行程序的路径,这样我们 进入命令行后就可以lscd等直接使用了。

(5)为什么我们的rcS文件还没添加,系统启动就有了PATH中的值?原因在于busybox自己用代码硬编码为我们导出了一些环境变量,其中就有PATH

 

runlevel=

(1)runlevel也是一个shell变量,并且被导出为环境变量。

(2)runlevel这个环境变量到底有什么用?

(3)runlevel=S表示将系统设置为单用户模式

 

umask=

(1)umasklinux的一个命令,作用是设置linux系统的umask值。

(2)umask值决定当前用户在创建文件时的默认权限。

 

mount -a

(1)mount命令是用来挂载文件系统的

(2)mount -a是挂载所有的应该被挂载的文件系统,在busyboxmount -abusybox会去查找一个文件/etc/fstab文件,这个文件按照一定的格式列出来所有应该被挂载的 文件系统(包括了虚拟文件系统)

/etc下添加fstsb文件

3)挂载测试时全部出错:

mount: mounting proc on /proc failed: No such file or directory

mount: mounting sysfs on /sys failed: No such file or directory

mount: mounting tmpfs on /var failed: No such file or directory

mount: mounting tmpfs on /tmp failed: No such file or directory

mount: mounting tmpfs on /dev failed: No such file or directory

原因是因为根文件系统中找不到挂载点。所谓挂载点就是我们要将目标文件系统(当然 这里都是虚拟文件系统)挂载到当前文件系统中的某一个目录中,这个目录就是挂载点。

解决方案就是自己在制作的rootfs根目录下创建这些挂载点目录即可。

验证是否挂载成功,可以看挂载时输出信息;还可以启动后去看procsys文件夹,如 果有文件出现则证明挂载成功了,如果没东西就证明失败了。

 

mdev

(1)mdevudev的嵌入式简化版本,udev/mdev是用来配合linux驱动工作的一个应用 层的软件,udev/mdev的工作就是配合linux驱动生成相应的/dev目录下的设备文件。

(2)因为这个问题涉及到驱动,因此详细讲解要等到驱动部分。这里我们只是通过一些 直观的现象来初步理解udev/mdev的工作效果。

(3)rcS文件中没有启动mdev的时候,/dev目录下启动后是空的;在rcS文件中添加 上mdev有关的2行配置项后,再次启动系统后发现/dev目录下生成了很多的设备驱动 文件。

(4)/dev目录下的设备驱动文件就是mdev生成的,这就是mdev的效果和意义。

 

hostname

(1)hostnamelinux中的一个shell命令。命令(hostname xxx)执行后可以用来设置当 前系统的主机名为xxx,直接hostname不加参数可以显示当前系统的主机名。

(2)/bin/hostname -F /etc/sysconfig/HOSTNAME -F来指定了一个主机名配置文件(这个文 件一般文件名叫hostname或者HOSTNAME

使用:/etc/sysconfig/HOSTNAME文件中定义了一个hostnameking210

ifconfig

(1)有时候我们希望开机后进入命令行时ip地址就是一个指定的ip地址(譬如192.168.1.30),这时候就可以在rcS文件中ifconfig eth0 192.168.1.30

 

 

3.profile文件和用户登录理论

  profile文件添加入/etc/目录下即可,添加了之后的实验现象:命令行提示符前面显 示:[@king210]#

用户登录实战

添加/bin/loginsysinit

(1)inittab中修改,去掉/bin/sh,换上/bin/login,则系统启动后出现登录界面。 可以输入用户名和密码。

(2)实验现象:成功出现用户登录界面,但是死活密码不对。

 

 添加passwdshadow文件

(1)为什么用户名和密码不对?因为我们根本没有为root用户设置密码。

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

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

(4)/etc/passwd/etc/shadow修理好后,shadow中默认有一个加密的密码口令, 这个口令和你拷贝的shadow本身有关,像我的ubunturoot用户的密码就是root, 因此复制过来后登陆时的密码还是root

 

重置密码

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

(2)其实这个原因就是root用户在/etc/shadow文件中加密口令是空白的。所以是不 能登录的。

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

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

 

4.移植动态链接库

1.找到并复制动态链接库文件到rootfs

(1)我们用的arm-2009q3这个交叉编译工具链的动态链接库在/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib目录下。其他的一些交叉编译 工具链中动态链接库的目录不一定在这里,要去找一下。找的方法就是find

(2)复制动态链接库到roots/lib目录下。复制时要注意参数用-rdf,主要目的就是符号链 接复制过来还是符号链接。

复制命令:cp lib/*so* /root/porting_x210/rootfs/rootfs/lib/ -rdf

 

2.使用strip工具去掉库中符号信息

动态链接库so文件中包含了调试符号信息,这些符号信息在运行时是没用的(调试 时用的),这些符号会占用一定空间。在传统的嵌入式系统中flash空间是有限的,为了 节省空间常常把这些符号信息去掉。这样节省空间并且不影响运行。

去掉符号命令:arm-linux-strip *so*

可以编译一个可执行程序测试

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

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

在开发板控制台执行动态链接的

 

注:开机自启动与主流rcS格式介绍

修改rcS实现开机自启动

(1)开机自启动指的是让一些应用程序能够开机后自动执行

(2)开机自启动的实现原理就是在开机会自动执行的脚本rcS中添加上执行某个程 序的语句代码即可

 

四、制作ext2格式的镜像并烧录启动

 确定文件夹格式的rootfs可用

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

 动手制作ext2格式的镜像

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

losetup  /dev/loop0 rootfs.ext2

mke2fs -m 0 /dev/loop0 10240

mount -t ext2 /dev/loop0 ./ext2_rootfs/ (注意新建对应的文件夹)

(2)./rootfs中复制内容,用cp ../rootfs/* ./ -rf   

(3)umount /dev/loop1

losetup -d /dev/loop1

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

 

烧录镜像并设置合适的bootargs

(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制作实验圆满完成。

0 0
原创粉丝点击