• 最近打算从头开始制作根文件系统,下面是开发过程。

一、根文件系统的制作


0、FHS(Filesystem Hierarchy Standard)标准介绍

该标准规定了根目录下各个子目录的名称及其存放的内容:

目录名 存放的内容
/bin 必备的用户命令,例如ls、cp等
/sbin 必备的系统管理员命令,例如ifconfig、reboot等
/dev 设备文件,例如mtdblock0、tty1等
/etc 系统配置文件,包括启动文件,例如inittab等
/lib 必要的链接库,例如C链接库、内核模块
/home 普通用户主目录
/root root用户主目录
/usr/bin 非必备的用户程序,例如find、du等
/usr/sbin 非必备的管理员程序,例如chroot、inetd等
/usr/lib 库文件
/var 守护程序和工具程序所存放的可变,例如日志文件
/proc 用来提供内核与进程信息的虚拟文件系统,由内核自动生成目录下的内容
/sys 用来提供内核与设备信息的虚拟文件系统,由内核自动生成目录下的内容
/mnt 文件系统挂接点,用于临时安装文件系统
/tmp 临时性的文件,重启后将自动清除

1、制作根文件系统过程

制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。其过程大体包括:

  • 编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录

  • 利用交叉编译工具链的lib,构建根文件系统的/lib目录
  • 手动构建/etc及最简/dev目录
  • 创建其他空目录
  • 配置系统自动生成的/proc目录
  • 利用udev构建完整的/dev目录

1)编译、安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录

Busybox,人称Linux系统的瑞士军刀,是一个集成了一百多个最常用linux命令和工具的软件,busybox的配置程序和linux内核菜单配置方式简直一模一样,很容易上手。

  • 解压busybox,我用的是天嵌科技提供的开发板光盘资料工具

     tar jxvf busybox-1.20.0_for_TQ210_V1..tar.bz2 -C /
  • 进入解压后得到的busybox目录,将Makefile文件中的两行修改为如下(黑体部分为修改之后的内容)

    190 ARCH ?= arm

    164 CROSS_COMPILE ?=arm-linux-

  • 配置busybox

    make menuconfig

  • busybox配置主要分两部分。

    第一部分是Busybox Settings,主要编译和安装busybox的一些选项。这里主要需要配置:

    1)、Build Options -- Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。我们选择动态链接C库。

    2)、Installation Options -- Applets links (as soft-links) -- (X) as soft-links,表示安装busybox时,将各个命令安装为指向busybox的软链接还是硬链接。我们选择软链接。

    3)、Installation Options -- (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安装位置。我们选择/work/nfs_root/fs_mini3

    4)Busybox Library Tuning。保留Command line editing以支持命令行编辑;保留History size以支持记忆历史命令;选中Tab completion和Username completion以支持命令自动补全

    第二部分是Applets,他将busybox的支持的几百个命令分门别类。我们只要在各个门类下选择想要的命令即可。这里我们基本保持默认设置。

    1)选中Networking Utilities -- httpd下的Enable -u <user> option,以启用http服务器的功能allows the server to run as a specific user

  • 编译busybox
    make
  • 安装busybox
    make install

  在busybox的目录下产生_install目录,此即为得到的根文件系统。

2)利用交叉编译工具链的lib构建文件系统的/lib目录

  将交叉编译工具链中的库文件拷到刚得到的文件系统的/lib目录下,不需要拷这么多,busybox只用到了3个库:通用C库(libc)、数学库(libm)、加密库(libcrypt),因此我们只需要拷贝这3个库的库文件即可。

   在文件系统目录下创建lib目录

mkdir lib

  复制库文件 

cp  libcrypt-* /opt/EmbedSky/TQ210/busybox-1.20./_install/lib
cp libcrypt.so.* /opt/EmbedSky/TQ210/busybox-1.20./_install/lib
cp libm-* /opt/EmbedSky/TQ210/busybox-1.20./_install/lib
cp libm.so.* /opt/EmbedSky/TQ210/busybox-1.20./_install/lib
cp libc-* /opt/EmbedSky/TQ210/busybox-1.20./_install/lib
cp libc.so.* /opt/EmbedSky/TQ210/busybox-1.20./_install/lib
cp ld-* /opt/EmbedSky/TQ210/busybox-1.20./_install/lib

3)手动构建/etc目录

/etc 目录存放的是系统程序的主配置文件,因此需要哪些配置文件取决于要运行哪些系统程序。即使最小的系统也一定会运行1号用户进程init,所以我们至少要手 工编写init的主配置文件inittab。

