移植第五天(文件系统)

引导程序
Linux内核
文件系统

文件系统里面包含了Linux系统能够运行所必需的应用程序,库等
/:根目录
bin:存放所有用户都可以使用的基本命令(应用程序)
sbin:存放系统命令,只有管理员才能够使用。普通用户不直接使用,需要权限
usr:存放用户命令、文档等
dev:存放的是设备文件,设备文件是Linux系统特有的类型,linux系统中, 大部份的设备都是通过访问设备文件来实现的。
文件操作流程:

    fd1 = open("/home/tarena/test.c",权限);
    read(fd1,&buf1,size1);
    write(fd1,&buf2,size2);

    //串口操作
    fd2 = open("dev/serial0",权限);
    read(fd2,&buf3,size3);//从串口读取数据   接收
    write(fd2,&buf4,size4);//从串口写数据    发送

etc:存放各种配置文件
inittab:init进程的配置文件
fstab:当执行mount -a 命令时,用到的配置文件
lib:存放基本共享库,用于启动系统,运行根文件系统中的可执行程序
proc:是一个空目录,常作为proc文件系统的挂载点。proc文件是一个虚拟的文件系统,里面的目录,文件都是内核临时生成的,用来表示系统的运行状态。
这里写图片描述
如果把proc比作游轮,挂载就相当于游轮靠岸,卸载相当于离岸
sys:是一个空目录,常作为sys文件系统的挂载点。
mnt:是一个空目录,是临时挂载某个文件系统的挂载点
tmp:用于有存放临时文件,通常是空目录
home:用户目录
var:用于存放系统日志及一些服务程序的临时文件等

制作最小根文件系统?
必不可少的文件目录有:
bin:
sbin
usr
lib
dev

busybox开源软件包(瑞士军刀):将众多的命令集合进了一个很小的可执行程序,它与GNU工具相比,所提供的选项较少,但是能够满足一般应用
busybox为各种小型或者嵌入式系统提供了一个比较完整的工具集
busybox按照模块进行设计,可以容易加入,去除某些命令,或增减某些命令的选项。(可配置)

busybox用法参考这里写链接内容

busybox-1.19.4 -rf
tar  jxf busybox-1.19.4.tar.bz2
cd busybox-1.19.4
vi Makefile //修改里面的架构 ARCH ?= arm      CROSS_COMPILE ?= arm-linux-

1,修改顶层目录下的Makefile:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2,配置busybox并保存
make menuconfig
3,编译busybox
make
4,安装busybox
make install
5,查看当前目录会不会生成一个_install目录,
cd _install

bin/busybox
dev目录:如果没有dev目录,要先创建dev目录
手动创建设备文件,如: sudo mknod console c 5 1
mknod:创建节点
console:表示设备文件名
c: 表示字符设备。 字符设备(c)、块设备(b)、网络设备(通过套接字访问)
5:表示主设备号
1:表示次设备号

lib目录:
共享库
bin/busybox
arm-linux-readelf -d bin/busybox查看busybox所使用的共享库
这里写图片描述

重新启动开发板
修改环境变量bootargs
这里写图片描述

bootargs init = /bin/sh
init = /linuxrc
busybox 集成的init程序,它的源代码busybox-1.19.4/init/init.c
etc/inittab 配置文件
inittab配置文件语法格式:每个条目用来定义一个子进程,并确定它的启动方式:
:::
:省略
:省略
:表示程序如何执行,共有8种方式:
sysinit:表示系统启动后最先执行,只执行一次
wait:系统执行完sysinit进程之后,再执行,只执行一次
once:系统执行完wait进程之后,再执行,只执行一次
respawn:系统执行完once进程之后,当监测到子进程退出时,重新启动
askfirst:系统执行完respawn进程之后,与respawn相似,输出”please press enter to active this console”
shutdown:当关机时执行
restart:重启时执行
ctrlaltdel:按下ctrl+alt+del组合键时执行
:要执行的程序,它可是程序,也以是脚本. 如果-,表示是一个可交互的程序

etc inittab案例:

mkdir etc
cd etc
sudo vi initab

initab文件:

::sysinit:echo "hello embedded!"
::askfirst:-/bin/sh
::shutdown:/bin/umount -a
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::shutdown:/bin/umount -a
mkdir init.d
cd init.d
sudo vi rcS
//rcS文件内容
echo "hello embedded!!"
/bin/mount -a
sudo chmod 777 rcS

mount -a执行过程中,用到/etc/fstab配置文件

