第一章:初识Linux shell
Linux内核负责以下4个主要功能:
1.系统内存管理
2.软件程序管理
3.硬件设备管理
4.文件系统管理
1.系统内存管理
内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存
内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为交换空间(swap space)
内核不断的在交换空间和实际物理内存之间反复交换虚拟内存存储单元的内容(这使得系统以为它拥有比物理内存更多的可用内存)
下面是书中的图片(实际上和书中有点出入,为了省事),让我有些不解
关于上面的图让我有些迷惑,所以我就把虚拟内存和交换空间作为关键词查了一下
中文wiki上的解释:虚拟内存(查看:Linux操作系统下虚拟内存实现)
也就是说,交换空间实现了虚拟内存。虚拟内存存在于交换空间之上,我的理解是这样的
内存存储单元会被按组分成很多块,这些块称为页面(page)
内核会将每个内存页面放在物理内存或者交换空间。内核会维护一个内存页面表,指明那些页面位于物理内存,哪些页面位于交换空间
内核会记录哪些页面正在使用,并自动把一段时间未访问的内存页面复制到交换空间区域(称之为换出,swapping out),即使还有可用内存
当程序要访问一个已被唤出的内存页面时,内核必须从物理内存唤出另外一个内存页面让出空间,然后从交换空间换入请求的页面(swapping in)。这个过程使得运行中的进程变慢
查看/proc/meminfo文件可以看到虚拟内存的当前状态
cat /proc/meminfo
MemTotal: 3954168 kB
MemFree: 454136 kB
Buffers: 78916 kB
Cached: 1120528 kB
SwapCached: 17144 kB
Active: 1879656 kB
Inactive: 1367204 kB
Active(anon): 1569708 kB
Inactive(anon): 681008 kB
Active(file): 309948 kB
Inactive(file): 686196 kB
Unevictable: 52 kB
Mlocked: 52 kB
SwapTotal: 2899696 kB
SwapFree: 2844256 kB
……MemTotal总内存
MemFree空闲内存
SwapTotal虚拟内存
默认情况下,运行在Linux系统上的每个进程都有各自的内存页面,进程不能访问其他进程正在使用的内存页面
用户进程不能访问内核进程使用的内存
为了方便共享数据,可以创建一些共享内存页面,多个进程可在同一块共用内存区域进行读取和写入操作
内核负责维护和管理这块共用内存区域并控制每个进程访问这块共享区域
ipcs
作用:查看系统上的当前内存共享页面
$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 65536 su1216 600 393216 2 dest
0x00000000 98305 su1216 600 393216 2 dest
0x00000000 131074 su1216 600 393216 2 dest
0x00000000 163843 su1216 600 393216 2 dest
0x00000000 196612 su1216 600 393216 2 dest
0x00000000 229381 su1216 600 393216 2 dest
……每个共享内存段都有个所有者,是创建它的用户
每个段也都有标准的Linux权限设置来设定其他用户是否可以访问该段
2.软件程序管理
一些Linux发行版使用一个表来管理在系统开机时要启动的进程。
在Linux上这个表通常位于/etc/inittab(见#1)
另一些系统(如Ubuntu发行版)则采用/etc/init.d目录(见#2),将开机时启动或停止某个应用的脚本放到此目录下
这些脚本通过/etc/rcX.d目录下的入口启动(其中X表示运行级别,run level)(见#1)。这些入口实际是到/etc/init.d的符号链接(见软链接,soft link#3)
3.硬件设备管理
Linux中两种方法用来插入设备驱动代码
1.编译进内核的设备驱动代码
2.可插入内核的设备驱动模块
Linux系统将硬件设备当成特殊文件,称为设备文件(见#4,这里只提到了下面的前两种)
设备文件有3种
字符型设备文件
块设备文件
网络设备文件
网络设备是指采用数据包发送和接收数据的设备,包括各种网卡和一个特殊的回环设备。这个回环设备允许Linux系统使用通用的网络编程协议同自己通信
Linux为每个设备都创建一种特殊的文件称为“节点”。与设备的所有通信都是通过设备节点完成的。每个节点都有一个唯一的数值对作为标识
数值对包括一个主设备号和一个次设备号
类似的设备具有同样的主设备号,次设备号用于标识同一主设备号下的某个特殊设备
$ cd /dev; ls -al sda* ttyS*
brw-rw---- 1 root disk 8, 0 2012-11-22 09:33 sda
brw-rw---- 1 root disk 8, 1 2012-11-22 09:33 sda1
brw-rw---- 1 root disk 8, 2 2012-11-22 09:33 sda2
brw-rw---- 1 root disk 8, 5 2012-11-22 09:33 sda5
brw-rw---- 1 root disk 8, 6 2012-11-22 09:33 sda6
brw-rw---- 1 root disk 8, 7 2012-11-22 09:33 sda7
crw-rw---- 1 root dialout 4, 64 2012-11-22 09:33 ttyS0
crw-rw---- 1 root dialout 4, 65 2012-11-22 09:33 ttyS1
crw-rw---- 1 root dialout 4, 66 2012-11-22 09:33 ttyS2
crw-rw---- 1 root dialout 4, 67 2012-11-22 09:33 ttyS3
(见#5)(其中第5列是主设备号,第6列是次设备号)
4.文件系统管理
Linux支持多种文件系统(自身的和其他操作系统的)来从硬盘中读取或写入数据
Linux系统用来读写数据的标准文件系统
文件系统 | 描述 |
ext | Linux扩展文件系统,最早的Linux文件系统 |
ext2 | 第二扩展文件系统,在ext的基础上提供了更多功能 |
ext3 | 第三扩展文件系统,支持日志功能 |
ext4 | 第四扩展文件系统,支持高级日志功能 |
hpfs | OS/2高性能文件系统 |
jfs | IBM日志文件系统 |
iso9660 | ISO 9660文件系统(CD-ROM) |
minix | MINIX文件系统 |
msdos | 微软的FAT16 |
ncp | Netware文件系统 |
nfs | 网络文件系统 |
ntfs | 支持Microsoft NT文件系统 |
proc | 访问系统信息 |
ReiserFS | 高级Linux文件系统,能提供更好的性能和硬盘恢复功能 |
smb | 支持网络访问的Samba SMB文件系统 |
sysv | 较早期的Unix文件系统 |
ufs | BSD文件系统 |
umsdos | 贮存在msdos上的类Unix文件系统 |
vfat | Window 95文件系统(FAT32) |
XFS | 高性能64位日志文件系统 |
任何供Linux服务器访问的硬盘都必须格式化成上面文件系统类型的一种
Linux内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的接口
这为Linux内核同任何文件系统通信提供了标准接口。当每个文件系统被挂载和使用时,VFS将信息都缓存到内存中
Linux发行版
Linux发行版通常可以归类为以下3种
完整的核心Linux发行版
专业发行版
LiveCD测试发行版
核心Linux发行版
核心Linux发行版含有内核、一个或多个图形化桌面环境以及预编译好的几乎所有能见到的Linux应用,它提供了一站式的完整Linux安装
下面是一些较流行的核心Linux发行版
发行版 | 描述 |
Slackware | 最早的Linux发行版中的一员,在Linux极客中比较流行 |
Red Hat | 一个主要用于Internet服务器的商业发行版 |
Fedora | 从Red Hat分离出的家用发行版 |
Gentoo | 为高级Linux用户设计的发行版,仅包含Linux源代码 |
Mandriva | 主要是家用(之前叫Mandrake) |
openSuSE | 用于商用和家用的发行版 |
Debian | 在Linux专家和商用Linux产品中流行的发行版 |
专业Linux发行版
除了提供专业软件之外,专业发行版还尝试通过自动检测和自动配置来帮助新手安装Linux
下面是一小部分专业Linux发行版以及他们的专长
发行版 | 描述 |
Xandros | 一个为新手配置的商业Linux发行版 |
SimplyMEPIS | 一个免费的家用Linux发行版 |
Ubuntu | 一个免费的学校和家庭用的Linux发行版 |
PCLinuxOS | 一个免费的家庭和办公用的Linux发行版 |
Mint | 一个免费的家庭娱乐用的Linux发行版 |
dyne:bolic | 一个免费的包含音频和MIDI应用程序的Linux发行版 |
Puppy Linux | 一个免费的使用于早期PC的小型Linux发行版 |
Linux LiveCD
可引导启动的Linux发行版,通过CD启动PC而无需在硬盘上安装任何东西
缺点:
运行速度慢
无法将数据写入cd
对Linux的更改在重启之后全部失效
发行版 | 描述 |
Knoppix | 一个德语Linux发行版,最早的LiveCD Linux |
SimplyMEPIS | 为家庭用户设计的Linux发行版 |
PCLinuxOS | 成熟的LiveCD上的Linux发行版 |
Ubuntu | 为多种语言设计的世界级项目 |
Slax | 基于Slackware Linux的LiveCD Linux |
Puppy Linux | 为早期PC设计的全功能Linux |
第二章:走进shell
哑终端(dumb terminal):通常是由通信电缆连接到Unix系统上的显示器和键盘(后来出现鼠标)。这个简单的组合提供了向Unix系统输入文本数据和显示文本结果的一条捷径
字符集
字符集是一组二进制命令
下面列举一些常见字符集,具体介绍请点击其中的链接(大部分为英文wiki,中文wiki不给力啊)
ASCII:美国信息交换标准码
ISO-8859-1(Latin-1):ASCII字符集的一个扩展,ISO字符集,采用8位码来支持标准ASCII字符,以及大多数西欧语言中的特殊外语字符
ISO-8859-2:ISO字符集,支持东欧语言字符
ISO-8859-6:ISO字符集,支持阿拉伯语字符
ISO-8859-7:ISO字符集,支持希腊语字符
ISO-8859-8:ISO字符集,支持希伯来语字符
ISO-10646(Unicode):ISO双字节字符集,包含大部分英语和非英语语言的代码。这个字符集包含所有ISO-8869-x系列字符集中定义的所有字符。
英语国家最常用的字符集为Latin-1
控制码
控制码是未在字符集中使用的特殊代码,它会发出信号给终端来执行特殊的非打印操作(回车、换行、方向键、翻页键……)
控制码也可以用来控制哑终端的通信功能(代码XON为开启终端数据传输,XOFF为停止到终端的数据传输)
块模式图形
DEC VT100终端是第一个支持完整ANSI字符集的终端
ANSI字符集包含的代码不但允许显示器显示文本,而且允许显示基本的图形符号,比如:框、线和块
矢量图形
矢量图形是基于DEC的块模式设计的,它将所有的屏幕图像(包括字符)变成一系列的线段(矢量)(这里应该是向量吧?)
由于矢量图不用点创建线,它能用相比其他基于点的图形终端更高的精度来绘制几何形状
显示缓冲
滚动区域(scroll region):在主显示窗口中翻屏时缓冲数据(该数据称为历史)。滚动区域是终端拥有的内存数量,它使得终端能在翻屏时“记住”数据
替代屏幕(alternative screen):控制码用来发送信号给终端,向替代屏幕而不是当前显示屏幕写数据,那部分数据会保留在内存中。另一个控制码会发信号给终端,几乎立即在普通屏幕数据和替代屏幕数据之间切换显示器显示
键盘
中断(Break):给主机发送一串0,通常用来中断shell中当前正在执行的程序
滚动锁定(Scroll Lock):也叫禁止滚动(No Scroll)。它会停止显示上的输出
重复(Repeat):按下此键和其他键时,它会让终端反复地向主机发送另一个键的键值
(其他见P24)
terminfo
P25,不打算细读,参看之前的简略笔记(#1)
一些终端介绍,这里就不细记录了,需要的时候翻阅书本吧
xterm终端(P29)
Konsole终端(P36)
GNOME Terminal(P43)