busybox根文件系统mdev的详解

2019-07-13 02:59发布

原文连接:http://7071976.blog.51cto.com/7061976/1385965

本文参考《嵌入式linux应用开发完全手册》部分内容
mdev是udev的简化版本,它也是通过读取内核信息来创建设备文件
一、mdev的用途:
  1、 初始化/dev目录、动态更新
       1.1、动态更新不仅是更新/dev目录,还支持热插拔,即支持接入卸下设备时执行某些动作,insmod自动创建/dev/***(class_create,class_device_create要自动创建设备必须依赖udev或mdev)

二、配置init脚本自动运行命令
1、busybox文件目录中/doc/mdev.txt中写到
1 2 3 4 5 6 7 8 9 Here's a typical code snippet from the init script:/*/etc/init.d//rcS*/     [1] mount -t sysfs sysfs /sys     [2] echo /bin/mdev > /proc/sys/kernel/hotplug     [3] mdev -s     Of course, a more "full" setup would entail executing this before the previous     code snippet:     [4] mount -t tmpfs mdev /dev     [5] mkdir /dev/pts     [6] mount -t devpts devpts /dev/pts    所以在/etc/init.d/rcS 配置如下

1 2 3 4 5 6 7 #!/bin/sh     ifconfig eth0 192.168.1.17     mount -a     mkdir /dev/pts    #使用内存文件系统,减少对flash的读写     mount -t devpts devpts /devpts    #/dev/pts用来支持外部网络链接(telnet:远程访问摄像头)的虚拟终端     echo /sbin/mdev /proc/sys/kernel/hotplug    #设置内核,当有设备插拔时调用/bin/mdev程序     mdev -s #在/dev目录下生成内核支持的所有设备的节点 2、在busybox文件目录中/doc/mdev.txt还有如下关键说明

