APP下载

一文看懂 Linux 系统结构

消息来源:baojiabao.com 作者: 发布时间:2024-05-17

报价宝综合消息一文看懂 Linux 系统结构

Linux系统一般有4个主要部分:

核心、shell、档案系统和应用程序。核心、shell和档案系统一起形成了基本的操作系统结构,它们使得使用者可以执行程式、管理档案并使用系统。部分层次结构如图1-1所示。

1、Linux核心

核心是操作系统的核心,具有很多最基本功能,它负责管理系统的程序、内存、装置驱动程式、档案和网络系统,决定着系统的效能和稳定性。

Linux 核心由如下几部分组成:内存管理、程序管理、装置驱动程式、档案系统和网络管理等。如图:

图1

系统呼叫界面:SCI 层提供了某些机制执行从使用者空间到核心的函式呼叫。这个界面依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函式呼叫多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。

2、内存管理

对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的实体内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟对映所使用的硬件机制。

不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。

为了支援多个使用者使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。

3、程序管理

程序实际是某特定应用程序的一个执行实体。在 Linux 系统中,能够同时执行多个程序,Linux 通过在短的时间间隔内轮流执行这些程序而实现“多工”。这一短的时间间隔称为“时间片”,让程序轮流执行的方法称为“程序排程” ,完成排程的程式称为排程程式。

程序排程控制程序对CPU的访问。当需要选择下一个程序执行时,由排程程式选择最值得执行的程序。可执行程序实际上是仅等待CPU资源的程序,如果某个程序在等待其它资源,则该程序是不可执行程序。Linux使用了比较简单的基于优先级的程序排程算法选择新的程序。

通过多工机制,每个程序可认为只有自己独占计算机,从而简化程式的编写。每个程序有自己单独的地址空间,并且只能由这一程序访问,这样,操作系统避免了程序之间的互相干扰以及“坏”程式对系统可能造成的危害。 为了完成某特定任务,有时需要综合两个程式的功能,例如一个程式输出文字,而另一个程式对文字进行排序。为此,操作系统还提供程序间的通讯机制来帮助完成这样的任务。Linux 中常见的程序间通讯机制有讯号、管道、共享内存、讯号量和套接字等。

核心通过 SCI 提供了一个应用程序程式设计界面(API)来建立一个新程序(fork、exec 或 Portable Operating System Interface [POSⅨ] 函式),停止程序(kill、exit),并在它们之间进行通讯和同步(signal 或者 POSⅨ 机制)。

4、档案系统

和 DOS 等操作系统不同,Linux 操作系统中单独的档案系统并不是由驱动器号或驱动器名称(如 A: 或 C: 等)来标识的。相反,和 UNIX 操作系统一样,Linux 操作系统将独立的档案系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一档案系统。Linux 将新的档案系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的档案系统结合成为一个整体。Linux 操作系统的一个重要特点是它支援许多不同型别的档案系统。Linux 中最普遍使用的档案系统是 Ext2,它也是 Linux 土生土长的档案系统。但 Linux 也能够支援 FAT、VFAT、FAT32、MINIX 等不同型别的档案系统,从而可以方便地和其它操作系统交换资料。由于 Linux 支援许多不同的档案系统,并且将它们组织成了一个统一的虚拟档案系统.

虚拟档案系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把档案系统操作和不同档案系统的具体实现细节分离了开来,为所有的装置提供了统一的界面,VFS提供了多达数十种不同的档案系统。虚拟档案系统可以分为逻辑档案系统和装置驱动程式。逻辑档案系统指Linux所支援的档案系统,如ext2,fat等,装置驱动程式指为每一种硬件控制器所编写的装置驱动程式模组。

虚拟档案系统(VFS)是 Linux 核心中非常有用的一个方面,因为它为档案系统提供了一个通用的界面抽象。VFS 在 SCI 和核心所支援的档案系统之间提供了一个交换层。即VFS 在使用者和档案系统之间提供了一个交换层。

VFS 在使用者和档案系统之间提供了一个交换层:

在 VFS 上面,是对诸如 open、close、read 和 write 之类的函式的一个通用 API 抽象。在 VFS 下面是档案系统抽象,它定义了上层函式的实现方式。它们是给定档案系统(超过 50 个)的外挂。档案系统的源代码可以在 ./linux/fs 中找到。

