分享
 
 
 

我也来学做嵌入式Linux系统V0.1二

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

第四章 建立根文件系统

1、建立目录

构建工作空间时,rootfs文件夹用来存放根文件系统,

#cd rootfs

根据根文件系统的基本结构,建立各个对应的目录:

# mkdir bin dev etc lib proc sbin tmp usr var root home

# chmod 1777 tmp

# mkdir usr/bin usr/lib usr/sbin

# ls

dev

etc

lib

proc

sbin

tmp

usr

var

# mkdir var/lib var/lock var/log var/run var/tmp

# chmod 1777 var/tmp

对于单用户系统来说,root和home并不是必须的。

准备好根文件系统的骨架后,把前面建立的文件安装到对应的目录中去。

2、拷贝链接库

把uclibc的库文件拷贝到刚才建立的lib文件夹中:

# cd ${PREFIX}/lib

[root@skynet lib]# cp *-*.so ${PRJROOT}/rootfs/lib

[root@skynet lib]# cp -d *.so.[*0-9] ${PRJROOT}/rootfs/lib

3、 拷贝内核映像和内核模块

因为没有模块,所以拷贝模块就省了,

新建boot目录,把刚才建立好的内核拷贝过来

# cd /home/kendo/control-project/daq-module/rootfs/

# mkdir boot

# cd ${PRJROOT}/images

# cp bzImages-2.4.18-rmk5 /home/kendo/control-project/daq-module/rootfs/boot

4、 建立/dev下边的设备文件

在linux中,所有的的设备文件都存放在/dev中,使用mknod命令创建基本的设备文件。

mknod命令需要root权限,不过偶本身就是用的root用户,本来是新建了一个用户专门用于嵌入式制作的,不过后来忘记用了……

# mknod -m 600 mem c 1 1

# mknod -m 666 null c 1 3

# mknod -m 666 zero c 1 5

# mknod -m 644 random c 1 8

# mknod -m 600 tty0 c 4 0

# mknod -m 600 tty1 c 4 1

# mknod -m 600 ttyS0 c 4 64

# mknod -m 666 tty c 5 0

# mknod -m 600 console c 5 1

基本的设备文件建立好后,再创建必要的符号链接:

# ln -s /proc/self/fd fd

# ln -s fd/0 stdin

# ln -s fd/1 stdout

# ln -s fd/2 stderr

# ls

console

fd

mem

null

random

stderr

stdin

stdout

tty

tty0

tty1

ttyS0

zero

设备文件也可以不用手动创建,听说RedHat /dev下的脚本MAKEDEV 可以实现这一功能,不过没有试过……

基本上差不多了,不过打算用硬盘/CF卡来做存储设备,还需要为它们建立相关文件,因为我的CF在目标机器上是CF-to-IDE,可以把它们等同来对待,先看看Redhat 下边had的相关属性:

# ls -l /dev/hda

brw-rw----

1 root

disk

3,

0 Jan 30

2003 /dev/hda

# ls -l /dev/hda1

brw-rw----

1 root

disk

3,

1 Jan 30

2003 /dev/hda1

对比一下,可以看出,had类型是b,即块设备,主编号为3,次编号从0递增,根限位是rw-rw----,即660,所以:

# mknod -m 660 hda b 3 0

# mknod -m 660 hda1 b 3 1

# mknod -m 660 hda2 b 3 2

# mknod -m 660 hda3 b 3 3

5、添加基本的应用程序

未来系统的应用程序,基本上可以分为三类:

基本系统工具,如ls、ifconfig这些……

一些服务程序,管理工具,如WEB、Telnet……

自己开发的应用程序

这里先添加基本的系统工具,有想过把这些工具的代码下载下来交叉编译,不过实在是麻烦,用BusyBox,又精简又好用……

将busybox-1.00.tar.gz下载至sysapps目录下,解压:

#tar zxvf busybox-1.00.tar.gz

#cd busybox-1.00

//进入配置菜单

#make TARGET_ARCH=i386 CROSS=i386-linux- PREFIX=${PRJROOT}/rootfs menuconfig

//建立依存关系

#make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs dep

//编译

#make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs

//安装

#make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs install

# cd ${PRJROOT}/rootfs/bin