1 2 3 4 The simple explanation here is that   [1] you need to have /sys mounted before executing mdev.   [4] make sure /dev is a tmpfs filesystem (assuming you're running out of flash).   Then you want to [5] create the /dev/pts mount point and finally [6] mount the devpts filesystem on it    所以要修改/etc/fstab来自动挂载文件系统,修改etc/init.d/rcS加入要自动运行的命令。

1 2 3 4 5 6 7 /etc/fstab     # device     mount-point    type   options        dump  fsck order     proc           /proc        proc   defaults        0     0     tmpfs          /tmp         tmpfs  defaults        0     0     #添加部分     sysfs          /sys         sysfs  defaults        0     0     tmpfs          /dev         tmpfs  defaults        0     0
三、s3c2410、s3c2440的串口名是s3c_2410_serial0、s3c_2410_serial1、s3c_2410_serial2,而不是ttySAC0、ttySAC1、ttySAC2。需要修改/etc/inittab文件

1 2 3 4 5 # /etc/inittab    ::sysinit:/etc/init.d/rcS    s3c2410_serial0::askfirst:-/bin/sh    ::ctrlaltdel:/sbin/reboot    ::shutdown:/bin/umount -a -r
扩展1:
   1、linux有几种虚拟的文件系统类型(只存在于内核,在物理内存不存在,不过我们可以用挂载的方式将它在物理内存上进行映射,mount-t proc proc /proc;将cpu,mem等信息挂载在硬盘中),比如proc,sysfs,tmpfs,root
   2、proc是内核用的文件系统,用于显示内核信息及改变内核参数;
   3、sysfs文件系统用来管理和显示各种设备的运行参数及设备的层次结构。//能减少对flash的对写
   4、tmpfs:能解决临时的设备(/dev)或文件(/tmp)访问速度慢的缺点。
//由于原来/dev的是devfs文件系统
       4.1、是一种虚拟内存文件系统
       4.2、最大的特点就是它的存储空间在VM(virtual memory)里面
       4.3、VM由RM+Swap两部分组成,因此tmpfs最大的存储空间可达(The size of RM + The size of Swap)
       4.4、对于tmpfs本身而言,它并不知道自己使用的空间是RM还是Swap,这一切都是由内核的vm子系统管理的
       4.5、tmpfs默认的大小是RM的一半,假如你的物理内存是128M,那么tmpfs默认的大小就是64M
     4.6、使用:mount -t tmpfs -o size=20m tmpfs /mnt/tmp
     4.7、断电或者你卸载它之后,数据就会立即丢失
     4.8、tmpfs使用的是VM,因此它比硬盘的速度肯定要快,由于没有挂载之前/tmp目录下的文件也许正在被使用,因此挂载之后系统也许有的程序不能正常工作。没有关系,只要在/etc/fstab里面加上下面的语句:tmpfs /tmp tmpfs size=2m 0 0;重启电脑之后就一切OK了。

扩展2:/etc/fstab 的用途
/etc/fstab 是设定分割区分 mount 目录相关的档案,开机时会依这个档案的內容 mount 档案系統,mount 档案系統的命令为:
   linux# mount -av
   会依 /etc/fstab 的內容 mount 进"除了 root 以外的所有档案系統"。
   root 是在开机时由核心所 mount 进來的。root 先由核心 mount 成 read-only,然后由使用者手动 remount 成 read-write。


扩展3:init根据/etc/inittab配置文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络;
   init 是在核心 mount 进 root 后,第一個执行的程式 (第一个 process),init 所负责的工作包括:
执行 /etc/rc.d/rc?.d 里的 scripts
   将系统由开机状态 (boot-up state) 切换至多使用者状态 (multiuser state)
   负责进入 tty (本地端) 的 login shell
   负责开机与关机的程序 (procedure)。
扩展4:开机的执行上述文件的过程:
1、开机==>mount -t root root /root (此句内核自动执行)==> /etc/fstab ==> /etc/inittab ==> 执行/etc/rc.d/目录下的脚本(包括/etc/init.d/rcS)
2、linuxrc文件的作用

   2.1、在嵌入式Linux中,init进程的执行程序通常是二选其一.这两个执行程序分别是/sbin/init程序,或者是Busybox生成的linuxrc程序.init进程的作用即这个程序的功能.init进程具体运行哪个程序,则由uboot的环境变量bootargs决定,即init=/linuxrc.通常采用命令行参数"init=xxxx"指定某个程序作为init进程运行.比如,init=linuxrc.可以说,linuxrc程序的作用就是init进程的作用.
   2.2linuxrc是一个程序,它的执行流程如下所示.其中,如何解析inittab文件可以由用户设定,其它两个一般都不会修改.
     2.2.1、设置信号处理函数.
     2.2.2、初始化控制台.
    2.2.3、解析inittab文件. 扩展5:细说/etc/fstab
1、 /etc/fatab
   1.1、文件fstab包含了你的电脑上的存储设备及其文件系统的信息。它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件
   1.2、这个文件的全路径是/etc/fstab,fsck、mount、umount的等命令都利用该程序
   1.3、用fstab可以自动挂载各种文件系统格式的硬盘、分区、可移动设备和远程设备等 2、/ect/fstab参数解释
1.1、 指挂载设备或分区为何种文件系统类型
           典型 的名字包括这些:ext2, ext3, reiserfs, xfs, jfs, smbfs, iso9660, vfat, ntfs, swap和auto, 
'auto' 不是一个文件系统,而是让mount命令自动判断文件类型,特别对于可移动设备,软盘,DVD驱动器,这样做是很有必要的,因为可能每次挂载的文件
           类型不一致。

2.2、,选项,这部分是最有用的设置!!!
   它能使你所挂载的设备在开机时自动加载、使中文显示不出现乱码、限制对挂载分区读写权限。它是与mount命令的用法相关的
       推荐参数
            noatime   关闭atime特性,提高性能,这是一个很老的特性,放心关闭,还能减少loadcycle
       默认设置
defaults  使用默认设置。等于rw,suid,dev,exec,auto,nouser,async,具体含义看下面的解释。
        自动与手动挂载 auto  在启动或在终端中输入mount -a时自动挂载
           noauto 设备(分区)只能手动挂载 The file system can be mounted only explicitly.
       IO编码设置 
           iocharset=?;在=号后面加入你的本地编码,似乎在这个设备(分区)中做文件IO的时候就会自动做编码的格式转换。
           例如:你的某个分区是编码是utf8,而设备中文件的编码是gb2312,当是复制你设备中的文件到你的这个分区时,它将自动做编码转换
       读写权限
          umask=   这是关于读写权限的,好像比下面的ro,rw选项更管用!!!
          例如:umask=000或0222,使得挂载时option中有default,普通用户仍然能读写挂载设备中的东西。
              ro  挂载为只读权限
              rw   挂载为读写权限
       可执行
              exec     是一个默认设置项,它使在那个分区中的可执行的二进制文件能够执行。
                  noexec  二进制文件不允许执行。千万不要在你的root分区中用这个选项!!!
        I/O同步
              sync      所有的I/O将以同步方式进行
                  async  所有的I/O将以非同步方式进行
       用户挂载权限
              user  允许任何用户挂载设备。 Implies noexec,nosuid,nodev unless overridden.
              nouser  只允许root用户挂载。这是默认设置。
                  suid     Permit the operation of suid, and sgid bits. They are mostly used to allow users on a computer system to execute 
                   binary executables with temporarily elevated privileges in order to perform a specific task.
                  nosuid   Blocks the operation of suid, and sgid bits.