`

linux笔记:构建根文件系统

阅读更多

 

 

最小根文件系统所需元素       

(1)  /dev/condsole 

    /dev/null

(2)  init---->busybox

(3) /etc/inittab

(4)  配置文件里指定的应用程序

(5)  C(如果busybox中程序是动态使用链接库的话)

 

先来配置编译busybox

源文件busybox-1.7.0.tar.bz2

解压

tar xjf busybox-1.7.0.tar.bz2

源码目录中的INSTALL文件详细说明了如何编译

  make menuconfig     # This creates a file called ".config"

  make                # This creates the "busybox" executable

  make install        # or make CONFIG_PREFIX=/path/from/root install

这里的make install默认是安装到pc,而我们的目的是安装到板子上,所以我们使用#号后面的方式

 

先执行make menuconfig编译出配置菜单,但编译出错了

...

In file included from scripts/kconfig/lxdialog/checklist.c:24:0:

scripts/kconfig/lxdialog/dialog.h:31:20: fatal error: curses.h: 没有那个文件或目录

 #include CURSES_LOC

                    ^

compilation terminated.

make[2]: *** [scripts/kconfig/lxdialog/checklist.o] 错误 1

make[1]: *** [menuconfig] 错误 2

make: *** [menuconfig] 错误 2

 

这是因为ubuntu系统中缺少一个套件 ncurses devel

sudo apt-get install libncurses5-dev

Preparing to unpack .../libtinfo-dev_5.9+20140118-1ubuntu1_i386.deb ...

Unpacking libtinfo-dev:i386 (5.9+20140118-1ubuntu1) ...

Selecting previously unselected package libncurses5-dev:i386.

Preparing to unpack .../libncurses5-dev_5.9+20140118-1ubuntu1_i386.deb ...

Unpacking libncurses5-dev:i386 (5.9+20140118-1ubuntu1) ...

正在设置 libtinfo-dev:i386 (5.9+20140118-1ubuntu1) ...

正在设置 libncurses5-dev:i386 (5.9+20140118-1ubuntu1) ...

 

装完再make menuconfig

出来配置界面

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

如果选择了这个静态编译,c库就不需要另外加,但会大大增加文件大小,一般不选

除非我们的应用程序工具的运行要c,

而且,使用glibc,静态链接容易出问题,此时更加不要选择静态编译

 

 

最新版的busybox可能可以配置设置交叉工具链,1.7版本没有这个选项,需要手动修改Makefile

一般linux里这种选项是cross前缀的,修改后

ARCH            ?= arm

CROSS_COMPILE   ?= arm-linux-

 

或者在make时加上参数

make CROSS_COMPILE=arm-linux-

 

 

tab单词补全

  Busybox Settings  --->

    Busybox Library Tuning  --->

      Tab completion

 

mdev是自动创建设备节点

还有模块相关命令

网络

 

tar打包解压命令

还有其他一些命令

 

最后make

 

安装不要直接make install 这是装到pc机上,而我们是要装到板子上

make CONFIG_PREFIX=/home/book/work/workspace/firstfs install

这里的"="号两边不要有空格

 

成功执行时出现以下打印信息

  /home/book/work/workspace/firstfs/bin/addgroup -> busybox

  /home/book/work/workspace/firstfs/bin/adduser -> busybox

  /home/book/work/workspace/firstfs/bin/ash -> busybox

  /home/book/work/workspace/firstfs/bin/cat -> busybox

...

 

进入firstfs目录ll查看,

bin  linuxrc  sbin  usr

 

drwxrwxr-x 2 book book 4096 Nov  2 19:57 bin/

lrwxrwxrwx 1 book book   11 Nov  2 19:57 linuxrc -> bin/busybox*

drwxrwxr-x 2 book book 4096 Nov  2 19:57 sbin/

drwxrwxr-x 4 book book 4096 Nov  2 19:57 usr/

 

ll bin/cp

查看里面的cp命令,是软链接到busybox,硬链接数是1

lrwxrwxrwx 1 book book 7 Nov  2 19:57 bin/cp -> busybox*

 

 

好了busybox暂时搞定了

============================================================

然后是创建设备目录

mkdir dev

cd dev

dev目录中创建2个字符设备,可以先查看完整linux系统中的相关文件属性,再创建一样的

sudo mknod console c 5 1

sudo mknod null c 1 3

 

再创建一个null字符设备

 

然后是inittab,我们只简单的加一项

 ::askfirst:-/bin/sh

 

mkdir etc

vi inittab

加一句

console::askfirst:-/bin/sh

sh是一个程序,它的3标会定位到控制台

 

如果不构造inittab的话,就会使个默认的配置项,

默认是

 ::ctrlaltdel:reboot

 ::shutdown:umount -a -r

 ::restart:init

 ::askfirst:-/bin/sh

 :/dev/vc/2:askfirst:-/bin/sh

 :/dev/vc/3:askfirst:-/bin/sh

 :/dev/vc/4:askfirst:-/bin/sh

 ::sysinit:/etc/init.d/rcS

我们不需要这么多

 

 

好了,由于我们做的是最小根文件系统,第四步的配置指定程序就不做了

 

 

第五步,c

armgcclib目录下

.a是静态库

.so是动态库

cp拷贝时加-d参数, 就拷贝so文件,而不是它的链接文件so.2

so比较小,具体啥区别暂不想它

 

mkdir lib

cp /home/book/soft/arm-linux-gcc-3.4.5/arm-linux/lib/*.so* lib/ -d

 

好了这样最小根文件系统就做好了

bin  dev  etc  lib  linuxrc  sbin  usr

 

现在要烧到板子上,要先把最小根文件系统制作成yaffs2映像文件

yaffs1是小页的512字节

yaffs2是大页的2048字节

 

制作映像文件源码在 yaffs_source_util_larger_small_page_nand.tar.bz2

可以支持大页和小页解压后是Development_util_ok目录

进入/Development_util_ok/yaffs2/utils  执行make

生成很多可执行文件,我们需要的是mkyaffs2image

sudo sudo cp mkyaffs2image /usr/local/bin/

sudo chmod +x /usr/local/bin/mkyaffs2image

 

cd ~/wrok/workspace

mkyaffs2image    firstfs     minifs.yaffs2

 

烧写好启动,输出

Please press Enter to activate this console.

starting pid 763, tty '/dev/console': '/bin/sh'

 

说明我们在inittab配置文件中的脚本有作用

console::askfirst:-/bin/sh

askfirst

按确定后启动shell程序,并定向到控制台console

 

 

============================================================

shell,基本的ls,cd等命令就有了

但像ps命令就不能用

怎么办呢

 

linux有个proc虚拟文件系统,如果把它挂接到proc目录,就可以使用ps命令查看内存中发生的一些事情

当前进程的信息会以文件的形式保存到proc目录

新建proc目录

mount -t proc non /proc

就可以使用ps命令了

# ps

  PID  Uid        VSZ Stat Command

    1 0          3092 S   init    

    2 0               SW< [kthreadd]

    3 0               SWN [ksoftirqd/0]

    4 0               SW< [watchdog/0]

    5 0               SW< [events/0]

    6 0               SW< [khelper]

   55 0               SW< [kblockd/0]

   56 0               SW< [ksuspend_usbd]

   59 0               SW< [khubd]

   61 0               SW< [kseriod]

   73 0               SW  [pdflush]

   74 0               SW  [pdflush]

   75 0               SW< [kswapd0]

   76 0               SW< [aio/0]

  710 0               SW< [mtdblockd]

  745 0               SW< [kmmcd]

  763 0          3096 S   -sh

  778 0          3096 R   ps

 

# ls -l /proc/1/fd

lrwx------    1 0        0              64 Jan  1 00:21 0 -> /dev/console

lrwx------    1 0        0              64 Jan  1 00:21 1 -> /dev/console

lrwx------    1 0        0              64 Jan  1 00:21 2 -> /dev/console

============================================================

但是每次开机都手动mount太麻烦了

可以在inittab中加一条

::sysinit:/etc/init.d/rcS

 

不过最好加上这句,好处是当用nfs方式挂载,在关机时自动解挂,但如果是烧写到flash的话即无所谓了

::shutdown:umount -a -r

 

然后创建rcS文件,加入一行脚本

mount -t proc non /proc

 

并加上可执行权限

sudo chmod +x /etc/init.d/rcS  

 

除了使用mount -t proc non /proc命令

 

也可以用mount -a  作用是加载文件/etc/fstab中配置的所有设备

它会依赖一个配置文件/etc/fstab

它的格式是         (手册第368)

#<file system> <mount point>   <type>  <options>       <dump>  <pass>

proc           /proc          proc      defaults       0         0

 

刚开始把defaults写成default,竟然也有效果,后面才发现错了,

好了

reboot看效果,也可以在制作根文件系统时直接做好烧写

 

 

============================================================

现在dev下只有2个字符设备,如果大量增加设备的话,

手动创建太麻烦,可以用udev,自动创建dev设备节点

简化版本是mdev

 

mdev.txt中有使用说明,6个步骤

Here's a typical code snippet from the init script:

[1] mount -t sysfs sysfs /sys

[2] echo /bin/mdev > /proc/sys/kernel/hotplug

[3] mdev -s

 

Of course, a more "full" setup would entail executing this before the previous

code snippet:

[4] mount -t tmpfs mdev /dev

[5] mkdir /dev/pts

[6] mount -t devpts devpts /dev/pts

 

按步就班:

挂载一个sysfs文件系统到/sys目录,因为使用mdev需要内核支持sysfs文件系统

tempfs文件系统可以减少对flash的读写

devpts虚拟终端用来支持对外部网络telnet链接

 

先建个目录,别忘了这步,不然启动后进不去系统了

mkdir sys

 

修改etc/fstab来配置要挂载文件的系统

并且修改rcS加入要自动运行的命令

 

vi etc/fstab

添加

sysfs           /sys            sysfs   defaults         0       0

tmpfs           /dev            tmpfs   defaults         0       0

tmpfs           /tmp            tmpfs   defaults         0       0

 

vi /etc/init.d/rcS

添加

mount -a

mkdir /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug  #支持热插拔,在热插播时自动创建对应的设备节点

mdev -s                         #一开始就创建内核所支持的设备节点

 

============================================================

编译制作jffs2映像文件的工具

mtd-utils-05.07.23.tar.bz2

这个工具包里有一个mkfs.jffs2工具, 它可以把我们准备好的文件系统的目录制作成jffs2映像文件,烧写到板子上

但是mkfs.jffs2工具依赖于一个压缩解压缩函数库zlib

所以先配置编译安装 zlib,

tar xzf zlib-1.2.3.tar.gz

cd zlib-1.2.3/

配置, 参数prefix指定了安装时的目录

./configure --shared --prefix=/usr/

配置成功的话make

最后安装sudo make install

 

然后编译mkfs.jffs2

tar xzf mtd-utils-05.07.23.tar.bz2

cd mtd-utils-05.07.23/util

直接make生成mkfs.jffs2

然后安装sudo make install

 

制作

mkfs.jffs2 -n -s 2048 -e 128KiB -d firstfs/ -o firstfs.jffs2

-s 一页的大小,这个根据nand的实际参数

-e 可擦除块的大小

-d 源目录

-o 目标文件名

 

 

dnw烧写并启动

问题来了,从打印出来的启动信息看到默认要挂接的是文件系统是yaffs

想要识别为jffs2,可以在uboot控制台修改启动参数,来指定要挂接的文件系统类型

print

set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 rootfstype=jffs2

save

 

jffs2的好处是可以压缩映像,大大减小映像体积

 

 

2
2
分享到:
评论

相关推荐

    根文件系统移植学习笔记

    本学习笔记将深入探讨如何进行根文件系统的移植,以构建一个最小化但功能完整的系统。 首先,我们需要理解根文件系统的基本概念。根文件系统是指Linux系统启动时挂载的第一个文件系统,通常包含了/etc、/bin、/lib...

    QT6410移植linux-2.6.39 笔记(三)-构建cramfs根文件系统(2)

    ### QT6410移植linux-2.6.39 笔记(三)-构建cramfs根文件系统(2) #### 构建cramfs根文件系统 本篇文章是关于QT6410开发板上Linux-2.6.39内核移植系列文章的一部分,主要介绍了如何构建cramfs根文件系统。以下将详细...

    QT6410移植linux-2.6.39 笔记(三)-构建cramfs根文件系统(1)

    ### 构建Cramfs根文件系统:QT6410与Linux-2.6.39 在嵌入式系统开发中,构建一个高效且可靠的根文件系统至关重要。本文将详细探讨如何在QT6410开发板上,利用Linux-2.6.39内核版本构建Cramfs根文件系统,这一过程...

    华清远见培训《根文件系统的制作》

    本章节主要介绍如何构建一个完整的根文件系统(root file system),这对于嵌入式Linux系统的开发至关重要。通过一系列步骤,我们可以创建出适用于不同架构(如X86和ARM)的根文件系统。 #### 二、准备工作 在开始...

    akang笔记:linux所有实验

    "akang笔记:linux所有实验"是作者akang根据自己的学习经历整理的一份详细笔记,旨在帮助读者深入理解和掌握Linux系统。尽管作者谦虚地表示个人能力有限,但这份笔记无疑为初学者提供了一条了解和探索Linux的路径。 ...

    linux笔记笔记笔记笔记

    以上就是“Linux笔记笔记笔记笔记”所涵盖的主要知识点,这些内容覆盖了Linux系统的基本操作、网络编程、脚本编写、版本控制等多个方面,对于提升Linux技能和解决实际问题大有裨益。学习并熟练掌握这些知识,能够...

    国嵌Linux笔记.zip

    "国嵌Linux笔记"很可能是中国嵌入式技术教育机构(简称“国嵌”)提供的关于Linux学习的一系列资料,旨在帮助学生和开发者深入理解Linux系统。 这份压缩包中的"Linux笔记国嵌"可能包含了以下核心知识点: 1. **...

    马哥的linux学习笔记

    接着,详细讲解了Linux的文件系统结构,包括根目录、用户主目录、各种系统目录的用途,以及文件权限与所有权的管理,这对于日常操作至关重要。 在命令行界面部分,笔记列举并解释了数十个常用的Linux命令,如ls、cd...

    深度探索Linux操作系统:系统构建和原理解析.王柏生(带详细书签).part2.rar

    它颠覆和摒弃了传统的从阅读Linux内核源代码着手学习Linux操作系统原理的方式,而是基于实践,以从零开始构建一个完整的Linux操作系统的过程为依托,指引读者在实践中去探索操作系统的本质。这种方式的妙处在于,让...

    linux运维笔记:Saltstack自动化运维与实战.docx

    Linux 运维笔记:Saltstack 自动化运维与实战 Saltstack 是一个服务器基础架构集中化管理平台,它基于 Python 语言实现,采用 C/S 架构,结合轻量级消息队列(ZeroMQ)与 Python 第三方模块(Pyzmq、PyCrypto、...

    linux\牛人笔记

    笔记可能讲解了交叉编译、Bootloader(如U-Boot)、根文件系统构建(如 BusyBox 和 Buildroot)以及嵌入式Linux设备驱动开发。 5. **joyfire Linux笔记**:这可能是作者自己整理的一系列教程或案例,可能包含他对...

    嵌入式Linux入门笔记

    2. Rootfs:根文件系统,包含了操作系统运行所需的各种文件和目录结构。 3. Filesystem Image:将根文件系统打包成镜像文件,便于烧录到目标设备。 六、交叉编译与部署 1. 交叉编译:在不同架构的主机上编译目标...

    Buildroot构建Qt根文件系统-思维导图-学习笔记-基于正点原子阿尔法开发板

    介绍了如何使用Buildroot构建支持Qt的根文件系统。首先,下载并解压Buildroot源码,接着安装必要的库以支持图形配置菜单。通过"make menuconfig"命令打开配置菜单,或者编辑IMX6ULL Qt配置文件,设置ARM架构、工具链...

    鱼树笔记之第11课_根文件系统2

    本篇笔记主要探讨了根文件系统启动的过程以及如何构建和理解其内部机制,特别是通过Busybox这一轻量级工具集来创建根文件系统。 首先,根文件系统的启动分析始于内核如何打开第一个应用程序。在Linux内核启动后,它...

    嵌入式linux入门笔记

    5. **文件系统**:嵌入式Linux系统也需要文件系统来组织和管理数据。常见的文件系统类型包括ext2、ext3、ext4以及FAT等,对于嵌入式设备,可能会使用YAFFS或JFFS2等针对闪存优化的文件系统。 6. **设备驱动**:设备...

    嵌入式Linux系统开发笔记--赖永诚

    通过以上介绍可以看出,构建一个嵌入式Linux系统是一项复杂的工作,需要对Linux系统有深入的理解,并熟练掌握Shell命令、Bootloader编写与移植、内核移植与驱动开发以及根文件系统的构建等关键技术。这对于嵌入式...

    构建嵌入式linux系统 英文版

    8. **根文件系统构建**:根文件系统包含了系统运行所需的最小集,包括基本的执行文件、库、配置文件等。可以通过 BusyBox、Debian 或其他发行版的工具来创建。 9. **设备驱动程序开发**:设备驱动程序是操作系统与...

    linux编程学习笔记PDF资料下载.txt

    根据提供的文件信息,我们可以推断出这是一份关于Linux编程学习笔记的PDF资料。下面将对这份资料可能涉及的关键知识点进行详细的阐述。 ### Linux编程基础知识 #### 1. Linux操作系统概述 - **定义与特点**:Linux...

    linux常用命令,嵌入式linux使用入门笔记,linux入门

    3. 文件系统构建:如busybox和rootfs的制作。 4. 编译交叉工具链:为不同架构的嵌入式处理器编译程序。 5. 开发板烧录:如何将Linux系统烧录到开发板的存储设备上。 6. 嵌入式设备驱动程序:学习编写和调试硬件驱动...

Global site tag (gtag.js) - Google Analytics