我们制作最简单的/etc/inittab文件,其内容如下:

::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a –r

分析inittab脚本文件可知/etc/init.d/rcS脚本在/etc/inittab中以最高优先级第一个被init程序解析并使用daemon方式启动,

所以这样rcS脚本就作为一个独立的程序存在于进程空间了,故需要先创建rcS脚本。

vim etc/init.d/rcS

在其中输入如下内容

#!/bin/sh
mount -t tmpfs tmpfs /tmp #不挂载,QT程序运行时会出错 #将/proc挂载为虚拟文件系统,以保存进程信息
mount -t proc proc /proc #使用mdev创建/dev目录内容
mount -t tmpfs mdev /dev
mount -t sysfs sysfs /sys
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s

环境变量配置文件profile

vim etc/profile

输入如下内容

#!/bin/sh
export HOSTNAME=lz
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME:\W]\#"
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=/lib:/usr/lib

4)利用mdev构建/dev目录

首先需手动创建/dev文件夹并在此文件夹下创建两个设备文件console和null,

mkdir dev
cd dev/
mknod console c 5 1
mknod null c 1 3

udev 的原理是:操作系统启动的时候将识别到的所有设备的信息自动导出到/sys目录,然后用户态的应用程序udev根据/sys中的设备信息,自动在/dev 目录下创建所有正确的设备文件。因此我们要做的就是:配置自动生成/sys目录下的内容并调用mdev(mdev是busybox中对udev的简化实 现)。也就是添加3)中rcS文件后面那部分的内容。

为了实现自动挂载与卸载SD卡,需要做以下工作:
在文件系统根目录下
vim etc/mdev.conf
       mmcblk[0-9]p[0-9] 0:0 666 @ /etc/sd_card_inserting
        mmcblk[0-9] 0:0 666 $ /etc/sd_card_removing
红色部分,是一个脚本,脚本内容可以根据我们的需要定制,可以实现挂载,卸载或其他一些功能
 
自动挂载SD卡脚本如下
挂载
vim etc/sd_card_inserting
        #!/bin/sh
        mount -t vfat /dev/mmcblk0p1 /mnt/sd
卸载
vim etc/sd_card_removing
        #!/bin/sh
        sync
        umount /mnt/sd

5)创建其他空目录

创建一些常用的目录,执行如下命令

mkdir  home tmp proc sys mnt

进入mnt创建sd文件夹,以便挂载SD卡
cd mnt/
mkdir sd

至此,一个简单的根文件系统已制作完毕,将_install 文件夹下的文件全部拷到NFS共享目录下,开发板即可挂载此文件系统。

二、NFS的安装及配置


1)安装相关软件

Ubuntu系统默认是没有安装NFS服务的,安装命令如下:

apt-get install  nfs-kernel-server

2)建立共享目录

#sudo mkdir /nfsboot
#sudo chmod 777 /nfsboot

3)修改配置文件

NFS服务的配置文件路径:/etc/exports,刚安装完的配置文件只有一些说明。

#sudo vi /etc/exports

在里面加入

/nfsboot *(rw,sync,no_root_squash)

说明:

/nfsboot是要共享的目录

*代表允许所有的网络段访问,为安全起见,可指定网络号段,如202.38.214*,注意:*与(之间不能有空格,否则开发板挂载之后将只有读权限而没有写权限。

rw是可读写权限

sync是资料同步写入内存和硬盘

no_root_squash是NFS客户端分享目录使用者的权限,如果客户端使用的是root用户,那么对于该共享目录而言,该客户端就具有root权限


4)重启服务

使用以下命令重启服务

#sudo /etc/init.d/nfs-kernel-server restart

5)测试服务器

查看服务器目录和权限

#showmount -e

我得到的结果如下
Export list for lzm:
/nfsboot 202.38.214*

三、开发板通过NFS挂载文件系统


将第一步制作好的文件系统拷到/nfsboot目录下,注意修改共享目录nfsboot的权限。777

启动开发板,进入uboot界面,设置boot参数,设置nfs boot参数,然后依次输入nfs服务器的IP(也就是PC的IP)、开发板的IP、子网掩码、NFS的共享文件夹。

重启开发板,便可进入刚制作好的文件系统。

至此工作全部完成。

终于可以去上厕所啦,憋死我了。。。。。。

  