# ls

addgroup

busybox

chown

delgroup

echo

kill

ls

mv

ping

rm

sleep

adduser

chgrp

cp

deluser

grep

ln

mkdir

netstat

ps

rmdir

umount

ash

chmod

date

dmesg

hostname

login

mount

pidof

pwd

sh

vi

一下子多了这么多命令……

配置busybox的说明:

A、如果编译时选择了:

Runtime SUID/SGID configuration via /etc/busybox.conf

系统每次运行命令时,都会出现“Using fallback suid method ”

可以将它去掉,不过我还是在/etc为其建了一个文件busybox.conf搞定;

B、[*] Do you want to build BusyBox with a Cross Compiler?

(i386-linux-gcc) Cross Compiler prefix

这个指明交叉编译器名称(其实在编译时的命令行已指定过了……)

C、安装选项下的(${PRJROOT}/rootfs) BusyBox installation prefix,这个指明了编译好后的工具的安装目录。

D、静态编译好还是动态编译好?即是否选择

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

动态编译的最大好处是节省了宝贵空间,一般来说都是用动态编译,不过我以前动态编译出过问题(其实是库的问题,不关busybox的事),出于惯性,我选择了静态编译,为此多付出了107KB的空间。

E、其它命令,根据需要,自行权衡。

6、系统初始化文件

内核启动时,最后一个初始化动作就是启动init程序,当然,大多数发行套件的Linux都使用了与System V init相仿的init,可以在网上下载System V init套件,下载下来交叉编译。另外,我也找到一篇写得非常不错的讲解如何编写初始化文件的文件,bsd-init,回头附在后面。不过,对于嵌入式系统来讲,BusyBox init可能更为合适,在第6步中选择命令的时候,应该把init编译进去。

#cd ${PRJROOT}/rootfs/etc

#vi inittab

我的inittal文件如下:

#指定初始化文件

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

#打开一个串口,波特率为9600

::respawn:/sbin/getty 9600 ttyS0

#启动时执行的shell

::respawn:/bin/sh

#重启时动作

::restart:/sbin/init

#关机时动作,卸载所有文件系统

::shutdown:/bin/umount -a ?r

保存退出;

再来编写rcS脚本:

#mkdir

${PRJROOT}/rootfs/etc/init.d

#cd ${PRJROOT}/rootfs/etc/init.d

#vi rcS

我的脚本如下:

#!/bin/sh

#Set Path

PATH=/sbin:/bin

export PATH

syslogd -m 60

klogd

#install /proc

mount -n -t proc none /proc

#reinstall root file system by read/write mode(need: /etc/fstab)

mount -n -o remount,rw /

#reinstall /proc

mount -n -o remount,rw -t proc none /proc

#set lo ip address

ifconfig lo 127.0.0.1

#set eth0 ip address

#当然,这样子做只是权宜之计,最后做的应该是在这一步引导网络启动脚本,像RedHat

#那样,自动读取所有指定的配置文件来启动

ifconfig eth0 192.168.0.68 netmask 255.255.255.0

#set route

#同样的,最终这里应该是运行启动路由的脚本,读取路由配置文件

route add default gw 192.168.0.1

#还差一个运行服务程序的脚本,哪位有现成的么?

#网卡/路由/服务这三步,事实上可以合在一步,在rcS这一步中,做一个循环,运行指定启动目录下的所有脚,先将就着这么做吧,确保系统能够正常启动了,再来写这个脚本。

#set hostname

hostname MyLinux

保存退出。

编写fstab文件

#vi fstab

我的fstab很简单:

/dev/hda1 / ext2 defaults 1 1

none /proc proc defaults 0 0

第五章 让MyLinux能够启动

前一章,我们把编译好的内核、应用程序、配置文件都拷贝至rootfs目录对应的子目录中去了,这一步,就是把这些文件移植至目标机的存储器。这里,我是先另外拿一块硬盘,挂在我的开发机上做的测试,因为我的本本用来写文档,PC机用来做开发机,已经没有另外的机器了……但是本章只是讲述一个一般性的过程,并不影响你直接在目标主机上的工作。

因为以后目标机识别硬盘序号都是hda,而我现

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有