[root@localhost afa]# . ./myembed.sh
[root@localhost embeded]# cd build-tools/
[root@localhost build-tools]# tar zxvf buildroot-0.9.27.tar.gz
[root@localhost build-tools]# cd buildroot;mkdir dl
[root@localhost buildroot]# ls ../dl
binutils-2.15.91.0.2.tar.bz2 genext2fs_1.3.orig.tar.gz
ccache-2.3.tar.gz linux-libc-headers-2.4.27.tar.bz2
gcc-3.3.4.tar.bz2 uClibc-0.9.27.tar.bz2
[root@localhost buildroot]# mv ../dl/* dl/
[root@localhost buildroot]# make menuconfig(如果用gcc4.0这里会有问题,自己修改一下即可,记得是有一句static语句,你可以去掉static就可以了)
Target Architecture (i386) —> 选择i386即可
Build options —>
(${PRJROOT}/tools) Toolchain and header file location?
这个是问你编译好的东西存放在什么地方
Toolchain Options —>
x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
x x — Kernel Header Options x x
x x Kernel Headers (Linux 2.4.27 kernel headers) —> x x
头文件它会自动去下载,不过应该保证与你将要用的内核是同一个版本
x x — uClibc Options x x
x x [ ] Use the daily snapshot of uClibc? x x
使用最近的uClibc的snapshot
x x [ ] Enable locale/gettext/i18n support? x x
x x — Binutils Options x x
x x Binutils Version (binutils 2.15.91.0.2) —> x x
Binutils的版本
x x — Gcc Options x x
x x GCC compiler Version (gcc 3.3.4) —> x x
gcc的版本
x x () Additional gcc options x x
x x [*] Build/install c++ compiler and libstdc++? x x
支持的语言
x x [ ] Build/install java compiler and libgcj? (NEW) x x
x x — Ccache Options x x
x x [*] Enable ccache support? (NEW) x x
启用ccache的支持,它用于编译时头文件的缓存处理,用它来编译程序,第一次会有点慢,但是以后的速度可就很理想了,呵呵……
x x — Gdb Options x x
x x [ ] Build gdb debugger for the Target x x
x x [ ] Build gdb server for the Target x x
x x — Common Toolchain Options x x
x mqqqqqqqqv(+)qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
Package Selection for the target —>
这个什么都不用选,留待以后用busybox来搞定好了。
Target Options —>
[*] ext2 root filesystem for the target device
选择ext2作为根文件系统
配置ok后:
[root@localhost buildroot]# make
等一会儿………..
会让你选择平台:
Target x86 Processor Family
&216; 1. Generic 386 (CONFIG_GENERIC_386) (NEW)
&216; 选这个好了
输入1,等待………
当出现下列:
.comment –remove-section=.note –strip-unneeded 2>/dev/null || true;
/home/afa/embeded/build-tools/buildroot/build_i386/genext2fs-1.3/genext2fs -i 503 -b 1068
-d /home/afa/embeded/build-tools/buildroot/build_i386/root -q -D target/default/device_table.txt /home/afa/embeded/build-tools/buildroot/root_fs_i386.ext2
[root@localhost buildroot]#
表示你编译成功:
回头看一下自己的战利品:
[root@localhost buildroot]# cd ../../tools/
[root@localhost tools]# ls
bin bin-ccache i386-linux i386-linux-uclibc include info lib man usr
bin:所有的编译工具,如gcc,都在这儿了,只是加了些指定的前缀;
bin-ccache:如果在Toolchain optaion中没有选择对ccache的支持,就没有这一项了;
i386-linux:链接文件;实际指向include
i386-linux-uclibc:uclibc的相关工具;
include:供交叉开发工具使用的头文件;
info:gcc 的info文件;
lib:供交叉开发工具使用的链接库文件;
内核编译记录:
—————————-
注意,如果用vmware进行编译,那么需要注意一些地方:
如果你在vmware下重新编译内核,硬盘用的是scsi的,以下选项必选:
Device Drivers —>SCSI device support —><*> SCSI disk support
Device Drivers —>SCSI device support —>SCSI low-level drivers —> <*> BusLogic SCSI support
可以
如果不选上这个当用grub启动时会出现:
VFS: Cannot open root device “sda1 ” or unknown-block(0,0)
Please append a correct “root= ” boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
关于USB, 能选的都选上吧
Code maturity level options 不选
Loadable module support 不选(这个以后再研究,进一步学习,毕竟这个还是要用的)
Processor type and features 根据实际,选择处理器类型(我选默认的)
General setup —>
[*] Networking support
[*] PCI support
(Any) PCI access mode
[*] PCI device name database
[*] System V IPC
[*] Sysctl support
(ELF) Kernel core (/proc/kcore) format
[*] Kernel support for ELF binaries
[*] Power Management support
Memory Technology Devices (MTD) —> MTD设备,我用USB盘,不选
Parallel port support —> 不选
Plug and Play configuration —> 我的系统用不着即插即用,不选
Block devices —>
[*] Loopback device support
[*] RAM disk support
(4096) Default RAM disk size (NEW)
[*] Initial RAM disk (initrd) support
上面三个一定要选上
Multi-device support (RAID and LVM) —> 不选
Networking options —> 基本上都选了
ATA/IDE/MFM/RLL support —> 用了默认的
Telephony Support —> 不选
SCSI support —>
[*] SCSI disk support
[*] Enable extra checks in new queueing code
[*] Probe all LUNs on each SCSI device
[*] Verbose SCSI error reporting (kernel size +=12K)
[*] SCSI low-level drivers —>
[*] Serial ATA (SATA) support(这个应该串口硬盘的支持,选不选无所谓)
[*] BusLogic SCSI support(这个一定要选)
Fusion MPT device support —> 不选
I2O device support —> 不选
Network device support —> 根据实际情况选择(选默认)
Amateur Radio support —> 不选
IrDA (infrared) support —> 不选
ISDN subsystem —> 不选
Old CD-ROM drivers (not SCSI, not IDE) —> 不选
Input core support —> 不选
Character devices —>
[*] Virtual terminal
[*] Support for console on virtual terminal
[*] Standard/generic (8250/16550 and compatible UARTs) serial support
[*] Support for console on serial port
Multimedia devices —> 不选
File systems —>
[*] Kernel automounter version 4 support (also supports v3)
[*] Virtual memory file system support (former shm fs)
[*] /proc file system support
[*] Second extended fs support
Console drivers —>
&8226; VGA text console 调试时接显示器用
Sound —>不选
USB support —>
[*] UHCI Alternate Driver (JE) support
[*] USB Mass Storage support
Kernel hacking —>不选
Cryptographic options —>不选
Library routines —>不选
第四章 建立根文件系统
构建工作空间时,rootfs文件夹用来存放根文件系统,
#cd ${PRJROOT}/rootfs
根据根文件系统的基本结构,建立各个对应的目录:
# mkdir bin dev etc lib proc sbin tmp usr var
# 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
准备好根文件系统的骨架后,把前面建立的文件安装到对应的目录中去。
2、拷贝链接库
把uclibc的库文件拷贝到刚才建立的lib文件夹中:
# cd ${PREFIX}/lib
[root@localhost lib]# cp -.so ${PRJROOT}/rootfs/lib
[root@localhost lib]# cp -d *.so.[*0-9] ${PRJROOT}/rootfs/lib
3、 拷贝内核映像和内核模块
我们这里没有模块,暂时省下这一步
[root@localhost boot]# cd ${PRJROOT}/boot
[root@localhost boot]# cp ../images/bzImage-2.4.27-rmk5 .
[root@localhost boot]# mkdir grub(建立grub目录,为grub启动文件做准备)
[root@localhost boot]# cp /boot/grub/stage* grub/
4、 建立/dev下边的设备文件
在linux中,所有的的设备文件都存放在/dev中,使用mknod命令创建基本的设备文件。
mknod命令需要root权限
用我这个脚本好了,比较简单:dev.sh
重要的是要建上sda,sda1这两个,usb启动用的
#!/bin/bash
mknod -m 600 mem c 11
mknod -m 666 null c 13
mknod -m 666 zero c 15
mknod -m 644 random c 18
mknod -m 600 tty0 c 40
mknod -m 600 tty1 c 41
mknod -m 600 ttyS0 c 464
mknod -m 666 tty c 50
mknod -m 600 console c 51
mknod -m 660 hda b 30
mknod -m 660 hda1 b 31
mknod -m 660 hdb b 30
mknod -m 660 hdb1 b 31
mknod -m 660 sda b 30
mknod -m 660 sda1 b 31
mknod -m 660 sdb b 30
mknod -m 660 sdb1 b 31
ln -s /proc/self/fd fd
ln -s fd/0 stdin
ln -s fd/1 stdout
ln -s fd/2 stderr
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
配置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编译进去。
[root@localhost etc]# vi inittab
::sysinit:/etc/init.d/rcS::respawn:/bin/sh
[root@localhost etc]# mkdir init.d
[root@localhost etc]# vi init.d/rcS
#!/bin/sh
#Set Path
PATH=/sbin:/bin
export PATH
#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 hostname
hostname afaLinux
[root@localhost etc]# chmod u+x init.d/rcS(修改为可执行文件)
[root@localhost etc]# vi fstab
proc /proc proc defaults 0 0