L i n u x用户指南
系统管理员指南
U n i x操作系统由一个内核和一些系统程序组成。系统程序利用内核所提供的工具执行操作系统要求的各种服务程序。系统程序和其他所有的程序一起,以“用户模式”运行于内核顶部。
L i n u x内核由几个重要部件组成:进程管理、内存管理、硬件设备驱动程序、文件系统驱
动程序、网络管理和其他零碎的东西.内存管理照管已分配给进程、内核部件和缓冲区的内存区和交换空间。进程管理则创建进程,并通过在处理器上交换活动进程的方式,实施多任务操作。
在最低级上,针对每个自己支持的硬件设备,内核中都包含相应的驱动程序.
Unix系统提供的主要服务:
- init :
i n i t是每个U n i x系统中第一个启动的进程,也是内核在启动时所进行的最后一件事情
网络管理员指南
如何在在Linux 和Unix 系统下编写安全程序?
“安全程序”是指一个位于安全区域内的程序,要从不具有与该程序相同访问权限的信息源获取输入数据。这样的程序包括用来浏览远端数据的应用程序、CGI 脚本程序、网络服务器和setuid/setgid 程序。
Unix
1969-1970 年,AT&T 贝尔实验室的Kenneth Thompson、Dennis Ritchie 和其
他人开始在一台较老的PDP-7 上开发一个小型的操作系统。不久这个操作系统
被命名为Unix,是对此前一个叫做MULTICS 的操作系统项目的双关语。在
1972-1973 年,系统被重新用C 语言改写了,这是一个很有眼光的不寻常的举动:
这个决定使Unix 成为第一个可以脱离其原始硬件而存在的被广泛应用的操作系
统。其它的新方法也不断被加入Unix,一部分原因是贝尔实验室与学术界的良
好协作。1979 年,Unix 的“第七版”(V7)发布了,它是所有现存Unix 系统的
鼻祖。
从此,Unix 的历史开始变得错综复杂。由Berkeley 领导的学术界开发了被称为
Berkeley 软件发行版(BSD)的变种,而AT&T 继续在“系统III”和随后的“系统
V”的名义下开发Unix。在八十年代后期到九十年代早期,这两个主要分支间的
“战争”激化了。经过多年开发,每个变种都采用了其它变种的许多关键特性。在
商业上,系统V 赢得了“标准之战”(使其绝大部分接口进入了正式标准),而且
绝大多数硬件厂商都切换到AT&T 的系统V。但是,系统V 包含了许多BSD 的
革新,使该系统更像是两大分支的融合。BSD 分支并未消失,而是广泛应用在
研究、PC 硬件和目的单一的服务器上(例如许多WEB 站点都使用某个BSD 变
种)。
最终结果是有很多不同版本的Unix,都来源于原先的第七版。绝大多数版本的
Unix 都是私有的,由其相应的硬件厂商维护,例如,Sun 的Solaris 就是系统V
的变种。Unix 的BSD 分支中有三个版本成为开放源码软件:FreeBSD(注重在
PC 类硬件上安装简便)、NetBSD(注重于很多不同的CPU 结构)和NetBSD
的一个变种,OpenBSD(注重于安全性)
Linux
1991 年,Linus Torvalds 开始开发一个他称为“Linux”的操作系统内核[Torvalds
1999]。这个内核可以同FSF 的资料和其它软件(特别是某些BSD 软件和MIT
的X-windows 软件)结合起来构成一个可以自由修改而且非常有用的操作系统。
本文把内核本身称为“Linux 内核”,而把该完整的结合体称为“Linux”。注意,很
多人使用术语“GNU/Linux”来称呼该结合体。
在Linux 社团中,不同的组织以不同的方式结合可用软件。每一种结合被称为一
个“发行版”,而开发发行版的组织就被称为“发行商”。普通的发行版包括Red
Hat、Mandrake、SuSE、Caldera、Corel 和Debian。各种发行版间存在差异,
但所有的发行版都基于同一个基础:Linux 内核与GNU 的glibc 库。由于这两
者都是受“copyleft”类型许可证保护的,对它们的修改一般也必须提供给所有人,
这是BSD 和源于AT&T 的Unix 系统之间所不存在的统一力量,使不同Linux
发行版统一在同一个基础之上。
。计算机安全目标通常由三个总体目标来描述:
? 秘密性(也被称为秘密),意味着计算系统的内容只能被授权对象访问。
? 完整性,意味着内容只能被授权对象以被授权的方式所修改。
? 可用性,意味着内容可以被授权对象使用。该目标经常提到的反义词就是
拒绝服务。
Saltzer [1974]和Saltzer and Schroeder [1975] 列出了以下依然有效的设计安全
保护系统的原则:
? 最小特权。每个用户和程序在操作时应当使用尽可能少的特权。该原则限
制了事故、错误或攻击带来的危害。它还减少了特权程序之间潜在的相互
作用,从而使对特权无意的、没必要的或不适当的使用不太可能发生。这
种想法还可以引申到程序内部:只有程序中需要那些特权的最小部分才拥
有特权。
? 机制经济。保护系统的设计应当尽可能地简单和小。用他们的话来说,“逐
行审阅软件和对硬件进行物理检查一类的技术是实现保护机制所必需的。
这样的技术要想成功,小而简单的设计是必不可少的。”
? 公开设计。保护机制不应该依赖于攻击者的无知。其机制反而应当是公开
的,依赖于象密码或密钥这样比较少的(而且容易改变的)项目的保密。
公开设计使广泛的公开详细检查成为可能,而且还可以让用户确信所要使
用的系统是可以满足需要的。坦白地说,要保持一个广泛应用系统的秘密
是不现实的;反向编译和硬件破解能够很快暴露一个产品的任何“秘密”。
Bruce Schneier 证明了聪明的设计者应当“对任何有关安全的东西都要求
公开源码”,以及确保它受到普遍的审核,而且任何找到的问题都已得到
修正[Schneier 1999]。
? 完全中介。每一个访问企图都应该被检查;把认证机制放在不会被推翻的
位置上。例如,在客户--服务器模型中,通常服务器应该进行所有的访问
检查,因为用户可以构建或修改他们自己的客户程序。
? 安全失败的缺省值(例如,基于许可的方案)。缺省反应应当是拒绝服务,
而且保护系统能随后辨别哪种情况下访问是允许的。
? >特权分离。理想情况下,访问对象应当依赖于多个条件,这样破坏一个
保护系统并不能进行完全的访问。
? 最少的公共机制。使共享机制的数量和使用(例如,对/tmp 或/var/tmp
目录的使用)最小化。共享对象提供了信息流和无意的相互作用的潜在危
险通道。
? 心理上的接受程度/使用简便。人机界面必须设计得易于使用,这样用户
就可以按惯例自动地正确使用保护机制。如果安全机制非常符合用户对自
己保护目标的想象,错误就很少发生。
进程
在类Unix 系统上,用户级别的活动由运行的进程来实现。绝大多数Unix 系统
支持作为独立概念的“线程”;一个进程内的线程共享内存,而且系统的调度器实
际上是调度线程。Linux 的做法与此不同(依我看是做得更好):线程与进程没
有本质的差异。在Linux 下,在某个进程创建另一个进程时,它可以选择共享哪
些资源(比如内存可以共享)。随后Linux 内核会进行优化以获得线程级的速度;
参见clone(2)以了解更多信息。值得注意的是Linux 内核的开发者倾向于使用“任
务”一词,而不是“线程”或“进程”,但外界的文档则倾向于使用进程一词
在类Unix 系统中,每个进程所有的典型属性如下:
? RUID, RGID -- 运行进程的用户的真实用户ID 和组ID
? EUID, EGID -- 用于权限检查(文件系统除外)的有效用户ID 和组ID
? SUID, SGID -- 保存的用户ID 和组ID;用来支持下面要讨论的切换许可
“开和关”。不是所有的类Unix 系统都支持它。
? 补充群组 -- 用户有成员资格的群组(GID)列表。
? umask -- 在创建一个新的文件系统对象时决定缺省访问控制设置的一组
比特位;参见umask(2)。
? scheduling parameters -- 每个进程都有一个调度策略,缺省策略为
SCHED_OTHER 的进程还具有nice、priority 和counter 的附加属性。
参见sched_setscheduler(2)以了解更多信息。
? limits -- 每个进程的资源限制(参见下文)。
? filesystem root -- 进程角度的根文件系统起始处;参见see chroot(2)。
嵌入式Linux 系统的开发指南
参阅<嵌入式Linux 系统的研究及其在串口通信中的应用>
Linux 系统内核的分析:Linux 系统使用了单一内核结构,即操作系统中所
有的系统相关功能都被封装在内核中。程序通过一套称作系统调用(System Call)
的界面访问内核结构。在 Linux 中,可以动态装入和卸载内核中的部分模块。
Linux 内核由5 个 部分组成:进程管理、内存管理、文件系统管理、进程间通
信和网络接口。
开发环境的建立:
Linux 下建立交叉编译器,在Windows 操作系统中用ADS 开发工具实现启动程序,在Linux 操作系统下,用交叉编译器进行Linux 内核、库函数及应用程序的编译。
嵌入式系统中,Boot Loader 是在操作系统内核或用户应用程序运行之前运
行一段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软
硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准
备好正确的环境。大多数BootLoader 都包含2 种不同的操作模式:启动加载
(BootLoading)模式和下载(DownLoading)模式。
内核的初始化分为以下几个阶段:
(1)内核的入口stext。
stext 是BootLoader 所调用的内核入口,从stext 进入后,将完成一些针对程
序运行环境的建立。
(2)内核的初始化函数start_kernel。
start_kernel 是内核初始化的主体。在调用这个函数的时候,系统已经有了一
个初始化的页目录表和堆栈。
(3)内核的初始化线程init。
在start_kernel 中,通过创建了一个内核进程来执行init 函数,进行初始化。
(4)系统的初试化程序
编译内核需要3 个步骤,分别是创建内核依赖关系、创建内核镜像文件和创
建内核模块。命令依次为:make dep,make zImage,make modules。
编译完成以后,会生成镜像文件arch/arm/boot/zImage,把这个文件下载到开
发板上,就会看到Linux2.6 的内核启动信息,即完成了Linux2.6 内核移植的第
一步。
使用Linux 自身的配置工具,编译定制内核。根据功能对内核进行剪裁
根文件系统的作用是存放了各种工具、应用程序、init 程序、必需的库和需
要加载的模块。
ARM公司的编译工具RVCT(Realview Compilation Tools)是业界最优化的 ARM编译器。在开发基于ARM Linux的系统时,用户可以使用GNU工具编译Linux内核,而将Linux上层应用代码的编译工作交给RVCT来完成,从而享受到RVCT高效的代码强优化功能。
用户可以在Codesourcery的官方网站()下载到复合ARM ABI标准的Codesourcery GNU工具链。
Cygwin一个Linux-like environment for Windows.
Cygwin is a Linux-like environment for Windows. It consists of two parts:
A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing substantial Linux API functionality.
A collection of tools which provide Linux look and feel.
The Cygwin DLL currently works with all recent, commercially released x86 32 bit and 64 bit versions of Windows, with the exception of Windows CE.
Note that the official support for Windows 95, Windows 98, and Windows Me will be discontinued with the next major version (1.7.0) of Cygwin.
What Isn't Cygwin?
Cygwin is not a way to run native linux apps on Windows. You have to rebuild your application from source if you want it to run on Windows.
Cygwin is not a way to magically make native Windows apps aware of UNIX ? functionality, like signals, ptys, etc. Again, you need to build your apps from source if you want to take advantage of Cygwin functionality.
刚开始学习的同学可以先download一个安装上,然后照着usermanual来做一遍,只有70页也不是很难,关键了解一下它的原理。