您的位置:首页 > 运维架构 > Linux

linux虚拟内核文件系统介绍

2012-05-29 17:32 441 查看
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 文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: