Electronic Joint Business

Solution for E-Business

Linux Kernel

Linux 内核简介之虚拟文件系统

虚拟文件系统又称虚拟文件系统交换器(Virual Filesystem Switch ,简称 VFS)。之所以说是“虚拟”,是因为VFS是一个抽象层,其所有数据结构都是在运行以后才建立,并在卸载时删除,磁盘上并不实际存储这些数据结构。VFS 提供了操作文件 目录和对象的统一方法,即通用文件模型。但显然如果只有 VFS,系统是无法工作的,因为这些数据结构只有和实际的文件系统,如 Ext2、Minix、VFAT 等相结合才有意义。相对的, Ext2、Minix、VFAT 等则称为“具体文件系统”。具体文件系统必须提供与 VFS 定义的结构适配的例程。所以对于基于完全不同概念的文件系统如XFS或Reiser,适配会相当困难,而如 EXT2 则会有性能提升。

Linux 内核可以支持40多种文件系统,主要分为三大类 磁盘文件系统,虚拟文件系统 如 proc 文件系统 及网络文件系统。

VFS 是 Linux 内核的一个子系统,内核中的其它子系统只与 VFS 打交道,而并不与具体文件系统发生联系。对具体文件系统来说,VFS 是一个管理者,而对内核的其它子系统来说,VFS 是它们与具体文件系统的接口,整个 Linux 中文件系统的逻辑关系如图1-1所示:

VFS 提供了一个统一的接口(实际上就是 file_operatoin 数据结构,稍后介绍)。一个具体文件系统要想为 Linux 所支持,就必须按该接口编写自己的操作函数,从而将细节对内核其它子系统隐藏起来。因此对内核其它子系统以及运行在操作系统之上的用户程序而言,所有的文件系统都是透明的。实际上,要支持一种新的文件系统,主要任务就是实现这些接口函数。

总的来看 VFS 主要作用有:

>>> 阅读全文

 

, ,

FreeBSD 的 ACPI 实现

几乎所有现代计算机系统的硬件都允许对电源使用进行管理、对系统温度进行监测,并将之维持在适当水平。由此一定水平的电源消耗就能带来最佳的性能。这对于使用电池的移动平台尤为重要,因为不必要的电源消耗会减少电池续航时间,在结束工作前,你就不得不重新充电。节电对桌面系统也同样重要,在系统空闲时关闭显示器、磁盘驱动器等设备显著可以降低能耗。1

不幸的是,在传统 PC 中, 用于电源及散热配置管理的大多数软件都与 BIOS 紧密相关。而且,除非受管的设备所连接的是即插即用总线(如 PCI),否则操作系统就很难便捷地检测、配置或管理设备。例如 ISA PnP 机制适用于枚举外置 ISA 卡设备而不是板载设备。而 PnP BIOS 则适用于枚举板载设备,但也很难扩展成通用方法。另外 PnP BIOS 是 16 位的,所以操作系统必须通过 16 位虚拟环境才能调用 PnP BIOS 的函数。

在引入高级配置和电源管理接口 (ACPI — Advanced Configuration and Power Management Interface) 前, 高级电源管理 (APM) BIOS 被广泛用于电源管理。在 APM 中,大部分的电源管理控制逻辑都驻留在 APM BIOS 代码中。支持 APM 的操作系统通过固定的 BIOS API 与 APM BIOS 进行通信,这些 API 提供了 BIOS 功能的基本访问。支持 APM 的操作系统必须定期对 APM 进行轮询以处理 APM 相关事件。APM BIOS 还可使用特殊系统管理中断,该中断对操作系统是不可见的。APM 提供了四种状态:运行、暂停、休眠和软关闭。

有三大因素制约着 APM 的使用。首先,除非供应商提供特殊的程序,否则很多 APM 功能都要在操作系统加载前通过供应商专有的 BIOS 菜单进行配置,比如设置关闭显示器前的系统空闲时间。此外,实施 APM 电源管理配置的具体策略是由 BIOS 供应商指定的。例如,某 APM BIOS 的策略是在关闭显示器的同时也降低 CPU 时钟频率或关闭网卡等设备,如果不修改 BIOS ,你就无法修改这一策略。

