根文件系统一般也叫做 rootfs 以下内容部分参考正点原子。 操作系统:Ubuntu 16 交叉编译工具:gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf BusyBox版本:1.29.0. 使用平台,正点原子开发板 ALPHA V2.2
1、/bin 目录 看到“bin”大家应该能想到 bin 文件,bin 文件就是可执行文件。所以此目录下存放着系统 需要的可执行文件,一般都是一些命令,比如 ls、mv 等命令。此目录下的命令所有的客户都可 以使用。 2、/dev 目录 dev 是 device 的缩写,所以此目录下的文件都是和设备有关的,此目录下的文件都是设备 文件。在 Linux 下一切皆文件,即使是硬件设备,也是以文件的形式存在的,比如 /dev/ttymxc0(I.MX6ULL 根目录会有此文件)就表示 I.MX6ULL 的串口 0,我们要想通过串口 0 发送或者接收数据就要操作文件/dev/ttymxc0,通过对文件/dev/ttymxc0 的读写操作来实现串口 0 的数据收发。 3、/etc 目录 此目录下存放着各种配置文件,大家可以进入 Ubuntu 的 etc 目录看一下,里面的配置文件 非常多!但是在嵌入式 Linux 下此目录会很简洁。 4、/lib 目录 lib 是 library 的简称,也就是库的意思,因此此目录下存放着 Linux 所必须的库文件。这些 库文件是共享库,命令和用户编写的应用程序要使用这些库文件。 5、/mnt 目录 临时挂载目录,一般是空目录,可以在此目录下创建空的子目录,比如/mnt/sd、/mnt/usb, 这样就可以将 SD 卡或者 U 盘挂载到/mnt/sd 或者/mnt/usb 目录中。 6、/proc 目录 此目录一般是空的,当 Linux 系统启动以后会将此目录作为 proc 文件系统的挂载点,proc 是个虚拟文件系统,没有实际的存储设备。proc 里面的文件都是临时存在的,一般用来存储系 统运行信息文件。 7、/usr 目录 要注意,usr 不是 user 的缩写,而是 Unix Software Resource 的缩写,也就是 Unix 操作系统 软件资源目录。这里有个小知识点,那就是 Linux 一般被称为类 Unix 操作系统,苹果的 MacOS 也是类 Unix 操作系统。关于 Linux 和 Unix 操作系统的渊源大家可以直接在网上找 Linux 的发 展历史来看。既然是软件资源目录,因此/usr 目录下也存放着很多软件,一般系统安装完成以 后此目录占用的空间最多。 8、/var 目录 此目录存放一些可以改变的数据。 9、/sbin 目录 此目录页用户存放一些可执行文件,但是此目录下的文件或者说命令只有管理员才能使用, 主要用户系统管理。 10、/sys 目录 系统启动以后此目录作为 sysfs 文件系统的挂载点,sysfs 是一个类似于 proc 文件系统的特 殊文件系统,sysfs 也是基于 ram 的文件系统,也就是说它也没有实际的存储设备。此目录是系 统设备管理的重要目录,此目录通过一定的组织结构向用户提供详细的内核数据结构信息。 11、/opt 可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。 关于 Linux 的根目录就介绍到这里,接下来的构建根文件系统就是研究如何创建上面这些子目 录以及子目录中的文件。 下面我们开始使用 BusyBox 进行构建根文件系统 我这里使用的是 busybox-1.29.0.tar.bz2 拿到busybox-1.29.0.tar.bz2后解压文件
tar -vxjf busybox-1.29.0.tar.bz2
最后得到
busybox 中文字符支持 修改 busybox 源码,取消 busybox 对中文显示的限制,打开文件 busybox- 1.29.0/libbb/printable_string.c,找到函数 printable_string,缩减后的函数内容如下
const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)
{
char *dst;
const char *s;
s = str;
while (1) {
unsigned char c = *s;
if (c == '\0') {
/* 99+% of inputs do not need conversion */
if (stats) {
stats->byte_count = (s - str);
stats->unicode_count = (s - str);
stats->unicode_width = (s - str);
}
return str;
}
if (c < ' ')
break;
/* if (c >= 0x7f)
break;*/
s++;
}
dst = unicode_conv_to_printable(stats, str);
{
char *d = dst = xstrdup(str);
while (1) {
unsigned char c = *d;
if (c == '\0')
break;
/* if (c < ' ' || c >= 0x7f)*/
if(c < ' ')
*d = '?';
d++;
}
if (stats) {
stats->byte_count = (d - dst);
stats->unicode_count = (d - dst);
stats->unicode_width = (d - dst);
}
}
return auto_string(dst);
}
接着打开文件 busybox-1.29.0/libbb/unicode.c 找到 unicode_conv_to_printable2 这个函数更改这两处 下面就是配置了
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm menuconfig
找到 Location: -> Settings -> Build static binary (no shared libs) 确保该项没有选中
Location: -> Settings -> vi-style line editing commands 选中该项 Location: -> Linux Module Utilities -> Simplified modutils 默认会选中“Simplified modutils”,这里我们要取消勾选!! Location: -> Linux System Utilities -> mdev (16 kb) //确保下面的全部选中,默认都是选中的 最后就是使能 busybox 的 unicode 编码以支持中文,配置路径如下: Location: -> Settings -> Support Unicode //选中 -> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中
最后 退出 保存! 开始编译。
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm
编译完成 下面将编译结果保存到我们所需的目录
make install CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm CONFIG_PREFIX=/home/dwh/linux/nfs/rootfs
编译完成以后会在 busybox 的所有工具和文件就会被安装到 rootfs 目录中,内容如图所示。 下面开始完善根文件系统 向lib添加库文件 首先建一个lib目录 进入到交叉编译器的目录复制库文件到根文件系统
mkdir lib
cd /usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/
cp cp *so* *.a /home/dwh/linux/nfs/rootfs/lib/ -d
因为 ld-linux-armhf.so.3文件是个链接文件 因此我们要删掉它,并且重新复制该文件
rm ld-linux-armhf.so.3
cp ld-linux-armhf.so.3 /home/dwh/linux/nfs/rootfs/lib
然后进入/usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib目录
cd /usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp *so* *.a /home/dwh/linux/nfs/rootfs/lib/ -d
然后向 usr/lib目录添加文件 首先先创建一个目录
mkdir /usr/lib
cd /usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a /home/dwh/linux/nfs/rootfs/usr/lib/ -d
接着创建别的目录
mkdir dev
mkdir proc
mkdir mnt
mkdir sys
mkdir tmp
mkdir root
mkdir etc
添加 rcS文件 创建/etc/init.d/rcS 在etc/init.d/rcS下写入
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
创建/etc/fstab 文件 添加以下代码
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
创建创建/etc/inittab 文件 添加以下代码
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
下面我们开始测试文件系统。 我们使用网络挂载的方式 在uboot启动时设置命令
setenv bootargs 'console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.0.9:/home/dwh/linux/nfs/rootfs ip=192.168.0.20:192.168.0.9:192.168.0.1:255.255.255.0::eth0:off'
saveenv
最后成功进入文件系统,大功告!
|