代码改变世界

【转】linux虚拟内核文件系统介绍

2011-10-27 15:46  shy.ang  阅读(1855)  评论(0编辑  收藏  举报

2.5 虚拟文件系统(sysfs,proc,tsmpfs等)
2.5.1 虚拟文件系统概述
2.5.2 proc 文件系统
2.5.3 sysfs文件系统
2.5.4 tmpfs文件系统
2.5.5 usbdevfs文件系统
2.5.6 devpts文件系统
2.5.1 虚拟文件系统概述
虚拟内核文件系统(Virtual Kernel File Systems),是指那些是由内核产生但并不存在于硬盘上(存在于内存中)的文件系统,
他们被用来与内核进行通信前面介绍的ext2,ext3,jffs2,yaffs2等目录和文件,都是真真正正、实实在在的存储在具体的外部存
储设备上的,它们可能是在本机的硬盘、闪存、光盘中,可能保存在不只一个磁盘分区中,也可能保存在网络中其它主机的存储设备中的。
虚拟文件系统,虽然它们出现在根文件系统中,但它里面的内容却无法在任何外部存储设备中找到,因为它们都在内存中。
==========
android 网络挂载:
rootfs / rootfs rw 0 0
/dev/root / nfs rw,vers=2,rsize=1024,wsize=1024,...
tmpfs /dev tmpfs rw,mode=755 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
/dev/block/mmcblk0p1 /sdcard vfat rw,...
===========
android 本机挂载(使用flash中的文件系统)
rootfs / rootfs ro 0 0
tmpfs /dev tmpfs rw,mode=755 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
/dev/block/mtdblock2 /system yaffs2 ro 0 0
/dev/block/mtdblock3 /data yaffs2 rw,nosuid,nodev 0 0
/dev/block/mmcblk0p1 /sdcard vfat rw
=============
ubuntu 系统:
/dev/sda8 on / type ext3 (rw,relatime,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
/proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
varrun on /var/run type tmpfs (rw,nosuid,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda7 on /boot type ext3 (rw,relatime)
/dev/sda11 on /home type ext3 (rw,relatime)
/dev/sdb5 on /opt type ext3 (rw,relatime)
/dev/sda9 on /usr/local type ext3 (rw,relatime)
/dev/sda1 on /windows/c type vfat (rw,utf8,umask=007,gid=1000)
/dev/sda5 on /windows/d type vfat (rw,utf8,umask=007,gid=1000)
/dev/sda6 on /windows/e type vfat (rw,utf8,umask=007,gid=1000)
===============
2.5.2 proc 文件系统
proc是一个重要虚拟文件系统,通过它里面的一些文件,可以获取系统状态信息并修改某些系统的配置信息。proc文件系统本身不占用
磁盘空间,它仅存在于内存之中,为操作系统本身和应用程序之间的通信提供了一个安全的接口。当我们在内核中添加了新功能或设备驱
动时,经常需要得到一些系统状态的信息,一般这样的功能可能需要经过一些象ioctl()这样的系统调用来完成。系统调用接口对于一些
功能性的信息可能是适合的,因为应用程序必须将这些信息读出后再做一定的处理。但对于一些实时性的系统信息,例如内存的使用状况,
或者是驱动设备的统计资料等,我们更需要一个比较简单易用的接口来取得它们。proc文件系统就是这样的一个接口,我们可以简单的用
cat、strings程序来查看这些信息。例如,执行下面的命令:
cat /proc/filesystems //操作系统支持的文件系统类型
cat /proc/meminfo //内存的实时信息,内存大小等
cat /proc/partitions //存储器分区信息
cat /proc/cpuinfo //查看cpu信息
同样的,free、df、top、ps等程序的功能实现,强烈依赖于proc文件系统,为了使用那些程序,一定要使内核支持proc文件系统,
并将其挂接到根文件系统的/proc目录下。
其他使用 /proc 文件系统的例子:
processor : 0
vendor_id : AuthenticAMD
processor : 1
vendor_id : AuthenticAMD
model name : AMD Athlon(tm) 64 X2 Dual Core CPU 5000+
1.vmware 虚拟机无法正常启动
在Linux下,单个进程的最大内存使用量受/proc/sys/kernel/shmmax中设置的数字限制(单位为字节),
例如 ubuntu 8.10 的shmmax默认值为33554432字节(33554432bytes/1024/1024=32MB)。
2.scratchbox 开发工具不能登录
/scratchbox/login 
Inconsistency detected by ld.so: rtld.c: 1192: dl_main: Assertion `(void *) ph->p_vaddr == 
_rtld_local._dl_sysinfo_dso' failed!
NOTE: on Ubuntu installation, you have to disable VDSO to make Scratchbox work fine, 
or you'll get errors like this:
在 ubuntu 系统中,我们必须关闭 VDSO 标记,以便scratchbox能正常工作
echo 0 | sudo tee /proc/sys/vm/vdso_enabled
echo 4096 | sudo tee /proc/sys/vm/mmap_min_addr
vm.vdso_enabled = 0
vm.mmap_min_addr = 4096
修改 /proc 文件系统值的方法
1.直接修改
echo "2147483648" | sudo tee /proc/sys/kernel/shmmax
echo 0 | sudo tee /proc/sys/vm/vdso_enabled
echo 4096 | sudo tee /proc/sys/vm/mmap_min_addr
2.将以下命令放入 /etc/rc.local 启动文件中:
echo "2147483648" > /proc/sys/kernel/shmmax
echo 0 > /proc/sys/vm/vdso_enabled
echo 4096 > /proc/sys/vm/mmap_min_addr
3.使用 sysctl 命令来更改 SHMMAX 的值:
sysctl -w kernel.shmmax=2147483648
4.内核参数插入到 /etc/sysctl.conf 启动文件中,使这种更改永久有效
echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf 
sudo sysctl –p
./system/core/logcat/logcat.cpp:403: fd = open("/proc/cmdline", O_RDONLY);
./system/core/init/init.c:553: char cmdline[1024];
./system/core/init/init.c:557: fd = open("/proc/cmdline", O_RDONLY);
./system/core/init/init.c:580: chmod("/proc/cmdline", 0440);
./system/core/init/bootchart.c:139: proc_read("/proc/cmdline", cmdline, sizeof(cmdline));
./system/core/init/bootchart.c:319: proc_read( "/proc/cmdline", cmdline, sizeof(cmdline) );
./system/core/init/bootchart.c:320: s = strstr(cmdline, KERNEL_OPTION);
./system/core/rootdir/init.rc:162: chown root radio /proc/cmdline
2.5.3 sysfs文件系统
与proc文件系统类似,sysfs文件系统也是一个不占有任何磁盘空间的虚拟文件系
统。它通常被挂接在/sys目录下。sysfs文件系统是Linux2.6内核引入的,它把连接在系
统上的设备和总线组织成为一个分级的文件,使得它们可以在用户空间存取。其实
sysfs是从proc和devfs中划分出来的。
一、devfs
linux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种。
在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道
/dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件
系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互。但是devfs文件系统有一些缺点,例如:
不确定的设备映射,有时一个设备映射的设备文件可能不同,例如我的U盘可能对应sda有可能对应sdb;没有足够的主/辅设备号,当设备过多
的时候,显然这会成为一个问题;/dev目录下文件太多而且不能表示当前系统上的实际设备;命名不够灵活,不能任意指定等等。
二、sysfs
正因为上述这些问题的存在,在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟devfs一样它也是一个
虚拟文件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用
这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个
kobject被创建的时候,对应的文件和目录也就被创建了,位于/sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也
就可以被用户空间读写了。用户空间的工具udev 就是利用了sysfs提供的信息来实现所有devfs的功能的,但不同的是udev运行在用户空间中,
而devfs却运行在内核空间,而且udev不存在 devfs那些先天的缺陷。很显然,sysfs将是未来发展的方向。
2.5.4 tmpfs文件系统
tmpfs 是Linux特有的文件系统,唯一的标准挂接点是/dev/shm。当然,用户可以将其挂接在其他地方。tmpfs有些像虚拟磁盘(ramdisk),
但不是一回事。说其像虚拟磁盘,是因为它可以使用你的RAM,但它也可以使用你的交换分区。传统的虚拟磁盘是一个块设备,而且需要一个mkfs
之类的命令格式化它才能使用。tmpfs是一个独立的文件系统,不是块设备,只要挂接,立即就可以使用。tmpfs的大下是不确定的,它最初只有
很小的空间,但随着文件的复制和创建,它的大小就会不断变化,换句话说,它会根据你的实际需要而改变大小;tmpfs的速度非常惊人,毕竟它
是驻留在RAM中的,即使用了交换分区,性能仍然非常卓越;由于tmpfs是驻留在RAM的,因此它的内容是不持久的,断电后,tmpfs的内容就消
失了,这也是被称作tmpfs的根本原因。
tmpfs 是ramfs的衍生物,用来限制缓存大小、向swap空间写入数据。它是用来保存VM所有文件的文件系统。
tmpfs中缓存的内容全部是临时的。一旦卸载,所有的内容都会遗失。它把所有的缓存置于内核,它的规模随着
文件的规模同步变化。但是它规模有大小限制,可以修改。它可以把当前不再需要的页写入到 swap空间。
tmpfs 和 ramfs 本身就是一个文件系统, 用的时候只需要直接挂载就可以. tmpfs可以使用ram, 也可以使用swap
共享内存的时候会使用tmpfs
系统默认共享内存是内存的一半大小! /dev/shm是挂载点!
通过 df -h 可以看出,默认状况下它为内存大小的一半:
文件系统 容量 已用 可用 已用% 挂载点
tmpfs 1013M 12K 1013M 1% /dev/shm
mount | grep tmpfs 显示当前系统中的 tmpfs:
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
varrun on /var/run type tmpfs (rw,nosuid,mode=0755)
varlock on /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
lrm on /lib/modules/2.6.27-4-generic/volatile type tmpfs (rw,mode=755)
2.5.6 usbdevfs文件系统
顾名思义,usbdevfs就是USB设备文件系统,它是一个动态生成的文件系统,有
些类似于proc文件系统。它的标准挂接点是/proc/bus/usb,当然,也可以挂接到其他
地方。它主要用于:用户级驱动、即插即用、提供USB设备信息、应用程序轮询
USB设备的变化等。
2.5.7 devpts文件系统
devpts文件系统为伪终端提供了一个标准接口,它的标准挂接点是/dev/pts。只要
pty的主复合设备/dev/ptmx被打开,就会在/dev/pts下动态的创建一个新的pty设备文
件。挂接时,UID、GID及其工作模式会指定给devpts文件系统的所有pty文件。这可
以保证伪终端的安全性。
讨论devpts文件系统的详细内容,已经超过本文范围,还请读者参考其他专
著。
2.6 一些必要重要的系统文件 ( /etc/fstab ,inittab,init.rc等)
2.6.1 /etc/inittab
2.6.2 /etc/init.d/rcS
2.6.3 /etc/fstab 文件