其次,APM 是 BIOS 级别代码,运行在操作系统的范围外。这使得开发和调试 APM 代码极其困难。而用户也只能通过烧写 ROM 的方式来解决 APM 的错误。重刷 BIOS 相当危险,因为一旦发生错误,系统就再无法使用了。

>>> 阅读全文

 

, , , , ,

Linux DRBD 模块指南

DRBD 即分布式复制块设备 (Distributed Replicated Block Device) ,是基于软件的(Software-based)、无共享的(shared-nothing)、复制存储方案,可用于在主机间镜像复制块设备(影片、分区、逻辑卷 等等)的内容。

用 DRBD 进行数据镜像有以下优点:

  • 实时。应用程序一修改设备上的数据,复制就会持续进行。
  • 透明。应用程序根本无法发觉数据存储在多个主机上。
  • 支持同步和异步。当同步数据镜像时,所有主机上完成写操作之后应用会收到通知。当异步镜像时,在本地的完成写操作之后其他主机完成写操作之前,应用就会收到通知。

DRBD 可以分为两部分:内核模块和用户空间的管理程序。

内核模块
DRBD 核心功能是通过 Linux 内核模块实现的。具体来说,DRBD 提供一个虚拟块设备的驱动程序,因此 DRBD 位于系统 I/O 栈的底部。正因如此,DRBD 非常灵活且多才多艺,是可以为任何应用程序添加高可用性的复制解决方案。

正如 Linux 内核架构所定义和构想的那样,DRBD 对其上层的组件是不可见的。因此,DRBD 无法为上层组件提供它们本就不具备的功能,比如 DRBD 无法自动检测损坏的文件系统,也无法为 ext3 或 XFS 文件系统增加 active-active 集群功能。

>>> 阅读全文

 

,

玩转 UEFI Secure Boot

对 Windows 8.0 的安全启动 (secure boot) 不少人都有困惑,但鲜有人真正了解它是如何工作的。我觉得理解它的最好方式就是从头开始配置安全启动,之后能就看清楚安全启动究竟带来了什么新功能。

首先要解决硬件问题。因为我手边缺少 UEFI 硬件以供测试。幸运的是 OVMF 开源项目提供了可供虚拟机使用的 UEFI 参考固件,它可以在 QEMU 中运行。EDK2 项目提供了编译好的二进制文件。但要支持安全启动,就需要自己动手重新编译。

我们需要的工具是 Intel 的 UEFI Build Tools,它是 EDK2 开发工具的一部分。 利用 svn 或者 git 可以检出 EDK2 源代码。

git clone git://github.com/tianocore/edk2.git

EDK2 随源代码还提供了最新的 Windows 版和 Unix 版的 BaseTools ,这是进行 UEFI 编程的一些辅助工具;如果选择在 Linux 上进行开发,你不得不选择重新编译 BaseTools,详情请参考 Ubuntu Wiki。1

这里假设 EDK2 源代码保存在 C:\edk2 目录中,后续的编译过程均以此为工作目录。你还需安装 iasl 和 Visual Studio 2012 Express 作为编译工具,isal 用于编译 ACPI 代码。此外还需要 Windows 8.0 SDK 或以上版本以及 .NET 4.5,该 SDK 提供了微软签名工具。

>>> 阅读全文

 

, , , , ,

LXC (Linux Container) 初览

LXC 是 Linux Container的缩写。Linux 容器技术是一种内核虚拟化技术(也叫操作系统虚拟化),它提供了轻量级的虚拟化技术,可以在单一控制主机上同时提供多个虚拟环境(即容器)以隔离进程和资源,每个虚拟环境拥有自己的进程和独立的网络空间。在基于容器的虚拟化技术中,进程不再是个全局概念,而是从属于某个特定的容器。理想情况下,进程跟容器之间是动态关联的,进程可以在容器之间迁移。在基于容器的虚拟化技术中,容器既是资源容器,也是隔离的命名空间,它能有效地将由单个操作系统管理的资源划分到隔离的组中,以更好地在隔离的组之间平衡有冲突的资源的占用需求。从用户的角度上看,容器的运行与表现与独立拥有一台 Linux 服务器并无二致。

容器技术原理是基于操作系统内核对不同的进程提供了不同的系统视图, 它可以在本地 CPU 核心运行指令,避免了全虚拟化指令级模拟或即时编译造成的系统开销。同时也避免了准虚拟化(Para-Virtualization)和系统调用替换的复杂性。但是,容器技术强制所有客户必须使使用与控制主机(Control Host) 相同的内核,用户既不能运行其他种类操作系统,也不能运行不同的内核。图 1-1 显示了容器技术和其他虚拟化技术的不同。

容器虚拟化起源于 1982 年发布的 CHROOT 工具,这是一个特殊的基于文件子系统的容器虚拟,最早由 Sun 公司创始人 Bill Joy 开发并且作为 BSD 4.2 的组成进行发布。此后,大量的容器虚拟化技术不断涌现,主要有:

  • Solaris Zones
  • FreeBSD Jails
  • Linux VServer
  • OpenVZ

但是这些技术都没有被 Linux 内核所接受。相反 Linus 选择使用一系列新的内核特性来实现这一目标。Linux Container (LXC) 就是利用这些新特性实现的下一代容器虚拟化技术,并随着 Linux 内核而发布。

下面我们先看一下容器虚拟化的鼻祖 CHROOT 是如何工作的。

>>> 阅读全文

 

, , , , ,

阅读 Grub 源代码 (二) 80386 寄存器和保护模式

寄存器
80386处理器是 Intel 公司80X86发展史上的里程碑,80386处理器中的保护模式,虚拟 8086 模式以及地址的段页管理机制,虚拟内存这些都是后续各种处理器的核心。所以说80386 是后续发展处理器的基础.

1.80386 的的寄存器:
80386的寄存器可以分为8组:通用寄存器,段寄存器,指令指针寄存器,标志寄存器,系统地址寄存器,控制寄存器,调试寄存器,测试寄存器,它们的宽度都是32位的。
A1.General Register(通用寄存器)
EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP,它们的低16位就是8086的AX,BX,CX,DX,SI,DI,SP,BP,它们的含义如下:

EAX:累加器
    EBX:基址寄存器
    ECX:计数器
    EDX:数据寄存器
    ESI:源地址指针寄存器
    EDI:目的地址指针寄存器
    EBP:基址指针寄存器
    ESP:堆栈指针寄存器

这些寄存器可以将低16位单独存取,也就是 8086 的AX,BX,CX,DX,SI,DI,SP,BP,在存取这些寄存器的低16位(AX,BX,CX,DX,SI,DI,SP,BP)时,它们的高16位不受影响,同时和8086 一样对于AX,BX,CX,DX这四个寄存器来讲,可以单独存取它们的高8位和低8位(AH,AL,BH,BL,CH,CL,DH,DL)

A2:Segment Register(段寄存器)

除了8086 的4个段外(CS,DS,ES,SS),80386还增加了两个段FS,GS,这些段寄存器都是16位的,它们的含义如下:

>>> 阅读全文

 

了解Linux操作系统 (四) 硬盘I/O子系统

在处理器进行解码和执行指令之前,数据必须通过某种方式从硬盘盘片的扇区里被读到处理器的缓存和寄存器中。之后执行结果还可能被写回硬盘。下面我们将简单地介绍一下Linux硬盘I/O子系统,以便更好地认识这个对系统性能产生很大影响的组件。

I/O子系统架构
图1-18展示了I/O子系统架构的基本概念。

为了使您能对I/O子系统的运作有个整体的认识,我们以写数据到硬盘作为例子。下面的步骤概述了当硬盘执行写操作的基本操作。这里假设存储于硬盘片某个扇区上的数据已经被读取到分页缓存中。

1. 进程使用write()系统调用发出写文件的请求。

2. 内核更新映射此文件的分页缓存。

>>> 阅读全文

 

了解Linux操作系统 (三) Linux文件系统

文章评分:

