1.Linux目录结构
2. /boot/
存放系统内核文件,如vmlinuz,initrd,System.map等。其中,
a. vmlinuz是可引导的、压缩的内核,“vm”即“Virtual Memory”;
b. initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在linux内核启动前, bootloader 会将存诸介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。第一阶段启动的目的是为第二阶段的启动扫清一切障碍,最主要的是加载根文件系统存储介质的驱动模块。initrd是“initial ramdisk”的简写。
c. system.map是一个特定内核的内核符号表。在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号。Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名。比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。(以上描述摘自WEB)
[2]中指出系统启起时文件的加载顺序是Kernel文件->initrd文件->其它系统模块文件,其中kernel文件用于让系统认识CPU、内存等信息,而initrd用于让系统知道哪些重要外设文件需要在启动时加载(比如硬盘),这里我的理解即是引导启动程序去哪里找这些诸如驱动的文件,当然initrd也可以让写入启动时要加载的模块,或执行一些特殊命,这取决于管理员的配置。但文中说的kernel文件具体指什么文件没有例举,一头雾水,我猜应该是vmlinux文件。[2]如下图所示描述加载顺序:
3. /dev,/proc,/sys
虚拟文件系统(VFS)是由Sun microsystems公司在定义网络文件系统(NFS)时创造的。它是一种用于网络环境的分布式文件系统,是允许和操作系统使用不同的文件系统实现的接口。虚拟文件系统(VFS)是物理文件系统与服务之间的一个接口层,它对Linux的每个文件系统的所有细节进行抽象,使得不同的文件系统在Linux核心以及系统中运行的其他进程看来,都是相同的。严格说来,VFS并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间。VFS在系统启动时建立,在系统关闭时消亡[4]
VFS的功能包括:纪录可用的文件系统的类型;将设备同对应的文件系统联系起来;处理一些面向文件的通用操作;涉及到针对文件系统的操作时,VFS把它们影射到与控制文件、目录以及inode相关的物理文件系统[4]。
当某个进程发布了一个面向文件的系统调用时,核心将调用VFS中相应的函数,这个函数处理一些与物理结构无关的操作,并且把它重定向为真实文件系统中相应的函数调用,后者则用来处理那些与物理结构相关的操作。
虚拟文件系统作为User Space与Kernel Space之间的桥梁,当用户的应用程序(Application)需要任何的硬件设备时,要先通过虚拟文件系统或系统模块,向Kernel请求支持。也就是说User Space中的应用程序无法直接和Kernel Space交互,必须通过中间的虚拟文件系统。
3.1 /dev目录
/dev目录放置所有设备文件,LINUX中设备以文件的形式展现给用户;其中,常用的设备文件直接放置/dev目录,其他设备文件则分类置于各个子目录下,如/dev/bus,/dev/disk等,可通过ls -l /dev | grep "^d"查询所有子目录。
/dev目录下的基本设备文件:
/dev/hd[a-t]:IDE设备,如IDE硬盘或光驱 /dev/sd[a-z]:SCSI设备,包括SATA硬盘等 /dev/fd[0-7]:标准软驱 /dev/md[0-31]:软raid设备 /dev/loop[0-7]:本地回环设备 /dev/ram[0-15]:内存 /dev/null:无限数据接收设备,相当于回收站 /dev/zero:无限零资源 /dev/tty[0-63]:虚拟终端,一般为远程终端 /dev/ttyS[0-3]:串口 /dev/lp[0-3]:并口 /dev/console:控制台 /dev/fb[0-31]:framebuffer /dev/cdrom => /dev/hdc /dev/modem => /dev/ttyS[0-9] /dev/pilot => /dev/ttyS[0-9]
/dev的子目录:
/dev/bus:根据不同的总线将硬件进行分类
/dev/disk:对所有硬盘按不同分类供用户查询,分类方式见诸三个目录by-id,by-uuid,by-path
/dev/input:输入设备的目录
/dev/VolGroup00:
/dev/mapper:
/dev/net:默认只有tun文件,用来建立VPN通道
/dev/pts:pts全名Pseudo-terninal slave,和终端相关的设备文件
/dev/shm:shm(share memory)提供分享内存的一种机制,以tmpfs的方式
/dev/snd:
3.2 /dev/proc
程序信息与系统设置目录,由procfs(process file system)产生,也是虚拟文件系统(procfs格式),提供系统一些实时的信息,包括主机硬件信息、系统配置信息等,可通过更改这些文件来修改系统配置(如修改网络配置)、调整系统内存和性能、调整系统执行时的参数等。
The proc file system is a pseudo-file system which is used as an interface to kernel data structures. It is commonly mounted at /proc. Most of it is read-only, but some files allow kernel variables to be changed[3] .
上述这段描述引自man手册,可以知道proc下文件提供内核数据结构的接口(比较难懂),大部分文件是只读的,有些是可配置的。
3.3 /dev/sys
由sysfs(system file system)文件系统建立,为用户访问kernel对象、属性提供接口,所有系统信息以类的方式的呈现给用户。具体分类包括:
/dev/block:以块设备分类信息,例如内存、硬盘、光驱 /dev/bus:以主板上的总线类型分类,例如serie、pci /dev/class:按功能进行分类,例如网卡、打印机 /dev/devices:? /dev/firmware:kernel默认支持的固件信息,可看成默认支持的驱动 /dev/fs:存放sysfs对象信息 /dev/kernel:内核信息 /dev/module:系统加载的模块信息 /dev/power:电源相关信息
参考文献
[1] http://proton.pathname.com/fhs/
[2] 邱世华. 《系统架构与目录解析》(烂书,建议别买,本人深受其害,虽出自国人之手,但内容与售价完成不符)
[3] man手册. http://man.he.net/
[4] 百度百科. http://baike.baidu.com/view/671797.htm?func=retitle