文件结构是文件存放在磁盘等存贮设备上的组织方法。主要体现在对文件和目录的组织上。

  目录提供了管理文件的一个方便而有效的途径。

  Linux使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。

                      /根目录

                              ┃

┏━━┳━━━┳━━━┳━━━╋━━━┳━━━┳━━━┳━━━┓

┃   ┃      ┃     ┃     ┃     ┃      ┃     ┃     ┃

bin  home    dev     etc     lib     sbin    tmp      usr    var

                      ┃                               ┃

                  ┏━┻━┓     ┏━━┳━━┳━━┳━┻━┳━━┓

                  ┃      ┃    ┃   ┃    ┃    ┃     ┃    ┃

                 rc.d   cron.d X11R6  src   lib   local    man  bin

                  ┃                              

┏━━━┳━━┳━┻━┳━━━┓        

┃      ┃    ┃      ┃      ┃

init.d rc0.d  rc1.d  rc2.d …… linux bin lib src

  Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。微软的DOS和windows也是采用树型结构,但是在DOS和 windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,他们之间的关系是并列的。但是在linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。从结构上讲,各个磁盘分区上的树型目录不一定是并列的。

  如果这样讲不好理解的话,我来举个例子:

  有一块硬盘,分成了4个分区,分别是/;/boot;/usr和windows下的fat

  对于/和/boot或者/和/usr,它们是从属关系;对于/boot和/usr,它们是并列关系。

  如果我把windows下的fat分区挂载到/mnt/winc下,(挂载??哦,别急,呵呵,一会就讲,一会就讲。)那么对于/mnt/winc和/usr或/mnt/winc和/boot来说,它们是从属于目录树上没有任何关系的两个分支。

  因为linux是一个多用户系统,制定一个固定的目录规划有助于对系统文件和不同的用户文件进行统一管理。但就是这一点让很多从windows转到linux的初学者感到头疼。下面列出了linux下一些主要目录的功用。

根文件系统

/boot 系统启动相关的文件

/dev 设备文件

块设备:随机访问,按照数据块进行访问

字符设备线性访问 ,按字符为单位

特殊文件没有大小,只有元数据,所以ls显示出来信息没有大小,只有主设备号major次设备号(minor

/home 用户的家目录

/root root用户的家目录

/lib 库文件

静态库 *.a 静态库直接链接到程序的地址空间,作为程序的一部分

动态库 .so 

/lib/modules 内核模块文件

/media/mnt 挂载点目录

/opt 可选目录

/proc 伪文件系统空目录显示的文件内核的映射文件

/sys 伪文件系统,跟硬件设备相关的属性映射文件

/tmp 临时文件,/var/tmp

/var 可变化文件

/bin 可执行文件,用户命令

/sbin 管理命令,

/usr 全局共享只读文件

详细说明

    /boot 是Linux系统在本地启动时一个非常重要的目录,其中的文件有:

(1)config 系统Kernel的配置文件

(2)initrd*.img文件是Linux在启动过程中内核使用的临时文件系统。该文件系统为挂载真正的文件系统做准备。可以通过一下方式解压出来:

# mkdir ~/initrd
# cp /boot/initrd ~/initrd
# cd ~/initrd
# mv initrd initrd.gz
# gunzip initrd.gz
# cpio -idmv < initrd

spacer.gif

Linux内核可以将设备驱动以模块形式加载,但是模块本身可能存储在SCSI或者RADI上,要想访问这些设备又需要先加载驱动,这就出现了“鸡和蛋”问题。当然不用模块,全部编译进内核,就像早期Linux那样,就不会出现这个问题了。initrd的引入可以使我们既得到模块带来的好处又解决上述问题。initrd在grub引导时通过BIOS载入内存。initrd除了内核模块外,还有引导系统的bash脚本。

/sbin/installkernel中有这么几行,在编译完内核后重新制作initrd。其实编译完内核后不更新initrd也是可以的。要想知道怎么制作的initrd,可以看看bash脚本/sbin/mkinitrd。如果没有这两个命令,确认是否安装了mkinitrd软件包。

(3)vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行 的Linux内核,它位于/boot/vmlinuz

(4)initramfs*.img是initrd的进化版本

(5)system.map sysmbols的索引。什么是Symbol?其实就是kernel中的变量(Variable Name)或函数名称(Function Name),这样可以方便程序员在写程序时可以直接参照这一份Symbol的索引文件,找到所需要的kernel信息,这一份Symbol的索引文件又称为kernel symbol table。编译内核时,

System.map文件用于存放内核符号表信息。符号表是所有内核符号及其对应地址的一个列表,随着每次内核的编译,就会产生一个新的对应System.map文件,当内核运行出错时,通过System.map中的符号表解析,就可以查到一个地址值对应的变量名,或反之。利用System.map,在内核或相关程序出错时,就可以获得我们比较容易识别的信息。System.map位于使用它的软件(例如内核日志记录后台程序klogd)能够找到的地方。在系统启动时,如果没有以一个参数的形式为klogd给出System.map的位置,则klogd会在三个地方寻找System.map: 

/boot/System.map

/System.map

/usr/src/linux/System.map

尽管内核本身实际上不使用System.map,但其它程序,像klogd、lsof、ps以及其它像dosemu等许多软件都需要有一个正确的System.map文件。利用该文件,这些程序就可以根据已知的内存地址查找出对应的内核变量名称,便于对内核的调试工作。

(6)symvers.gz  保存着内核中所有符号的crc值

(7)grub目录  系统引导启动目录

/dev是设备目录,存放的不是驱动程序,而是Linux中设备文件的访问接口。分为字符设备和块设备,有以下设备:

       /dev/hd[a-t]:IDE设备

  /dev/sd[a-z]:SCSI设备

  /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/random:随机数设备

  /dev/urandom:随机数设备