cd etc
sudo vi fstab

``
fstab文件格式:
device mount-point type options  dump fsck-order
device:设备文件,就是要挂载的设备
mount-point:挂载点
type:文件系统的类型
options :挂载的参数 
dump:0 
fsck-order:0

fstab文件内容:

proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0


几个配置文件的关系如图:
![这里写图片描述](https://img-blog.csdn.net/20161220134415204?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUFowNjA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

验证文件系统:

tarena#print bootargs
tarena#setenv bootargs init=/linuxrc console=ttySAC0 nfsroot=192.168.1.8:/home/tarena/workdir/tools.busybox-1.19.4/_install ip=192.168.1.6:192.168.1.8:192.168.1.1:255.255.255.0::eth0:on
tarena#save

tarena#re 

文件系统类型:
1,网络文件系统(NFS)
2,基于Flash的文件系统
jfs2 cramfs yaffs romfs等等
3,基于RAM的文件系统
ramdisk initramfs

cramfs文件系统
cd busybox-1.19.4
sudo mkfs.cramfs _install rootfs.cramfs
cp rootfs.cramfs /tftpboot

cramfs:
使得Linux内核支持cramfs文件系统类型
cd linux-2.6.35.7
make menuconfig
File system ->
[*]Miscellaneous filesystems—>
<*>Compressed ROM file system support(carmfs)
make zImage
cp arch/arm/boot/zImage /tftpboot

启动开发板,进入命令模式:

tarena#tftp 0x20008000 zImage //烧内核
tarena#nand erase 0x500000 0x500000
tarena#nand wirte 0x20008000 0x500000 0x500000
tarena#tftp 0x20008000 rootfs.cramfs  //烧文件系统
tarena#nand erase 0xa00000 0x1000000
tarena#nand wirte 0x20008000 0xa00000 0x1000000
tarena#setenv bootcmd nand read 0x20008000 0x500000\;bootm  0x20008000
tarena#setenv bootargs root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 rooftstype=cramfs

拔掉网线

基于RAM的文件系统:
ramdisk
ramdisk:是将一部分固定大小的内存当做分区来使用。它并非是一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为文件系统。

这里写图片描述

制作ramdisk文件系统(在ubuntu中做)

//生成initrd.img,8M,初始化为0
sudo dd if=/dev/zero   of=initrd.img bs=1k count=8192
//将8M initrd.img格式成 ex2类型文件系统
sudo mkfs.ext2 -F initrd.img   
mkdir /mnt/initrd
//将ext2类型的init.img文件系统挂载到/mnt/initrd
sudo mount -t ext2 -o loop initrd.img  /mnt/initrd

cd busybox-1.19.4
sudo cp _install/*  /mnt/initr.img
sudo umount /mnt/initrd
gzip --best -c initrd.img>ramdisk.img
cp ramdisk.img /tftpboot

内核支持ramdis类型文件
cd linux-2.6.35.7
make menuconfig–>
Device Driver—->
[*] Block devices—>
(16)Default number of RMA disks
(8192)Default RMA disks size(kbytes)
make zImage

修改环境变量

tarena#setenv bootcmd 'tftp 0x20008000 zImage;ftfp 0x50800000 ramdisk.img;bootm 0x20008000' 
tarena#setenv bootargs root=/dev/ram rw initrd=0x50800000,8M
tarena#saveenv

initamfs文件制作:基于RAM

cd linux-2.6.35.7
make menuconfig
      General setup--->
         [*]Initial RAM filessytem and RAM disk(initramfs/initrd)support

 Initramfs source file(s)
 make zImage
 cp arch/arm/boot/zImage     /tftpboot
 sudo chmod 777 .ash_history

修改环境变量

tarena#setenv bootcmd 'tftp 0x20008000 zImage;ftfp 0x50800000 ramdisk.img;bootm 0x20008000' 
tarena#setenv bootargs root=/dev/ram rdinit=/linuxrc console=ttySAC0,115200
tarena#saveenv

小结
文件系统:
_install/*
网络文件系统
基于Flash cramfs
基于RAM

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Busybox创建nfs文件系统 1、解压busybox-1.19.4.tar.bz2 修改Makefilez中的ARCH和CROSS_COMPILE与本机的路径一致: CROSS_COMPILE ?= /opt/crosstool/bin/arm-s3c2410-linux-gnu- ... ARCH ?= arm 2、编译busybox。先make menuconfig,修改以下: Busybox Settings ---> Build Options ---> Build BusyBox as a static binary (no shared libs) //直接编译成静态库,省事点 (/opt/crosstool/bin/arm-s3c2410-linux-gnu-) Cross Compiler prefix //这里和Makefile里保持一致,应该写一处就行了 Installation Options ---> Don't use /usr //不用本机的目录 Shells ---> Choose your default shell (ash) ---> //这里选择shell为ash,应该是默认选中的 --- ash //把ash这档的选项全部选上 保存退出,直接make,make install。 3、用shell脚本创建根文件系统的目录结构,并在想要建立根文件系统的地方运行此脚本。我是用root用户登陆的,直接创建了设备节点。 [root@Sure root-s3c2410]# vim makedir.sh #!/bin/sh echo "makeing rootdir" mkdir rootfs cd rootfs echo "makeing dir: bin dev etc lib proc sbin sys usr" mkdir bin dev etc lib proc sbin sys usr #8 dirs mkdir usr/bin usr/lib usr/sbin lib/modules #Don't use mknod, unless you run this Script as mknod -m 600 dev/console c 5 1 mknod -m 666 dev/null c 1 3 echo "making dir: mnt tmp var" mkdir mnt tmp var chmod 1777 tmp mkdir mnt/etc mnt/jiffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/log var/run var/tmp chmod 1777 var/tmp echo "making dir: home root boot" mkdir home root boot echo "done" 执行这个sh: [root@Sure root-s3c2410]# sh makedir.sh 创建出一个主文件夹rootfs,里面有一批文件: [root@Sure rootfs]# ls bin boot dev etc home lib mnt proc root sbin sys tmp usr var 4、把busybox源码目录下的etc的内容拷贝到这里的etc下 [root@Sure rootfs]# cd etc/ [root@Sure etc]# cp -a /home/jacky/busybox-1.11.1/examples/bootfloppy/etc/* ./ 5、修改拷贝过来的profile文件 [root@Sure etc]# vim profile # /etc/profile: system-wide .profile file for the Bourne shells echo "Processing /etc/profile" # no-op # Set search library path echo " Set search library path" export LD_LIBRARY_PATH=/lib:/usr/lib # Set user path echo " Set user path" PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH # Set PS1 echo " Set PS1" HOSTNAME=`/bin/hostname` # 此处让shell提示符显示host名称的。是`,不是’,要注意 # 会在进入根系统后显示Jacky export PS1="\\e[32m[$USER@$HOSTNAME \\w\\a]\\$\\e[00;37m " # 此处\\e[32m是让后面的“[$USER@$HOSTNAME \\w\\a]”显示为绿色 # \\e[00是关闭效果 # \\e[05是闪烁 # 37m是让后面的显示为白色 # 多个命令可以;号隔开 echo "All done!" echo 6、修改初始化文件inittab和fstab [root@Sure etc]# vim inittab ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::restart:/sbin/init tty2::askfirst:-/bin/sh ::ctrlaltdel:/bin/umount -a -r ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff –a [root@Sure etc]# vim fstab proc /proc proc defaults 0 0 none /tmp ramfs defaults 0 0 mdev /dev ramfs defaults 0 0 sysfs /sys sysfs defaults 0 0 7、修改初始化的脚本文件init.d/rcS [root@Sure etc]# vim init.d/rcS #! /bin/sh echo "Processing etc/init.d/rc.S" #hostname ${HOSTNAME} echo " Mount all" /bin/mount -a echo " Start mdev...." /bin/echo /sbin/mdev > proc/sys/kernel/hotplug mdev -s echo "****************************************************" echo " RootFS by NFS, s3c2410" echo " Created by Jacky Xu @ 2008.7.13" echo " Enjoy it!!!" echo "****************************************************" echo 8、创建一个空的mdev.conf文件,在挂载根文件系统时会用到的 [root@Sure etc]# touch mdev.conf 9、从本机拷贝passwd、shadow、group文件。 [root@Sure etc]# cp /etc/passwd . [root@Sure etc]# cp /etc/shadow . [root@Sure etc]# cp /etc/group . 修改passwd文件,把第一行和最后一行的bash修改成ash。 10、把busybox默认安装目录中的文件全部复制到这里的rootfs中。会发现多了linuxrc -> bin/busybox文件,这是挂载文件系统需要执行的。 [root@Sure etc]# cd .. [root@Sure rootfs]# cp -Rfv /home/jacky/busybox-1.11.1/_install/ ./ OK,以上用busybox创建了一个基本的文件系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值