档案系统层之下是缓冲区快取,它为档案系统层提供了一个通用函式集(与具体档案系统无关)。这个快取层通过将资料保留一段时间(或者随即预先读取资料以便在需要是就可用)优化了对物理装置的访问。缓冲区快取之下是装置驱动程式,它实现了特定物理装置的界面。

因此,使用者和程序不需要知道档案所在的档案系统型别,而只需要象使用 Ext2 档案系统中的档案一样使用它们。

5、装置驱动程式

装置驱动程式是 Linux 核心的主要部分。和操作系统的其它部分类似,装置驱动程式执行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个装置驱动程式的错误都可能导致操作系统的崩溃。装置驱动程式实际控制操作系统和硬件装置之间的互动。

装置驱动程式提供一组操作系统可理解的抽象界面完成和操作系统之间的互动,而与硬件相关的具体操作细节由装置驱动程式完成。一般而言,装置驱动程式和装置的控制芯片有关,例如,如果计算机硬盘是 SCSI 硬盘,则需要使用 SCSI 驱动程式,而不是 IDE 驱动程式。

6、网络界面(NET)

提供了对各种网络标准的存取和各种网络硬件的支援。网络界面可分为网络协议和网络驱动程式。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。

Linux 的网络实现支援 BSD 套接字,支援全部的TCP/IP协议。Linux核心的网络部分由BSD套接字、网络协议层和网络装置驱动程式组成。网络装置驱动程式负责与硬件装置通讯,每一种可能的硬件装置都有相应的装置驱动程式。

7、Linux shell

shell是系统的使用者界面,提供了使用者与核心进行互动操作的一种界面。它接收使用者输入的命令并把它送入核心去执行,是一个命令直译器。另外,shell程式语言具有普通程式语言的很多特点,用这种程式语言编写的shell程式与其他应用程序具有同样的效果。

目前主要有下列版本的shell。

1.Bourne Shell:是贝尔实验室开发的。

2.BASH:是GNU的Bourne Again Shell,是GNU操作系统上预设的shell,大部分linux的发行套件使用的都是这种shell。

3.Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell相容。

4.C Shell:是SUN公司Shell的BSD版本。

8、Linux 档案系统

档案系统是档案存放在磁盘等储存装置上的组织方法。Linux系统能支援多种目前流行的档案系统,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。

8.1 档案型别

Linux下面的档案型别主要有:

1) 普通档案:C语言元程式码、SHELL指令码、二进位制的可执行档案等。分为纯文字和二进位制。

2) 目录档案:目录,储存档案的唯一地方。

3) 连结档案:指向同一个档案或目录的的档案。

4) 装置档案:与系统外设相关的,通常在/dev下面。分为块装置和字元装置。

5)管道(FIFO)档案 : 提供程序建通讯的一种方式

6)套接字(socket) 档案: 该档案型别与网络通讯有关

可以通过ls –l, file, stat几个命令来检视档案的型别等相关资讯。

8.2 Linux目录

档案结构是档案存放在磁盘等存贮装置上的组织方法。主要体现在对档案和目录的组织上。

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

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

完整的目录树可划分为小的部分,这些小部分又可以单独存放在自己的磁盘或分割槽上。这样,相对稳定的部分和经常变化的部分可单独存放在不同的分割槽中,从而方便备份或系统管理。目录树的主要部分有 root、/usr、/var、/home 等(图2) 。这样的布局可方便在 Linux 计算机之间共享档案系统的某些部分。

图2

Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。

微软的DOS和windows也是采用树型结构,但是在DOS和 windows中这样的树型结构的根是磁盘分割槽的碟符,有几个分割槽就有几个树型结构,他们之间的关系是并列的。最顶部的是不同的磁盘(分割槽),如:C,D,E,F等。

但是在linux中,无论操作系统管理几个磁盘分割槽,这样的目录树只有一个。从结构上讲,各个磁盘分割槽上的树型目录不一定是并列的。

8.3 Linux磁盘分割槽

一、主分割槽,扩充套件分割槽和逻辑分割槽: 

linux分割槽不同于windows,硬盘和硬盘分割槽在Linux都表示为装置.

硬盘分割槽一共有三种:主分割槽,扩充套件分割槽和逻辑分割槽。

