1.文件系统的一般定义是
负责管理和存储文件信息的软件系统
2.文件系统的功能
1.负责存储器中文件的组织和分配
2.提高对存储器资源的利用效率
3.将文件的存取、共享、和保护等功能提供给操作系统和用户
4.简化用户对文件的各项操作
5.保证在多用户环境下文件的安全性和一致性
文件系统是操作系统的重要组成部分,是实现文件多元化管理的必要条件。
3.虚拟文件系统
为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统--VFS(Virtual File System), 为各类文件系统提供统一的操作界面和应用编程接口。
VFS并不是一种实际的文件系统, 它是物理文件系统与服务之间的一个接口层
VFS只存在于内存中, 不存在于任何外存空间
VFS在系统启动时建立, 在系统关闭时消亡
4.Linux根文件系统标准目录
QQ截图20181024111933.png5.使用busybox制作跟文件系统
0.准备工具
0.0. busybox-1.29.3:或选用其他版本的 busybox,大同小异
0.1. 下载地址:http://www.busybox.net/
0.2. 交叉编译器安装:sudo apt-get install gcc-arm-linux-gnueabihf
1.构建目录结构
1.0. 创建根文件系统目录,主要包括以下目录:
/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin
/sbin /opt /sys /media
1.1. 命令:
mkdir $HOME/rootfs
cd $HOME/rootfs
mkdir dev etc lib usr var proc tmp home root mnt bin sbin opt sys media
*rootfs目录位置可根据自己实际需求放置,只要保证路径中国无中文字符与特殊字符即可*
2.使用busybox构建 /bin /sbin linuxrc
2.1. 解压busybox
tar -jxvf busybox-x.xx.x.tar.bz2
cd busybox-x.xx.x/
2.2. 使用busybox的默认配置
make defconfig
*使用默认配置 busybox,大部分的命令都会被选中*
make menuconfig
*如果此过程中出错多半是因为加载库文件失败导致, 使用命令sudo apt-get install libncurses5-dev 安装ncurses5即可*
进入Settings ---> 找到 ---Build Options
选中Build static binary (no shared libs)
选中Cross compiler prefix,设置交叉编译前缀为 arm-linux-gnueabihf-
向下滑动找到 ---Library Tuning
选中Username completion
选中Fancy shell prompts
选中Query cursor position from terminal
按左右键选中Exit退出到最后一层,选择Save Configuration to an Alternate File保存
最后选择Exit退出界面
2.3.make
2.4.make install
2.5.完成在 busybox 目录下会看见 _install 目录,里面有 bin sbin usr linuxrc 四个文件与目录,
将这三个目录或文件拷到第 1 步所建的 rootfs 文件夹下,
命令:cp bin sbin usr linuxrc $HOME/rootfs -rfav
*-a 的参数必不可少,因为 bin sbin 里面的命令大多是到 busybox 的动态链接,
如果不加-a 则拷贝过程中会自动将每个命令复制一份*
**************************************************************************
* 到这里就实现了跟文件系统的基本工作,文件系统就可以正常使用了 *
**************************************************************************
3.构建 /lib 目录
进入 /usr/arm-linux-gnueabihf/lib/ 目录,将以下动态库拷贝到$HOME/rootfs/lib 下
命令:cp *so* $HOME/rootfs/lib -av
4.构建 /etc 目录
4.1./etc 目录下最重要的四个文件
inittab:用来作为 linuxrc 的配置脚本。
init.d/rcS:inittab 启动的第一个脚本,一般用来挂载系统必需的文件系统,必要的设备连接,设置 IP 地址,启动其他脚本等。默认仅有 mount –a
fstab:执行 mount –a 时,按照此文件挂载文件系统。
profile:登陆完 shell 后自动执行此脚本,一般用来配置用户的登录环境。
4.2.进入根文件系统 rootfs 的 etc 目录,执行如下操作:
拷贝 Busybox 目录下 examples/bootfloopy/etc/ 下的所有文件到当前目录下,以此为模板构建我们的根文件系统。
命令:cd $HOME/rootfs/etc
cp -rv ../../busybox-1.29.3/examples/bootfloppy/etc/ * .
4.3.修改 inittab
inittab 的作用及格式请参考其他说明
删除第三行代码:tty2::askfirst:-/bin/sh
命令:vi inittab
将第三行删除或者在本行最前面加一个#将其注释
4.4.修改 init.d/rcS 文件
init 进程通过 inittab 启动的第一个进程为此脚本,我们需要做以下修改:
命令:vi init.d/rcS 或 gedit init.d/rcS
将下列信息覆盖到打开的文件中
#! /bin/sh
#1.根据 fstab 配置文件挂载相应的文件系统
/bin/mount -a
#2.配置 telnetd 服务器的时候需要以下文件夹及文件系统
/bin/mkdir -p /dev/pts
/bin/mkdir -p /dev/shm
/bin/mount -t devpts devpts /dev/pts
/bin/mount -t tmpfs tmpfs /dev/shm
#3.启动需要以下文件夹
/bin/mkdir /var/tmp
/bin/mkdir /var/modules
/bin/mkdir /var/run
/bin/mkdir /var/log
#4.在 lib 下创建相应文件夹(与当前内核版本相同) ,为驱动模块加载作准备
if ! [ -d /lib/modules ]; then
mkdir /lib/modules
fi
if ! [ -d /lib/modules/$(uname -r) ]; then
mkdir /lib/modules/$(uname -r)
fi
#5.自动在/dev 下创建设备节点
/sbin/mdev -s
5.修改 fstab 文件,将一下内容替换源文件fstab 中的内容
#device mount-point type options dump fask order
proc /proc proc defaults 0 0
ramfs /var ramfs defaults 0 0
ramfs /tmp ramfs defaults 0 0
none /sys sysfs defaults 0 0
none /dev ramfs defaults 0 0
6.修改 profile,将一下内容填写到profile的第五行位置
#1.初始化 PATH 环境变量及动态链接库路径
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
#2.初始化主机名以及当前工作路径
/bin/hostname TechManZhang
USER="`id -un`"
LOGNAME=$USER
HOSTNAME='/bin/hostname'
PS1='[\u@\h \W]# '
6.用户名、密码文件构建(这步可以不做,一般开发板都不带密码)
拷贝虚拟机上的/etc/passwd, /etc/group, /etc/shadow 到 rootfs/etc 下。
命令:
cp /etc/passwd $HOME/rootfs/etc
cp /etc/group $HOME/rootfs/etc
cp /etc/shadow $HOME/ rootfs/etc
对以下三个文件修改,只保存与 root 相关的项(每个文件的第一行)只保留 passwd 第一行,为:
root:x:0:0:root:/root:/bin/sh
(而且最后改成/bin/ash,PC 使用 bash 作为默认 shell,嵌入式系统不支持 bash,这里改为 sh 或 ash)只保留 group 第一行,为:
root:x:0:root
只保留 shadow 第一行,为:
root:$1$x9yv1WlB$abJ2v9jOlOc9xW/y0QwPs.:14034:0:99999:7:::
(注意这个值不一定一样,各人密码不一样,这个值也不一样,这个的密码是六个1:111111)这个文件在本地登录或者 ftp、telnet 登录时起作用打开/etc/inittab
把第二行:::respawn:-/bin/sh
改为::respawn:-/bin/login //登录时需要用户名、密码验证
这样,以后登陆开发板时需输入用户名密码,同虚拟机相同
登陆后可以通过 passwd 命令修改密码或通过 adduser 增加新用户
至此,根文件系统制作完毕
6.根文件系统验证及镜像制作
验证根文件系统主要有两种方式:
1.通过 Nfs 启动根文件系统验证
2.制作镜像烧写到开发板中验证
6.1.nfs 启动根文件系统
网络文件系统是 FreeBSD 支持的文件系统中的一种, 也被称为 NFS。 NFS允许一个系统在网络上与他人共享目录和文件。通过使用 NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。
在 u-boot 的配置界面按照以下格式,可设置 nfs 启动系统。
模板:
setenv bootargs ‘noinitrd root=/dev/nfs nfsroot=(虚拟机路径),rsize=1024,wsize=1024 ip=(开发板 iP):(服务器 ip):(网关):255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200’
注:服务器 ip 一般是虚拟机 ip
例子:
setenv bootargs ‘noinitrd root=/dev/nfs nfsroot=/home/zhang/MyShare/04_day/rootfs_test_2,rsize=1024,wsize=1024 ip=10.0.108.117:10.0.108.229:10.0.108.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 , 115200’
saveenv
如果想恢复本机 emmc 启动,请输入:
setenv bootargs 'noinitrd root=/root=/dev/mmcblk0p2 rwrootfstype=ext4 init=/linuxrc lcd=wy070ml tp=gslx680'
saveenv
6.2.制作文件系统镜像
用 make_ext4fs 制作 ext4 文件系统镜像
tar xvf mkfs_ext4.tar.gz
cp make_ext4fs /bin/make_ext4fs
sudo chmod 777 $HOME/rootfs/ -R
制作 ext4 镜像
make_ext4fs -s -l 314572800 -a root -L linux gtk.img /home/edu/rootfs
网友评论