1、编译busybox, 选择静态链接还是动态链接,生成/bin /sbin /usr/bin /usr/sbin 下 busybox等命令
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-
make install CONFIG_PREFIX=../rootfs_20150417
Busybox Settings --->
Busybox Library Tuning --->
[*] Tab completion tab键 命令补全
[*] Username completion 显示控制命令行提示符有用, 在profile中导出环境变量PS1='[\u@\h \W]\# '
[*] Fancy shell prompts 显示控制台命令行提示符有用, 在profile中导出环境变量PS1='[\u@\h \W]\# '
root@linux user@hostname
2、lib目录构建,拷贝busybox所需的动态库,若busybox是静态编译的,则可以不用
从工具链中拷贝对应的库
3、etc下文件构建
inittab : init解析文件
init.d/rcS : init解析inittab执行的第一个脚本
fstab : 当执行mount -a时,会自动解析的脚本
hostname : 当执行hostname -F hostname,会修改主机的名字
profile : 环境变量文件,每次启动shell的时候都会,都会解析该文件
调用getty or telnet 登录时,会调用login
getty: Open a tty,printf /etc/issue and prompt for a login name, then invoke /bin/login
login 会解析passwd、shadow、group文件,并调用shell,所以/etc/profile会被再次解析,对应用户下的.profile以及 .bashrc也会被调用解析
passwd : LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL
group : 组文件
shadow : 用户密码存储在/etc/shadow,格式为(以“:”为分割符)
mdev.conf : mdev的配置文件,后用udev替代
mtab : 自动生成的文件
4、创建基本的/dev/下节点,根据情况,有些版本可不用创建, /dev/下保持空即可,mdev或者udev已创建好
/bin/mknod /dev/console c 5 1
/bin/mknod /dev/null c 1 3
5、创建其他必须的目录
bin sbin /usr/bin /usr/sbin -------->由busybox创建
lib -------->所需的动静态库
etc -------->启动及环境变量配置
dev -------->挂载tmpfs,由udev或者mdev生成动态节点
proc -------->挂载proc文件系统
sys -------->挂载sysfs文件系统
tmp -------->挂载tmpfs文件系统
var -------->syslogd能生成日志文件
boot
home
root
media
mnt
opt
lost+found
一页2k
mkyaffs2image-2k-page rootfs_20150417/ Rootfs_2k.yaffs
6、根文件系统的启动
uboot下烧写
#define CONFIG_RUNDR "mw.b 0x30008000 ff 0x56c100;tftp 0x30008000 Rootfs.yaffs;nand erase 0x02d60000 0x56c100;nand write.yaffs 0x30008000 0x2d60000 0x56c100;" //(521b一页) 0x56c100/(512+16) =10975 yaffs2文件系统的页大小为(512+16)B,因此,烧写的大小应该是这个页大小的整数倍,否则会导致根文件系统起不来
#define CONFIG_RUNDR "mw.b 0x30008000 ff 0x630000;tftp 0x30008000 Rootfs.yaffs;nand erase 0x02d60000 0x630000;nand write.yaffs2 0x30008000 0x2d60000 0x630000;" //(2k一页) 0x630000%(2048+64) = 0,一页大小要是2048+64的整数倍
从nand flash启动
setenv bootargs "noinitrd root=/dev/mtdblock5 rootfstype=yaffs2 rw init=/sbin/init console=ttySAC0,115200 mem=0x4000000"
从网络启动
setenv bootargs "noinitrd console=ttySAC0,115200 mem=64M init=/linuxrc root=/dev/nfs rw nfsroot=192.168.0.101:/home/smb/uboot_kernel/rootfs_20150417,intr,nolock,proto=tcp,nfsvers=3 ip=192.168.0.110:192.168.0.101:192.168.0.1:255.255.255.0:xlpc:eth0:off"
nfsroot=192.168.0.101:/home/smb/uboot_kernel/rootfs_20150417,intr,nolock,proto=tcp,nfsvers=3
nfsaddrs = <my-ip> : <serv-ip> : <gw-ip> : <netmask> :<name>:<dev>:<auto>
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-
make install CONFIG_PREFIX=../rootfs_20150417
Busybox Settings --->
Busybox Library Tuning --->
[*] Tab completion tab键 命令补全
[*] Username completion 显示控制命令行提示符有用, 在profile中导出环境变量PS1='[\u@\h \W]\# '
[*] Fancy shell prompts 显示控制台命令行提示符有用, 在profile中导出环境变量PS1='[\u@\h \W]\# '
root@linux user@hostname
2、lib目录构建,拷贝busybox所需的动态库,若busybox是静态编译的,则可以不用
从工具链中拷贝对应的库
3、etc下文件构建
inittab : init解析文件
init.d/rcS : init解析inittab执行的第一个脚本
fstab : 当执行mount -a时,会自动解析的脚本
hostname : 当执行hostname -F hostname,会修改主机的名字
profile : 环境变量文件,每次启动shell的时候都会,都会解析该文件
调用getty or telnet 登录时,会调用login
getty: Open a tty,printf /etc/issue and prompt for a login name, then invoke /bin/login
login 会解析passwd、shadow、group文件,并调用shell,所以/etc/profile会被再次解析,对应用户下的.profile以及 .bashrc也会被调用解析
passwd : LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL
group : 组文件
shadow : 用户密码存储在/etc/shadow,格式为(以“:”为分割符)
mdev.conf : mdev的配置文件,后用udev替代
mtab : 自动生成的文件
4、创建基本的/dev/下节点,根据情况,有些版本可不用创建, /dev/下保持空即可,mdev或者udev已创建好
/bin/mknod /dev/console c 5 1
/bin/mknod /dev/null c 1 3
5、创建其他必须的目录
bin sbin /usr/bin /usr/sbin -------->由busybox创建
lib -------->所需的动静态库
etc -------->启动及环境变量配置
dev -------->挂载tmpfs,由udev或者mdev生成动态节点
proc -------->挂载proc文件系统
sys -------->挂载sysfs文件系统
tmp -------->挂载tmpfs文件系统
var -------->syslogd能生成日志文件
boot
home
root
media
mnt
opt
lost+found
5、使用工具生成镜像
一页512b
mkyaffs2image-512b-page rootfs_20150417/ Rootfs_512b.yaffs一页2k
mkyaffs2image-2k-page rootfs_20150417/ Rootfs_2k.yaffs
6、根文件系统的启动
uboot下烧写
#define CONFIG_RUNDR "mw.b 0x30008000 ff 0x56c100;tftp 0x30008000 Rootfs.yaffs;nand erase 0x02d60000 0x56c100;nand write.yaffs 0x30008000 0x2d60000 0x56c100;" //(521b一页) 0x56c100/(512+16) =10975 yaffs2文件系统的页大小为(512+16)B,因此,烧写的大小应该是这个页大小的整数倍,否则会导致根文件系统起不来
#define CONFIG_RUNDR "mw.b 0x30008000 ff 0x630000;tftp 0x30008000 Rootfs.yaffs;nand erase 0x02d60000 0x630000;nand write.yaffs2 0x30008000 0x2d60000 0x630000;" //(2k一页) 0x630000%(2048+64) = 0,一页大小要是2048+64的整数倍
从nand flash启动
setenv bootargs "noinitrd root=/dev/mtdblock5 rootfstype=yaffs2 rw init=/sbin/init console=ttySAC0,115200 mem=0x4000000"
从网络启动
setenv bootargs "noinitrd console=ttySAC0,115200 mem=64M init=/linuxrc root=/dev/nfs rw nfsroot=192.168.0.101:/home/smb/uboot_kernel/rootfs_20150417,intr,nolock,proto=tcp,nfsvers=3 ip=192.168.0.110:192.168.0.101:192.168.0.1:255.255.255.0:xlpc:eth0:off"
nfsroot=192.168.0.101:/home/smb/uboot_kernel/rootfs_20150417,intr,nolock,proto=tcp,nfsvers=3
nfsaddrs = <my-ip> : <serv-ip> : <gw-ip> : <netmask> :<name>:<dev>:<auto>
ip = 192.168.0.240:192.168.1.200:192.168.1.1:255.255.255.0: xlpc : eth0: off
7、附件中是对应的/etc文件下的文件
本文介绍如何构建一个完整的嵌入式Linux根文件系统,包括编译BusyBox、构建lib目录、创建必要的文件夹结构等内容。文章还详细解释了如何通过不同的方式启动根文件系统。
1300

被折叠的 条评论
为什么被折叠?