作为开源操作系统,Linux 一个很大优势就是支持多种文件系统。现代 Linux 内核几乎支持计算机系统曾使用过每一款文件系统,从基本的FAT到诸如JFS(Journaling File System)之类的高性能文件系统。不过,因为Ext2、Ext3和ReiserFS是大多数 Linux 发行版的原生文件系统(ReiserFS只有使用在Novell SUSE Linux上才能获得商业支持),所以在本文中我们主要了解这些文件系统的有关特性,其它鲜少使用的文件系统只略作说明。关于文件系统和硬盘子系统,参见 “调优硬盘子系统”

虚拟文件系统 VFS
虚拟文件系统VFS它是内核的一个子系统,提供了一个通用文件系统模型,该模型囊括了所能见到的文件系统常用功能和行为,并为应用程序提供一致性的文件系统接口,安装的所有物理文件系统不但依赖于VFS共存,而且也依靠VFS协同工作。

虚拟文件系统位于用户进程与各种Linux文件系统之间,作为一个抽象接口层,它提供用于访问文件系统对象的通用对象模型(如i-node、文件对象、页缓存、目录条目等等)和方法,对于用户进程来说,它屏蔽了文件系统之间的差异。用户进程不需要知道使用的是哪个文件系统,也不需要了解不同的文件系统需要呼叫哪个系统调用。

图14 阐明了VFS的概念。

>>> 阅读全文

 

, , ,

Linux可执行文件格式分析

可执行文件格式综述

可执行文件是操作系统中最重要的文件类型。可执行文件中包含代码和数据,此外文件可能需要引用外部文件定义的符号(变量和函数),因此重定位信息和符号信息也是需要的。其他一些辅助信息是可选的,如调试信息、硬件信息等。基本上任意一种可执行文件格式都是按区间保存上述信息,称为段(Segment)或节(Section)。不同的文件格式中段和节的含义可能有细微区别。最后,可执行文件通常都有一个文件头部以描述本文件的总体结构。

获得可执行文件有三个重要的步骤:编译(compile)、连接(link,也可称为链接、联接)、加载(load)。源程序文件被编译成目标文件,多个目标文件被连接成一个最终的可执行文件,可执行文件被加载到内存中运行。

下面我们来看一下LINUX平台下ELF文件加载过程的一个简单描述。

1:内核首先读ELF文件的头部,然后根据头部的数据指示分别读入各种数据结构,找到标记为可加载(loadable)的段,并调用函数 mmap()把段内容加载到内存中。在加载之前,内核把段的标记直接传递给 mmap(),段的标记指示该段在内存中是否可读、可写,可执行。显然,文本段是只读可执行,而数据段是可读可写。这种方式是利用了现代操作系统和处理器对内存的保护功能。

>>> 阅读全文

 

,

了解Linux操作系统 (二)Linux内存架构

文章评分:

为了执行进程,Linux 内核会为请求的进程分配一段内存区域。进程用这段内存作为工作区来执行所请求的工作。这就像你申请了一张办公桌,你可以在桌面上摆放工作所需的纸张、文件和备忘录。不同之处是 Linux 内核采用动态的方法来分配内存空间。在内存大小通常是有限的情况下有时进程的数量会达到数万个,Linux 内核必须有效地来管控内存。在本章节中,我们会介绍内存的结构、地址分布,以及Linux是怎样有效地管理内存空间的。

物理内存与虚拟内存

如今我们面临选择 32 位系统或者 64 位系统的问题。对于企业级用户来说,最重要的区别就是虚拟内存地址是否可以超过 4GB。从性能角度来看,弄明白32 位和64 位 Linux 内核是怎么样将物理内存映射到虚拟内存是非常有意思的。

在图1-10中,你可以很明显的看出 32 位系统和 64 位系统在内存地址分配上的不同之处。关于物理内存映射到虚拟内存的详细内容已超出本文的范畴,本文将只着重介绍Linux内存结构的部分细节。

>>> 阅读全文

 

,

了解Linux操作系统 (一)进程管理

文章评分:

