本文主要是介绍使用busybox-1.28.0制作文件系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如果利用busybox工具,制作linux根文件系统。首先从busybox官网上下载:https://busybox.net/downloads/),进行编译。这里我下载的是
busybox-1.28.0.tar.bz2。将源码包放到 linux 目录中tar -xjvf busybox-1.28.0.tar.bz2解压。
(1)在解压后的busybox文件夹中修改Makefile中的编译工具链和架构
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
(2)进入 busybox 的图形配置界面:
执行make menuconfig在界面中进行文件系统相关配置。
Busybox Settings--->
Build Options--->
[*]Build BusyBox as a static binary(no shared libs)-----把busybox配置成静态链接库
[*]Build with Large File Support (for accessing files > 2GB)
Busybox Settings--->
Busybox Library Tuning--->
[*]vi-style line editing commands----支持vi风格的命令行
[*]Fancy shell prompts-------这个选项要选中,否则挂载文件系统后,无法正常显示命令提示符:“[\u@\h \W]#”
Linux Module Utilities--->------------Linux驱动模块相关配置
[ ]Simplified modutils---简化的模块工具--我们去掉
[*]insmod
[*]rmmod
[*]lsmod
[*]Pretty output
[*]modprobe
[*]Blacklist support
[*]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
修改默认安装路径:
Busybox Settings --->
Installation Options ("make install" behavior) --->
(./_install) BusyBox installation prefix---------这里指的了默认安装路径,默认是安装在 busybox 目录下的_install 目录下
配置完后,选择<Exit>按回车,提示是否保存配置。
选择<Yes>,按回车,将配置保存为.config
(3)编译安装:
#make
#make install
注意:编译或配置过程出现错误参考另一篇博客中的解决方法。
完成之后会在 busybox 目录下生成 _install 文件夹,里面包含三个文件夹和一个文件:
/bin /sbin /usr linuxrc
(4)建一个名为 rootfs 的文件夹,作为文件系统的根目录,并手动创建根文件系统所需的目录,主要包括以下目录:
/bin, /etc, /dev, /home, /lib, /mnt, /opt, /proc, /root, /sbin, /sys, /tmp, /usr, /var
#mkdir rootfs
#cd rootfs
#mkdir bin etc dev home lib mnt opt proc root sbin sys tmp usr var
Linux 文件系统目录结构说明:
bin 存放系统常用的可执行命令,如 ls cp mv mkdir tar 等,嵌入式系统中的这些命令由 busybox 生成
dev 存放设备文件,系统启动后由 mdev 机制根据系统中的驱动在此目录下生成设备节点
etc 存放系统管理和配置文件,是制作文件系统时重点关注的目录
home 用户目录,一般下面会有一个以用户名命名的目录
lib 存放系统库文件,一般是动态连接共享库,供执行应用程序使用,此目录库文件从交叉编译器中复制得来
mnt 用于临时挂载文件系统,如 U 盘、 SD 卡、网络文件系统
opt 暂时用不到
proc proc 文件系统,系统运行过程中生成文件,可以访问此目录获得系统信息
root 系统管理员的主目录
sbin 存放系统管理命令,如 halt、 reboot 等
sys sys 文件系统,在系统启动后根据系统中注册的设备驱动,在此目录下生成用于管理设备的相关文件
tmp 存放临时文件
usr 嵌入式系统最主要的目录, bin 可存放用户的应用程序, lib 存放用户的库文件, local 可存放应用程序包
var 可存放各种服务的日志文件, web 服务器的网页脚本文件, FTP的资源目录。
(5)把_install 文件夹下文件全部复制到刚建好的 rootfs 目录下,替换原有的目录
#cd _install
#cp -rf * ../../rootfs
(6)制作文件系统
进入 rootfs/dev 目录,创建两个设备节点:
#mknod console c 5 1
#mknod null c 1 3
(7)进入 rootfs/etc 目录,添加文件:
拷贝 busybox-1.28.0/examples/bootfloopy/etc 目录下的内容到当前目录下。
#cd rootfs/etc/
#cp -r ../../busybox-1.28.0/examples/bootfloopy/etc/* ./
这里面包括文件: fstab init.d inittab profile
拷贝 ubuntu 下的/etc/passwd, /etc/group, /etc/shadow 三个文件到当前目录下。
#cp /etc/passwd ./
#cp /etc/group ./
#cp /etc/shadow ./
把 passwd 文件中的第一行: root:x:0:0:root:/root:/bin/bash 中的/bin/bash,改成/bin/ash
root:x:0:0:root:/root:/bin/ash
因为文件系统的 bin 目录下没有 bash 这个命令,而是用 ash 代替 bash,所以在用用户名密
码登录的时候(如 telnet), 会出现“cannot run /bin/bash: No such file or directory”的错误。
再从 ubuntu 的/etc 目录下复制一些常用的配置文件: mime.types services resolv.conf
(8)修改 etc/inittab 文件,内容如下:
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::once:/usr/sbin/telnetd -l /bin/login
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
(9)修改 etc/fstab 文件,内容如下:
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
(10)修改 etc/init.d/rcS 文件,内容如下:
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
(11)修改 etc/profile 文件,内容如下:
# Ash profile
# vim: syntax=sh
# No core files by default
#ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]# '
PATH=$PATH
HOSTNAME=`/bin/hostname`
echo "Processing /etc/profile... "
echo "Done"
export USER LOGNAME PS1 PATH
(12)新建 etc/sysconfig 目录,在里面新建一个名为 HOSTNAME 文件,编辑文件内容为: zhjtest
(13)拷贝时区文件:
Linux 下的时区文件存放在/usr/share/zoneinfo 下,在我们的文件系统中建立/usr/share 目录,
将系统中的时区文件复制过来。
mkdir -p usr/share
cp -rf /usr/share/zoneinfo usr/share
然后需要在 etc 目录下建立 localtime 文件,指定 linux 的时区,否则会出现系统时间和硬件时
间相差 8 小时的情况
ln -s /usr/share/zoneinfo/Asia/Hong_Kong etc/localtime
拷贝库文件:
进入 rootfs/lib 目录,拷贝交叉编译器的库文件到 lib 目录下
cp -f -a /opt/toolchains/arm-angstrom-linux-gnueabi/lib/*.so* ./
由于交叉编译器的库文件比较多,体积较大,所以需要裁剪一下库文件,只保留常用的
库文件,具体的裁剪方法可以参考我们提供的文件系统的源码。
到这里,文件系统的框架已经做好,我们需要把文件系统制作成可以烧写进 Nandflash 中
的 yaffs2 镜像文件。
制作 yaffs2 镜像需要使用 mkyaffs2image 工具,使用我们提供的编译好的 mkyaffs2image
工具(位置:光盘资料/linux 平台工具/mkyaffs2image.tar.gz)
把解压出来的可执行文件复制到 ubuntu 的/usr/bin 目录下
cp mkyaffs2image /usr/bin
制作文件系统镜像:
mkyaffs2image rootfs rootfs.bin
rootfs.bin 就是 yaffs2 文件系统镜像,要先修改它的权限,否则该文件无法被复制:
chmod 777 rootfs.bin
把 rootfs.bin 下载到 nandflash 中的文件系统分区中
如果文件系统能正常挂载,终端会打印出:
Please press Enter to activate this console. (按回车)
Processing /etc/profile...
Done
[root@zhjtest/]#
(14)完善文件系统
在/mnt 目录下创建以下文件夹,用来挂载 NFS, SD 卡和 U 盘 nfs sd udisk1 udisk2 udisk3 udisk4
cd rootfs/mnt
mkdir nfs sd udisk1 udisk2 udisk3 udisk4
设置开发板 IP 地址:在 init.d/rcS 文件中加入:
ifconfig lo 127.0.0.1
ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
route add default gw 192.168.1.1
这样在开机时,就自己设置了 IP 地址为:192.168.1.10
在/etc/profile 中加入:
alias ll='ls -l'
alias mntnfs='mount -t nfs -o nolock'
alias mntud1='mount -t vfat /dev/sda1 /mnt/udisk1'
alias umntud1='umount /mnt/udisk1'
alias mntsd='mount -t vfat /dev/mmcblk0p1 /mnt/sd'
alias umntsd='umount /mnt/sd'
alias 命令的作用是给一个命令取个别名,可以把较长的命令简化成简单易记的短命令,可以
根据自己的需要添加这里的内容。
(15)热插拔:
Linux 系统的热插拔机制可以识别插入的 U 盘或 SD 卡,并自动挂载到指定目录。
在 etc 目录下新建一个 hotplug 的目录,在其中分别创建 SD 卡和 U 盘的目录
在 sd 和 usb 目录下分别创建文件 sd_insert、 sd_remove、 udisk_insert、 udisk_remove
文件内容如下:
sd_insert:
mount -t vfat -o iocharset=cp936 /dev/mmcblk0p1 /mnt/sd
sd_remove:
umount /mnt/sd
udisk_insert:
mount -t vfat /dev/sda1 -o iocharset=cp936 /mnt/udisk1
udisk_remove:
umount /mnt/udisk1
在 etc 目录下创建 mdev.conf 文件,内容如下:
sd[a-z][0-9] 0:0 666 @/etc/hotplug/usb/udisk_insert
sd[a-z] 0:0 666 $/etc/hotplug/usb/udisk_remove
mmcblk[0-9]p[0-9] 0:0 666 @/etc/hotplug/sd/sd_insert
mmcblk[0-9] 0:0 666 $/etc/hotplug/sd/sd_remove
当插入 U 盘时, dev 目录下会生成 sda1 设备文件,这时第一条语句会触发后面所指向路径的
脚本 disk_insert,此脚本执行挂载 U 盘的动作
当拔出 U 盘时,第二条语句会触发后面所指向路径的脚本 udisk_remove,执行卸载 U 盘动作
同样,当插入 SD 卡, dev 目录下生成 mmclk0p1 设备文件,第三条语句触发 sd_insert 脚本,
挂载 SD 卡,拔出 SD 卡,第四条语句触发 sd_remove 脚本,卸载 SD 卡.
(15)其他建议:
一、设置开机自启动程序:可以在 etc/init.d/rcS 文件中加入要自启动的命令,如果要使程序在后台运行,在命令后加&
二、移植的应用程序一般放在 usr/bin 目录下
三、移植的库文件一般放在 usr/lib 目录下
四、用户目录(home/xgc)可以存放一些文档、图片、声音等文件
五、var 目录可存放 FTP 服务器的目录或存放 Web 服务器的网页脚本等
这篇关于使用busybox-1.28.0制作文件系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!