硬盘的分割槽主要分为主分割槽(Primary Partion)和扩充套件分割槽(Extension Partion)两种,主分割槽和扩充套件分割槽的数目之和不能大于四个。

主分割槽(Primary Partion):可以马上被使用但不能再分割槽。

扩充套件分割槽(Extension Partion):必须再进行分割槽后才能使用,也就是说它必须还要进行二次分割槽。

逻辑分割槽((Logical Partion)):由扩充套件分割槽建立起来的分割槽。逻辑分割槽没有数量上限制。

扩充套件分割槽只不过是逻辑分割槽的“容器”,实际上只有主分割槽和逻辑分割槽进行资料储存。

二、Linux下硬盘分割槽的标识

硬盘分割槽的标识一般使用/dev/hd[a-z]X或者/dev/sd[a-z]X来标识,其中[a-z]代表硬盘号,X代表硬盘内的分割槽号。

整块硬盘分割槽的块号标识:Linux下用hda、hdb、sda、sdb 等来标识不同的硬盘;

其中:

IDE界面硬盘:表示为/dev/hda1、/dev/hdb …;

SCSI 界面的硬盘、SATA界面的硬盘表示为/dev/sda、/dev/sdb … … ;

硬盘内的分割槽:如果X的值是1到4,表示硬盘的主分割槽(包含扩充套件分割槽);逻辑分割槽从是从5开始的,比如/dev/hda5肯定是逻辑分割槽了;

例如:

用hda1、hda2、 hda5、hda6 来标识不同的分割槽。其中,字母a 代表第一块硬盘,b代表第二块硬盘,依次类推。而数字1 代表一块硬盘的第一个分割槽、2 代表第二个分割槽,依次类推。1 到4 对应的是主分割槽(Primary Partition)或扩充套件分割槽(Extension Partition)。从5开始,对应的都是硬盘的逻辑分割槽(Logical Partition)。一块硬盘即使只有一个主分割槽,逻辑分割槽也是从5开始编号的,这点应特别注意。

总结:一个硬盘分割槽首先要大确认在哪个硬盘,然后再确认它所在硬盘内的哪个分割槽。

对于/dev/hda 类似的表示方法,也并不寞生吧;我们在Linux通过fdisk -l 就可以查到硬盘是/dev/hda还是/dev/hdb;

[[email protected] ~]# fdisk -l Disk /dev/hda: 80.0 GB, 80026361856 bytes 255 heads, 63 sectors/track, 9729 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 970 7791493+ 7 HPFS/NTFS /dev/hda2 971 9729 70356667+ 5 Extended /dev/hda5 971 2915 15623181 b W95 FAT32 /dev/hda6 2916 4131 9767488+ 83 linux /dev/hda7 4132 5590 11719386 83 linux /dev/hda8 5591 6806 9767488+ 83 linux /dev/hda9 6807 9657 22900626 83 linux /dev/hda10 9658 9729 578308+ 82 linux swap / Solaris

请注意第一行, Disk /dev/hda: 80.0 GB, 80026361856 bytes ,这个就是表示机器中只有一个硬盘装置/dev/hda ,体积大小为 80.0G;下面的就是硬盘的分割槽,每个分割槽都有详细的资讯,在这里不详细说了;

Linux下磁盘分割槽和目录的关系如下:

– 任何一个分割槽都必须挂载到某个目录上。

– 目录是逻辑上的区分。分割槽是物理上的区分。

– 磁盘Linux分割槽都必须挂载到目录树中的某个具体的目录上才能进行读写操作。

– 根目录是所有Linux的档案和目录所在的地方,需要挂载上一个磁盘分割槽。

8.4 linux主要目录的功用。

