最小根文件系统所需元素:
(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库
在armgcc的lib目录下
.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控制台修改启动参数,来指定要挂接的文件系统类型
set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 rootfstype=jffs2
save
jffs2的好处是可以压缩映像,大大减小映像体积
相关推荐
QT6410移植linux-2.6.39 笔记(三)-构建cramfs根文件系统(1)
QT6410移植linux-2.6.39 笔记(三)-构建cramfs根文件系统(2)
它颠覆和摒弃了传统的从阅读Linux内核源代码着手学习Linux操作系统原理的方式,而是基于实践,以从零开始构建一个完整的Linux操作系统的过程为依托,指引读者在实践中去探索操作系统的本质。这种方式的妙处在于,让...
简单地概括,它是一个工具,可以用来构建u-boot,kernel,文件系统,交叉编译工具链,等等。Yocto提供了一套完整的全面的嵌入式Linux移植解决方案。使嵌入式Linux系统移植告别了以前通过源码一步步移植的刀耕火种...
2 LINUX 正根的嵌入式系统,LINUX消费与通信领域用的比较多,但缺点是必须ARM9才能跑,ARM9的板子自己做就不行了,6层板太贵。买开发板1K达底吧。但是还是推荐选ARM9+LINUX 3 UCLINUX 算投机嵌入式系统:)ARM7上...
4.Yaffs作为根文件系统启动… 5.完整的嵌入式Linux系统…… 四.嵌入式WEB服务器…… 1. Boa移植… … 2.WEB应用开发……… 五.NFS的配置. 1.主机的NFS服务器配置… 2.目标机的NFS客户端配置……… 3.出现的问题…… ...
LINUX学习笔记--FTP服务器设置 Linux中文件查找技术大全 Linux中文件的压缩与解压缩 将Linux配置为代理防火墙用途 教你十种提高Linux系统安全性的招数 解析Linux操作系统文件目录 免费的Linux...
Plasmafox Web浏览器 适用于兼容Arch的发行版 Plasmafox和Firefox之间的主要区别: KDE与文件对话框和全局菜单的集成 ... 二进制文件在系统化的EndeavourOS / Arch容器中构建。 默认情况下,profile
Linux和Windows构建: MacOS构建 登陆页面: 主要特点 Git风味Markdown(GFM)支持 macOs + Windows + Linux 几种语言的代码语法突出显示 暗模式 用标签标记笔记 通过董事会整理卡片 通过自定义目录进行云同步 ...
当前没有针对Linux的预构建版本,但是您可以轻松地自己构建NBFC: 入门 通常,如果您有任何疑问,尤其是以下页面, 是: 贡献 不管有多小的贡献,我们都欢迎。 在创建新的发行或请求请求之前,请阅读。 如果您喜欢...
以下是此处包含的一些内容: 一个常规的笔记文档,在其中记下了Linux命令,示例,有关如何使用gdb注释, bazel ,各种命令行工具,构建工具等。 这是一个一般的地方,我记下我学到的知识,这些知识知道以后我会需要...
在Linux上访问Evernote的方法有很多,例如Nevernote,Geeknote和Everpad。 作为Evernote的长期用户和Docker爱好者,将两者结合起来是很有意义的。 这项工作基于: : #版本 Ubuntu的:14:04 印象笔记:5.8.13...
一个构建系统,用于制作无斑点的Debian和主线Linux内核,并支持libth ath9k无线,dmcrypt / LUKS根分区加密以及使用panfrost进行图形加速 支持以下设备: armhf cpu: 华硕C201(C201P)(C201PA)(veyron-speedy...
有助于要构建二进制文件,只需运行make 。 $ makeDownload go.mod dependenciesBuilding binaries 要运行Wisky Tango,您可以调用二进制文件。 $ bin/wtUsing config file: /Users/marco/code/priv/whisky-tango/.wt...
齐奏可以运行在Windows和Unix(Solaris,Linux或OS X等)系统的许多口味两者。此外,齐奏跨平台工作,让您在使用Unix服务器,Windows笔记本电脑同步例如。 不同于简单的镜像或备份工具,齐奏可以处理更新分布式目录...
先决条件Linux(Ubuntu 16.04+) 确保已安装系统TeX发行版,例如TeX Live(可apt install texlive-full )。 使用标准软件包管理器安装pdf2svg , pdftoppm和libyaml ( apt install pdf2svg poppler-u
Linux: 视窗: 要求 吉特 蚂蚁1.9.9或以上 JDK 8或11(用于构建NetBeans) JDK 9或更高版本(用于运行NetBeans) MinGW(可选),用于构建Windows启动器 笔记: NetBeans还可与JDK 8一起运行,尽管那时它不...
第14章:灵活的构建/14.3 激活属性文件的方法/14.3.5 系统属性等于某个值时激活 第14章:灵活的构建/14.3 激活属性文件的方法/14.3.6 根据操作系统激活 第14章:灵活的构建/14.3 激活属性文件的方法/14.3.7 默认激活...
印象笔记Linux Evernote Web应用程序的非官方桌面包装我对现有Linux Evernote客户端并不特别满意。 它们中的大多数都很好,但是它们仍然缺少Evernote的某些功能。 Evernote Web应用程序功能齐全,但是与专用的桌面...
门达修斯计划基于GUI的虚拟化工具,用于运行Linux,基于Apple为macOS Big Sur引入的虚拟化框架,并支持Apple Silicon架构(也受基于Intel的macs支持) 通过在访客操作系统中具有用于安装openssh-server的快速操作...