根文件系统rootfs('/')是Linux系统中所有其他文件系统和目录的起源。在Linux中,所有文件、目录、设备和驱动都被组织为一个树型结构linux下socket编程,根文件系统就是这个结构的根节点,也是引导过程中启动并加载内核所需的起点。

根文件系统是嵌入式系统的关键组成部份,它包含了操作系统运行所需的所有基本文件和数据,才能使操作系统顺利地启动和运行,而且提供文件系统的访问和管理功能。它还包含了驱动程序、系统库文件以及其他与系统运行和管理有关的数据。所以可以简单的将他理解为一个文件夹或是一个目录。

通常来讲,嵌入式系统中根文件系统占用显存空间较小,一般采用压缩的文件系统(如ext2、ext3或ext4文件系统)来进行储存。

嵌入式Linux开发中,常用到的目录如下:

rootfs常用子目录说明

/bin

可执行文件,比如ls、mv等。

/dev

设备Linux下一切皆文件比如:/dev/ttymxc0代表并口0

/etc

配置文件

/lib

库文件

/mnt

临时挂载目录诸如:/mnt/usb

/proc

proc文件系统挂载点系统运行信息文件

/usr

软件资源目录

/var

变量

/sbin

管理员可使用的可执行文件

/sys

sysfs文件系统挂载点

/opt

可选的文件、软件

以下从几个方面介绍根文件系统的建立:

一、BusyBox建立根文件系统

1、编译BusyBox建立根文件系统

2、添加lib库

3、创建其他文件夹

二、测试

三、完善

四、其他功能

以下一一进行说明:

一、BusyBox建立根文件系统1、编译BusyBox建立根文件系统1)更改Makefile,添加编译器

打开busybox的顶楼Makefile,添加ARCH和CROSS_COMPILE,如下:

CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-20170.1-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-//使用绝对路径防止编译出错
......
ARCH ?= arm

2)busybox英文字符支持

由于busybox中的对英文进行了限制,未能正确的显示英文。须要对源码中的printable_string函数进行更改,如下:

12 const char* FAST_FUNC printable_string(uni_stat_t *stats, const char
*str)
13 {
14 char *dst;
15 const char *s;
16
17 s = str;
18 while (1) {
......
30 if (c = 0x7f)
34 break; */
35 s++;
36 }
37
38 #if ENABLE_UNICODE_SUPPORT
39 dst = unicode_conv_to_printable(stats, str);
40 #else
41 {
42 char *d = dst = xstrdup(str);
43 while (1) {
44 unsigned char c = *d;
45 if (c == '')
46 break;
47 /* 修改下面代码 */
48 /* if (c = 0x7f) */
49 if( c < ' ')
50 *d = '?';
51 d++;
52 }
......
59 #endif
60 return auto_string(dst);
61 }

将代码中字符小于0X7F之后就跳出的相关程序注释掉即可。

接着打开unnicode.c文件,进行如下的更改:

1003 static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t
*stats, const char *src, unsigned width, int flags)
1004 {
1005 char *dst;
1006 unsigned dst_len;
1007 unsigned uni_count;
1008 unsigned uni_width;
1009
1010 if (unicode_status != UNICODE_ON) {
1011 char *d;
1012 if (flags & UNI_FLAG_PAD) {
1013 d = dst = xmalloc(width + 1);
......
1022 /* 修改下面一行代码 */
1023 /* *d++ = (c >= ' ' && c = ' ') ? c : '?';
1025 src++;
1026 }
1027 *d = '';
1028 } else {
1029 d = dst = xstrndup(src, width);
1030 while (*d) {
1031 unsigned char c = *d;
1032 /* 修改下面一行代码 */
1033 /* if (c = 0x7f) */
1034 if(c < ' ')
1035 *d = '?';
1036 d++;
1037 }
1038 }
......
1044 return dst;
1045 }
......
1047
1048 return dst;
1049 }

在该段代码中,也是对字符小于0X7F的相关程序进行注释掉。

3)配置busybox

配置路径如下所示:

linux系统建立文件夹命令_linux建文件系统_建立文件linux

Location:

Settings

Buildstaticbinary(nosharedlibs)不要选中

继续如下路径的配置:

Location:

Settings

vi-stylelineeditingcommands

继续如下配置:

Location:

LinuxModleUtilities

Simplifedmodutils不要选中

继续配置如下:

Location:

LinuxSystemUtilities

mdev(16k)//确保下边的全部选中

最后配置使能Unicode支持英文,路径如下:

Location:

Settings

SupportUnicode

Check$LC_ALL,$LC_CTYPEand$LANGenvironmentvarabies

4)编译busybox

输入如下指令编译busybox,并拟定编译结果的储存路径:

make
make install CONFIG_PREFIX=/home/jia/linux/nfs/rootfs

linux系统建立文件夹命令_建立文件linux_linux建文件系统

2、添加lib库1)向rootfs的/lib目录添加库文件

将交叉编译器下所有的*so*和.a文件都拷贝到rootfs/lib目录中,如下:

cp *so* *.a /home/jia/linux/nfs/rootfs/lib/ -d

删除rootfs/lib中的ld-linux-armhf.so.3(由于它只是一个快捷方法,是一个影子而已),之后将贫道移植到相应文件中,如下:

rm ld-linux-armhf.so.3
cp ld-linux-armhf.so.3 /home/jia/linux/nfs/rootfs/lib/