/bin 二进位制可执行命令/dev 装置特殊档案/etc 系统管理和配置档案/etc/rc.d 启动的配置档案和指令码/home 使用者主目录的基点,比如使用者user的主目录就是/home/user,可以用~user表示/lib 标准程式设计库,又叫动态连结共享库,作用类似windows里的.dll档案/sbin 系统管理命令,这里存放的是系统管理员使用的管理程式/tmp 公用的临时档案储存点/root 系统管理员的主目录(呵呵,特权阶级)/mnt 系统提供这个目录是让使用者临时挂载其他的档案系统。/lost+found 这个目录平时是空的,系统非正常关机而留下“无家可归”的档案(windows下叫什么.chk)就在这里/proc 虚拟的目录,是系统内存的对映。可直接访问这个目录来获取系统资讯。/var 某些大档案的溢位区,比方说各种服务的日志档案/usr 最庞大的目录,要用到的应用程序和档案几乎都在这个目录。其中包含:/usr/X11R6 存放X window的目录/usr/bin 众多的应用程序/usr/sbin 超级使用者的一些管理程式/usr/doc linux文件/usr/include linux下开发和编译应用程序所需要的标头档案/usr/lib 常用的动态连结库和软件包的配置档案/usr/man 帮助文件/usr/src 源代码,linux核心的源代码就放在/usr/src/linux里/usr/local/bin 本地增加的命令/usr/local/lib 本地增加的库

8.5 linux档案系统

档案系统指档案存在的物理空间,linux系统中每个分割槽都是一个档案系统,都有自己的目录层次结构。linux会将这些分属不同分割槽的、单独的档案系统按一定的方式形成一个系统的总的目录层次结构。一个操作系统的执行离不开对档案的操作,因此必然要拥有并维护自己的档案系统。

档案系统型别:ext2 : 早期linux中常用的档案系统ext3 : ext2的升级版,带日志功能RAMFS : 内存档案系统,速度很快NFS : 网络档案系统,由SUN发明,主要用于远端档案共享MS-DOS : MS-DOS档案系统VFAT : Windows 95/98 操作系统采用的档案系统FAT : Windows XP 操作系统采用的档案系统NTFS: Windows NT/XP 操作系统采用的档案系统HPFS : OS/2 操作系统采用的档案系统PROC : 虚拟的程序档案系统ISO9660 : 大部分光碟所采用的档案系统ufsSun : OS 所采用的档案系统NCPFS : Novell 服务器所采用的档案系统SMBFS : Samba 的共享档案系统XFS : 由SGI开发的先进的日志档案系统,支援超大容量档案JFS :IBM的AIX使用的日志档案系统ReiserFS : 基于平衡树结构的档案系统udf: 可擦写的资料光碟档案系统

2.档案系统特性:

磁盘分割槽完毕后还需要进行格式化(format),之后操作系统才能够使用这个分割槽。 格式化的目的是能使操作系统可以使用的档案系统格式(即我们上面提到档案系统型别).

每种操作系统能够使用的档案系统并不相同. 如windows 98 以前的微软操作系统主要利用的档案系统是 FAT (或 FAT16),windows 2000 以后的版本有所谓的 NTFS 档案系统,至于 Linux 的正统档案系统则为 Ext2 (Linux second extended file system, ext2fs)这一个。此外,在预设的情况下,windows 操作系统是不会认识 Linux 的 Ext2 的。

传统的磁盘与档案系统之应用中,一个分割槽就是只能够被格式化成为一个档案系统,所以我们可以说一个 filesystem 就是一个 partition。但是由于新技术的利用,例如我们常听到的LVM与软件磁盘阵列(software raid), 这些技术可以将一个分割槽格式化为多个档案系统(例如LVM),也能够将多个分割槽合成一个档案系统(LVM, RAID)! 所以说,目前我们在格式化时已经不再说成针对 partition 来格式化了, 通常我们可以称呼一个可被挂载的资料为一个档案系统而不是一个分割槽喔!

那么档案系统是如何执行的呢?这与操作系统的档案资料有关。较新的操作系统的档案资料除了档案实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的档案许可权(rwx)与档案属性(拥有者、群组、时间引数等)。 档案系统通常会将这两部分的资料分别存放在不同的区块,许可权与属性放置到 inode 中,至于实际资料则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个档案系统的整体资讯,包括 inode 与 block 的总量、使用量、剩余量等。

对于一个磁盘分割槽来说,在被指定为相应的档案系统后,整个分割槽被分为 1024,2048 和 4096 字节大小的块。根据块使用的不同,可分为:

超级块(Superblock): 这是整个档案系统的第一块空间。包括整个档案系统的基本资讯,如块大小,inode/block的总量、使用量、剩余量,指向空间 inode 和资料块的指标等相关资讯。inode块(档案索引节点) : 档案系统索引,记录档案的属性。它是档案系统的最基本单元,是档案系统连线任何子目录、任何档案的桥梁。每个子目录和档案只有唯一的一个 inode 块。它包含了档案系统中档案的基本属性(档案的长度、建立及修改时间、许可权、所属关系)、存放资料的位置等相关资讯. 在 Linux 下可以通过 “ls -li” 命令检视档案的 inode 资讯。硬连线和原始档具有相同的 inode 。资料块(Block) :实际记录档案的内容,若档案太大时,会占用多个 block。为了提高目录访问效率,Linux 还提供了表达路径与 inode 对应关系的 dentry 结构。它描述了路径资讯并连线到节点 inode,它包括各种目录资讯,还指向了 inode 和超级块。

就像一本书有封面、目录和正文一样。在档案系统中,超级块就相当于封面,从封面可以得知这本书的基本资讯; inode 块相当于目录,从目录可以得知各章节内容的位置;而资料块则相当于书的正文,记录着具体内容。

Linux正统的档案系统(如ext2、3等)将硬盘分割槽时会划分出超级块、inode Table区块和data block资料区域。一个档案由一个超级块、inode和资料区域块组成。Inode包含档案的属性(如读写属性、owner等,以及指向资料块的指标),资料区域块则是档案内容。当检视某个档案时,会先从inode table中查出档案属性及资料存放点,再从资料块中读取资料。

ext2档案系统示意图

我们将 inode 与 block 区块用图解来说明一下,如下图所示,档案系统先格式化出 inode 与 block 的区块,假设某一个档案的属性与许可权资料是放置到 inode 4 号(下图较小方格内),而这个 inode 记录了档案资料的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一口气将四个 block 内容读出来! 那么资料的读取就如同下图中的箭头所指定的模样了。

图 inode/block 资料存取示意图

这种资料存取的方法我们称为索引式档案系统(indexed allocation)。那有没有其他的惯用档案系统可以比较一下啊? 有的,那就是我们惯用的闪盘(闪存),闪盘使用的档案系统一般为 FAT 格式。FAT 这种格式的档案系统并没有 inode 存在,所以 FAT 没有办法将这个档案的所有 block 在一开始就读取出来。每个 block 号码都记录在前一个 block 当中, 其读取方式有点像下图所示:

图、FAT档案系统资料存取示意图

上图中我们假设档案的资料依序写入1->7->4->15号这四个 block 号码中, 但这个档案系统没有办法一口气就知道四个 block 的号码,他得要一个一个的将 block 读出后,才会知道下一个 block 在何处。 如果同一个档案资料写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的资料, 因此磁盘就会多转好几圈才能完整的读取到这个档案的内容!

常常会听到所谓的“碎片整理”吧? 需要碎片整理的原因就是档案写入的 block 太过于离散了,此时档案读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个档案所属的 blocks 汇整在一起,这样资料的读取会比较容易啊! 想当然尔,FAT 的档案系统需要经常的碎片整理一下,那么 Ext2 是否需要磁盘重整呢?

由于 Ext2 是索引式档案系统,基本上不太需要常常进行碎片整理的。但是如果档案系统使用太久, 常常删除/编辑/新增档案时,那么还是可能会造成档案资料太过于离散的问题,此时或许会需要进行重整一下的。 不过,老实说,鸟哥倒是没有在 Linux 操作系统上面进行过 Ext2/Ext3 档案系统的碎片整理说!似乎不太需要啦!^_^

可以用ln命令对一个已经存在的档案再建立一个新的连线,而不复制档案的内容。连线有软连线和硬连线之分,软连线又叫符号连线。它们各自的特点是:

硬连线:原档名和连线档名都指向相同的实体地址。目录不能有硬连线;硬连线不能跨越档案系统(不能跨越不同的分割槽)档案在磁盘中只有一个拷贝,节省硬盘空间;

由于删除档案要在同一个索引节点属于唯一的连线时才能成功,因此可以防止不必要的误删除。

符号连线:用ln -s命令建立档案的符号连线符号连线是linux特殊档案的一种,作为一个档案,它的资料是它所连线的档案的路径名。类似windows下的快捷方式。

可以删除原有的档案而储存连线档案,没有防止误删除功能。