根文件系统制作、NFS配置与安装及利用NFS挂载根文件系统的更多相关文章

  1. NFS配置与安装

    安装 1 环境描述:    * 网络环境:                  NFS server: 192.168.102.47                  NFS client: 192.1 ...

  2. centos7下NFS配置

    NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. 前言 四台机器: ,218三台机器的/root/filedi ...

  3. [转载]SELinux 环境下网络服务设置,配置 Apache 、Samba、NFS

    原文地址:http://www.ibm.com/developerworks/cn/linux/l-cn-selinux-services1/index.html?ca=drs- 引言 SELinux ...

  4. 【原创】-- nfs安装配置及使用,挂载根文件系统

    环境:ubuntu14.04(非虚拟机),OK6410 环境搭建: (1) #sudo apt-get install nfs-kernel-server 如果已经是最新版本了,无需安装 (2) 建立 ...

  5. 基于mini2440嵌入式Linux根文件系统制作(Initramfs和nfs两种跟文件系统)

    嵌入式系统由三部分构成: 1.bootoader---bootparameters---2.kernel 3.Root-filesysytem 一个内核可以挂载多个文件系统,但是有一个根文件系统所以叫 ...

  6. Centos 7网络文件系统nfs服务的安装与配置

    实验环境>>>>>>>>> nfs服务端:(nfs-server)192.168.100.2 nfs客户端:(nfs-client)192.168 ...

  7. linux根文件系统制作

    在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误. 那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/l ...

  8. S5PV210的根文件系统制作

    一.移植BusyBox1.下载BusyBox的源代码下载地址:http://www.busybox.net/downloads/,此处下载busybox-1.20.2.tar.bz2.2.解压并进入目 ...

  9. 嵌入式linux内核制作、根文件系统制作

    嵌入式系统构成: 主要由bootloader.kernel.以及根文件系统三部分组成. 内核制作步骤: 制作嵌入式平台使用的linux内核制作方法与pc平台上的linux内核基本一致 1.清除原有配置 ...

随机推荐

  1. postgresql 免安装版使用

    免安装版 postgresql 使用 1.首先使用 initdb 初始化数据目录 initdb --pgdata=data --encoding=UTF8 --locale=C 2.启动 postgr ...

  2. C/C++程序基础 (十一)标准模板库

    标准模板库 标准模板库在标准函数库的定位 迭代器(类似指针)保证算法(常用算法)和容器(数据结构)的结合. vector的实现 底层实现是动态数组,所以支持随机访问. 内部是动态数组,随着insert ...

  3. Mybatis-数据插入

    传统jdbc数据插入 1.在Java代码for循环插入 executeUpdate() 2.批处理方法addBatch(Statement.Prestatement) addBatch() execu ...

  4. Servlet学习笔记07——什么是cookie,session?

    7)cookie的路径问题 a.什么是cookie路径问题? 浏览器在向服务器上的某个地址发送请求时, 会查看cookie的路径是否与该地址匹配,只有 匹配的cookie才会被发送. b.cookie ...

  5. JavaScript编码加密

    网上看到的加密方法: JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,deco ...

  6. Gulp工具

    Gulp是一个基于node开发的构建工具. gulp本身是不进行任何构建任务,是通过gulp的一些列插件完成: gulp-less  编译LESS文件: gulp-autoprefix  添加css私 ...

  7. 使用windows api安装windows服务程序(C#)

    3个步骤: 1.安装器代码编写 2.安装器工具类编写 1)安装.启动服务) 2)卸载服务 3.windows服务程序编写(参考:多线程.方便扩展的Windows服务程序框架) 4.代码下载,在文末(注 ...

  8. 使用python制作神经网络——搭建框架

    一.神经网络的大体结构可分为三个函数,分别如下: 1.初始化函数 设定输入层节点,隐藏层节点和输出层节点的数量. 2.训练 学习给定训练集样本后,优化权重. 3.查询 给定输入,从输出节点给出答案 所 ...

  9. Git的使用--将本地项目上传到Github

    Git的使用--将本地项目上传到Github 感谢作者 --> 原文链接 很早之前就注册了Github,但对其使用一直懵懵懂懂,很不熟练.直到昨天做完百度前端技术学院的task,想把代码托管到G ...

  10. 适合pc端的移动拖拽,分享一下。

    h5新加的特性拖拽事件,但是只适合PC端哦.不多说了上代码 <!DOCTYPE html> <html> <head> <title></titl ...