【ARM】制作Linux 文件系统

本文详细介绍了在ARM平台上制作Linux文件系统的步骤,包括使用NFS挂载文件系统,配置 Busybox,以及理解Linux文件系统结构如ext2的布局。通过编译Busybox,创建初始文件系统,并挂载到NFS服务器,最后讨论了如何完善文件系统,涉及初始化脚本、MP3播放、登录功能等。文章深入讲解了Linux文件系统的元数据(inode、超级块)和VFS(虚拟文件系统)的概念,以及内核启动过程和文件系统的联系。
摘要由CSDN通过智能技术生成

文章目录


#1从零开始由busybox 建立文件系统
##1.1文件系统在LINUX 中的结构图
这里写图片描述
##1.2编译好kernel
编译linux kernel的具体操作在之前文章讲过,下面简要提示一下。
修改编译器PATH,指定寻找路径。
cd kernel-2.6.13 (进入内核目录)
cp config_n35 .config
make (编译内核,假设已经设置好了)
cd arch/arm/boot (进入生成的zImage 目录)
mkimage.sh (产生有uboot 可以引导的uImage 内核文件)
##1.3Uboot 状态下显示的环境设置信息

setenv bootcmd "tftp 30008000 uimage;bootm"
setenv ipaddr 192.168.1.244
setenv serverip 192.168.1.112
setenv gatewayip 192.168.1.1
setenv bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.1.113:/home/wu-being/linux/my_nfs ip=192.168.1.244:192.168.1.114:192.168.1.1:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M

我们启用NFS 方式装载文件系统,首先启动PC 上的NFS 服务器
vi /etc/exports (添加你要装载的文件系统目录)
/home/wu-being/linux/my_nfs 192.168.*.*(rw,sync,no_root_squash)
/etc/rc.d/init.d/portmap restart
/etc/rc.d/init.d/nfs restart
然后启动内核,查看结果??
##1.4开始busybox 生成文件系统
Busybox 是很多标准Linux 工具的单一可执行实现,它说明了一个问题,
很多标准的linux 工具可以共享很多共同的元素。

  • 第1步:从www.busybox.net 下载最新的版本busybox1.18.4.

  • 第2步:解压并打补丁
    tar –jxvf busybox-1.18.4.tar.bz2

wu-being@ubuntu:~/linux/bosybox$ l
busybox-1.18.4/                 busybox-1.18.4-hush.patch*
busybox-1.18.4-buildsys.patch*  busybox-1.18.4.tar.bz2*
busybox-1.18.4-fuser.patch*
wu-being@ubuntu:~/linux/bosybox$ patch -p0 <./busybox-1.18.4-buildsys.patch 
wu-being@ubuntu:~/linux/bosybox$ patch -p0 <./busybox-1.18.4-fuser.patch 
wu-being@ubuntu:~/linux/bosybox$ patch -p0 <./busybox-1.18.4-hush.patch 
  • 第3步:配制编译器路径,注意这个编译器版本要和编译Kernel的编译器版本同样。
wu-being@ubuntu:~/linux/bosybox/busybox-1.18.4$ l /home/wu-being/linux/3.4.1/bin/
arm-linux-addr2line*  arm-linux-gcc*        arm-linux-objcopy*
arm-linux-ar*         arm-linux-gcc-3.4.1*  arm-linux-objdump*
arm-linux-as*         arm-linux-gccbug*     arm-linux-ranlib*
arm-linux-c++*        arm-linux-gcov*       arm-linux-readelf*
arm-linux-c++filt*    arm-linux-gprof*      arm-linux-size*
arm-linux-cpp*        arm-linux-ld*         arm-linux-strings*
arm-linux-g++*        arm-linux-nm*         arm-linux-strip*
wu-being@ubuntu:~/linux/bosybox/busybox-1.18.4$ export PATH=$PATH:/home/wu-being/linux/3.4.1/bin/    
wu-being@ubuntu:~/linux/bosybox/busybox-1.18.4$ arm-linux-gcc(TAB)
arm-linux-gcc        arm-linux-gcc-4.4.3  
arm-linux-gcc-3.4.1  arm-linux-gccbug     
wu-being@ubuntu:~/linux/bosybox/busybox-1.18.4$ arm-linux-gcc
  • 第4步:进入目录busybox-1.18.4/执行命令make defconfig (default config)
  • 第5步:指定构架和编译工具编译和安装busybox
    (1).先执行编译命令:make ARCH=arm CROSS_COMPILE=arm-linux-

如果在32位Linux系统中编译,没修改下面三个问题可能不会报错,但也要修改后编译!

如果没有定义ARPHRD_INFINIBAND,定义之
vi networking/interface.c
#define INFINIABAND_ALEN 20
#define ARPHRD_INFINIBAND 20 //++
如果没有定义IFLA_OPERSTATE,屏蔽它
vi networking/libiproute/ipaddress.c
#ifdef IFLA_OPERSTATE //++
if (tb[IFLA_OPERSTATE]) {
static const char operstate_labels[] ALIGN1 =
"UNKNOWN\0""NOTPRESENT\0""DOWN\0""LOWERLAYERDOWN\0"
"TESTING\0""DORMANT\0""UP\0";
printf("state %s ", nth_string(operstate_labels,
*(uint8_t*)RTA_DATA(tb[IFLA_OPERSTATE])));
}
#endif //++
如果编译mkfs_ext2 工具错误,去掉它。
make menuconfig --> Linux System Utilites --> mkfs_ext2 (disable) --->
save and quit

(2).命令编译成功后,执行安装命令:
make ARCH=arm CROSS_COMPILE=arm-linux- install

  • 第6步:拷贝文件系统到NFS 能输出的目录
    mkdir /home/wu-being/linux/my_nfs
    cp -rf _INSTALL/* /home/wu-being/linux/my_nfs

  • 第7步:修改nfs 配置
    vi /etc/exports and append "/home/wu-being/linux/my_nfs 192.168..(rw,sync,no_root_squash)
    "
    /etc/init.d/nfs-kernel-server restart

  • 第8步:下载内核到目标板运行看结果
    配制板子文件系统目录,并保存。

setenv bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.1.113:/home/wu-being/linux/my_nfs ip=192.168.1.244:192.168.1.114:192.168.1.1:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M
saveenv

应该会看到文件系统已经Mount 成功,但是现实console 错误,应该是没有这个设备。

VFS: Mounted root (nfs filesystem).
mount_devfs_fs(): unable to mount devfs, err: -2
Freeing init memory: 144K
Warning: unable to open an initial console.
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
  • 第9步:建立串口设备
    建立dev和lib目录,并在文件系统的dev目录创建主设备号为5次设备号为1的console字符设备:mknod console c 5 1
    (不一定要创建这个console,文件系统启动后自动创建,当dev目录一定要建立来挂载)
  • 第10步:下载并启动内核显示如下
VFS: Mounted root (nfs filesystem).
Mounted devfs on /dev
Freeing init memory: 172K
Kernel panic - not syncing: No init found. Try passing init= option to kernel.

看来init 不存在或不能运行.

  • 第11步:指定init
    ln -sf bin/busybox init
    (不一定要,只是缺少相关的lib文件)
  • 第12步:再启动内核
    init 还是不能运行,也许就是busybox 不能运行,用文件形式打开busybox发现是要一些库文件。
    从原来挂载成功的文件系统目录的Lib下拷贝所需库
    最后结果
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值