这一段的的内容过于抽象,又是节点又是阵列的,我已经尽量通俗再通俗了,又不好加例子作演示。大家如果还是云里雾里的话,我也没有什么办法了,只有先记住,日后在实际应用中慢慢体会、理解了。这也是我学习的一个方法吧。

8.6 档案系统在核心中的表示

核心资料结构

Linux核心的VFS子系统可以图示如下:

档案与IO: 每个程序在PCB(Process Control Block)中都储存着一份档案描述符表,档案描述符就是这个表的索引,每个表项都有一个指向已开启档案的指标,现在我们明确一下:已开启的档案在核心中用file结构体表示,档案描述符表中的指标指向file结构体。

在file结构体中维护File Status Flag(file结构体的成员f_flags)和当前读写位置(file结构体的成员f_pos)。在上图中,程序1和程序2都开启同一档案,但是对应不同的file结构体,因此可以有不同的File Status Flag和读写位置。file结构体中比较重要的成员还有f_count,表示引用计数(Reference Count),后面我们会讲到,dup、fork等系统呼叫会导致多个档案描述符指向同一个file结构体,例如有fd1和fd2都引用同一个file结构体,那么它的引用计数就是2,当close(fd1)时并不会释放file结构体,而只是把引用计数减到1,如果再close(fd2),引用计数就会减到0同时释放file结构体,这才真的关闭了档案。

每个file结构体都指向一个file_operations结构体,这个结构体的成员都是函式指标,指向实现各种档案操作的核心函式。比如在使用者程式中read一个档案描述符,read通过系统呼叫进入核心,然后找到这个档案描述符所指向的file结构体,找到file结构体所指向的file_operations结构体,呼叫它的read成员所指向的核心函式以完成使用者请求。在使用者程式中呼叫lseek、read、write、ioctl、open等函式,最终都由核心呼叫file_operations的各成员所指向的核心函式完成使用者请求。

file_operations结构体中的release成员用于完成使用者程式的close请求,之所以叫release而不叫close是因为它不一定真的关闭档案,而是减少引用计数,只有引用计数减到0才关闭档案。对于同一个档案系统上开启的常规档案来说,read、write等档案操作的步骤和方法应该是一样的,呼叫的函式应该是相同的,所以图中的三个开启档案的file结构体指向同一个file_operations结构体。如果开启一个字元装置档案,那么它的read、write操作肯定和常规档案不一样,不是读写磁盘的资料块而是读写硬件装置,所以file结构体应该指向不同的file_operations结构体,其中的各种档案操作函式由该装置的驱动程式实现。

每个file结构体都有一个指向dentry结构体的指标,“dentry”是directory entry(目录项)的缩写。我们传给open、stat等函式的引数的是一个路径,例如/home/akaedu/a,需要根据路径找到档案的inode。为了减少读盘次数,核心快取了目录的树状结构,称为dentry cache,其中每个节点是一个dentry结构体,只要沿着路径各部分的dentry搜寻即可,从根目录/找到home目录,然后找到akaedu目录,然后找到档案a。dentry cache只储存最近访问过的目录项,如果要找的目录项在cache中没有,就要从磁盘读到内存中。

每个dentry结构体都有一个指标指向inode结构体。inode结构体储存着从磁盘inode读上来的资讯。在上图的例子中,有两个dentry,分别表示/home/akaedu/a和/home/akaedu/b,它们都指向同一个inode,说明这两个档案互为硬连结。inode结构体中储存着从磁盘分割槽的inode读上来资讯,例如所有者、档案大小、档案型别和许可权位等。每个inode结构体都有一个指向inode_operations结构体的指标,后者也是一组函式指标指向一些完成档案目录操作的核心函式。

和file_operations不同,inode_operations所指向的不是针对某一个档案进行操作的函式,而是影响档案和目录布局的函式,例如新增删除档案和目录、跟踪符号连结等等,属于同一档案系统的各inode结构体可以指向同一个inode_operations结构体。

inode结构体有一个指向super_block结构体的指标。super_block结构体储存着从磁盘分割槽的超级块读上来的资讯,例如档案系统型别、块大小等。super_block结构体的s_root成员是一个指向dentry的指标,表示这个档案系统的根目录被mount到哪里,在上图的例子中这个分割槽被mount到/home目录下。

