Linux
中就有制作根文件系统的工具,mke2fs
.只需要找到一个目录,然后依次执行下面的命令就行
dd if=/dev/zero of=rootfs.ext2 bs=1024 count=2048
losetup /dev/loop1 rootfs.ext2
mke2fs -m 0 /dev/loop1 2048
mount -t ext2 /dev/loop1 ./rootfs/ #注意这里的rootfs在执行前应该创建出一个这样的文件夹
上面的命令中的loop1
,执行的时候如果显示losetup: rootfs.ext2
:设置回环设备失败: 设备或资源忙,可以改成loop2
,
还是不行的话,就改成loop3
,以此类推。
然后进到刚刚创建的rootfs
目录中,创建一个touch linuxrc
的文件。
卸载命令
umount /dev/loop1
losetup -d /dev/loop1
注意这里的loop1
,要和上面的loop
一样,上面用的loop2
,这里就用loop2
.
nfs
方式挂载根文件系统然后我们要配置nfs
,打开vi /etc/exports
,输入
/home/mengchao/flushbonding/rootfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)
前面就是我们放的rootfs
的位置,根据自己的位置决定,后面照着写就行了,在星号前面有一个空格。
依次执行下面的命令,自己检查命令是否执行成功
chmod 777 /home/mengchao/flushbonding/rootfs/rootfs
sudo exportfs -r
sudo showmount localhost -e
sudo /etc/init.d/nfs-kernel-server restart
nfs
make menuconfig
中
配置Linux
内核支持nfs
CONFIG_IP_PNP
以在2
中能够看到Root file system on NFS
选项Networking support
Networking options
TCP/IP networking
IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
nfs
服务File systems --->
Network File Systems --->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] NFS client support for NFS version 4 (EXPERIMENTAL)
[*] NFS client support for NFSv4.1 (DEVELOPER ONLY)
[*] Root file system on NFS
uboot
中设置如下启动参数(IP
根据实际使用更改)setenv bootargs root=/dev/nfs rw nfsroot=192.168.0.111:/home/mengchao/flushbonding/rootfs/rootfs ip=192.168.0.88:192.168.0.111:192.168.0.1:255.255.255.0::enp2s0:off init=/linuxrc console=ttySAC2,115200
busybox
下载busybox
,随便下载到一个地方,解压,进到源代码目录
make menuconfig
,大概的配置项就这么几个Busybox Settings--->
Build Options--->
[*]Build BusyBox as a static binary(no shared libs)
Busybox Library Tuning--->
[*]vi-style line editing commands
[*]Fancy shell prompts
Linux Module Utilities--->
[ ]Simplified modutils
[*]insmod
[*]rmmod
[*]lsmod
[*]modprobe
[*]depmod
Linux System Utilities--->[*]mdev
[*]Support /etc/mdev.conf
[*]Support subdirs/symlinks
[*]Support regular expressions substitutions when renaming dev
[*]Support command execution at device addition/removal
[*]Support loading of firmwares
make
,一般来说不会有什么错误,有错误就要自己解决喽,我这里遇到一个error
:util-linux/lib.a(nsenter.o): In function `nsenter_main':
nsenter.c:(.text.nsenter_main+0x180): undefined reference to `setns'
collect2: ld returned 1 exit status
Note: if build needs additional libraries, put them in CONFIG_EXTRA_LDLIBS.
Example: CONFIG_EXTRA_LDLIBS="pthread dl tirpc audit pam"
Makefile:718: recipe for target 'busybox_unstripped' failed
make: *** [busybox_unstripped] Error 1
解决方法:make menuconfig
在Linux System Utilities--->nsenter
,去掉该选项,重新编译make
make install
执行成功后,我们安装到我们的nfs挂载的根文件系统中,方法如下:
我们的根文件系统目录:/home/mengchao/flushbonding/rootfs/rootfs
方法:make menuconfig
Busybox Settings —>
Installation Options (“make install” behavior) —> (./_install) Destination path for 'make install'
点进去,改成我们将要用作NFS
挂载的目录
/home/mengchao/flushbonding/rootfs/rootfs
make install
此时就安装到了我们的根文件系统中去了,这里添加这几个文件或者文件夹
不可缺少的文件夹dev、sys、proc、usr、etc、lib
。
etc
中要有inittab
(才可以使用开发板中的控制台,必不可少啊)、profile
(在shell
前面添加用户名), init.d
(文件夹),init.d
中要有rCS
。
动态链接库/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib
复制动态链接库到roots/lib
目录下(自行创建)。复制时要注意参数用-rdf
,主要目的就是符号链接复制过来还是符号链接。复制命令:cp lib/*so* /home/menghcao/flushbonding/rootfs/rootfs/lib/ -rdf
使用strip
工具去掉库中符号信息
动态链接库so
文件中包含了调试符号信息,这些符号信息在运行时是没用的(调试时用的),这些符号会占用一定空间。在传统的嵌入式系统中flash空间是有限的,为了节省空间常常把这些符号信息去掉。这样节省空间并且不影响运行。
去掉符号信息的命令:arm-linux-strip so
ext2
格式的镜像并烧录启动按照第一步重新做一个文件夹,暂时先不unmount
,全部做好之后再卸载,然后把上面nfs
中的那个根文件系统中的rootfs
全部复制过来,然后unmount
即可。