继续进行如下操作:

cp *so* *.a /home/jia/linux/nfs/rootfs/lib/ -d

完成之后的目录如下:

linux系统建立文件夹命令_建立文件linux_linux建文件系统

2)向rootfs的usr/lib目录添加库文件

进行如下操作

cp *so* *.a /home/linux/nfs/rootfs/usr/lib/ -d

完成之后的rootfs/usr/lib目录如下:

linux系统建立文件夹命令_建立文件linux_linux建文件系统

3、创建其他文件夹

进行指令操作,创建dev、proc、mnt、sys、tmp、root等须要的文件夹。

二、测试

要测试创建好的根文件系统rootfs,只须要将root的值改为NFS挂载即可。

bootarg环境变量boot的值如下:

root=/dev/nfs/nfsroot=192.168.1.250:/home/zi/linux/nfs/rootfs,proto=tcprw

ip=192.169.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off

所以,须要重启开发板,步入uboot行模式,重新设置bootargs环境变量,命令如下:

setenv bootargs 'console=ttymxc0,115200 root=dev/nfs nfsroot=192.168.1.250:/home/jia/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::etho:off'//设置bootargs环境变量
saveenv//保存环境变量

linux系统建立文件夹命令_建立文件linux_linux建文件系统

使用boot命令启动Linux内核,如下:

在上图中出现了文件缺位的错误提示。须要进一步对根文件系统进行构建。

三、完善根文件系统1.创建/etc/init.d/rcS文件

rcS是规定启动什么文件的shell文件。在rootfs中创建/etc/init.d/rcS文件linux建文件系统,内容如下:

1 #!/bin/sh//这是一个shell
2 
3PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH//PATH环境变量保存着可执行文件可能存在的目录
4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib//LD_LIBRARY_PATH保存着库文件所在的目录
5 export PATH LD_LIBRARY_PATH//导出上述环境变量,相当于声明一些全局变量
6
7mount -a//使用mount命令挂载所有的文件系统
8 mkdir /dev/pts//创建目录
9 mount -t devpts devpts /dev/pts//将devpts挂载到/dev/pts目录中
10
11 echo /sbin/mdev > /proc/sys/kernel/hotplug//使用mdev管理热拔插设备
12 mdev -s

使用chmod777rcS命令给予/etc/init.d/rcS可执行权限。

设置好之后,重新启动系统,得到如下界面:

提示缺乏/etc/fstab文件。

2.创建/etc/fstab文件

fstab文件会在开机之后手动配置什么须要手动挂载的分区。在fstab文件中输入如下内容:

1 #     
2 proc /proc proc defaults 0 0
3 tmpfs /tmp tmpfs defaults 0 0
4 sysfs /sys sysfs defaults 0 0

重新启动系统,会得到如下提示:

linux系统建立文件夹命令_linux建文件系统_建立文件linux

上图其实没有提示错误学linux有前途吗,并且还是要创建/etc/inittab文件

3.创建/etc/inittab文件

创建/etc/inittab文件,在上面输入如下内容:

1 #etc/inittab
2 ::sysinit:/etc/init.d/rcS
3 console::askfirst:-/bin/sh
4 ::restart:/sbin/init
5 ::ctrlaltdel:/sbin/reboot
6 ::shutdown:/bin/umount -a -r
7 ::shutdown:/sbin/swapoff -a

至此,根文件系统创建的文件全部完成。

四、根文件系统其它功能测试1.软件运行测试

使用vim编辑器新建hello.c文件linux建文件系统,内容如下:

1 #include 
2 3
int main(void)
4 {
5 while(1) {
6 printf("hello world!rn");
7 sleep(2);
8 }
9 return 0;
10 }

使用如下命令进行编译:

arm-linux-gnueabihf-gcc hello.c -o hello

使用file命令查看文件类型及编码格式:

file hello

将其拷贝到rootfs/dervers目录下,在开发板中输入如下指令执行这个可执行文件:

cd /drivers
./hello

结果如下:

linux系统建立文件夹命令_建立文件linux_linux建文件系统

后台关掉软件的方式:

软件前面加&,使用ps查看要关掉软件的PID,使用kill-9pid关掉指定软件。

2.英文字符测试

根据右图对SecureCRT进行设置:

linux系统建立文件夹命令_linux建文件系统_建立文件linux

在rootfs目录新建一个“中文测试”文件夹,新建一个名为“测试文档.txt”的文件,使用vim编辑器输入“这是一个英文测试文档”,使用cat命令查看“测试文档.txt”内容,如下:

建立文件linux_linux系统建立文件夹命令_linux建文件系统

3.开机自启测试

在rcS文件添加自启动相关内容,如下:

cd /drivers
./hello &
cd /

重启开发板,会得到如下界面:

linux系统建立文件夹命令_linux建文件系统_建立文件linux

说明自启动成功。

4.内网联接测试

输入ping命令测试内网网址能够成功,出现“badaddress”提示,则在/etc/resolv.conf中输入一下内容:

nameserver 114.114.114.114
nameserver 192.168.1.1

然后再使用ping命令测试内网网址成功。

本文内容为学习Linux参考正点原子开发板配套文档整理所得,仅用于学习交流,不得用于商业用途。

本文原创地址://q13zd.cn/gwjxtlxtdqyy.html编辑:刘遄,审核员:暂无