file、dentry、inode、super_block这几个结构体组成了VFS的核心概念。对于ext2档案系统来说,在磁盘储存布局上也有inode和超级块的概念,所以很容易和VFS中的概念建立对应关系。而另外一些档案系统格式来自非UNIX系统(例如Windows的FAT32、NTFS),可能没有inode或超级块这样的概念,但为了能mount到Linux系统,也只好在驱动程式中硬凑一下,在Linux下看FAT32和NTFS分割槽会发现许可权位是错的,所有档案都是rwxrwxrwx,因为它们本来就没有inode和许可权位的概念,这是硬凑出来的。

8.6 挂载档案系统

linux系统中每个分割槽都是一个档案系统,都有自己的目录层次结构。linux会将这些分属不同分割槽的、单独的档案系统按一定的方式形成一个系统的总的目录层次结构。这里所说的“按一定方式”就是指的挂载。

将一个档案系统的顶层目录挂到另一个档案系统的子目录上,使它们成为一个整体,称为挂载。把该子目录称为挂载点.

例如要读取硬盘中的一个格式化好的分割槽、光碟或软件等装置时,必须先把这些装置对应到某个目录上,而这个目录就称为“挂载点(mount point)”,这样才可以读取这些装置。 挂载后将物理分割槽细节遮蔽掉,使用者只有统一的逻辑概念。所有的东西都是档案。

注意:1、挂载点必须是一个目录。

2、一个分割槽挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。

对于其他操作系统建立的档案系统的挂载也是这样。但是需要理解的是:光碟、软盘、其他操作系统使用的档案系统的格式与linux使用的档案系统格式是不一样的。光碟是ISO9660;软盘是fat16或ext2;windows NT是fat16、NTFS;windows98是fat16、fat32;windows2000和windowsXP是fat16、fat32、 NTFS。挂载前要了解linux是否支援所要挂载的档案系统格式。

挂载时使用mount命令,其格式:mount [-引数] [装置名称] [挂载点]

其中常用的引数有

-t 指定装置的档案系统型别(什么提到的档案型别)

-o 指定挂载档案系统时的选项。有些也可用在/etc/fstab中。常用的有

codepage=XXX 内码表iocharset=XXX 字符集ro 以只读方式挂载rw 以读写方式挂载nouser 使一般使用者无法挂载user 可以让一般使用者挂载装置

例如:

1.挂载windows的档案系统:

1)首先我们使用sudo fdisk -l检视挂载的装置,例如最下面有:/dev/hda5

2)mkdir建立一个目录,这里的目录是作为挂在目录,就是你要把E盘挂到这个目录下:mk /mnt/winc

3)windows和linux使用的不是一个档案系统,一般情况下linux不挂载windows档案系统,所以要你手动mount:

# mount -t vfat /dev/hda5 /mnt/winc ( -t vfat指出这里的档案系统fat32)

现在就可以进入/mnt/winc等目录读写这些档案了。

2.挂载光碟:# mk /mnt/cdrom

# mount -t iso9660 /dev/cdrom /mnt/cdrom (关盘的名字一般都是cdrom,这条命令一般都通用)

3.虚拟机器共享资料夹:例如在VirtualBox下,主机是Windows,Ubuntu是Guest。共分三步:

1). 首先要安装虚拟电脑工具包:在VirtualBox的选单里选择”装置”->”安装虚拟电脑工具包”,你会发现在Ubuntu桌面上多出一个光碟图示,这张光碟预设被自动载入到了资料夹/media/cdom0,而且/cdrom自动指向这个资料夹。预设设定下档案管理器会自动开启这张光碟,可以看到里面有个”VBoxLinuxAdditions.run”档案。开启一个命令列终端,依次输入”cd /cdrom”和”sudo sh ./VBoxLinuxAdditions.run”,不含双引号,开始安装工具包。安装完毕,会用英文提示要重启Ubuntu,建议立刻重启。重启后,比较明显的变化是鼠标是共享模式,并且剪贴簿也和Windows共享了。如果有这些变化,说明虚拟电脑工具包已经装成功。

2). 下一步设定共享资料夹。

在共享资料夹设定视窗中,单击右侧的”新增一个共享资料夹”,路径选择你想要共享的Windows资料夹,共享名任取一个自己喜欢的,比如”myshare”,选项read-only是指是否只允许ubuntu读这个资料夹,请根据需要选择这个选项。

