linux文件系统 订阅
Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。 展开全文
Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。
信息
包含着
文件中的数据
数据的集合
介    绍
文件系统的结构
中文名
Linux文件系统
Linux文件系统创始人
Linus Torvalds林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)出生于芬兰赫尔辛基市。父亲尼尔斯·托瓦兹(Nils Torvalds)是一名活跃的共产主义者及电台记者。托瓦兹家族属于在芬兰占6%的少数民族芬兰瑞典人。他毕业于赫尔辛基大学计算机科学系,1997年至2003年在美国加州硅谷任职于全美达公司(Transmeta Corporation)参与该公司芯片的code morph技术研发。后受聘于开源码发展实验室(OSDL : Open Source Development Labs,Inc),全力开发Linux内核。现任职于Linux基金会。
收起全文
精华内容
下载资源
问答
  • Linux文件系统

    万次阅读 2017-03-31 13:16:05
    一、Linux文件系统 Linux以树状结构管理所有目录、文件,其他分区挂接在某个目录上,这个目录被称为挂接点或安装点,然后就可以通过这个目录来访问这个分区上的文件了。比如根文件系统被挂接在根目录“/”上后,在根...

    一、Linux文件系统

    Linux以树状结构管理所有目录、文件,其他分区挂接在某个目录上,这个目录被称为挂接点或安装点,然后就可以通过这个目录来访问这个分区上的文件了。比如根文件系统被挂接在根目录“/”上后,在根目录下就有根文件系统的各个目录、文件:/bin、 /sbin 、 /mnt等;再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录、文件。

    在一个分区上存储文件时,需要遵循一定的格式,这种格式称为文件系统类型,比如fat16、fat32、ntfs、ext2、ext3、jffs2、yaffs等。除了这些拥有实实在在的存储分区的文件系统类型外,Linux还有几种虚拟的文件系统类型,比如proc、sysfs等,它们的文件并不存储在事件的设备上,而是在访问它们时由内核临时生成。

    二、Linux根文件系统目录结构

    这里写图片描述

    三、etc目录下的文件

    这里写图片描述

    四、init进程

    inti进程是由内核启动的第一个(也是唯一的一个)用户进程,它根据配置文件决定启动哪些程序,比如执行某些脚本、启动shell、运行用户指定的程序等。init进程是后续所有进程的发起者,比如init进程启动/bin/sh程序后,才能够在控制台上输入各种命令。

    如果存在/etc/inittab文件,init程序会解析它,然后按照它的指示创建各种子进程;否则使用默认的配置创建子进程

    1、/etc/inittab文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下:

    <id>:<runlevels>:<action>:<process>
    
    <id>: 表示这个子进程要使用的控制台,如果省略,则使用与init进程一样的控制台。
    <runlevels>: 对于Busybox init程序,这个字段没有意义,可以省略。
    <action>:表示init进程如何控制这个子进程。
    <process>:要执行的程序,它可以是可执行程序,也可以是脚本。如果<process>字段前有
    		 “-”字符,这个程序被称为“交互的”。
    

    这里写图片描述

    2、在/etc/inittab文件的控制下,init进程的行为总结如下:

    1. 在系统启动前期,init进程首先启动为sysinit、wait、once的3类子进程。
    2. 在系统正常运行期间,init进程首先启动为respawn、askfirst的两类子进程,并监视它们,发现某个子进程退出时重新启动它。
    3. 在系统退出时,执行为shutdown、restart、ctrlaltdel的3类子进程(之一或全部)。

    3、如果根文件系统中没有/etc/inittab文件,Busybox init程序将使用如下默认的inittab条目:

    ::sysinit:/etc/init.d/rcS
    ::askfirst:/bin/sh
    tty2::askfirst:/bin/sh
    tty3::askfirst:/bin/sh
    tty4::askfirst:/bin/sh
    ::ctrlaltdel:/sbin/reboot
    ::shutdown:/sbin/swapoff -a
    ::shutdown:/bin/umount -a -r
    ::restart:/sbin/init
    

    4、/etc/inittab实例:

    # /etc/inittab
    #这是init进程启动的第一个子进程,它是一个脚本,可以在里面指定用户想执行的操作
    #比如挂接其他文件系统、配置网络等
    ::sysinit:/etc/init.d/rcS
    
    #启动shell,以/dev/ttySAC0作为控制台
    ttySAC0::askfirst:-/bin/sh
    
    #按下Ctrl+Alt+Del之后执行的程序,不过在串口控制台中无法输入Ctrl+Alt+Del组合键
    ::ctrlaltdel:/sbin/reboot
    
    #重启、关机前执行的程序
    ::shutdown:/bin/umount -a -r
    
    展开全文
  • Linux文件系统详解

    万次阅读 多人点赞 2019-05-29 16:07:53
    从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。本文参考: http://blog.chinaunix.net/uid-8698570-id-1763151.html ...

    从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。本文参考:

    http://blog.chinaunix.net/uid-8698570-id-1763151.html
    http://www.iteye.com/topic/816268
    http://soft.chinabyte.com/os/142/12315142.shtml
    http://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/
    http://blog.csdn.net/kension/article/details/3796603
    http://www.360doc.com/content/11/0915/17/3200886_148505332.shtml
    在LINUX系统中有一个重要的概念:一切都是文件。 其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。这样带来优势也是显而易见的:
    UNIX 权限模型也是围绕文件的概念来建立的,所以对设备也就可以同样处理了。
    在这里插入图片描述

    1. 硬盘驱动

    常见的硬盘类型有PATA, SATA和AHCI等,在Linux系统中,对不同硬盘所提供的驱动模块一般都存放在内核目录树drivers/ata中,而对于一般通用的硬盘驱动,也许会直接被编译到内核中,而不会以模块的方式出现,可以通过查看/boot/config-xxx.xxx文件来确认:

    CONFIG_SATA_AHCI=y

    1. General Block Device Layer

    这一层的作用,正是解答了上面提出的第一个问题,不同的硬盘驱动,会提供不同的IO接口,内核认为这种杂乱的接口,不利于管理,需要把这些接口抽象一下,形成一个统一的对外接口,这样,不管你是什么硬盘,什么驱动,对外而言,它们所提供的IO接口没什么区别,都一视同仁的被看作块设备来处理。

    所以,如果在一层做的任何修改,将会直接影响到所有文件系统,不管是ext3,ext4还是其它文件系统,只要在这一层次做了某种修改,对它们都会产生影响。

    1. 文件系统

    文件系统这一层相信大家都再熟悉不过了,目前大多Linux发行版本默认使用的文件系统一般是ext4,另外,新一代的btrfs也呼之欲出,不管什么样的文件系统,都是由一系列的mkfs.xxx命令来创建,如:

    mkfs.ext4 /dev/sda

    mkfs.btrfs /dev/sdb

    内核所支持的文件系统类型,可以通过内核目录树 fs 目录中的内容来查看。

    1. 虚拟文件系统(VFS)

    Virtual File System这一层,正是用来解决上面提出的第二个问题,试想,当我们通过mkfs.xxx系列命令创建了很多不同的文件系统,但这些文件系统都有各自的API接口,而用户想要的是,不管你是什么API,他们只关心mount/umount,或open/close等操作。

    所以,VFS就把这些不同的文件系统做一个抽象,提供统一的API访问接口,这样,用户空间就不用关心不同文件系统中不一样的API了。VFS所提供的这些统一的API,再经过System Call包装一下,用户空间就可以经过SCI的系统调用来操作不同的文件系统。

    VFS所提供的常用API有:

    mount(), umount() …

    open(),close() …

    mkdir() …
    和文件系统关系最密切的就是存储介质,存储介质大致有RAM,ROM,磁盘磁带,闪存等。

    闪存(Flash Memory)是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器,数据删除不是以单个的字节为单位而是以固定的区块为单位(注意:NOR Flash 为字节存储。),区块大小一般为256KB到20MB。闪存是电子可擦除只读存储器(EEPROM)的变种,EEPROM与闪存不同的是,它能在字节水平上进行删除和重写而不是整个芯片擦写,这样闪存就比EEPROM的更新速度快。由于其断电时仍能保存数据,闪存通常被用来保存设置信息,如在电脑的BIOS(基本输入输出程序)、PDA(个人数字助理)、数码相机中保存资料等。
    外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD等,能长期保存信息,并且不依赖于电来保存信息,但是由机械部件带动,速度与CPU相比就显得慢的多。内存指的就是主板上的存储部件,是CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中)的数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。
    RAM又分为动态的和静态。。静态被用作cache,动态的常用作内存。。网上说闪存不能代替DRAM是因为闪存不像RAM(随机存取存储器)一样以字节为单位改写数据,因此不能取代RAM。这个以后可以了解下硬件的知识再来辨别.

    Linux下的文件系统结构如下:
    在这里插入图片描述
    Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。
      不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。
      1. 基于FLASH的文件系统
      Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。
     闪存主要有NOR和NAND两种技术。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。
      在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。
      顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。
      (1) jffs2
      JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。
      Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)
      主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。
      目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。
      jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。
       (2) yaffs:Yet Another Flash File System
      yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。
      yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。
      yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
      (3) Cramfs:Compressed ROM File System
      Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。
      在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。
      Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。
      另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。
      由于以上特性,Cramfs在嵌入式系统中应用广泛。
      但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。?
      Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。
      (4) Romfs
      传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。
      其他文件系统:fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA, Smartphone, 数码相机等的SD卡),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有诸多弊端。
      2. 基于RAM的文件系统
      (1) Ramdisk
      Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。
      在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。
      (2)ramfs/tmpfs
      Ramfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)
      Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。
      Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。
      Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。
      3. 网络文件系统NFS (Network File System)
      NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。
      以上讨论的都是基于存储设备的文件系统(memory-based file system),它们都可用作Linux的根文件系统。实际上,Linux还支持逻辑的或伪文件系统(logical or pseudo file system),例如procfs(proc文件系统),用于获取系统信息,以及devfs(设备文件系统)和sysfs,用于维护设备文件。
      附录:NOR闪存与NAND闪存比较
    NOR FLASH
    接口时序同SRAM,易使用
    读取速度较快
    擦除速度慢,以64-128KB的块为单位
    写入速度慢(因为一般要先擦除)
    随机存取速度较快,支持XIP(eXecute In Place,芯片内执行),适用于代码存储。在嵌入式系统中,常用于存放引导程序、根文件系统等。
    单片容量较小,1-32MB
    最大擦写次数10万次

    NAND FLASH
    地址/数据线复用,数据位较窄
    读取速度较慢
    擦除速度快,以8-32KB的块为单位
    写入速度快
    顺序读取速度较快,随机存取速度慢,适用于数据存储(如大容量的多媒体应用)。在嵌入式系统中,常用于存放用户文件系统等。
    单片容量较大,8-128MB,提高了单元密度
    http://bbs.ednchina.com/BLOG_ARTICLE_142972.HTM

    三、文件存储结构

    介绍文件存储结构前先来看看文件系统如何划分磁盘,创建一个文件、目录、链接的过程。

    1.物理磁盘到文件系统
    我们知道文件最终是保存在硬盘上的。硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。盘片被分成许多扇形的区域,每个区域叫一个扇区,每个扇区可存储128×2的N次方(N=0.1.2.3)字节信息。在DOS中每扇区是128×2的2次方=512字节,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。硬盘中,不同盘片相同半径的磁道所组成的圆柱称为柱面。磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用,我们知道,每个磁盘有两个面,每个面都有一个磁头,习惯用磁头号来区分。扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数,帮这些参数可以得到硬盘的容量,基计算公式为:
    存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
    要点:
    (1)硬盘有数个盘片,每盘片两个面,每个面一个磁头
    (2)盘片被划分为多个扇形区域即扇区
    (3)同一盘片不同半径的同心圆为磁道
    (4)不同盘片相同半径构成的圆柱面即柱面
    (5)公式: 存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
    (6)信息记录可表示为:××磁道(柱面),××磁头,××扇区
    那么这些空间又是怎么管理起来的呢?unix/linux使用了一个简单的方法。
    它将磁盘块分为以下三个部分:

    1. 超级块,文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。
    2. I-切点表。超级块的下一个部分就是i-节点表。每个i-节点就是一个对应一个文件/目录的结构,这个结构它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号
    3. 数据区。文件系统的第3个部分是数据区。文件的内容保存在这个区域。磁盘上所有块的大小都一样。如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布上千个独产的磁盘块中。

    Linux正统的文件系统(如ext2、ext3)一个文件由目录项、inode和数据块组成。
    目录项:包括文件名和inode节点号。
    Inode:又称文件索引节点,是文件基本信息的存放地和数据块指针存放地。
    数据块:文件的具体内容存放地。

    Linux正统的文件系统(如ext2、3等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。

    文件存储结构大概如下:
    在这里插入图片描述
    其中目录项的结构如下(每个文件的目录项存储在改文件所属目录的文件内容里):

    图4:目录项结构
    在这里插入图片描述
    其中文件的inode结构如下(inode里所包含的文件信息可以通过stat filename查看得到):
    在这里插入图片描述
    以上只反映大体的结构,linux文件系统本身在不断发展。但是以上概念基本是不变的。且如ext2、ext3、ext4文件系统也存在很大差别,如果要了解可以查看专门的文件系统介绍。
    2. 创建一个文件的过程

    我们从前面可以知道文件的内容和属性是分开存放的,那么又是如何管理它们的呢?现在我们以创建一个文件为例来讲解。
    在命令行输入命令:
    $ who > userlist
    当完成这个命令时。文件系统中增加了一个存放命令who输出内容的新文件userlist,那么这整个过程到底是怎么回事呢?
    文件主要有属性、内容以及文件名三项。内核将文件内容存放在数据区,文件属性存放在i-节点,文件名存放在目录中。
    创建成功一个文件主要有以下四个步骤:

    1.    存储属性 也就是文件属性的存储,内核先找到一块空的i-节点。例如,内核找到i-节点号921130。内核把文件的信息记录其中。如文件的大小、文件所有者、和创建时间等。
      
    2.    存储数据 即文件内容的存储,由于该文件需要3个数据块。因此内核从自由块的列表中找到3个自由块。如600、200、992,内核缓冲区的第一块数据复制到块600,第二和第三分别复制到922和600.
      
    3.    记录分配情况,数据保存到了三个数据块中。所以必须要记录起来,以后再找到正确的数据。分配情况记录在文件的i-节点中的磁盘序号列表里。这3个编号分别放在最开始的3个位置。
      
    4.    添加文件名到目录,新文件的名字是userlist 内核将文件的入口(47,userlist)添加到目录文件里。文件名和i-节点号之间的对应关系将文件名和文件和文件的内容属性连接起来,找到文件名就找到文件的i-节点号,通过i-节点号就能找到文件的属性和内容。
      

    代码具体实现过程参考:
    http://blog.csdn.net/kai_ding/article/details/9206057
    3.创建一个目录的过程

    前面说了创建一个文件的大概过程,也了解文件内容、属性以及入口的保存方式,那么创建一个目录时又是怎么回事呢?
    我现在test目录使用命令mkdir 新增一个子目录child:

    从用户的角度看,目录child是目录test的一个子目录,那么在系统中这层关系是怎么实现的呢?实际上test目录包含一个指向子目录child的i-节点的链接,原理跟普通文件一样,因为目录也是文件。

    目录其实也是文件,只是它的内容比较特殊。所以它的创建过程和文件创建过程一样,只是第二步写的内容不同。

    1.  系统找到空闲的i-节点号887220,写入目录的属性
      
    2.  找到空闲的数据块1002来存储目录的内容,只是目录的内容比较特殊,包含文件名字列表,列表一般包含两个部分:i-节点号和文件名,这个列表其实也就是文件的入口,新建的目录至少包含三个目录”.”和”..”其中”.”指向自己,”..”指向上级目录,我们可以通过比较对应的i-节点号来验证,887270 对应着上级目录中的child对应的i-节点号
      
    3.  记录分配情况。这个和创建文件完全一样
      
    4.  添加目录的入口到父目录,即在父目录中的child入口。
      

    一般都说文件存放在某个目录中,其实目录中存入的只是文件在i-节点表的入口,而文件的内容则存储在数据区。我们一般会说“文件userlist在目录test中”,其实这意味着目录test中有一个指向i-节点921130的链接,这个链接所附加的文件名为userlist,这也可以这样理解:目录包含的是文件的引用,每个引用被称为链接。文件的内容存储在数据块。文件的属性被记录在一个被称为i-节点的结构中。I-节点的编号和文件名关联起来存在目录中。
    注意:其中“.”表示是当前目录。而“…”是当前目录的父目录。但也有特殊情况:如我们查看根目录/的情况:

    发现“.”和“…”都指向i-节点2。实际上当我们用mkfs创建一个文件系统时,mkfs都会将根目录的父目录指向自己。所以根目录下.和…指向同一个i-节点也不奇怪了。
    代码具体实现参考:
    http://blog.csdn.net/kai_ding/article/details/9206057

    1. 理解链接

    我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。图 1.展示了程序通过文件名获取文件内容的过程。
    图 1. 通过文件名打开文件
    在这里插入图片描述

    图 1. 通过文件名打开文件

    清单 3. 移动或重命名文件

     # stat /home/harris/source/glibc-2.16.0.tar.xz
      File: `/home/harris/source/glibc-2.16.0.tar.xz'
      Size: 9990512        Blocks: 19520      IO Block: 4096   regular file
    Device: 807h/2055d      Inode: 2485677     Links: 1
    Access: (0600/-rw-------)  Uid: ( 1000/  harris)   Gid: ( 1000/  harris)
    ...
    ...
    # mv /home/harris/source/glibc-2.16.0.tar.xz /home/harris/Desktop/glibc.tar.xz
    # ls -i -F /home/harris/Desktop/glibc.tar.xz
    2485677 /home/harris/Desktop/glibc.tar.xz
    

    在 Linux 系统中查看 inode 号可使用命令 stat 或 ls -i(若是 AIX 系统,则使用命令 istat)。清单 3.中使用命令 mv 移动并重命名文件 glibc-2.16.0.tar.xz,其结果不影响文件的用户数据及 inode 号,文件移动前后 inode 号均为:2485677。
    为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。

    具体关系可以看下图:

    为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名(见 图 2.hard link 就是 file 的一个别名,他们有共同的 inode)。硬链接可由命令 link 或 ln 创建。如下是对文件 oldfile 创建硬链接。
    link oldfile newfile
    ln oldfile newfile
    由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:
    文件有相同的 inode 及 data block;
    只能对已存在的文件进行创建;
    不能交叉文件系统进行硬链接的创建;
    不能对目录进行创建,只可对文件创建;
    删除一个硬链接文件并不影响其他有相同 inode 号的文件。

    创建一个链接的步骤大概如下:
    1) 通过原文件的文件名找到文件的i-节点号
    2) 添加文件名关联到目录,新文件的名字是mylink 内核将文件的入口(921130,mylink)添加到目录文件里。
    和创建文件的过程比较发现,链接少了写文件内容的步骤,完全相同的是把文件名关联到目录这一步
    现在.i- 节点号921130对应了两个文件名。链接数也会变成2个,文件的内容并不会发生任何变化。前面我们已经讲了:目录包含的是文件的引用,每个引用被称为链接。所以链接文件和原始文件本质上是一样的,因为它们都是指向同一个i-节点。由于此原因也就可以理解链接的下列特性:你改变其中任何一个文件的内容,别的链接文件也一样是变化;另外如果你删除某一个文件,系统只会在所指向的i-节点上把链接数减1,只有当链接数减为零时才会真正释放i-节点。
    硬链接有两个特点:
    1)不能跨文件系统
    2)不能对目录
    清单 4. 硬链接特性展示

    # ls -li 
     total 0 
    
     // 只能对已存在的文件创建硬连接
     # link old.file hard.link 
     link: cannot create link `hard.link' to `old.file': No such file or directory 
    
     # echo "This is an original file" > old.file 
     # cat old.file 
     This is an original file 
     # stat old.file 
      File: `old.file'
      Size: 25             Blocks: 8          IO Block: 4096   regular file 
     Device: 807h/2055d      Inode: 660650      Links: 2 
     Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root) 
     ... 
     // 文件有相同的 inode 号以及 data block 
     # link old.file hard.link | ls -li 
     total 8 
     660650 -rw-r--r-- 2 root root 25 Sep  1 17:44 hard.link 
     660650 -rw-r--r-- 2 root root 25 Sep  1 17:44 old.file 
    
     // 不能交叉文件系统
     # ln /dev/input/event5 /root/bfile.txt 
     ln: failed to create hard link `/root/bfile.txt' => `/dev/input/event5': 
     Invalid cross-device link 
    
     // 不能对目录进行创建硬连接
     # mkdir -p old.dir/test 
     # ln old.dir/ hardlink.dir 
     ln: `old.dir/': hard link not allowed for directory 
     # ls -iF 
     660650 hard.link  657948 old.dir/  660650 old.file
    

    软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块(见 图 2.)。因此软链接的创建与使用没有类似硬链接的诸多限制:
    软链接有自己的文件属性及权限等;
    可对不存在的文件或目录创建软链接;
    软链接可交叉文件系统;
    软链接可对文件或目录创建;
    创建软链接时,链接计数 i_nlink 不会增加;
    删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
    图 2. 软链接的访问
    在这里插入图片描述
    软链接
    实际上只是一段文字,里面包含着它所指向的文件的名字,系统看到软链接后自动跳到对应的文件位置处进行处理;相反,硬链接为文件开设一个新的目录项,硬链接与文件原有的名字是平权的,在Linux看来它们是等价的。由于这个原因,硬链接不能连接两个不同文件系统上的文件。

    软连接与windows下的快捷方式类似
    至于硬连接,举个例子说吧,你把dir1/file1硬连接到dir2/file2, 就是在dir2下建立一个dir1/file1的镜像文件file2,它与file1是占用一样大的空间的,并且改动两者中的一个,另一个也会发生同样的改动.
    软连接和硬连接可以这样理解:
    硬连接就像一个文件有多个文件名,
    软连接就是产生一个新文件(这个文件内容,实际上就是记当要链接原文件路径的信息),这个文件指向另一个文件的位置,
    硬连接必须在同一文件系统中,而软连接可以跨文件系统
    硬连接 :源文件名和链接文件名都指向相同的物理地址,目录不能够有硬连接,文件在磁盘中只有一个复制,可以节省硬盘空间,由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此可以防止不必要的误删除软连接(符号连接)用ln -s命令创建文件的符号连接,符号连接是linux特殊文件的一种,作为一个文件,它的资料是它所连接的文件的路径名,类似于硬件方式,可以删除原始文件 而连接文件仍然存在。**
    清单 5. 软链接特性展示

    # ls -li 
     total 0 
    
     // 可对不存在的文件创建软链接
     # ln -s old.file soft.link 
     # ls -liF 
     total 0 
     789467 lrwxrwxrwx 1 root root 8 Sep  1 18:00 soft.link -> old.file 
    
     // 由于被指向的文件不存在,此时的软链接 soft.link 就是死链接
     # cat soft.link 
     cat: soft.link: No such file or directory 
    
     // 创建被指向的文件 old.file,soft.link 恢复成正常的软链接
     # echo "This is an original file_A" >> old.file 
     # cat soft.link 
     This is an original file_A 
    
     // 对不存在的目录创建软链接
     # ln -s old.dir soft.link.dir 
     # mkdir -p old.dir/test 
     # tree . -F --inodes 
     . 
    ├── [ 789497]  old.dir/ 
    │   └── [ 789498]  test/ 
    ├── [ 789495]  old.file 
    ├── [ 789495]  soft.link -> old.file 
    └── [ 789497]  soft.link.dir -> old.dir/
    

    代码具体实现参考:http://blog.csdn.net/kai_ding/article/details/8942884

    四、文件节点inode
    可以看到inode节点好比是文件的大脑,下面就详细介绍一下inode。
    1.inode是什么
    理解inode,要从文件储存说起。
    扇区(sector):硬件(磁盘)上的最小的操作单位,是操作系统和块设备(硬件、磁盘)之间传送数据的单位。
    block由一个或多个sector组成,文件系统中最小的操作单位;OS的虚拟文件系统从硬件设备上读取一个block,实际为从硬件设备读取一个或多个sector。对于文件管理来说,每个文件对应的多个block可能是不连续的;
    block最终要映射到sector上,所以block的大小一般是sector的整数倍。不同的文件系统block可使用不同的大小,操作系统会在内存中开辟内存,存放block到所谓的block buffer中。在Ext2中,物理块的大小是可变化的,这取决于在创建文件系统时的选择,之所以不限制大小,也正体现了Ext2的灵活性和可扩充性。通常,Ext2的物理块占一个或几个连续的扇区,显然,物理块的数目是由磁盘容量等硬件因素决定的。具体文件系统所操作的基本单位是逻辑块,只在需要进行I/O操作时才进行逻辑块到物理块的映射,这显然避免了大量的I/O操作,因而文件系统能够变得高效。逻辑块作为一个抽象的概念,它必然要映射到具体的物理块上去,因此,逻辑块的大小必须是物理块大小的整数倍,一般说来,两者是一样大的。
    通常,一个文件占用的多个物理块在磁盘上是不连续存储的,因为如果连续存储,则经过频繁的删除、建立、移动文件等操作,最后磁盘上将形成大量的空洞,很快磁盘上将无空间可供使用。因此,必须提供一种方法将一个文件占用的多个逻辑块映射到对应的非连续存储的物理块上去,Ext2等类文件系统是用索引节点解决这个问题的。
    在这里插入图片描述在这里插入图片描述
    文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
    在Unix/Linux上,一个文件由一个inode 表示。inode在系统管理员看来是每一个文件的唯一标识,在系统里面,inode是一个结构,存储了关于这个文件的大部分信息。
    2.inode内容
    inode包含文件的元信息,具体来说有以下内容:
    *文件的字节数
    文件拥有者的UserID文件的GroupID
    *文件的读、写、执行权限
    *文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
    链接数,即有多少文件名指向这个inode文件数据block的位置可以用stat命令,查看某个文件的inode信息:statexample.txt
    总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。
    inode中存储了一个文件的以下信息:
    3.inode结构

    struct inode {
            struct hlist_node       i_hash;              /* 哈希表 */
            struct list_head        i_list;              /* 索引节点链表 */
            struct list_head        i_dentry;            /* 目录项链表 */
            unsigned long           i_ino;               /* 节点号 */
            atomic_t                i_count;             /* 引用记数 */
            umode_t                 i_mode;              /* 访问权限控制 */
            unsigned int            i_nlink;             /* 硬链接数 */
            uid_t                   i_uid;               /* 使用者id */
            gid_t                   i_gid;               /* 使用者id组 */
            kdev_t                  i_rdev;              /* 实设备标识符 */
            loff_t                  i_size;              /* 以字节为单位的文件大小 */
            struct timespec         i_atime;             /* 最后访问时间 */
            struct timespec         i_mtime;             /* 最后修改(modify)时间 */
            struct timespec         i_ctime;             /* 最后改变(change)时间 */
            unsigned int            i_blkbits;           /* 以位为单位的块大小 */
            unsigned long           i_blksize;           /* 以字节为单位的块大小 */
            unsigned long           i_version;           /* 版本号 */
            unsigned long           i_blocks;            /* 文件的块数 */
            unsigned short          i_bytes;             /* 使用的字节数 */
            spinlock_t              i_lock;              /* 自旋锁 */
            struct rw_semaphore     i_alloc_sem;         /* 索引节点信号量 */
            struct inode_operations *i_op;               /* 索引节点操作表 */
            struct file_operations  *i_fop;              /* 默认的索引节点操作 */
            struct super_block      *i_sb;               /* 相关的超级块 */
            struct file_lock        *i_flock;            /* 文件锁链表 */
            struct address_space    *i_mapping;          /* 相关的地址映射 */
            struct address_space    i_data;              /* 设备地址映射 */
            struct dquot            *i_dquot[MAXQUOTAS]; /* 节点的磁盘限额 */
            struct list_head        i_devices;           /* 块设备链表 */
            struct pipe_inode_info  *i_pipe;             /* 管道信息 */
            struct block_device     *i_bdev;             /* 块设备驱动 */
            unsigned long           i_dnotify_mask;      /* 目录通知掩码 */
            struct dnotify_struct   *i_dnotify;          /* 目录通知 */
            unsigned long           i_state;             /* 状态标志 */
            unsigned long           dirtied_when;        /* 首次修改时间 */
            unsigned int            i_flags;             /* 文件系统标志 */
            unsigned char           i_sock;              /* 可能是个套接字吧 */
            atomic_t                i_writecount;        /* 写者记数 */
            void                    *i_security;         /* 安全模块 */
            __u32                   i_generation;        /* 索引节点版本号 */
            union {
                    void            *generic_ip;         /* 文件特殊信息 */
            } u;
    };
    

    inode就是一个文件的一部分描述,不是全部,在内核中,inode对应了这样一个实际存在的结构。
    复制代码
    纵观整个inode的C语言描述,没有发现关于文件名的东西,也就是说文件名不由inode保存,实际上系统是不关心文件名的,对于系统中任何的操作,大部分情况下你都是通过文件名来做的,但系统最终都要通过找到文件对应的inode来操作文件,由inode结构中 *i_op指向的接口来操作。
    文件系统如何存取文件的:
    1)、根据文件名,通过Directory里的对应关系,找到文件对应的Inodenumber
    2)、再根据Inodenumber读取到文件的Inodetable
    3)、再根据Inodetable中的Pointer读取到相应的Blocks
    这里有一个重要的内容,就是Directory,他不是我们通常说的目录,而是一个列表,记录了一个文件/目录名称对应的Inodenumber。

    转自: https://www.cnblogs.com/alantu2018/p/8461749.html

    展开全文
  • Linux文件系统目录结构详解

    万次阅读 2017-10-08 13:09:34
    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux...

    引言

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux目录结构的相关知识。

    在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。

    linux文件系统的最顶端是/,我们称/为Linux的root(根目录),也就是 Linux操作系统的文件系统。Linux的文件系统的入口就是/,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。

    FHS诞生

    谈到目录结构,不得不首先了解一下FHS团队的来由。
    由于linux是开放源代码,最开始各大公司和团体根据linux的核心代码做各自的操作,编程。这样就造成在根下的目录的不同。这样就造成个人不能使用他人的linux系统的PC。因为你根本不知道一些基本的配置,文件在哪里,这就造成了混乱。这就是FHS(Filesystem Hierarchy Standard )机构诞生的原因。该机构是linux爱好者自发的组成的一个团体,主要是是对linux做一些基本的要求,不至于是操作者换一台主机就成了linux的‘文盲’。
    根据FHS(http://www.pathname.com/fhs/)的官方文件指出, 他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵循FHS的标准。 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。
    事实上,FHS是根据过去的经验一直再持续的改版的,FHS依据文件系统使用的频繁与否与是否允许使用者随意更动, 而将目录定义成为四种交互作用的形态,用表格来说有点像底下这样:
     
    可分享的(shareable)
    不可分享的(unshareable)
    不变的(static)
    /usr (软件放置处)
    /etc (配置文件)
    /opt (第三方协力软件)
    /boot (开机与核心档)
    可变动的(variable)
    /var/mail (使用者邮件信箱)
    /var/run (程序相关)
    /var/spool/news (新闻组)
    /var/lock (程序相关)
    四中类型:
    1. 可分享的:
    可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;
    2. 不可分享的:
    自己机器上面运作的装置文件或者是与程序有关的socket文件等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。
    3. 不变的:
    有些数据是不会经常变动的,跟随着distribution而不变动。 例如函式库、文件说明文件、系统管理员所管理的主机服务配置文件等等;
    4. 可变动的:
    经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等。
    事实上,FHS针对目录树架构仅定义出三层目录底下应该放置什么数据而已,分别是底下这三个目录的定义:
    / (root, 根目录):与开机系统有关;
    /usr (unix software resource):与软件安装/执行有关;
    /var (variable):与系统运作过程有关。

    根目录 (/) 的意义与内容

    根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的, 同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心文件、开机所需程序、 函式库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分区, 因为越大的分区内你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。
    因此FHS标准建议:根目录(/)所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。 如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。说白了,就是根目录和Windows的C盘一个样。
    根据以上原因,FHS认为根目录(/)下应该包含如下子目录:
    目录
    应放置档案内容
    /bin
    系统有很多放置执行档的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般帐号所使用,主要有:cat,chmod(修改权限), chown, date, mv, mkdir, cp, bash等等常用的指令。
    /boot
    主要放置开机会使用到的档案,包括Linux核心档案以及开机选单与开机所需设定档等等。Linux kernel常用的档名为:vmlinuz ,如果使用的是grub这个开机管理程式,则还会存在/boot/grub/这个目录。
    /dev
    在Linux系统上,任何装置与周边设备都是以档案的型态存在于这个目录当中。 只要通过存取这个目录下的某个档案,就等于存取某个装置。比要重要的档案有/dev/null, /dev/zero, /dev/tty , /dev/lp*, / dev/hd*, /dev/sd*等等
    /etc
    系统主要的设定档几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。 一般来说,这个目录下的各档案属性是可以让一般使用者查阅的,但是只有root有权力修改。 FHS建议不要放置可执行档(binary)在这个目录中。 比较重要的档案有:/etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等等。 另外,其下重要的目录有:/etc/init.d/ :所有服务的预设启动script都是放在这里的,例如要启动或者关闭iptables的话: /etc/init.d/iptables start、/etc/init.d/ iptables stop
    /etc/xinetd.d/ :这就是所谓的super daemon管理的各项服务的设定档目录。
    /etc/X11/ :与X Window有关的各种设定档都在这里,尤其是xorg.conf或XF86Config这两个X Server的设定档。
    /home
    这是系统预设的使用者家目录(home directory)。 在你新增一个一般使用者帐号时,预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号:
    ~ :代表当前使用者的家目录,而 ~guest:则代表用户名为guest的家目录。
    /lib
    系统的函式库非常的多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已 。 什么是函式库呢?妳可以将他想成是外挂,某些指令必须要有这些外挂才能够顺利完成程式的执行之意。 尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模组(驱动程式)。
    /media
    media是媒体的英文,顾名思义,这个/media底下放置的就是可移除的装置。 包括软碟、光碟、DVD等等装置都暂时挂载于此。 常见的档名有:/media/floppy, /media/cdrom等等。
    /mnt
    如果妳想要暂时挂载某些额外的装置,一般建议妳可以放置到这个目录中。在古早时候,这个目录的用途与/media相同啦。 只是有了/media之后,这个目录就用来暂时挂载用了。
    /opt
    这个是给第三方协力软体放置的目录 。 什么是第三方协力软体啊?举例来说,KDE这个桌面管理系统是一个独立的计画,不过他可以安装到Linux系统中,因此KDE的软体就建议放置到此目录下了。 另外,如果妳想要自行安装额外的软体(非原本的distribution提供的),那么也能够将你的软体安装到这里来。 不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下。
    /root
    系统管理员(root)的家目录。 之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中。
    /sbin
    Linux有非常多指令是用来设定系统环境的,这些指令只有root才能够利用来设定系统,其他使用者最多只能用来查询而已。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。至于某些伺服器软体程式,一般则放置到/usr/sbin/当中。至于本机自行安装的软体所产生的系统执行档(system binary),则放置到/usr/local/sbin/当中了。常见的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。
    /srv
    srv可以视为service的缩写,是一些网路服务启动之后,这些服务所需要取用的资料目录。 常见的服务例如WWW, FTP等等。 举例来说,WWW伺服器需要的网页资料就可以放置在/srv/www/里面。呵呵,看来平时我们编写的代码应该放到这里了。
    /tmp
    这是让一般使用者或者是正在执行的程序暂时放置档案的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要资料不可放置在此目录啊。 因为FHS甚至建议在开机时,应该要将/tmp下的资料都删除。
    事实上FHS针对根目录所定义的标准就仅限于上表,不过仍旧有些目录也需要我们了解一下,具体如下:
    目录
    应放置文件内容
    /lost+found
    这个目录是使用标准的ext2/ext3档案系统格式才会产生的一个目录,目的在于当档案系统发生错误时,将一些遗失的片段放置到这个目录下。 这个目录通常会在分割槽的最顶层存在,例如你加装一个硬盘于/disk中,那在这个系统下就会自动产生一个这样的目录/disk/lost+found
    /proc
    这个目录本身是一个虚拟文件系统(virtual filesystem)喔。 他放置的资料都是在内存当中,例如系统核心、行程资讯(process)(是进程吗?)、周边装置的状态及网络状态等等。因为这个目录下的资料都是在记忆体(内存)当中,所以本身不占任何硬盘空间。比较重要的档案(目录)例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等等。呵呵,是虚拟内存吗[guest]?
    /sys
    这个目录其实跟/proc非常类似,也是一个虚拟的档案系统,主要也是记录与核心相关的资讯。 包括目前已载入的核心模组与核心侦测到的硬体装置资讯等等。 这个目录同样不占硬盘容量。
    除了这些目录的内容之外,另外要注意的是,因为根目录与开机有关,开机过程中仅有根目录会被挂载, 其他分区则是在开机完成之后才会持续的进行挂载的行为。就是因为如此,因此根目录下与开机过程有关的目录, 就不能够与根目录放到不同的分区去。那哪些目录不可与根目录分开呢?有底下这些:
    /etc:配置文件
    /bin:重要执行档
    /dev:所需要的装置文件
    /lib:执行档所需的函式库与核心所需的模块
    /sbin:重要的系统执行文件
    这五个目录千万不可与根目录分开在不同的分区。

    /usr 的意义与内容

    依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable, static), 如果你知道如何透过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给局域网络内的其他主机来使用喔。
    /usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据啦。这点要注意。 FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。
    因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr底下,因此这个目录有点类似Windows 系统的C:\Windows\ + C:\Program files\这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。 一般来说,/usr的次目录建议有底下这些:
    目录
    应放置文件内容
    /usr/X11R6/
    为X Window System重要数据所放置的目录,之所以取名为X11R6是因为最后的X版本为第11版,且该版的第6次释出之意。
    /usr/bin/
    绝大部分的用户可使用指令都放在这里。请注意到他与/bin的不同之处。(是否与开机过程有关)
    /usr/include/
    c/c++等程序语言的档头(header)与包含档(include)放置处,当我们以tarball方式 (*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含档。
    /usr/lib/
    包含各应用软件的函式库、目标文件(object file),以及不被一般使用者惯用的执行档或脚本(script)。 某些软件会提供一些特殊的指令来进行服务器的设定,这些指令也不会经常被系统管理员操作, 那就会被摆放到这个目录下啦。要注意的是,如果你使用的是X86_64的Linux系统, 那可能会有/usr/lib64/目录产生
    /usr/local/
    统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录, 这样会比较便于管理。举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版, 此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别啦。 你可以自行到/usr/local去看看,该目录下也是具有bin, etc, include, lib...的次目录
    /usr/sbin/
    非系统正常运作所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)
    /usr/share/
    放置共享文件的地方,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文本文件嘛。在此目录下常见的还有这些次目录:/usr/share/man:联机帮助文件
    /usr/share/doc:软件杂项的文件说明
    /usr/share/zoneinfo:与时区有关的时区文件
    /usr/src/
    一般原始码建议放置到这里,src有source的意思。至于核心原始码则建议放置到/usr/src/linux/目录下。

    /var 的意义与内容

    如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运作后才会渐渐占用硬盘容量的目录。 因为/var目录主要针对常态性变动的文件,包括缓存(cache)、登录档(log file)以及某些软件运作所产生的文件, 包括程序文件(lock file, run file),或者例如MySQL数据库的文件等等。常见的次目录有:
    目录
    应放置文件内容
    /var/cache/
    应用程序本身运作过程中会产生的一些暂存档
    /var/lib/
    程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。 举例来说,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去
    /var/lock/
    某些装置或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该装置时, 就可能产生一些错误的状况,因此就得要将该装置上锁(lock),以确保该装置只会给单一软件所使用。 举例来说,刻录机正在刻录一块光盘,你想一下,会不会有两个人同时在使用一个刻录机烧片? 如果两个人同时刻录,那片子写入的是谁的数据?所以当第一个人在刻录时该刻录机就会被上锁, 第二个人就得要该装置被解除锁定(就是前一个人用完了)才能够继续使用
    /var/log/
    非常重要。这是登录文件放置的目录。里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登入者的信息)等。
    /var/mail/
    放置个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中,通常这两个目录是互为链接文件。
    /var/run/
    某些程序或者是服务启动后,会将他们的PID放置在这个目录下
    /var/spool/
    这个目录通常放置一些队列数据,所谓的“队列”就是排队等待其他程序使用的数据。 这些数据被使用后通常都会被删除。举例来说,系统收到新信会放置到/var/spool/mail/中, 但使用者收下该信件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中, 等到被送出后就被删除。如果是工作排程数据(crontab),就会被放置到/var/spool/cron/目录中。
    由于FHS仅是定义出最上层(/)及次层(/usr, /var)的目录内容应该要放置的文件或目录数据, 因此,在其他次目录层级内,就可以随开发者自行来配置了。

    目录树(directory tree)

    在Linux底下,所有的文件与目录都是由根目录开始的。那是所有目录与文件的源头, 然后再一个一个的分支下来,因此,我们也称这种目录配置方式为:目录树(directory tree), 这个目录树的主要特性有:
    目录树的启始点为根目录 (/, root);
    每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说, 可以利用 Network File System (NFS) 服务器挂载某特定目录等。
    每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。
    如果我们将整个目录树以图的方法来显示,并且将较为重要的文件数据列出来的话,那么目录树架构就如下图所示:

    以下是对这些目录的解释:

    /:根目录,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中。


    /bin:/usr/bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。例如cp、ls、cat,等等。


    /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/boot/vmlinuz为linux的内核文件,以及/boot/gurb。建议单独分区,分区大小100M即可。


    /dev :dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备文件,在Linux中访问设备的方式和访问文件的方式是相同的。访问该目录下某个文件,相当于访问某个设备,其功能类似DOS下的.sys和Win下的.vxd。例如:/dev/hda代表第一个物理IDE硬盘。常用的是挂载光驱mount /dev/cdrom /mnt。


    /etc:这个目录用来存放所有的系统管理所需要的配置文件和子目录。不建议在此目录下存放可执行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d修改配置文件之前记得备份。注:/etc/X11存放与x windows有关的设置。


    /home:用户的主目录,在Linux中,系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~表示当前用户的家目录,比如说有个用户叫zhong,那他的主目录就是/home/zhong也可以用~zhong表示。建议单独分区,并设置较大的磁盘空间,方便用户存放数据。


    /lib:/usr/lib:/usr/local/lib:这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的目录为/lib/modules。


    /lost+found:这个目录一般情况下是空的,当系统不正常关机后,这里就成了一些无家可归的文件的避难所。对了,有点类似于DOS下的.chk文件。系统异常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下。如加载硬盘于/disk 中,此目录下就会自动产生目录/disk/lost+found


    /media:linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。


    /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。光盘默认挂载点,通常光盘挂载于/mnt/cdrom下,也不一定,可以选择任意位置进行挂载。


    /opt:这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的KDE 桌面软件,可以将该软件安装在该目录下。以前的 Linux 系统中,习惯放置在 /usr/local 目录下。


    /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等。这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。

    这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all


    /root:该目录为系统管理员,也称作超级权限者的用户主目录。系统管理员root的家目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下。


    /sbin:/usr/sbin:/usr/local/sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。


    /selinux:这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。


    /srv:该目录存放一些服务启动之后需要提取的数据。服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内。


    /sys:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。


    /tmp:这个目录是用来存放一些临时文件的。一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。


    /var:这个目录中存放着在不断扩充着的东西,包括各种日志文件。为了保持/usr的相对稳定,那些经常被修改的目录可以放在这个目录下,实际上许多系统管理员都是这样干的。顺带说一下系统的日志文件就在/var/log目录中。放置系统执行过程中经常变化的文件,如随时更改的日志文件/var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。建议单独分区,设置较大的磁盘空间。


    /usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录。应用程序存放目录,/usr/bin存放应用程序,/usr/share存放共享数据,/usr/lib存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local:存放软件升级包。/usr/share/doc:系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录,使用 man ls时会查询/usr/share/man/man1/ls.1.gz的内容建议单独分区,设置较大的磁盘空间。


    绝对路径与相对路径


    除了需要特别注意的FHS目录配置外,在文件名部分我们也要特别注意。因为根据档名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relative)。 这两种文件名/路径的写法依据是这样的:
    绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc;
    相对路径:相对于目前路径的文件名写法。 例如 ./home/dmtsai 或 http://www.cnblogs.com/home/dmtsai/ 等等。反正开头不是 / 就属于相对路径的写法
    而你必须要了解,相对路径是以你当前所在路径的相对位置来表示的。举例来说,你目前在 /home 这个目录下, 如果想要进入 /var/log 这个目录时,可以怎么写呢?
    cd /var/log (absolute)
    cd ../var/log (relative)
    因为你在 /home 底下,所以要回到上一层 (../) 之后,才能继续往 /var 来移动的,特别注意这两个特殊的目录:
    . :代表当前的目录,也可以使用 ./ 来表示;
    .. :代表上一层目录,也可以 ../ 来代表。
    这个 . 与 .. 目录概念是很重要的,你常常会看到 cd .. 或 ./command 之类的指令下达方式, 就是代表上一层与目前所在目录的工作状态。
    如果一个目录或文件名以一个点 . 开始,表示这个目录或文件是一个隐藏目录或文件(如:.bashrc)。即以默认方式查找时,不显示该目录或文件。ls -a 能看见所有目录或文件(包括隐藏的)。
    实例1:如何先进入/var/spool/mail/目录,再进入到/var/spool/cron/目录内?
    命令:
    cd /var/spool/mail
    cd ../cron
    说明:
    由于/var/spool/mail与/var/spool/cron是同样在/var/spool/目录中。如此就不需要在由根目录开始写起了。这个相对路径是非常有帮助的,尤其对于某些软件开发商来说。 一般来说,软件开发商会将数据放置到/usr/local/里面的各相对目录。 但如果用户想要安装到不同目录呢?就得要使用相对路径。
    实例2:网络文件常常提到类似./run.sh之类的数据,这个指令的意义为何?
    说明:
    由于指令的执行需要变量的支持,若你的执行文件放置在本目录,并且本目录并非正规的执行文件目录(/bin, /usr/bin等为正规),此时要执行指令就得要严格指定该执行档。./代表本目录的意思,所以./run.sh代表执行本目录下, 名为run.sh的文件。

    几个比较重要的目录


    在linux系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

    /etc: 这个目录相当重要,如前所述,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。你的开机与系统数据文件均在这个目录之下,因此当这个目录被破坏,那你的系统大概也就差不多该死掉了!而在往后的文件中,你会发现我们常常使用这个目录下的 /etc/rc.d/init.d 这个子目录,因为这个 init.d 子目录是开启一些 Linux 系统服务的 scripts的地方。而在 /etc/rc.d/rc.local 这个文件是开机的执行档。


    /bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的,例如 root 常常使用的 userconf, netconf, perl, gcc, c++ 等等的数据都放在这几个目录中,所以如果你在提示字符下找不到某个执行档时,可以在这四个目录中查一查!其中, /bin, /usr/bin 是给系统用户(除root外的通用户)使用的指令,而 /sbin, /usr/sbin 则是给系统管理员使用的指令!


    /usr/local:这是系统预设的让你安装你后来升级的套件的目录。例如,当你发现有更新的 Web 套件(如 Apache )可以安装,而你又不想以 rpm 的方式升级你的套件,则你可以将 apache 这个套件安装在 /usr/local 底下。安装在这里有个好处,因为目前大家的系统都是差不多的,所以如果你的系统要让别人接管的话,也比较容易上手呀!也比较容易找的到数据!因此,如果你有需要的话,通常我都会将 /usr/local/bin 这个路径加到我的 path 中。

     
    /home:这个是系统将有账号的人口的家目录设置的地方。


    /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,不论是登入、各类服务的问题发生时的记录、以及常态性的服务记录等等的记录目录,所以当你的系统有问题时,就需要来这个目录记录的文件数据中察看问题的所在啰!另外mail的预设放置也是在这里。


    /usr/share/man, /usr/local/man:这两个目录为放置各类套件说明档的地方,例如你如果执行 man man,则系统会自动去找这两个目录下的所有说明文件。



    详解几个目录


    /dev:目录

    dev是设备(device)的英文缩写。/dev这个目录对所有的用户都十分重要。因为在这个目录中包含了所有Linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序,这一点和windows,dos操作系统不一样。它实际上是一个访问这些外部设备的端口。我们可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。
    Linux沿袭Unix的风格,将所有设备认成是一个文件。
      设备文件分为两种:块设备文件(b)和字符设备文件(c)
      设备文件一般存放在/dev目录下,对常见设备文件作如下说明:
      /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:随机数设备
      
      /dev目录下的节点是怎么创建的?  --->   devf或者udev会自动帮你创建得。
      kobject是sysfs文件系统的基础,udev通过监测、检测sysfs来获取新创建的设备的。

    /etc:目录

    包含很多文件.许多网络配置文件也在/etc 中
    ./etc/rc or /etc/rc.d or /etc/rc*.d :启动、或改变运行级时运行的scripts或scripts的目录.
    /etc/passwd:用户数据库,其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息.
    /etc/fstab:启动时mount -a命令(在/etc/rc 或等效的启动文件中)自动mount的文件系统列表. Linux下,也包括用swapon -a启用的swap区的信息.
    /etc/group:类似/etc/passwd ,但说明的不是用户而是组.
    /etc/inittab:init 的配置文件.
    /etc/issue:getty 在登录提示符前的输出信息.通常包括系统的一段短说明或欢迎信息.内容由系统管理员确定.
    /etc/motd:Message Of The Day,成功登录后自动输出.内容由系统管理员确定.经常用于通告信息,如计划关机时间的警告.
    /etc/mtab:当前安装的文件系统列表.由scripts初始化,并由mount 命令自动更新.需要一个当前安装的文件系统的列表时使用,例如df 命令.
    /etc/shadow:在安装了影子口令软件的系统上的影子口令文件.影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow 中,而后者只对root可读.这使破译口令更困难.
    /etc/login.defs:login 命令的配置文件.
    /etc/printcap:类似/etc/termcap ,但针对打印机.语法不同.
    /etc/profile , /etc/csh.login , /etc/csh.cshrc:登录或启动时Bourne或C shells执行的文件.这允许系统管理员为所有用户建立全局缺省环境.
    /etc/securetty:确认安全终端,即哪个终端允许root登录.一般只列出虚拟控制台,这样就不可能(至少很困难)通过modem或网络闯入系统并得到超级用户特权.
    /etc/shells:列出可信任的shell.chsh 命令允许用户在本文件指定范围内改变登录shell.提供一台机器FTP服务的服务进程ftpd 检查用户shell是否列在 /etc/shells 文件中,如果不是将不允许该用户登录.
    /etc/sysconfig:网络配置相关目录

    /proc: 目录

    档名 文件内容
    /proc/cmdline: 加载 kernel 时所下达的相关参数!查阅此文件,可了解系统是如何启动的!
    /proc/cpuinfo :本机的 CPU 的相关资讯,包含时脉、类型与运算功能等
    /proc/devices :这个文件记录了系统各个主要装置的主要装置代号,与 mknod 有关呢!
    /proc/filesystems: 目前系统已经加载的文件系统罗!
    /proc/interrupts :目前系统上面的 IRQ 分配状态。
    /proc/ioports :目前系统上面各个装置所配置的 I/O 位址。
    /proc/kcore :这个就是内存的大小啦!好大对吧!但是不要读他啦!
    /proc/loadavg:还记得 top 以及 uptime 吧?没错!上头的三个平均数值就是记录在此!
    /proc/meminfo :使用 free 列出的内存资讯,嘿嘿!在这里也能够查阅到!
    /proc/modules :目前我们的 Linux 已经加载的模块列表,也可以想成是驱动程序啦!
    /proc/mounts :系统已经挂载的数据,就是用 mount 这个命令呼叫出来的数据啦!
    /proc/swaps :到底系统挂加载的内存在哪里?呵呵!使用掉的 partition 就记录在此啦!
    /proc/partitions: 使用 fdisk -l 会出现目前所有的 partition 吧?在这个文件当中也有纪录喔!
    /proc/pci :在 PCI 汇流排上面,每个装置的详细情况!可用 lspci 来查阅!
    /proc/uptime: 就是用 uptime 的时候,会出现的资讯啦!
    /proc/version :核心的版本,就是用 uname -a 显示的内容啦!
    /proc/bus/* :一些汇流排的装置,还有 U盘 的装置也记录在此喔!

    /usr: 目录

    /usr :文件系统经常很大,因为所有程序安装在这里. /usr 里的所有文件一般来自Linux distribution;本地安装的程序和其他东西在/usr/local 下.这样可能在升级新版系统或新distribution时无须重新安装全部程序.
    /usr/etc: 存放设置文件
    /usr/games: 存放游戏和教学文件
    /usr/include :存放C开发工具的头文件
    /usr/share :存放结构独立的数据
    /usr/bin :几乎所有用户命令.有些命令在/bin 或/usr/local/bin 中.
    /usr/sbin :根文件系统不必要的系统管理命令,例如多数服务程序.
    /usr/share/man , /usr/share/info , /usr/share/doc: 手册页、GNU信息文档和各种其他文档文件.
    /usr/include: C编程语言的头文件.为了一致性这实际上应该在/usr/lib 下,但传统上支持这个名字.
    /usr/lib :程序或子系统的不变的数据文件,包括一些site-wide配置文件.名字lib来源于库(library); 编程的原始库存在/usr/lib 里.
    /usr/local :本地安装的软件和其他文件放在这里.
    /usr/src: 存放程序的源代码

    /var: 目录

    /var :包括系统一般运行时要改变的数据.每个系统是特定的,即不通过网络与其他计算机共享.
    /var/catman:当要求格式化时的man页的cache.man页的源文件一般存在/usr/man/man* 中;有些man页可能有预格式化的版本,存在/usr/man/cat* 中.而其他的man页在第一次看时需要格式化,格式化完的版本存在/var/man 中,这样其他人再看相同的页时就无须等待格式化了. (/var/catman 经常被清除,就象清除临时目录一样.)
    /var/lib :系统正常运行时要改变的文件.
    /var/local:/usr/local 中安装的程序的可变数据(即系统管理员安装的程序).注意,如果必要,即使本地安装的程序也会使用其他/var 目录,例如/var/lock .
    /var/lock:锁定文件.许多程序遵循在/var/lock 中产生一个锁定文件的约定,以支持他们正在使用某个特定的设备或文件.其他程序注意到这个锁定文件,将不试图使用这个设备或文件.
    /var/log:各种程序的Log文件,特别是login (/var/log/wtmp log所有到系统的登录和注销) 和syslog (/var/log/messages 里存储所有核心和系统程序信息. /var/log 里的文件经常不确定地增长,应该定期清除.
    /var/run:保存到下次引导前有效的关于系统的信息文件.例如, /var/run/utmp 包含当前登录的用户的信息.
    /var/spool:mail, news, 打印队列和其他队列工作的目录.每个不同的spool在/var/spool 下有自己的子目录,例如,用户的邮箱在/var/spool/mail 中.
    /var/tmp:比/tmp 允许的大或需要存在较长时间的临时文件. (虽然系统管理员可能不允许/var/tmp 有很旧的文件.)
    展开全文
  • Linux文件系统及文件储存方式

    千次阅读 2017-02-08 20:05:54
    闲来无事复习了下Linux文件系统的基本构成,做下记录。主要涉及的内容有: Ext文件系统的记录方式; Linux文件系统的访问方式; rm删除的原理以及恢复方案。

    前言

    闲来无事复习了下Linux文件系统的基本构成,做下记录。主要涉及的内容有:
    Ext文件系统的记录方式;
    Linux文件系统的访问方式;
    rm删除的原理以及恢复方案。

    Linux文件系统构成

    现在一般使用的是Ext4格式的文件系统, 由最初的Ext2发展而来。
    对于Ext2和Ext3文件系统的描述, 请见:

    Linux将文件系统抽象为一个树形结构,可以在系统内挂载多个磁盘。
    Linux里面所有数据都是文件,文件夹也是文件。
    文件由如下内容构成:

    • 目录项(即文件名与Inode的映射)
    • Inode(文件基本信息与数据块 DataBlock 索引)
    • DataBlock

    文件式的文件结构

    以文件 /root/File 为例:

    # pwd
    /root
    
    # stat /root/
      File: `/root/'
      Size: 4096        Blocks: 8          IO Block: 4096   directory
    Device: fd01h/64769d    Inode: 2315        Links: 14
    Access: (0550/dr-xr-x---)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2017-02-08 16:09:51.510593179 +0800
    Modify: 2017-02-08 16:09:45.789604414 +0800
    Change: 2017-02-08 16:09:45.789604414 +0800
    
    # stat File 
      File: `File'
      Size: 23496       Blocks: 48         IO Block: 4096   regular file
    Device: fd01h/64769d    Inode: 57115       Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2017-02-08 16:06:52.739596489 +0800
    Modify: 2017-02-08 16:06:52.739596489 +0800
    Change: 2017-02-08 16:06:52.739596489 +0800

    当前操作系统持有的磁盘, 0~1号扇区为引导扇区, 2号扇区归”/”使用。

    # stat /
      File: `/'
      Size: 4096        Blocks: 8          IO Block: 4096   directory
    Device: fd01h/64769d    Inode: 2           Links: 30
    Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2017-02-08 13:21:03.821594978 +0800
    Modify: 2016-07-31 03:53:01.651715290 +0800
    Change: 2016-07-31 03:53:01.651715290 +0800

    其包含:

    • Innode: 通过上级目录项的Innode序列’2’找到Innode
    • Innode中的DataBlock又是一个目录项,其中有root -> 2315的映射

    由此层层找到了/root/File这个文件。该文件依然包含:

    • Innode(大小共128B):

      Created with Raphaël 2.1.0Innode文件权限(rwx)文件所有者(root/other)文件创建时间... ... ...数据索引 DataBlock文件是否为空?Innode直接数据索引一直接数据索引二... ... ...直接数据索引十二间接一级数据索引间接二级数据索引间接三级数据索引yesno
    • DataBlock(文件具体内容)

    其中DataBlock的计算方式为:

    • 十五个索引的大小都是4B, 共60B。
    • 前十二个直接索引直接索引到Block, Linux支持的Block大小有1K,2K, 4K
    • 间接索引就是索引的索引。可以索引 (Block大小 / 4B) * Block大小数据
    • 双间接索引是间接索引的索引,三间接索引是双间接索引的索引

    设置为1KB Block大小的文件系统的最大单个文件支持量16G。

    Block大小设1KB为,则间接为(1KB / 4B) * 1KB = 256KB。

    总空间= 直接+ 间接+ 双间接+ 三间接
    总空间= 12K + 256K + 256 * 256K + 256 * 256 *256K = 16G.


    其余:

    Block大小 最大单一文件限制
    1KB 16GB
    2KB 256GB
    4KB 2TB

    文件和文件夹的一个区别为其DataBlock里面储存的内容不一样。文件夹储存的是当前文件夹下一级所有的文件名与Innode号的映射;而文件则储存的是文件的具体内容。

    Linux的一个具体文件

    新建一个空文件 空文件/root/EmptyFile 进行对比

    # touch EmptyFile
    # stat EmptyFile 
      File: `EmptyFile'
      Size: 0           Blocks: 0          IO Block: 4096   regular empty file
    Device: fd01h/64769d    Inode: 57109       Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2017-02-08 16:09:45.789604414 +0800
    Modify: 2017-02-08 16:09:45.789604414 +0800
    Change: 2017-02-08 16:09:45.789604414 +0800
    • 它的文件名储存在 /root 的 DataBlock中。即目录项。
    • Innode里面包含了 Inode: 57109 、Links: 1、Access: (0644/-rw-r–r–)等信息
    • 数据块大小扇区大小 0.5KB, 8个扇区凑成一个Block,所占Block: 0, Size: 0。该文件无数据。
    • 作为对比File的Blocks: 48, Size: 23496。

    一个Block只能属于一个文件。未使用完毕则空置。
    每个扇区的大小、Block由多少个扇区组成、Block的大小在系统格式化的时候就已经定好。理论上不能更改。

    系统对文件的访问方式

    如上一章节所诉。系统在访问文件的时候必须从根”/”开始逐级通过文件名寻找对应的Innode号,再通过Innode访问到文件的具体数据。

    例如访问/home/work/File

    Created with Raphaël 2.1.0找到"/"是否是个文件夹?目录项里有无下级目标?找到目标文件夹下级目标是文件?文件是否存在?找到/home/work/File错误结束yesnoyesnoyesnoyesno

    在这里面, 每次目录的访问都会对访问用户的权限进行校验,如果没有权限都会报权限错误

    Linux系统的删除方式

    了解了文件的储存形式,才能知道怎么删除它。

    Linux对每一个文件都设置了两个引用计数器i_count/i_nlink这两个计数器是关乎Linux操作系统的,跟文件系统无太大关联。

    i_count: 引用计数器,文件被一进程引用,i_count数增加 ,可以认为是当前文件使用者的数量;
    i_nlink: 硬链接数目(可以理解为磁盘的引用计数器),创建硬链接对应的 i_nlink 就会增加

    通过分析rm的源码得知它是调用了系统函数unlinkat

    static enum RM_status
    excise (FTS *fts, FTSENT *ent, struct rm_options const *x, bool is_dir)
    {
      int flag = is_dir ? AT_REMOVEDIR : 0;
      if (unlinkat (fts->fts_cwd_fd, ent->fts_accpath, flag) == 0)
        {
          // print
          // ....
          return RM_OK;
        }
    
      /* The unlinkat from kernels like linux-2.6.32 reports EROFS even for
         nonexistent files.  When the file is indeed missing, map that to ENOENT,
         so that rm -f ignores it, as required.  Even without -f, this is useful
         because it makes rm print the more precise diagnostic.  */
      // ....
    
      if (ignorable_missing (x, errno))
        return RM_OK;
    
      /* When failing to rmdir an unreadable directory, we see errno values
         like EISDIR or ENOTDIR (or, on Solaris 10, EEXIST), but they would be
         meaningless in a diagnostic.  When that happens and the errno value
         from the failed open is EPERM or EACCES, use the earlier, more
    
      // ....
      return RM_ERROR;
    }

    即rm的时候i_count加一再减二。 i_nlink减一(删除目录项中的文件名与Innode号的映射, 即无法再通过这个文件名进行索引)。


    如图:
    文件删除

    可以看到rm的删除仅仅是去掉目录项里面的一个值而已

    也就可以解释如下两个观点:

    • 当一个进程正在访问文件时,文件依然可以被访问。
      • 进程已经得到了文件的DataBlock
      • ls或者cat等操作必须通过文件名,而文件名已经在目录项里面删除了
    • 当文件存在其余硬链接时,文件依然可以显示。
      • 硬链接是文件名对Innode号的映射
      • 只要映射一直存在,文件一定能访问到(rm不会抹掉Innode)

    shred与rm的区别

    shred 在去掉目录项的时候,还会修改Innode以及覆盖DataBlock(3次)。
    此外shred还有多种模式,比如补充0,多次抹掉等等。

    rm删除文件的恢复

    rm 只是删除了目录项的一个链接。只要删除之后当前数据块没有被操作。 文件是一定可以被恢复的。 见testdisk:
    How to use TestDisk

    还有其它很多的文件恢复软件,其使用原理都是绕过文件系统,直接访问磁盘。每读取到一个Innode就根据其DataBlock索引找到被删除文件。

    后续可能会写一个C的单个文件恢复的代码。写好之后贴上来。

    我的代码

    本文若有错误敬请轻拍。

    展开全文
  • Linux 文件系统(目录介绍)

    万次阅读 2019-09-15 01:09:19
    Linux 文件系统(目录介绍) Linux 系统大家一定不陌生,学习工作中肯定会和 Linux 打交道。不过谈及 Linux,给人的第一印象可能就是黑乎乎的命令行,乱七八糟的文件夹,甚至安装软件都不知道是怎么安装上去的。...
  • Windows下访问Linux文件系统

    千次阅读 2019-02-19 16:47:59
    Windows下访问Linux文件系统
  • 本文按照自己的理解从硬件磁盘到文件系统的逐层网上的思路开展,从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。
  • Linux 文件系统类型 磁盘文件系统。 包括硬盘、CD-ROM、DVD、USB存储器、磁盘阵列等。常见文件系统格式有:autofs、coda、Ext(Extended File sytem,扩展文件系统)、Ext2、Ext3、VFAT、ISO9660(通常是CD-ROM...
  • 写这篇文章的主要目的就是提供一步一步的指导,关于如何使用 SSHFS 通过 SSH 挂载远程的 Linux 文件系统或目录。这篇文章对于那些无论出于什么目的,希望在他们本地的系统中挂载远程的文件系统的用户或者系统管理员...
  • Linux文件系统的设计

    万次阅读 2011-04-23 22:26:00
    总论: linux的文件... 一、Linux文件系统概述 1、Linux文件系统组织 Linux中使用树来组织文件系统。整个文件系统构成了一颗树,这棵树以/为根。整个系统有且只有这一颗文件树。这棵树描
  • Linux文件系统管理

    千次阅读 2018-03-19 15:07:43
    一、文件系统概念文件系统使用户不必要关系存储介质的具体块地址,直接通过目录即可进行文件存取。文件系统自动完成存储空间的分配和释放两个功能。元数据:文件权限、所有者、修改信息等。二、文件系统分类传统型...
  • linux文件系统类型

    万次阅读 2018-01-09 20:27:38
     Linux 支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面...
  • Linux 文件系统的创建与挂载方法

    万次阅读 2016-06-13 10:52:45
    1 Linux文件系统的创建 Linux 操作系统在安装服务器时,安装程序已经创建了自己的文件系统,但是在使用了一段时间后, 由于用户和软件系统的增加使得磁盘空间越来越紧张,此时就需要网络管理员对原有的文件...
  • Linux文件系统类型

    千次阅读 2007-06-26 11:45:00
    Linux文件系统类型介绍转至《孔令春学习网》http://hi.baidu.com/klcstudy,略做修改。随着Linux的不断发展,Linux所支持的文件系统类型也在迅速 扩充。伴随着 Linux 2.4 版本的发行,出现了大量的文件系统可能性,...
  • 最近想研究一下Linux文件系统,最好的开始当然是自己写一个简单的文件系统,并能够mount上。这方面的工作其实已经有很多人做过了,比如IBM Linux技术中心的教程:Linux FileSystems in 21 Days( A step by step ...
  • Linux文件系统基础之inode和dentry

    千次阅读 2016-08-10 09:41:28
    Linux文件系统基础之inode和dentry inode(节点)和dentry(目录项)在VFS和实体的文件系统(ext2、ext3等)中都是比较重要的概念。首先看一下虚拟文件系统的标准定义:虚拟文件系统(英语:virtual file system,缩写为...
  • 磁盘分区完毕后自然就是要进行文件系统的格式化 格式化其实就是创建文件系统。命令就是===&gt;mkfs(make fileststem),这个命令只是个综合命令。它会调用正确的文件系统格式化工具 一、mkfs命令 1.功能:...
  • linux文件系统详解

    万次阅读 多人点赞 2017-03-19 19:09:20
    最近在做磁盘性能优化,需要结合文件系统原理去思考优化方向,因此借此机会进一步加深了对文件系统的认识。在看这篇文章之前,建议先看下前面一篇关于磁盘工作原理的解读。下面简单总结一些要点分享出来: 一、文件...
  • 大多数当前流行的Linux文件系统,包括EXT3和EXT4,都将文件系统barrier作为一个增强的安全特性。它保护数据不被写入日记。但 是,在许多情况下,我们并不清楚这些barrier是否有用。本文就为什么要在你的Linux系统上...
  • Linux文件系统功能和作用详解

    千次阅读 2018-08-20 11:35:19
    一、文件系统 1、文件结构 目录:路径映射 文件:有边界的,在磁盘的一段数据流,对数据可以做到按名存取 文件系统:层级结构,目录和文件的一个组合层级结构,起点是根/,组成一个倒置的树状结构, /dev/pts/2...
  • Linux文件系统存储方式

    千次阅读 2014-12-10 10:34:52
    与此同时,Linux和Windows上的文件系统的原理又恰恰是不一样的。Windows中采用的是FAT 表的形式,但是今天我主要的讲的是更为经典的Linux本地文件系统上的存储原理,稍稍分析一下他的结构,作为抛砖引玉。 文件系统...
  • Linux 文件系统挂载与开机自动挂载

    万次阅读 2018-03-15 20:27:16
    1. 背景  前博 介绍了如何配置Linux的Samba服务以便... 对于Linux系统,根文件系统“/”之外的其他文件要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此关联操作即为“挂载”,此目录即为
  • Linux:Windows和Linux文件系统区别

    千次阅读 2019-04-15 19:20:52
    二:Linux下的文件系统Linux 下,我们是看不到这些驱动器盘符,我们看到的是文件夹(目录): linux没有盘符这个概念,只有一个根目录 /,所有文件都在它下面 **Root也在 / 根目录上(**绝对...
  • Linux文件系统简介&挂载简介

    千次阅读 2016-08-15 17:23:11
    文件系统简介主要介绍:linux磁盘分区和目录、挂载基本原理、文件存储结构linux磁盘分区和目录 Linux发行版本之间的差别很少,差别主要表现:在系统管理的特色工具 软件包管理方式的不同。目录结构基本上都是一样的...
  • linux文件系统之i节点详解

    千次阅读 2015-10-30 22:31:16
    i节点即index node索引节点。接下来的是第五个磁盘块了,480个i节点,每个i节点占用32个字节,总共占用480*32/1024=15个磁盘块,现在再...19块:数据块,刚好和Linux文件系统分析之二中提到的数据块开始于第19块吻合。
  • Linux文件系统的缓存机制

    万次阅读 2010-05-17 17:31:00
    Linux文件系统设计了三类的Cache以用来支持多类型的文件系统。一、 VFS索引节点缓存 Inode CacheVFS索引节点是一个Hash表,它不断地读取。VFS提供的索引节点缓存可以加快对文件系统的存取。每次从索引节点缓存中...
  • Linux文件系统下的分区和挂载

    千次阅读 2018-01-11 14:22:27
    方便OS管理,提高系统管理效率大大减少寻找文件所花费的时间,节省花销 硬盘分区  信息是存储在硬盘上的,计算机中存放信息的主要的存储设备就是硬盘,但是硬盘不能直接使用,必须对硬盘进行分割,分割成的一块...
  • linux文件系统初始化过程(1)---概述

    千次阅读 2014-01-04 21:30:36
    linux文件系统主要分为三个部分:文件系统调用;虚拟文件系统(VFS);挂载到VFS的实际文件系统。 其中,VFS是核心,linux文件系统的本质就是在内存中创建一棵VFS树。当根目录被创建后,用户就可以使用系统调用在VFS...
  • 修复损坏linux 文件系统

    万次阅读 2007-10-04 19:20:00
    原贴:http://www.linuxext.com/bbs/htm_data/14/0708/14411.html修复损坏linux 文件系统revised by woflman 2007.08.05今天的我们早上我的服务器无法启动,停在检查mail.wofman.com/var filesystem bad ,我的mail...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,907,660
精华内容 763,064
关键字:

linux文件系统

linux 订阅