前言
Linux 是一种由全世界开发者共同开发的开源操作系统。其源代码可以自由获取并可以在 GNU GPL 授权下使用。有很多公司提供不同的系统发行版供用户使用,如Redhat和Novell SUSE。大部分桌面发行版都可以从网站上免费下载,但服务器版一般是需要购买的。

在过去的几年里,Linux 被世界上许多公司的数据中心所使用。如今 Linux 操作系统为科学领域和企业用户所认可。它已经成为一种多种用途的操作系统。你能在多种嵌入式设备中发现它,如:防火墙、手机或电脑主机。所以 Linux 的性能对于科学领域和企业用户来说已经成为一个热门议题。然而一个操作系统可能被用来计算全球的天气预报或者被用来运行数据库等多种用途,Linux 必须能够为各种可能的使用情境提供优良性能。大多数 Linux 发行版含有常规的调校参数来满足所有用户。

IBM 意识到作为一种操作系统,Linux 非常适合在 IBM 系统之上运行企业级应用。大多数企业应用现在都可以运行在 Linux 上,包括文件服务器、打印服务器、数据库服务器、Web服务器、以及沟通和邮件服务器。

在企业级服务器运行 Linux 时需要对其性能进行监控,在必要时需要对服务器进行调优以消除影响用户的性能瓶颈。本红皮书将介绍一些调优 Linux 的方法、监控分析服务器性能的工具、以及对于特定应用的关键性能参数。本文目的是说明怎样分析和调校 Linux 操作系统,从而为在系统上运行的各种不同应用提供优良的性能。

>>> 阅读全文

 

, , , , ,

AWK 语法入门 (一)

AWK 和 GAWK

在日常工作中,我们会遇到许多需要理解和提取文本的要求。一般来说,简单的要求,我们可以使用 grep,复杂的,可能会采用Perl 和其他的解决方案。在本系列文章中,我们要介绍的一种专门为文本处理和模式匹配而生的语言 — AWK,这个古怪的名字其实来自于它的三个主要作者的首字母缩写:Drs. A. Aho、P. Weinberger 和 B. Kernighan。

简单描述一下 AWK 的工作方式:AWK 的程序语句描述了需要处理的数据的模式和操作,运行时,AWK在其输入的数据中搜索包含模式的记录,然后对该记录进行指定的操作,,所以 AWK 非常擅长于处理数据库和表型数据,如从多个数据集中提取一些列、建立报表或分析数据等等。AWK能够用很短的程序对文档里的资料做修改、比较、提取、打印等处理,并且能和管道一起使用,是管理员和程序员一个不可缺少的工具。

AWK的主要功能是针对文件的每一行(line),也就是每一条记录,搜寻指定的格式。当某一行符合指定的格式时,AWK就会在此行执行被指定的动作。AWK依此方式自动处理输入文件的每一行直到输入文件档案结束。因此 AWK 也被称作是数据驱动的语言。AWK经常用在如下的几个方面:

  • 根据要求选择文件的某几行,几列或部分字段以供显示输出。
  • 分析文档中的某一个字出现的频率、位置等。
  • 根据某一个文档的信息准备格式化输出。
  • 以一个功能十分强大的方式过滤输出文档。
  • 根据文档中的数值进行计算。
  • AWK 存在着几个不同的版本,比如早期的版本称为 OAWK (old awk),而Dr. Kernighan 又维护了一个 NAWK(New AWK),随着 GNU 项目的蓬勃发展,又出现了 GAWK,它主要是为了替代 OAWK,并包含了 NAWK 的一些特性。

    >>> 阅读全文

     

    , ,

    Linux与Windows进程之比较

    进程是现代操作系统的一个最基本的概念。书本上说:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。

    详细点说:进程的概念主要有两点:

    第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

    第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

    在Unix系统中,我们通常用 fork 来创建一个进程,相应的,在 Windows 操作系统里,我们用的是 CreateProcess,如果我们分别用 fork 和 CreateProcess 反复创建1000个进程,你可能会得出 Windows 创建进程比在 Unix 慢许多这样一个结论。然而这是事实吗?

    >>> 阅读全文

     

    ,

    Next posts