3). 在ubuntu下挂载这个共享资料夹:sudo mount -t vboxsf myshare /media/share

其中”myshare”是之前取的共享资料夹的名字,”/media/share”是要挂载到的目标档案.

8.7 自动挂载windows分割槽

每次开机访问windows分割槽都要执行mount命令显然太烦琐,为什么访问其他的linux分割槽不用使用mount命令呢?

其实,每次开机时,linux自动将需要挂载的linux分割槽挂载上了。那么我们是不是可以设定让linux在启动的时候也挂载我们希望挂载的分割槽,如windows分割槽,以实现档案系统的自动挂载呢?

这是完全可以的。在/etc目录下有个fstab档案,它里面列出了linux开机时自动挂载的档案系统的列表。我的/etc/fstab档案如下:

/dev/hda2 / ext3 defaults 1 1/dev/hda1 /boot ext3 defaults 1 2none /dev/pts devpts gid=5,mode=620 0 0none /proc proc defaults 0 0none /dev/shm tmpfs defaults 0 0/dev/hda3 swap swap defaults 0 0/dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0/dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0/dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0

在/etc/fstab档案里,第一列是挂载的档案系统的装置名,第二列是挂载点,第三列是挂载的档案系统型别,第四列是挂载的选项,选项间用逗号分隔。第五六列不知道是什么意思,还望高手指点。

在最后两行是我手工新增的windows下的C;D盘,加了codepage=936和iocharset=cp936引数以支援中文档名。引数defaults实际上包含了一组预设引数:

rw 以可读写模式挂载

suid 开启使用者ID和群组ID设定位

dev 可解读档案系统上的字元或区块装置

exec 可执行二进位制档案

auto 自动挂载

nouser 使一般使用者无法挂载

async 以异步方式执行档案系统的输入输出操作

大家可以看到在这个列表里,光驱和软驱是不自动挂载的,引数设定为noauto。(如果你非要设成自动挂载,你要确保每次开机时你的光驱和软驱里都要有盘,呵呵。)

8.8 .软连线、硬连结

可以用ln命令对一个已经存在的档案再建立一个新的连线,而不复制档案的内容。连线有软连线和硬连线之分,软连线又叫符号连线。它们各自的特点是:

硬连线:是给档案一个副本,原档名和连线档名都指向相同的实体地址。目录不能有硬连线;硬连线不能跨越档案系统(不能跨越不同的分割槽)档案在磁盘中只有一个拷贝,节省硬盘空间;

修改其中一个,与其连线的档案同时被修改。如果删除其中任意一个其余的档案将不受影响。

由于删除档案要在同一个索引节点属于唯一的连线时才能成功,因此可以防止不必要的误删除。

符号连线(软连线):用ln -s命令建立档案的符号连线符号连线是linux特殊档案的一种,作为一个档案,它的资料是它所连线的档案的路径名。类似windows下的快捷方式。

当然删除这个连线,也不会影响到原始档,但对连线档案的使用、引用都是直接呼叫原始档的。

具体关系可以看下图:

图5:软连结和硬连结

从图上可以看出硬连结和软连结的区别:

1:硬连结原档案和新档案的inode编号一致。而软连结不一样。2:对原档案删除,会导致软连结不可用,而硬连结不受影响。3:对原档案的修改,软、硬连结档案内容也一样的修改,因为都是指向同一个档案内容的。

8.9.档案目录管理命令

磁盘和档案空间 :fdisk df du

档案目录与管理: cd pwd mkdir rmdir ls cp rm mv

检视档案内容 cat、tac、more、less、head 、tail

档案目录与许可权 :chmod chown chgrp umask

档案查询:which、whereis、locate、find、find

9、Linux 应用

标准的Linux系统一般都有一套都有称为应用程序的程式集,它包括文字编辑器、程式语言、X Window、办公套件、Internet工具和数据库等。

10、Linux核心引数优化

核心引数是使用者和系统核心之间互动的一个界面,通过这个界面,使用者可以在系统执行的同时动态更新核心配置,而这些核心引数是通过Linux Proc档案系统存在的。因此,可以通过调整Proc档案系统达到优化Linux效能的目的。

来源: huangguisu

连结: http://blog.csdn.net/hguisu/article/details/6122513

免责宣告:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

2019-07-01 06:45:00

相关文章