第零章:计算机概论 计算机:接受用户输入指令和数据,经过中央处理器的数据和逻辑单元运算处理器处理后,以产生或存储成有用的信息。 计算机硬件的五大单元:输入单元、输出单元、CPU内部控制单元、算术逻辑单元和内存。CPU作为一个具有特定功能的芯片,里面含有微指令集,一条微指令集对应一个汇编语句。CPU内分为算术逻辑单元与控制单元,算术逻辑单元主要负责程序运算与逻辑判断,控制单元主要协调各组件与各单元间的工作。基本上数据都是流经内存然后再转出去。 CPU:内部已经含有一些小指令,软件都是要经过CPU内部的指令集来完成,常见的分为精简指令集和复杂指令集。精简指令集:指令较为精简,每个指令的执行时间很短,完成操作也很简单,指令的执行性能较佳,复杂的事情就需要多个指令来完成。复杂指令集:每个小指令可以执行一些较低阶的硬件操作,指令数目多且复杂,每条指令长度并不相同,每条指令执行时间较长,单个指令可以处理的工作较为丰富。 X86指的是特定微处理器执行的一些计算机语言指令集,定义了芯片的基本使用规则,78年intel发不8086标志x86架构的诞生。 接口设备:输入输出设备、存储设备、显示设备和网络设备。 南桥北桥:主板上面最重要的就是芯片组了,芯片组又分为两个桥接器来控制各组件间的通信,分别是:南桥,负责速度较慢的周边接口,包括硬盘、USB网卡等;北桥,负责连接速度较快的CPU,内存和显卡等各组件。Intel与AMD的CPU之间的主要区别是AMD将内存控制单元集成到CPU中,而不是通过北桥,用来加速内存与CPU之间的通信。因为CPU上的数据主要来自于内存。 多核处理器:原来的单核CPU只有一个运算单元,多喝则是在一个CPU中嵌入多个运算内核。 CPU选取:CPU内部含有的微处理集、CPU频率,就是CPU每秒可以进行的工作次数。频率越高表示CPU单位时间内可以做更多的事情。因为不同CPU之间的微指令集和架构可能不同,每次频率所能完成的工作指令数也不同,所以频率仅能比较同款CPU之间的速度。不能通过频率简单来判断CPU运算性能。 CPU外频与倍频:外频,CPU与外部组件进行数据传输/运算时的速度;倍频是CPU内部用来加速工作性能的一个倍数,两者相乘才是CPU的频率。例如频率3GHZ外频333MHZ,倍频就是9倍。超频,将CPU的倍频或外频通过主板的设定功能更改为较高频率的一种方式,但因为倍频出厂时已经被锁定,所以较常被超频的是外频,但超频有可能导致死机等问题。因为CPU需要强大的运算能力,所以CPU的频率要大于CPU与外界各部件之间的传输速度。 北桥的总线称为系统总线,因为是内存传输的主要信道,所以速度较快;南桥就是所谓的输入输出总线,主要用于练习硬盘、USB、网卡等接口设备。北桥所支持的频率我们成为前端总线速度,而每次传送的位数则是总线宽度。常见有32/64位。CPU每次能处理的数据量称为字组大小,依据CPU的设计有32位和64位。32位CPU每次能够解析的数据量有限,因此又内存传来的数据量就有所限制了。大概为4GB左右。 内存:不论是软件程序还是数据,只有读入内存才能被使用。个人计算机的内存主要组件为动态随机访问内存,只有在通电时才能记录和使用,通电后数据就消失了。内存选取需要考虑频率/频宽、型号和容量等,通常容量越大系统越快,因为系统不用常常释放一些内存内部的数据。对于服务器来说,内存的容量有时比CPU速度更重要。 CPU与内存关系,CPU与内存的外频应该相同,效果较佳。 缓存,因为内存中的数据要通过北桥送到CPU内,如果某些常用的程序=或数据放置在CPU内部可以大大提升效率。因为缓存要集成到CPU内部,所以缓存的速度必须要与CPU的频率相同。使用动态随机访问内存无法达到这个速度,这个时候就需要静态随机访问内存,缓存一般为静态随机访问内存。其设计上使用晶体管较多,价格较高,不宜做成大容量,不过其速度快,适合做高速缓存。 因为主板上面各组件参数可调,而主板上面如果有内置的网卡或显卡,该功能是否调用与该功能的各项参数被记录在一个称为CMOS的芯片上面,这个芯片需要借助额外的电源来发挥记录功能,所以主板上面一般会有一个电池。 BIOS:是一套程序,这套程序被写死在主板上面的一个内存芯片中,这个内存芯片在没有通电时也能够将数据记录下来,就是只读存储器。只读存储器是一种非挥发性的内存。BIOS是系统开始时首先读取的一个小程序。 固件:使用只读存储器来进行软件的写入,固件像软件一样是被计算机所执行的程序。 显卡:显存,显存的内存容量将会影响到屏幕分辨率与色彩深度。显卡也是通过北桥与CPU、内存等通信。 硬盘的盘片上面有多个同心圆绘制出的饼图,而又同心圆以放射状的方式分隔出磁盘的最小存储单位,扇区的大小为512字节。硬盘接口:IDE与SATA前者较宽,速度较慢可连接两个硬盘,后者较窄,速度较快,只能连接一个设备,排线小利于主机壳内部的散热与安装。 硬盘选购:容量大小、缓冲存储器主流的有16MB,转速(高)。 主板:主板上面负责通信各个组件的就是芯片组,一般分为南桥和北桥,北桥负责CPU/RAM/VGA等的连接,南桥负责PCI接口与速度较慢的I/O设备。芯片组是一个可能高发热的组件,一般上面会覆盖黄铜色的散热片。且连接数根圆形导管,负责散热。 CMOS:记录主板上面的重要参数,包括系统时间、CPU电压与频率、各项设备的I/O地址与IRQ,由于这些数据的记录要花费电力,所以主板上面会有电池;BIOS:写入到主板上某一块闪存的程序,可以在开机时运行,以加载CMOS当中的参数,并尝试调用存储设备中的开机程序,进一步进入操作系统时,BIOS程序也可以修改CMOS中的数据。 操作系统内核:操作系统其实也是一组程序,这组程序的重点在于管理计算机的所有活动以及驱动系统中的所有硬件。内核程序所放置的内存区块是受保护的,并且开机后就一直在内存中。 计算机系统由硬件组成,然后内核程序主要在于管理硬件,提供合理的计算机系统资源分配(包括CPU资源、内存使用),操作系统除了内核程序以外,通常还会提供一整组开发接口,那就是系统调用层。因为内核只负责计算机系统的资源分配,所以在上面还需要有应用程序的提供,用户借此操作系统。 操作系统其实就是内核与其提供的接口工具,但因为内核缺乏与用户通信的亲和接口,所以一般提到的操作系统都会包含内核与相关的用户应用软件。 操作系统的内核层直接参考硬件规格写成,所以同一操作系统程序不能够在不一样的硬件架构下运行。 操作系统只是在管理整个硬件资源,包括CPU、内存、输入输出设备及系统文件。 应用程序的开发都是参考操作系统提供的开发接口,所以该应用程序只能在该操作系统上面运行而已,不可以在其他操作系统上面运行。 内核功能:负责整个计算机系统相关的资源分配与管理,系统调用接口、程序管理、内存管理、文件系统管理和设备驱动。 操作系统必须能够驱动硬件,如此应用程序才能够使用该硬件功能;一般来说,操作系统会提供开发接口,让开发商制作他们的驱动程序;要使用新硬件功能,必须安装厂商提供的驱动程序才行;驱动程序是由厂商提供的,与操作系统开发者无关。 重点回顾: 计算机的定义:接受用户输入命令与数据,经由中央处理器的数据与逻辑单元运算处理后,以产生或存储成有用的信息; 计算机五大单元:输入单元、输出单元、CPU内部的控制单元、算术逻辑单元和内存; 数据会流进/流出内存是CPU所发布的控制命令,而CPU实际要处理的数据则完全来自内存; CPU以设计理念分为精简指令集和复杂指令集系统; 关于CPU的频率部分,外频指的是CPU与外部组件进行数据传输时的速度,倍频是CPU内部用来加速工作性能的一个倍数,两者相乘才是CPU的频率速度; 一般主板芯片组分为南桥和北桥,北桥的总线称为系统总线,因为是内存传输的主要信道,所以速度较快。南桥就是所谓的输入输出总线,主要在于连系硬盘、USB、网卡等接口设备。 北桥所支持的频率我们称为前端总线速度,而每次传输的位数则是总线宽度; CPU每次能够处理的数据量称为字组大小,字组大小依据CPU的设计而有32位和64位之分。我们现在所称的计算机室32位或64位主要是依据这个CPU解析的字组大小而来的; 个人计算机的内存主要组件为动态随机访问内存,至于CPU内部的第二层缓存则使用静态随机访问内存。 BIOS是一套程序,这套程序是写死在主板上面的一个内存芯片中 ,这个内存芯片在没有通电时也能够将数据记录下来,就是只读存储器。 显卡的规格有PCI/AGP/PCIE,目前主流的为PCIE接口; 硬盘是由盘片、机械手臂、磁头与主轴马达所组成,其中盘片的组成为扇区、磁道与柱面; 操作系统其实是一组程序,这组程序的重点在于管理计算机的所有活动以及驱动系统中的所有硬件。 计算机主要以二进制为单位,常用的磁盘容量为字节,一个字节由八位比特组成。 操作系统仅在于驱动与管理硬件,而要使用硬件时,就得需要通过应用软件或者是shell的功能,来调用操作系统操纵硬件工作。目前,操作系统除了上述功能外,通常已经包含了日常工作所需要的应用软件在内了。 第一章:linux是什么? Linux是一套操作系统,由内核和系统调用接口那两层构成,不含有其他应用程序。 硬件由内核控制,每种操作系统都有自己的内核,windows是针对x86架构的硬件设计的,所以他只能够在x86的计算机上面运行。Linux提供了一个完整的操作系统中最底层的硬件控制与资源管理的完整架构,可以再x86上运行。虽然linux仅是其内核与内核和提供的工具,不过由于内核、内核工具与这些软件开发者提供的软件的整合,是的linux成为一个完整的、功能强大的操作系统。 UNIX like可以说是目前服务器类型的操作系统的统称! Linux特色:自由与开放的适用与学习环境、配备需求低廉、内核功能强大而稳定、独立作业。优点:稳定的系统、免费或少许费用、安全性与漏洞的快速修补、多任务多用户、用户与用户组的规划、相对比较不耗资源的系统、适合需要小内核程序的嵌入式系统、整合度佳且多样的用户图形界面;缺点:没有特定的厂商、游戏的支持度不足、专业软件的支持度不足; 重点回顾: 计算机以二进制作为单位,而目前常用的磁盘容量单位为B,其单位换算为1B=8bit,其他的以1024为其倍数; 操作系统主要用于管理与驱动硬件,因此必须要能够管理内存、管理设备、负责进程管理以及系统调用等。因此,只要能够让硬件准备妥当的情况,就是一个很棒的操作系统; 操作系统重点仅在驱动与管理硬件,而要使用硬件时,就得需要通过应用软件或者是shell的功能,来调用操作系统操纵硬件工作。因此,目前操作系统除了上述的功能外,通常包含了入场所需要的应用软件在内了; Linux本身就是一个了不起的操作系统,我们称linux操作系统最底层的数据为内核; 目前linux内核的开发分为两种版本,分别是开发版本如2.5.x,适合开发特殊功能的环境;稳定版本的偶数版,如2.6.x适合于商业与家用环境使用; 第二章:linux如何学习 Linux kernel非常小巧精致,可以在很多省电以及较低硬件资源的环境下面执行; 重点回顾: linux在企业应用方面,着重于网络服务器、关键任务的应用及高性能运算等任务; linux在个人环境的使用上着重于桌面计算机、手持系统、嵌入式系统; linux distributions有针对桌面计算机所开发的,例如ubuntu,opensuse及fedora等,是学习x window的好工具; 有心向linux学习者,应该多接触文字界面(shell)的环境,包括正则表达式、管道命令与数据流重定向,最好都要学习!最好连shell脚本都要有能力编写; 实践是学习linux的最佳方案,空读书,遇到问题不见得能够自己处理! 。。。 第三章:主机规划与磁盘分区 在linux系统中,每个设备都被当成一个文件来对待。例如IDE接口的硬盘的文件名即为:/dev/hd[a-d],括号中的为a-d中的任意一个,例如/dev/hda、….等四个文件,[]只是一种表达方式;打印机为/dev/lp0,软盘为/dev/fd0;每个磁盘驱动器的磁盘分区不同时,其磁盘文件名还会改变; 主机通常提供两个IDE接口,每个IDE接口又可以连接两个IDE设备,所以一个主机最多可以连接四个IDE设备。两个IDE设备通常称为IDE1,IDE2;每个IDE设备可以被分为主设备master和从设备slave;IDE1的主从分别为/dev/had、/dev/hdb。IDE2的主从分别为/dev/hac、/dev/hdd,顺序固定,只有一个IDE接口的硬盘,接在IDE2的master上,就是/dev/hac。 SATA接口是使用SCSI模块来驱动,这些接口的磁盘设备名是/dev/sd[a-p],与IDE接口不同的是,SATA接口的磁盘没有一定的顺序,根据linux内核检测到的磁盘的顺序来定; 磁盘的组成:盘片、机械手臂、磁头、主轴马达等;数据的写入其实是在盘片上面。盘片上又可以分出扇区与柱面两种单位,其中扇区大小为512kb。 扇区:大小固定为512字节,旧式的记录方式是半径小的地方数据密度高,半径大的地方数据密度低;新的解决方式为,越往磁盘外面的地方就应该划分越多的扇区。每个扇区的面积都一样,容纳的数据量也是一样的;数据写入的时候先写满最外道的磁道,接着再写里面的磁道,磁盘用久了读写越来越慢,是因为同样的时间,在外面可以扫过多个扇区的面积,读取多个磁道的数据;而在里面的磁道只能扫过一个扇区的面积,读写一个扇区的数据,所以这时候做磁盘整理或者格式化,使外面的磁道得到使用。 柱面:硬盘通常由重叠的一组盘片构成,每个盘面但都被划分为数目相等的磁道,并且从外面的0开始编号,具有相同编号的磁道形成一个柱面,称之为磁盘的柱面。柱面数与磁道数相同。每个盘面都有自己的磁头,盘面数等于总的磁头数。 磁盘的第一个扇区特别重要,它记录了连个重要的信息:主引导分区MBR,可以安装引导加载程序的地方,有446字节;分区表,记录整块硬盘分区的状态,有64字节;MBR很重要,系统在开机时会主动去读取这个区块的内容,系统才知道程序放在那里并且如何进行开机。 假设磁盘设备文件名为/dev/hda时,将其分为四个分区,四个分区的文件名为p1:/dev/hda1、…等; 由于分区表只有64字节,最多只能容纳四个分区,被称为主分区或扩展分区。其实所谓的分区只是针对那个64字节的分区表进行设置而已;硬盘默认的分区表仅能写如四组分区信息;这四组分区信息我们称为主或者扩展分区;分区的最小单位为柱面;当系统要写入磁盘时,一定会参考磁盘分区表,才能对某个分区进行数据的处理。 利用额外的扇区来记录更多的分区信息:四个分区记录区仅使用了两个,P1是主分区、P2是扩展分区。扩展分区的目的是使用额外的扇区来记录分区信息,扩展分区本身并不能被拿来格式化。然后我们可以通过扩展分区所指向的那个区块继续做分区的纪录。扩展分区继续切分出来的分区,就称为逻辑分区。主分区和扩展分区的名字为p1:/dev/hda1、p1:/dev/hda2,扩展分区分的设备文件名为:L1:/DEV/HDA5、L2:/DEV/HDA6、L3:/DEV/HDA7…;没有hda3,hda4是因为前面四个号码都是保留给primary和extended使用的。 关于主分区、扩展分区和逻辑分区的特性我们做个简单的定义:主分区与扩展分区最多可以有四个(硬盘的限制);扩展分区最多只能有一个(操作系统的限制);逻辑分区是由扩展分区持续切割出来的分区;能够被格式化后作为数据访问的分区为主分区与逻辑分区;扩展分区无法格式化;逻辑分区的数量依操作系统而不同,在linux系统中,IDE硬盘最多有59个逻辑分区(5到63号),SATA则有11个逻辑分区(5到15号); 硬盘的容量等于主分区容量加上扩展分区的容量; 扩展分区的容量等于各个逻辑分区的容量之和; 由于第一个扇区所记录的分区表与MBR是这么重要,几乎只要读取硬盘都会由这个扇区先读起。因此,如果硬盘的第一个扇区屋里坏掉了,那这个硬盘就没什么用了。因为系统找不到分区表,就没办法继续读取柱面等。 CMOS是记录各项硬件参数并嵌入到主板上面的存储器,BIOS是一个写入到主板上面的一个软件程序,是开机运行的第一个程序。接下来BIOS会去分析计算机里面有哪些存储设备,我们以硬盘为例,BIOS会依据用户的设置去取得能够开机的硬盘,并且到该硬盘里面读取第一个扇区里面的MBR位置。MBR这个仅有446字节的容量里装的是最基本的引导加载程序,此时BIOS功成身退,接下来是MBR内部的引导加载程序的工作了;引导加载程序的目的是加载内核文件,由于引导加载程序是操作系统安装时提供的,所以它会识别硬盘内的文件系统格式,因此就能够读取内核文件,接下来就是内核文件的工作了,引导加载文件也完成了,之后就是操作系统的任务了; 简单说开机流程如下:BIOS,开机主动执行的程序,会认识第一个可开机的设备;MVR,第一个可开机设备的第一个扇区内的主引导分区块,内包含引导加载程序;引导加载程序loader,一支可读取内核文件来执行的软件;内核文件,开始操作系统的功能。 BIOS和MBR是硬件本身会支持的功能,而引导加载程序是操作系统安装在MBR上面的一套软件罢了。 引导加载程序的主要任务有:提供菜单,用户可以选择不同的开机选项,这也是多重引导的重要功能;载入内核文件,直接指向可开机的程序区段来开始操作系统;转交其他的loader:将引导加载功能转交给其他loader负责。第三点实现多系统的安装,用户选择某个分区上的引导加载程序来进行开机。 目录树结构:整个目录树结构最重要的就是那个根目录,这个根目录的表示方法为一条斜线“/”,所有文件都与目录树有关;所有文件都是由根目录衍生而来的,而次目录之下还能够有其他的数据存在。整个linux系统使用的是目录树结构,但是我们的文件数据其实是放置在磁盘分区当中的,通过挂载的方式将目录树的架构与磁盘内的数据结合起来; 文件系统与目录树的关系(挂载):利用一个目录当成进入点,将磁盘分区的数据放置在该目录下;也就是说,通过进入该目录就可以读取该分区的意思。这个操作叫做挂载,那个进入点的目录我们称为挂载点。由于整个linux系统最重要的是根目录,因此根目录一定要挂在在某个分区上,置于其他目录可以根据用户的需求挂载到不同的分区。 挂载:在windows系统中,挂在通常是值给磁盘分区分配一个盘符。第三方软件,如磁盘分区管理软件、虚拟磁盘软件等,通常也附带挂在功能。 在linux系统中,挂在是指将一个设备挂接到一个已存在的目录上。我们要访问存储设备上面的文件,必须将文件所在分区挂在到一个已存在的目录上,然后通过访问这个目录来访问存储设备。挂在是一个非常重要的功能,使用非常频繁。将一个设备(通常是一个存储设备)挂接到一个已存在的目录上,这个目录可以不为空,但是挂载后这个目录下以前的内容将不可用。Linux将所有设备都视为文件,他将整个计算机的资源都整合成一个大的文件目录。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。 Swap分区:当物理内存不够用时,把内存的一部分空间释放出来以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存在swap分区中,等到那些程序要运行时,再从swap分区中恢复保存的数据到内存中。 重点回顾: 新添计算机硬件配置时,需要考虑的角度有游戏机/工作机的考虑,性价比的考虑、支持度的考虑; 旧的硬件配置可能由于保存的问题或者电子元件老化的问题,导致计算机系统非常容易在运行过程中出现不明的死机情况; 在linux系统中,每个设备都有一个设备名,被当成一个文件来对待; 磁盘的设备名主要分为IDE接口的/dev/hd[a-d]及SATA/SCSI/USB接口的/dev/sd[a-p]两种; 磁盘的第一个扇区主要记录了两个重要的信息,分别是:主引导分区,可以安装引导加载程序的地方,有446字节;分区表,记录整个硬盘分区的状态,有64字节。 磁盘的主分区与扩展分区最多可以有四个,逻辑分区的设备文件名号码一定由5号开始; 开机的流程是:BIOS->MVR->boot loader->内核文件; Boot loader的功能主要有提供菜单、加载内核、转交控制权给其他loader; Boot loader可以安装的地点有两个,分别是MBR与boot sector; Linux操作系统的文件使用目录树系统,与磁盘对应需要有挂载的操作才行。 适合新手的简单分区:建议只要有/及swap两个分区即可。 第四章:安装centos.5.x与多重引导小技巧 Swap:内存交换空间,由于swap并不会使用到目录树的挂载,所以用swap就不需要指定挂载点。 重点回顾: 不论你要安装什么样的linux操作系统,都应该事先规划,例如分区、引导装载程序等; 建议练习机安装时的磁盘分区能有/,/boot,/home,swap四个分区; 调整开机启动设备的顺序必须要重新启动并进入BIOS系统调整; 安装centos 5.x的结构至少有两种,分别是图形界面与文字界面; 若安装笔记本电脑时失败,可尝试在开机时加入“inux nodb apm =off acpi=off”来关闭省电功能; 安装的过程中,可以创建软件磁盘阵列; 一般要求swap应该要是内存容量的1.5~2倍; 即使没有swap,已经能够安装与运行linux操作系统; Centos 5.x的引导装载程序为grup,安装时最好选择安装在设备MBR中; 没有连上internet时,可尝试关闭防火墙,但selinux最好选择强制状态; 尽量使用一般用户来操作linux,有必要时再转身份称为root即可; 第五章:首次登陆与在线求助 Linux默认会提供6个terminal来让用户登录,切换的方式为ctrl+atl+f1~f6的组合按钮;ctrl+atl+f7:图像界面桌面; Linux默认的登陆模式中,主要分为两种,一种是仅有纯文本界面的登录环境,可以由tty1~tty6的终端界面,另一种是图形界面的登录环境tty7; 终端输入exit注销linux,即离开系统,并没有关机; 命令行模式的登陆后所取得的程序被称为shell,这是因为这个程序负责最外层的跟用户通信工作; 命令执行的方式:command [-options] parameter1 parmeter2 … (命令+选项+参数1+参数2);一行命令中第一个输入的部分绝对是命令或可执行文件;command为命令的名称,如变换路径的命令为cd;中括号[]并不存在于实际的命令中,而加入参数设置时,通常参数前会带-号;parameter1 parameter2为依附在option后面的参数,或者是command的参数;命令,-options,参数等命令之间以空格间隔,不然视为一格;按下[enter]按键后,命令开始执行;命令太长可以用反斜杠符号,使命令连续到下一行; data显示时间; echo $LANG显示目前的语言;LANG=en_US修改语言为英文语系; 命令之后的参数除了前面带有减号“-”之外,某些特殊情况下也会带有“+”的情况; 基础命令的操作: 显示日期与时间的命令:date;date +%Y/%m/%d 显示日历的命令:cal;cal 2009;cal [[month] year]; 简单好用的计算器:bc,quit退出;加+减-乘*除/指数^余数%;bc默认输出整数,如果要输出全部小数,必须执行scale=number,number就是小数点后的位数; 在命令行模式下执行命令时,会有两种情况:一种是该命令会直接显示结果然后回到命令提示符等待下一个命令的输入;一种是进入到该命令的环境,直到结束命令才回到命令提示符的环境; [Tab]按键:命令补全与文件补齐的功能;避免我们打错命令或文件名;[tab]接在一串命令的第一个命令的后面,则为命令补全ca [tab][tab];[tab]接在一串命令的第二个命令后面,则为文件补齐ls –al ~/.bash[tab][tab]。 Ctrl-c按键:如果输入了错误的命令或参数,这个命令或程序会不停地运行,可以按ctrl+c的组合键,就是中断目前程序的按键;如果正在进行比较重要的命令,可别急着使用这个组合键; Ctrl-d按键:这个组合键通常代表着键盘输入结束(EOF)的意思;另外,他也可以用来替代exit的输入。例如你想要直接离开文字界面,可以直接按下ctrl-d就能够直接离开了,相当于输入exit; 错误信息:command not found,这个命令不存在,因为该软件没有安装的缘故,解决方案就是安装该软件;这个命令所在的目录目前的用户并没有将它加入命令搜寻路径中;你打错了命令; man page:man是manual的简写,输入此命令会有详细的说明出现; 输入man date man page的内容: DATE(1):表示一般用户可使用的命令; 数字的意义:1,用户在shell环境中可以操作的命令或可执行文件;2,系统内核可调用的函数或工具;3,一些常用的函数与函数库,大部分为C的函数库;4,设备文件的说明,通常在/dev下的文件;5,配置文件或者是某些文件的格式;6,游戏;7,惯例与协议等,例如linux文件系统、网络协议、ASCII code等说明;8,系统管理员可用的管理命令;9,跟kernel有关的文件; man page中常用的按键:空格键:向下翻页;[page down]:向下翻页;[page up]:向上翻页;[home]:去到第一页;[end]:去到最后一页;/string:向下查询string字符串,例如/date;?string:向上查询string字符串;n/N:利用/或?查询时:继续下一个;q:结束此次man page; nano文本编辑器:nano nihao.cpp进入编辑,g++ nihao.cpp –o nihao.o; who命令可以查看目前有谁在线;netstart –a可以查看网络的联机状态;ps –aux可以查看后台执行的程序; shutdown命令是关机命令;可以完成下列工作:可以自由选择关机模式,是要关机、重启或进入单用户操作模式均可;可以设置关机时间,可以设置成现在立刻关机,也可以设置成某一特定时间才关机;可以自定义关机消息,在关机之前,可以将自己设置的消息传送给在线用户;可以仅发出警告消息,告诉用户注意下,但并不是真的要关机;shutdown –h now,立即关机,其中now相当于时间为0的状态;shutdown –h 20:35,系统在该时间段关机,若在改时间执行此命令,隔天才关机;…. reboot、halt、powerroff是重启关机命令; sunc命令:在文字界面下输入sync,那么在内存中尚未被更新的数据就会被写入到硬盘中,在关机前或重启之前最好多执行几次; 重点回顾: 为了避免瞬间断电造成的linux系统损害,建议作为服务器的linux主机应该加上不断电系统来持续提供稳定的电力; 在默认的图形模式登陆中,可以选择语言以及会话。会话为多种窗口管理员软件所提供,如GNOME及KDE等; 默认情况下,linux提供tty1~tty6的文字界面登录,以及tty7的图形登录环境; 在终端环境中,可依据提示符为$或#判断为一般的帐号或root帐号; 要取得终端支持的语言可执行echo $LANG或locale命令; date可显示日期,cal可显示日历,bc可以作为计算机软件; 组合键中,[tab]按键可作为命令补齐或文件名补齐,[ctrl]-c可以中断目前正在运行中的程序; 在线帮助系统有man及info两个常见的命令; man paga的数字中,1代表一般账号可用命令,8代表系统管理员常用命令,5代表系统配置文件格式; info page可将一份说明文件拆成多个节点显示,并具有类似超链接的功能,增加易读性; 要使系统正确关机,可使用shutdown,poweroff等命令; 第六章:linux的文件权限与目录配置 文件所有者;用户组; ls是list的意思,重点在于显示文件的文件名和相关属性。参数-al表示列出所有的文件详细的权限与属性,包含隐藏文件(文件名第一个字符为‘.’)。 第一列表示这个文件的权限与类型,包含十个字符; 第一个字符代表这个文件是“目录、文件或链接文件等”;若是d则是目录;若是-则是文件;若是l则表示是链接文件;若是b则表示设备文件里面的可供存储的接口设备;若是c则表示设备文件里面的串行端口设备,如键盘鼠标等; 接下来的字符里以三个为组:均为“rwx”三个参数的组合。其中r表示可读,w代表可写,x表示可执行。这三个权限不会改变,若没有权限就会出现-; 第一组为文件所有者的权限;第二组为同用户组的权限;第三组为其它非本用户组的权限; 第二列表示有多少文件名连接到此节点; 第三列表示这个文件(或目录)的所有者账号; 第四列表示这个文件的所属用户组; 第五列为这个文件的容量大小,默认单位是B,字节。 第六列为这个文件的创建文件日期或者是最近的修改日期;若修改时间过长,只会显示年份,要显示完整时间格式可用ls -al --time-style=full-iso; 第七列为文件名; 改变文件属性与权限;chgrp:改变文件所述用户组;chown:改变文件所有者;chmod:改变文件的权限; chown如果连目录下的所有子目录或文件都同时更改文件所有者的话,直接加上-R的参数即可。 chmod用数字类型改变文件权限,各权限的分数如下:r4w2x1;每种身份的分数为三种权限分数相加;例如-rwxr-xr的分数为664;执行chmod 664 filename更改权限; 第二种改权限方法,符号类型改变文件权限:有三种身份:user,group,others,通过u,g,o代表着三种身份的权限,另外a代表全部的身份;读写的权限就可以写成r,w,x;可通过下面方法更改:chmod u=rwx,go=rx filename/chmod a+w filename/chmod a-x filename; 文件的权限,文件是实际含有数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件等。xwr的意义有: r,可读取此文件的实际内容; w,可以编辑、新增或者是修改该文件的内容; x,该文件具有可以被系统执行的权限,在linux中文件是否可执行由是否有x的权限决定,而不是由后缀决定; 目录的权限,目录主要的内容是记录文件名列表,文件名与目录有强烈的关联;针对目录,xwr的意义为: r,表示具有读取目录结构列表的权限,当具有权限时表示可以查询该目录下的文件名数据,可以用ls将其目录下的内容列表显示出来; w,表示具有更改该目录结构列表的权限,也就是:新建新的文件或目录;删除已经存在的文件与目录(不论权限如何);将已存在的文件或目录进行重命名;转移该目录内的文件、目录位置;w权限不能随便给; x代表用户能否进入该目录成为工作目录,工作目录就是当前所在的目录。只有x权限可以进入该目录,r只是可读而已,进不了; linux文件种类与扩展名:文件种类包括普通文件、纯文本文件、二进制文件、数据格式文件;目录d、链接文件l、设备与设备文件通常集中在/dev(分为块设备文件和字符设备文件,前者为硬盘等,后者为就键盘鼠标等)、套接字、管道; 扩展名:基本上linux没有扩展名的概念,一个文件能否执行只与权限有关,与文件名没有一点关系;虽然如此,通常也用扩展名来了解文件是什么种类; 单一文件或目录最大容许文件名长度为255个字符;包含完整路径名称及目录的完整文件名为4096个字符; FHS:linux目录配置标准,其目的主要是希望让用户可以了解到已安装软件通常放置于那个目录下; 重点回顾: linux的每个文件中,依据权限分为用户、用户组与其他人三种身份; 用户组最有用的功能之一,就是当你在团队开发资源的时候,且每个账号都可以有多个用户组的支持; 利用ls –l显示的文件属性中,第一个字段是文件的权限,共有10位,第一位是文件类型,接下来三个为一组,为用户、用户组其他人的权限,权限有r,w,x三种; 如果文件名之前多一个.,则代表这个文件是隐藏文件; 更改文件的用户组支持可用chgrp,修改文件的所有者可用chown,修改文件的权限可用chmod; chmod修改权限的方法有两种,分别是符号法与数字法,数字法中r,w,x的分数为4,2,1; 对文件来讲,权限的效能为:r:可读取此文件的实际内容;w:可以编辑、新增或者是修改该文件的内容,不含删除该文件;x:该文件具有可以被系统执行的权限; 对目录来说,权限的职能为:r:读取该目录的内容;w:编辑该目录的内容;x:进入该目录; 要开放目录给所有人浏览时,应该至少也要给与r及x的权限,但w权限不可随便给予; 有五个目录不可与根目录放在不同的分区,分别为/etc,/bin,/lib,/dev,/sbin; 第七章:linux文件与目录管理 相对路径与绝对路径;绝对路径一定是由根目录写起;相对目录则不是; cd命令是用来切换目录的;还有一些比较特殊的目录:.代表当前目录;..代表上一层目录;-代表前一个工作的目录;~代表目前用户身份所在的主文件夹;~account代表这个用户的主文件夹;所有目录下面都会存在两个目录,分别是.和..,分别代表当前目录和上一层目录;根目录的上一层目录还是根目录; 常见的处理目录的命令:cd:切换目录;pwd:显示当前的目录;mkdir:新建一个新的目录;rmdir:新建一个空的目录; 默认情况下,mkdir需要一层一层地创建目录,例如cd home;cd test;…但是可以加上-p这个参数系统自动帮助自动建立目录,如果已经存在就使用该目录例如cd –p home/test…;但是不建议这样,因为如果打错字,目录会变得很糟糕; rmdir:目录需要一层一层地删除,而且被删除的目录里面必定不能存在其他的目录或者文件;如果连同文件一块删除,就得用rm –r test; 执行文件路径的变量,查看文件属性的命令ls的完整文件名是:/bin/ls(是绝对路径),因为环境变量的缘故,可以在任何地方只输入ls命令就可以了。用echo $来查看环境变量中的路径;echo有显示打印的意思,$表示后面接的是变量;每个目录用:分开;命令所在目录没有被加入到环境变量中,就只能通过绝对路径来进行执行该命令; 不同身份用户默认的PATH不同,默认能够随意执行的命令也不同; PATH是可以更改的,所以一般用户还是可以通过随意修改PATH来执行某些位于/sbin或/usr/sbin下的命令来查询; 使用绝对路径或相对路径直接指定某个命令的文件名来执行,回比查询PATH来的正确; 命令应该要放置到正确的目录下,执行才会比较方便; 本目录最好不要放到PATH中去; 目录放入PATH的方法为 PATH=”PATH”:/root,以root为例; 文件与目录管理 查看文件与目录: ls:参数: ls后可加多个目录; -a:全部的文件,联通隐藏文件一起列出来; -A:列出全部的文件但不包括.和..这两个文件夹; -d仅列出目录本身,而不是列出目录在内的文件数据,不列出目录; -f直接列出结果,而不进行排序; -F根据文件、目录等信息给与附加数据结构;例:*代表可执行文件;/代表目录;=代表socket文件;l代表FIFO文件; -h将文件容量以人类较易读的方式列出来; -i列出inode号码; -l列出长数据串,包含文件的属性与权限等数据;(常用) -r将排序结果反序输出; -R连同子目录一起列出来; -S以文件的大小排序; -t以时间排序; --color=never不要一句文件特性给与颜色显示; --color=always显示颜色; --color=auto让系统自行依据设置来判断是否给与颜色; --full-time以完整的时间模式输出; --time=(atime,ctime)输出访问时间或改变权限属性时间而非内容更改时间; cp命令:复制文件或目录 cp [options] source1 source2 … -a相当于-pdr的意思;-d若源文件为链接文件的属性;-f为强制的意思,若目标文件已经存在或无法开启,则删除后再进行一次;-i若目标文件已经存在,在覆盖时会先询问操作的进行;-l进行硬连接的连接文件创建,而非复制文件本身;-p联通文件的属性一块复制过去;-r递归持续复制,用于目录的复制行为;-s复制称为符号连接文件,即快捷方式文件;-u若比目标文件新的话就复制; 在默认的条件中,cp的源文件与目的文件的权限是不同的,目的文件的所有者通常会是命令操作者本身; 总之,由于cp有种种的文件属性与权限的特性,所以在复制的时候,必须清楚的认识到:是否需要完整保留来源文件的信息;源文件是否为软连接文件;源文件是否为特殊文件;源文件是否为目录; rm移除文件或目录 -f忽略不存在的文件,不会出现警告信息; -i互动模式,再删除前会询问用户是否操作; -r递归删除。最常用在目录的删除。这是非常危险的参数;因为该目录或文件肯定会被root删除掉,因为系统不会再次询问及是否要删除; 删除-开头的文件最好加上./或者在前面加上-- ; mov移动文件与目录,或更名 -f强制,如果文件已经存在,不会询问直接覆盖; -i若目标文件已经存在时,就会询问是否覆盖; -u若目标文件已经存在,且source比较新,才会更新; 可将多个文件移动到目标目录里面去mv 1 2 dir;重命名mv 1 2; 取得文件名basename;取得目录名dirname; 纯文本文件类型查看命令:cat:由第一行开始显示文件内容;tac:从最后一行开始显示,可以看出tac是tca的倒写形式;nl显示的时候,顺便输出行号;more一页一页底线是文件;less与more类似,但是比more好的是,它可以往前翻页;head只看头几行;tail只看结尾几行;od以二进制的方式读取文件内容; nl、cat和tac都是一次性将数据一口气显示到屏幕上,more和less可以一页一页进行翻看; head默认只显示前十行,如果想要显示多行,可用-n选项后加数字,例如head –n 20 filename;数字为正+100,列出100行后面的所有,数字为负-100,除了后面100行之外,列出前面所有的行; 非纯文本文件查看用od命令; 修改文件时间或创建新文件命令touch;最常用的用途为:创建一个空的文件;将某个文件日期修改为目前日期; 文件默认权限,umask值决定,003的话,其他人就减去wx功能; 文件隐藏属性;设置文件的隐藏属性的命令chattr;这个命令很重要,尤其是在数据安全上面;用法chattr [+-=] [参数];+增加一个特殊参数,其他不变;-删除一个特殊参数,其他不变;=仅有后面接的参数;参数有:A、S、a设置后只能增加数据不能删除数据也不能修改数据只有root可以设置这个属性、c设置后自动压缩使用时自动解压缩、d、i设置后不可以删除因为不发写入或添加数据、s设置后被删除的话完全从硬盘中被删除、u与s相反删除后硬盘中还有可以尝试找回; 显示文件隐藏属性lsattr; 当s这个标志出现在文件所有者的x权限上面时,例如-rwsr-xr-x,此时就称为SetUID,简称为SUID,它的限制和功能为:SUID权限仅对二进制程序有效;执行者对于该程序需要具有x的可执行权限;本权限仅在执行该程序的过程中有效;执行者将具有该程序所有者的权限; 当s标志出现在用户组的x时则称为SetGID,SGID,与SUID不同的是,可以对目录或文件来设置,有以下功能:SGID对二进制程序有用,程序执行者对于该程序来说,须具备x的权限;执行者在执行的过程中将会获得该程序用户组的支持; Sticky Bit目前只对目录有效;简写为SBIT,作用为:当用户对于此目录具有w,x权限,即具有写入的权限时;当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件; SUID/SGID/SBIT权限设置:4代表SUID,2为SGID,1为SBIT;假设要将-rwxr-xr-x改为-rwsr-xr-x,就是在原来的基础上面加上4,就是用chmod 4755 filename来设置。 file,查看文件类型;file+filename; which+命令是根据环境变量PATH所规范的路径去查询执行文件的文件名,所以重点是找出执行文件而已!且which后面跟的是完整的文件名,若加上-a参数,就输出所有可以找到的同名可执行文件,而不是第一个找到的。cd是找不到的,因为踏实bash内置的命令,而which实在PATH里面去寻找; 文件名的查找whereis寻找特定的文件。whereis+参数+文件或目录名;参数有:-b只找二进制;-m只找在说明文件路径下的文件;-s只找源文件;-u查找不再上述三个选项里面的其他特殊文件;find也是查找但是在硬盘里面查找,比较慢,whereis实在一个记录着系统里所有文件名的数据库里面去查找,所以会比较快; locate的后面输入部分名称后就可以找到结果,当天新建的文件必须要更新数据库才能找到; find。。。 权限与命令间的关系: 让用户能进入某目录成为可工作目录的基本权限是: 可使用的命令:例如cd等切换工作目录的命令; 目录所需权限:用户对这个目录至少需要x的权限; 额外需求:如果用户想要在这个目录内ls查阅文件名,则用户对这个目录还需要有r的权限; 用户在某个目录内读取一个文件的基本权限是什么: 可使用的命令:例如本章谈到的cat、more、less等; 目录所需权限:用户对这个目录至少需要x的权限; 文件所需权限:用户对这个文件至少需要r的权限; 让用户可以修改一个文件的基本权限是什么: 可使用的命令:例如nano或未来要介绍到的vi编辑器; 目录所需权限:用户在该文件所在目录至少需要x的权限; 文件所需权限:用户对该文件至少要有r,w的权限; 让一个用户可以创建一个文件的基本权限是什么: 目录所需权限:用户在该目录要具有w,x的权限,重点在于w; 让用户进入某目录并执行该目录下的某命令的基本权限是什么: 目录所需权限:用户在该目录至少要有x的权限; 文件所需权限:用户在该文件至少需要有x的权限; 重点回顾: 绝对路径一定由根目录写起;相对路径不是由根目录写起; 特殊目录有:.,..,-,~,~account,需要注意; 与目录相关的命令有cd,mkdir,rmdir,pwd等命令; rmdir仅能删除空目录,要删除非空目录需使用rm –r命令; 用户能使用的命令是依据PATH变量所规定的目录去查找的; 不同的什么(root与一般用户)系统默认的PATH并不重要。差异较大的地方在于/sbin和/usr/sbin; ls可以查看文件的属性,尤其是-d,-a,-l等参数特别重要; 文件的复制、删除、移动可以分别使用cp,rm,mv等命令来操作; 检查文件的内容(读文件)可使用的命令包括:cat,tac,nl,more,less,head,tail,od等; cat –n与nl均显示行号,但默认的情况下,空白行不会编号并不相同; touch的目的在修改文件的时间参数,但也可以用来创建空文件; 一个文件记录的时间参数有三种,分别是atime,ctime,mtime,ls默认显示是mtime; 除了传统的rwx权限之外,在Ext2/Ext3文件系统中,还可以使用charrt与lsattr设置及查看隐藏属性。常见的包括只能新增数据的+a与完全不能更动文件爱你的+i属性; 新建文件/目录时,新文件的默认权限使用umask来规范; 文件具有SUID的特殊权限,代表当用户执行此二进制程序时,在执行过程中用户会暂时具有程序所有者的权限; 目录具有SGID的特殊权限时,代表用户在这个目录下面新建的文件用户组都会与该目录的用户名组相同; 目录具有SBIT的特殊权限时,代表在该目录下用户创建的文件只有自己与ROOT能够删除; 查看文件的类型可以使用file命令来查看; 查找命令的完整文件名可用which或type,这两个命令都是通过PATH变量来查找文件名; 要查找文件的完整文件名可以使用whereis或locate到数据库文件去查找,而不实际查找文件系统; 利用find可以加入许多参数来直接查询文件系统,已获得自己想知道的文件名; 第八章:linux磁盘与文件系统管理 磁盘的物理组成:圆形的盘片,主要记录数据的部分;机械手臂与机械手臂上面的磁头,可读写盘片上的数据;主轴马达,可以转动盘片,让机械手臂的磁头在盘片上面读写数据;扇区为最小的物理存储单位,每个扇区为512字节;将扇区组成一个圆,那就是柱面,柱面是分区的最小单位;第一扇区非常重要,里面有硬盘主引导记录及分区表,其中主引导记录MBR占有446字节,分区表占有64字节;/dev/sd[a-p][1-25]为SCSI,SATA,USB,Flash等接口的磁盘文件名;/dev/hd[a-d][1-63]为IDE接口的磁盘文件名; 磁盘分区就是指定分区的起始与结束柱面就可以。分区表里仅有64字节,最多只能记录四条分区的纪录,这四条记录我们称为主分区或扩展分区,其中扩展分区还可以再分出逻辑分区,而能被格式化的仅有主要分区与逻辑分区; 分区的定义:主分区与扩展分区最多可以有四个(硬盘的限制);扩展分区最多只能有一个,操作系统的限制;逻辑分区是由扩展分区持续分出来的分区;能够被格式化后作为数据访问的分区为主要分区与逻辑分区,扩展分区无法格式化;逻辑分区的数量依操作系统而不同,在linux系统中,IDE硬盘最多有59个逻辑分区,SATA硬盘则有11个逻辑分区; 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。 磁盘分区完毕后还需要进行格式化,之后操作系统才能使用这个分区,因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区进行格式化,已成为操作系统能够利用的文件系统格式;每种操作系统能使用的文件系统并不相同。linux默认的文件系统是Ext2,windows的文件系统为早期的FAT和之后的NTFS文件系统。默认情况下windows是不会认识Ext2的;以前一个分区就只能是一种文件系统,但是现在可以将多个分区合成一个文件系统,通常我们称呼一个可被挂载的数据为一个文件系统而不是一个分区。文件数据除了文件实际内容外,还含有其他属性,例如linux中的文件权限与文件属性。文件系统通常会将这两部分的数据分别存放在不同的块中。权限与属性放置在inode中,至于实际数据则放置在data block块中。另外还有一个超级块superblock会记录整个文件系统的整体信息,包含inode与block的总量、使用量、剩余量等;这三个数据的意义简洁说明如下: superblock:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等; inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码; block:实际记录文件的内容,若文件太大时,会占用多个block。 每个inode和block都有编号,通过inode去读取文件的数据。这种数据访问方法称为索引式文件系统。FAT是通过链表的形式去存储数据,会产生大量碎片,是的文件读取性能变差;Ext2是索引式文件系统,不太需要进行碎片整理,但是时间长了也有可能产生文件数据过于离散的问题; ext2文件系统在格式化时基本上是区分为多个块组的,每个块组都有独立的inode/block/superblock系统。在整体规划中,文件系统最前面还有一个启动扇区,这个启动扇区可以安装引导装载程序,这样就可以将不同的引导装载程序安装到个别的文件系统最前端而不用覆盖整块硬盘的唯一的MBR,也能制作出多重引导的环境。 ext2系统的block的限制:文件系统所支持的block大小有1kb、2kb、4kb三种而已;某些应用程序采用旧的限制,不支持2GB以上的文件;原则上,block的大小与数量在格式化完就不能再改变了,除非重新格式化;每个block内最多只能够放置一个文件的数据;呈上,如果文件大于block的大小,则一个文件会占用多个block数量;承上,若文件小于block,则该block的剩余空间就不能够再被使用了,如果文件都比较小会产生大量空间浪费;如果文件都比较大,block设的比较小,inode就会记录更多的block号码,会导致文件系统不良的读写性能;所以在格式化之前,要预先想好预计使用的情况,再进行格式化; inodetable记录的文件数据至少有:文件的访问模式;文件的所有者和组;文件的大小;文件创建或状态改变的时间;最近一次的读取时间;最近修改的时间;定义文件特性的标志;该文件真正内容的指向; 除此之外,inode还有以下特点:每个inode大小均固定在128字节;每个文件都会仅占用一个inode而已;承上,因此文件系统能够创建的文件数量与ionde的数量有关;系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容; inode记录block的区域定义为12个直接、一个间接、一个双间接、一个三间接记录区;所以一个block的大小为1k的话,最大可以支持16GB的单一文件; superblock是记录整个文件系统相关信息的地方,没有superblock就没有整个文件系统,它记录的信息主要有:block与inode的总量;未使用与已使用的inode/block数量;block与inode的大小(block为1K,2K,3K,inode为128个字节);文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等系统的相关信息;一个validbit的数值,若此文件系统已被挂载,则validbit为0,若未被挂载为1; 在linux系统中,每个文件(不管是一般的文件还是目录文件)都会有一个inode,且可依据文件的内容大小来分配多个block来给文件使用; 目录:在ext2中,新建一个目录,ext2会分配一个inode与至少一个block给该目录。其中,inode记录该目录的相关权限与属性,并可记录分配到的那块block号码;而block记录在这个目录下的文件名与该文件名占用的inode号码数据。 查看root目录内的文件所占用的inode号码可以用ls –i来处理; 文件:在ext2中,新建一个文件,ext2会分配一个inode与相对于该文件大小的block数量给该文件; 目录树的读取:inode本身并不记录文件名,文件名的纪录是在目录的block当中。因为文件名是记录在目录的block中,所以读取该文件时,必经过目录的inode与block,然后才能找到那个待读取文件的inode,最终才会读到正确的文件的block内的数据; 目录树是从根目录开始读起,因此系统通过挂载的信息可以找到挂载点的inode号码,此时就能够得到根目录的inode内容,并依据该inode读取根目录的block内的文件名数据,在一层一层往下读正确的文件名; 新建一个文件或目录时,就需要blockbitmap与inodebitmap,此时文件系统的行为是:先确定用户对该与添加文件的目录是否有w和x的权限,若有的话才能添加;根据inodebitmap找到没有使用的inode号码,并将新文件的权限/属性写入;根据blockbitmap找到没有使用的block号码,并将实际的数据写入block中,且更新inode的block指向数据;将刚才写入的inode与block数据同步更新inodebitmap与blockbitmap,并更新superblock的内容; 日志文件系统:预备,当系统写入一个文件时,会先在日志记录块中记录某个文件准备要写入的信息;实际写入,开始写入文件的权限与数据,开始更新metadata的数据;结束,完成数据与metadata的更新后,在日志记录块当中完成该文件的纪录; 在内存中编辑一个比较大的文件,需要频繁的写入磁盘,降低效率;linux通过异步处理来解决:当内存中加载一个文件时,如果该文件没有改动,则在内存段的文件数据会被设置为clean。但如果内存中文件数据被更改过,此时该内存中的数据会被设置为dirty。此时的所有操作都在内存中,并没有写入磁盘,系统会不定期将内存中设置为dirty的数据写回到磁盘,以保持磁盘与内存数据的一致性; 系统会将常用的文件数据放置在主存储器的缓冲区,以加速文件系统的读写;承上,新词linux的物理内存最后都会被用光,这是正常的情况,可加速系统性能;可以手动使用sync来强迫内存中设置为dirty的文件回写到磁盘中;若正常关机,系统会自动调用sync来将内存的数据回写入磁盘内;但若不正常关机,由于数据尚未回写到磁盘内,因此重新启动后可能会花很多时间再进行磁盘检验,甚至可能导致文件系统的损坏; 挂载点一定是目录,该目录为进入该文件系统的入口; 除了ext2和加入日止功能的ext3,linux支持其他一些文件系统,linux系统通过一个虚拟文件系统VFS的内核功能去读取文件系统。 磁盘与目录的容量命令: df列出文件系统的整体磁盘使用量;-a列出所有的文件系统,包括系统特有的/proc等文件系统;-k以kb的容量显示各文件系统;-m以mb的容量显示各文件系统;-h以人们较易阅读的GB、MB、KB等格式自行显示;-H以M=1000K替代M=1024的进位方式;-T连同该分区的文件系统名称列出;-i不用硬盘容量,而以inode的数量来显示; du评估文件系统的磁盘使用量,常用于评估目录所占容量;-a列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已;-h以人们较易读的容量格式显示;-s列出总量而已,而不列出每个个别的目录占用容量;-S不包括子目录下的总计,与-s有点区别;-k以KB列出容量显示;-m以MB列出容量显示; 连接文件ln分两种,一种是类似windows的快捷方式功能的文件,可以让你快速连接到目标文件或目录;另一种则是通过文件系统的inode连接来产生新文件名,而不是产生新文件,这种称为硬链接; hardlink硬连接:每个文件都会有一个inode,文件内容由inode的记录来指向;想要读取该文件,必须经过目录记录的文件名来指向正确的inode号码才能读取;文件名只与目录有关,但文件内容则与inode有关。当多个文件名指向同一个inode号码时,就是硬连接;硬连接只是在某个目录下新建了一个文件名连接到某个inode号码的关联记录而已;如果将任何一个文件名删除,其实inode与block都还是存在的。此时可以通过另一个文件名来读取到正确的文件数据;使用硬连接设置连接文件时,磁盘空间与inode的数目都不会改变,只是在某个目录下的block多写入一个关联数据而已;硬连接有限制:不能跨文件系统;不能连接到目录; symbolic link符号连接,也就是快捷方式:就是创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名;两个文件会指向两个不同的inode号码,当然就是两个独立的文件;链接文件的重要内容就是它会写上目标文件的文件名; 看起来似乎硬连接比较可靠,但是硬连接没法连接目录,所以在用途上比较受限;软连接如果目标文件删除就无法读取; ln [-sf] 源文件 目标文件;参数:如果不加任何参数就进行连接,那就是硬连接,加上s就是软连接;-f如果目标文件存在时,就主动将目标文件直接删除后在创建。 新增一块硬盘时需要做的是:对硬盘进行分区,以新建可用的分区;对该分区进行格式化,以创建系统可用的文件系统;若想要仔细一点,则可对刚才新建好的系统进行检验;在linux系统上,需要创建挂载点(也即是目录),并将它挂载上来; 磁盘分区命令fdisk;只有root才能执行;退出时不按w就不会保存,按q退出; 1-4号尚有剩余,且系统未有扩展分区;此时会出现让你挑选primary/extended的选项,让你指定1~4的号码; 1-4尚有剩余,且系统有扩展分区;此时会出现让你挑选primary/logical的选项,若悬p还需制定1~4的号码;若选l则不需设置号码,系统自动设定; 1-4没有剩余,且系统有扩展分区;不会选分区类型,直接进入logical的分区形式; fdisk无法处理大于2TB的磁盘分区; 挂载的意义是挂载点是目录,而这个目录是进入磁盘分区的入口就是了;挂载前需要明确:单一文件系统不应该被重复挂载在不同的挂载点;单一目录不应该重复挂载多个文件系统;作为挂载点的目录理论上应该都是空目录才是。 如果你要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时消失;等到新分区被卸载之后,原来的文件都会显示出来; 系统挂载的一些限制:根目录是必须挂载的,而且一定要先于其他mount point被挂载进来;其他挂载点必须为以新建的目录,可任意指定,但一定要遵守必须的系统目录架构原则;所有挂载点在同一时间内,只能挂载一次;所有分区在同一时间之内,只能挂载一次;如若进行卸载,你必须先将工作目录一到挂载点之外; 安装时一定需要的两个分区:一个是根目录;另外一个就是swap(内存交换空间);swap的功能就是在应付物理内存不足的情况下所造成的内存扩展记录的功能; swap在被构建时是有限制的:在内核2.4.10版本以后,单一swap已经没有2GB的限制了;但是,最多还是仅能创建32个swap;而且,由于目前x86-64最大内存寻址64GB,因此,swap总量最大也是仅能达到64GB就是了; 重点回顾: 基本上linux最重要的文件系统为ext2,该文件系统内的信息主要有:superblock,记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息;inode,记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;block,世纪记录文件的内容,若文件太大时,会占用多个block; ext2文件系统的数据访问为索引式文件系统; 需要碎片整理的原因是文件写入block太过于松散,此时文件读取的性能将会变得很差所致。这个时候可以通过碎片整理将同一个文件所属的block汇集在一起; ext2文件系统主要有boot sector,superblock,inodebitmap,blockbitmap,inodetable,datablock等六大部分; datablock是用来放置文件内容数据的地方,在ext2文件系统中所支持的block大小有1KB,2KB,4KB三种而已; inode记录文件的属性/权限等数据,每个inode大小均固定为128字节;每个文件都会仅占用一个inode而已;因此文件系统能够新建的文件数量与inode的数量有关; 文件的block记录文件的实际数据,目录的block则记录该目录下面文件名与inode号码的对照表; 日志文件系统会多出一块记录区,随时记载文件系统的主要活动,可加快系统恢复时间; linux文件系统为了增加性能,会让主存储器作为大量的磁盘高速缓存。 实际连接只是多一个文件名对该inode号码的连接而已; 符号链接就类似于windows的快捷方式功能; 磁盘的使用必须经过分区、格式化与挂载,分别惯用的命令fdisk、mkfs和mount; 开机自动挂载可参考/etc/fstab的设置,设置完毕后务必使用mount –a测试语法正确; 第九章:文件与文件系统的压缩与打包 gzip,zcat压缩解压命令;用法gzip [-cdtv#] 文件名;-c将压缩的数据输出到屏幕上,可通过数据流重定向来处理;-d解压缩的参数;-t可以用来检验一个压缩文件的一致性,看看文件有无错误;-v可以显示出原文件/压缩文件的压缩比等信息;-#压缩等级-1最快-9最慢但是压缩比默认是-6;可以打开compress;解压:zcat 文件名.gz bzip2,bzcat压缩命令;比上面的压缩比更好,用法几乎与上面的相同;bzip2 [-cdkzv#] 文件名;-c将压缩过程中产生的数据输出到屏幕上;-d解压缩的参数;-k保留原文件,而不会删除原始的文件;-z压缩的参数;-v可以显示出原文件/压缩文件的压缩比等信息;-#与gzip同样的,,,;解压:bzcat 文件名.bz2; 打包命令tar,参数非常多,记住下面的方式即可: 压缩:tar –jcv –f filename.tar.bz2要被压缩的文件或目录名称 查询:tar –jtv –f filename.tar.bz2 解压缩:tar –jxv –f filename.tar.bz2 –C 与解压的目录 dump:完整备份工具命令; restore:恢复备份的命令; mkisofs:新建镜像文件命令; cdrecord:光盘刻录工具命令; 重点回顾: 压缩命令为通过一些运算方法去将原本的文件进行压缩,以减少文件所占用的磁盘空间。压缩前与压缩后的文件所占硬盘空间比值,就可以成为“压缩比”; 压缩的好处是可以减少磁盘空间的浪费,在WWW网站也可以利用文件压缩技术来进行数据的传送,好让网站带宽的可利用率上升; 压缩文件的扩展名大多是*.tar,*tar.gz,*.tgz,*.gz,*.Z,*.bz2。 常见的压缩命令有gzip与bzip2,其中bzip2压缩比gzip还要更好,建议使用bzip2; tar可以用来进行文件打包,并可支持gzip或bzip2的压缩; 压缩:tar –jcv –f filename.tar.bz2 被压缩的文件或目录名称; 查询:tar –jtv –f filename.tar.bz2 解压缩:tar –jxv –f filename.tar.bz2 –C 欲解压缩的目录; dump命令可备份文件系统或单一目录; dump的备份若针对文件系统时,可进行0~9的level差异备份。其中level 0为完整备份; restore命令可还原被dump构建的备份文件; 要新建光盘刻录数据时,可通过mkisofs命令来构建; 可通过cdrecord来写入CD或DVD刻录机; dd可备份完整的分区或磁盘,因为dd可读取磁盘的扇区表面数据; cpio为相当优秀的备份命令,不过需要搭配类似find命令来读入欲备份的文件名数据,才可进行备份操作; 第十章:vim程序编辑器 学习vim的原因:所有的unix like系统都会内置vi文本编辑器,其他的文本编辑器则不一定会存在;很多软件的编辑接口都会主动调用vi;vim具有程序编辑的能力,可以主动以字体颜色辨别语法的正确性,方便程序设计;程序简单,编辑速度相当快速; vim是vi的升级版本,可以用颜色或底线等方式来显示一些特殊的信息; vi分为三种模式:分别是一般模式、编辑模式和命令行模式分别如下; 一般模式:以vi打开一个文件就直接进入一般模式了。可以上下左右移动光标,也可以删除字符或整行,也可以复制和粘贴; 编辑模式:在一般模式中可以进行删除、赋值、粘贴等操作,但是却无法编辑文件内容。要等到按下“i、I、o、O、a、A、r、R”中任意一个才能进入编辑模式,退出编辑模式按esc; 命令行模式:在一般模式,输入“:、/、?”3个中任意一个就可以将光标移动到最下面那一行,在这个模式可以提供你查找数据的操作,而读取、保存、大量替换字符、离开vi、显示行号等操作则是在此模式下完成的; 使用vi进入一般模式:vi test.txt 按下i进入编辑模式,开始编辑文字 按下esc键回到一般模式 在一般模式中输入:wq保存后离开vi vim按键说明: 第一部分:一般模式可用的按键说明,光标移动、复制粘贴、查找替换等; ctrl+f:屏幕向下移动一页,相当于pagedown; ctrl+b:屏幕向上移动一页,相当于pageup; ctrl+d:屏幕向下移动半页; ctrl+u:屏幕向上移动半页; +:光标移动到非空格符的下一行; -:光标移动到非空格符的上一行; n<space>:n表示数字,按下数字后再按空格键,光标会向右移动这一行的n个字符; 0或者功能键[Home]:移动到这一行的最前面字符处; $或者功能键[End]:移动到这一行的最后面字符处; H:光标移动到这个屏幕的最上方那一行的第一个字符; M:光标移动到这个屏幕的中央那一行的第一个字符; L:光标移动到这个屏幕的最下方那一行的第一个字符; G:移动到这个文件的最后一行; nG:n为数字。移动到这个文件的第n行; gg:移动到这个文件的第一行,相当于1G; N[Enter]:n为数字。光标向下移动n行; 查找与替换 /word:向下寻找一个名称为WORD的字符串; ?word:向上寻找一个字符串名称为word; n:这个n是英文按键;代表重复前一个查找的操作;向下继续查找; N:这个N是英文按键;与n刚好相反,向上继续查找; 使用/word配合n及N是非常有用的,可以重复第找到一些关键字; :n1,n2s/word1/word2/g:n1与n2为数字。在第n1与n2行之间寻找一个word1这个字符串,并将该字符串替换为word2。 :1.$s/word1/word2/g:从第一行到最后一行查找word1字符串,并将该字符串替换为word2; :1,$s/word1/word2/gc:从第一行到最后一行查找word1字符串,并将该字符串替换为word2。且在替换前显示提示字符给用户确认是否需要替换; 删除、复制和粘贴; x、X:在一行字当中,x为向后删除一个字符(相当于del),X为向前删除一个字符(相当于backspace); nx:n为数字,连续向后删除n个字符; dd:删除光标所在的那一整行; ndd:n为数字,删除光标所在的向下n行; d1G:删除光标所在到第一行的所有数据; dG:删除从光标所在到最后一行的所有数据; d$:删除从光标到该行的最后一个字符; d0:0是数字;删除从光标所在处到该行的最前面一个字符; yy:复制光标所在的一行; nyy:n为数字,复制光标所在处的向下n行; y1G:复制光标所在行到第一行的所有数据; yG:复制光标所在行到最后一行的所有数据; y0:复制光标所在的那个字符到该行行首的所有数据; y$:复制光标所在的那个字符到该行行尾的所有数据; p,P:p为将以复制的数据在光标的下一行粘贴,P为粘贴在光标的上一行; J:将光标所在行与下一行的数据结合成一行; c:重复删除多个数据,例如向下删除10行,[10c]; u:复原前一个操作; ctrl+r:重做前一个操作; .:小数点,意思是重复前一个操作的意思,如果你想要删除、重复粘贴等操作,按下小数点就好了; 第二部分:一般模式切换到编辑模式的可用的按钮; i,I:进入插入模式:i从目前光标所在处插入,I为在目前所在行的第一个非空格符出开始插入; a, A:进入插入模式:a为从目前光标所在处的下一个字符处开始插入,A为从光标所在行的最后一个字符处开始插入; o,O进入插入模式:这是英文o的大小写,o为在目前光标处的下一行插入新的一行;O为在目前光标所在处得上一行插入新的一行; r,R:进入替换模式:r只会替换光标所在的那一个字符一次;R会一直替换光标所在处的字符,直到按下ESC键为止; ESC键:推出编辑模式,回到一般模式; 第三部分:一般模式切换到命令行模式的可用的按钮说明; :w:将编辑的数据写入到硬盘文件中; :w!:若文件属性为只读时,强制写入给文件。只不过到底能不能写入,还是跟你对该文件的文件权限有关; :q:离开vi; :q!若修改过文件,又不想存储,使用!为强制离开不保存文件;!在vi中经常有强制的意思; :wq:保存后离开,若为:wq!则为强制保存后离开; ZZ:大写的Z。若文件没有改动,则不保存离开,若文件已经被改动过,则保存后离开; :w[filename]:将编辑的数据保存成另一个文件,类似于零存文件; :r[filename]:在编辑的数据中,读入另一个文件的数据,即将filename这个文件内容加到光标所在行后面; :n1,n2 w[filename]将n1到n2的内容保存成filename这个文件; :!command:暂时离开vi到命令行模式下执行command的显示结果; :set nu:显示行号,设置之后,会在每一行的前缀先是该行的行号; :set nonu:与set nu相反,为取消行号; 在vi中,数字是很有意义的。数字通常代表重复做几次的意思。也有可能是代表重复做几次的意思。也有可能是代表去到第几个什么的意思; 在使用vim编辑时,vim会在被编辑的文件的目录中在新建一个filename.swp的暂存文件,可以有恢复文件的功能; 块编辑; 多文件编辑:按键有:n编辑下一个文件;:N编辑上一个文件;:files列出目前这个vim的打开的所有文件; 将hosts中的四行复制到hosts1中: 通过vim hosts hosts1命令来使用一个vim来打开两个文件; 在vim中先使用:files查看一下编辑的文件数据有什么;然后按下任意键回到vim一般模式; 在第一行输入4yy命令来复制四行; 在vim的环境下输入n回来到第二个编辑的文件,即hosts1中; 在hosts1下按G到最后一行,再输入p粘贴; 按下多次的u来还原原本的文件数据; 最终按下:q来离开vim的多文件编辑; 多窗口功能:在命令行模式下输入:sp[filename]即可多打开一个窗口,filename可有可无,如果想在新窗口启动另一个文件,就加上文件名;否则近输入:sp时,出现的则是同一个文件在两个窗口间; 多窗口情况下的按键功能:ctrl+w+下键或j键,光标移动到下方的窗口;ctrl+w+上键或k,光标移动到上方的窗口;ctrl+w+q其实就是:q结束离开; 重点回顾: linux下面的配置文件多为文本文件,故使用vim即可进行设置编辑; vim可视为程序编辑器,可用以编辑shell script、配置文件等,避免打错字; vi为所有UNIX like的操作系统都会存在的编辑器,且执行速度快; vi有三种模式,一般模式可变换到编辑与命令行模式,但编辑模式与命令行模式不能互换; 常用的按键有I,esc,:wq; vi的界面大致可分为两部分:上半部的本文与最后一行的状态+命令行模式; 数字是有意义的,用来说明重复进行几次操作的意思,例如5yy为赋值5行的意思; 光标的移动中,大写的G经常使用,尤其是1G、G,表示移动到文章的头、尾功能; vi的替换功能也很棒。:n1,n2s/old/new/g要特别注意学习起来; 小数点.为重复进行前一次操作,也是经常使用的按键功能; 进入编辑模式几乎只要记住I,o,R三个按钮即可,尤其是新增一行与替代的R; vim会主动创建swap暂存文件,所以不要随意短线; 可以使用ctrl+v进行复制/粘贴/删除的行为; 使用:sp可以切割窗口; vim的环境设置可以写入~/.vimrc文件中; 可以使用iconv进行文件语系编码的转换; 使用dos2UNIX及UNIX2dos可以变更文件每一行的行尾断行字符; 第十一章:认识与学习bash 管理整个计算机硬件的其实是操作系统的内核,这个内核是需要被保护,所以我们一般用户就只能通过shell来跟内核通信; 我们必须要通过shell将我们输入的命令与内核通信,好让内核可以控制硬件来正确无误地工作; 操作系统其实就是一组软件,由于这组软件在控制整个硬件与管理系统的活动监测,如果这组软件能被用户随意操作,若用户应用不当,将会使整个系统崩溃; shell的功能只是提供用户操作系统的一个接口,可以通过这个借口调用其他软件; bash是shell的诸多版本中的一个,linux用的是这一版本; cat /etc/passwd可以查看登陆后可以取得的默认的shell; bash的主要优点:命令记忆功能;命令与文件补全功能,tab接在一串命令第一个字后面为命令补全,接在第二个字后面为文件补全;命令别名设置alias;作业控制、前台、后台控制;程序脚本;通配符; 通过type+命令可以知道每个命令是否为bash的内置命令; 为转义字符,只有当紧接enter才是使用两行输入;中间有空格就是转意空格了; shell的变量;真正以shell来跟linux通信,是在正确登录linux之后。进入shell之前,系统需要一些变量来提供他数据的访问,所以就会有一些环境变量的读入;区分不同的用户; 变量的现实用echo,前面必须加上字符$;当一个变量名称尚未被设置时,默认的内容是空的; 变量的设置规则:变量与变量的内容以一个登号来连接,例如“myname=vbird”;等号两遍不能直接接空格符;变量名称只能是英文字母与数字,但是开头字符不能是数字;变量内容若有空格符可使用双引号或单引号将变量内容结合起来,双引号内的特殊字符如$可以保有原本的特性,单引号内的特殊字符则为一般字符;可用转义字符将特殊符号变成一般字符; 单引号与双引号的最大不同在于双引号仍然可以保有变量的内容 ,但单引号内仅能是一般字符,而不会有特殊字符;反单引号内的命令将会被先执行; env查询环境变量与常见环境变量说明; 一些环境变量:HOME,代表用户的主文件夹;SHELL,告知我们目前这个环境使用的shell是那个程序;HISTSIZE,记录的历史命令有多少条;MAIL,当我们使用mail这个命令再收信时会去读取的邮件信箱文件;PATH,执行文件查找的路径,目录与目录中间以冒号隔开,文件的查找依PATH中目录的顺序查询;LANG:语系数据;RANDOM,随机数的变量;PS1,提示符的设置;OSTYPE,HOSTTYPE,MACHTYPE主机硬件与内核的等级; 子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量; 当启动一个shell,操作系统会分配一记忆块给shell使用,此内存内的变量可让子进程取用;若在父进程利用export功能,可以让自定义变量的内容写到上述的记忆块中(环境变量);当加载另一个shell时(即启动子进程,而离开原本的父进程了),子shell可以将父shell的环境变量所在的记忆块导入到自己的环境变量当中; read读取来自键盘的变量;read [-pt] varable;-p后面可以接提示符;-t后面可以接等待的秒数,不会一直等待用户; read –p “please keyin your name:” –t 30 named; declare [-aixr] variable:-a,将后面名为variable的变量定义成为数组;-i定义为整数数字;-x定义为环境变量;-r改变量不可被更改;变量类型默认为字符串;bash环境中的数值运算,默认只能达到整数类型; 数组的读取与输出: 使用ulimit限制用户的某些资源,包括可以打开的文件数量、可以使用的CPU时间、可以使用的内存总量; 变量内容的删除、替代与替换: ${变量#关键字} 若变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除; ${变量##关键字} 若变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除; ${变量%关键字} 若变量内容从尾开始的数据符合“关键字”,则将符合的最短数据删除; ${变量%%关键字} 若变量内容从尾开始的数据符合“关键字”,则将符合的最长数据删除; ${变量/旧字符串/新字符串} 若变量内容符合“旧字符串”,则第一个旧字符串会被新字符串替换; ${变量//旧字符串/新字符串} 若变量内容符合“旧字符串”,则全部的旧字符串会被新字符串替换; linux中使用clear来清除界面; alias可以为命令设置别名;例如alias lm=’ls –l | more’,取消的时候用unalias,unalias lm; history命令:查询命令历史的服务;n,数字,列出最近的n条命令行;-C,将目前的shell中所有shell删除;-a将目前新增的命令写入histfiles中,不存在则写入到~/.bash_history中去;-r,将histfiles的内容读到目前这个shell的history记忆中;-w将目前的history记忆内容写入histfiles中;HISTSIZE,~/.bash_history中记录的命令数量,新的进入旧的删除; 命令运行的顺序:以相对/绝对路径执行命令,例如“/bin/ls”或“./ls”;由alias找到该命令来执行;由bash内置的命令来执行;通过$PATH这个变量的顺序找到的第一个命令来执行; ctrl+C:终止目前的命令;ctrl+D:输入截至,例如邮件结束的时候;ctrl+M:就是enter;ctrl+S:暂停屏幕的输出;ctrl+Q:恢复屏幕的输出;ctrl+U:在提示符下,将整行命令删除;ctrl+Z:暂停目前的命令; 通配符:*:代表0个或无穷多个任意字符;?:代表一定有一个任意字符;[]:同样代表一定有一个在中括号内的字符,例如[abcd]代表一定有一个字符,可能是a,b,c,d这四个中的任何一个;[-]:若有减号在中括号中,代表在编码顺序内的所有字符;[^]若中括号内的第一个字符为^,那么表示原向选择,例如[^abc]代表一定有一个字符,只要是非a,b,c中的其他字符就接受的意思; 重点回顾: 由于内核在内存中是受保护的块,因此我们必须要通过“shell”将我们输入的命令与kernel通信,好让kernel可以控制硬件来准确无误地工作; 学习shell的原因主要有:命令行界面的shell在各大distribution都一样;远程控制时命令行界面速度较快;shell是管理linux系统非常重要的一环,因为linux内很多控制都是以shell编写的; 系统合法的shell均写在/etc/shells文件中; 用户默认登录取得的shell记录于/etc/passwd的最后一段字段; bash的功能主要有命令编辑功能、命令与文件补全功能、命令别名设置功能、作业控制、前台后台控制、程序化脚本、通配符; type可以用来找到执行命令为何种类型,也可用于与which相同的功能; 变量就是以一组文字或符号来替换一些设置或者是一串保留的数据; 变量主要有环境变量与自定义变量,或称全局变量与局部变量; 使用env与export可查看环境变量,其中export可以将自定义变量转成环境变量; set可以查看目前bash环境下的所有变量; $?也为变量,是前一个命令执行完毕后的回转码,在linux中回转码为0代表执行成功; locale可用于查看语系数据。 ulimit可用以限制用户使用系统的资源情况; 第十二章:正则表达式与文件格式化处理 正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单地来讲,正则表达式就是用在字符串的处理上面的一项“表达式”。正则表达式并不是一个工具程序,而是一种字符串处理的标准依据。 正则表达式基本上是一种表示法,只要工具程序支持这种表示法,那么该工具程序就可以用来作为正则表达式的字符串处理之用; 正则表达式的字符串表示方式依据不同的严谨度可分为基础正则表达式与扩展正则表达式; 基础正则表达式练习: 查找特定字符串:在文件中查找the这个特定字符串:grep –n ‘the’ regular_express.txt;反向选择,查找没有the这个特定字符串的行:grep –vn ‘the’ regular_express.txt;取得无论大小写的the的字符串:grep –in ‘the’ regular_express.txt; 利用中括号[]来查找集合字符: ^在中括号内表示反向选择,在中括号外表示定位在行首的意思; grep –vn ‘.$’ regular_express.txt;因为.有其他意义,所以必须使用转义字符来解除其特殊意义; 任意一个字符.与重复字符*:.代表一定有一个任意字符的意思;*代表重复前一个字符0到无穷多次的意思,为组合形态; 特殊符号表 [:alnum:] 代表英文大小写字符及数字,即0-9,A-Z,a-z; [:alpha:] 代表任何英文大小写字符,即A-Z,a-z; [:blank:] 代表空格键与[Tab]按键; [:cntrl:] 代表键盘上面的控制按键,包括CR,LF,Tab,Del等; [:digit:] 代表数字而已; [:graph:] 除了空格符外的其他所有按键; [:lower:] 代表小写字符,即a-z; [:print:] 代表任何可以被打印出来的字符; [:punct:] 代表标点符号; [:upper:] 代表大写字符; [:space:] 任何会产生空白的字符,包括空格键[Tab]CR等; [:xdigit:] 代表十六进制的数字类型,因此包括0-9,A-F,a-f的数字与自符; 基础正则表达式特殊字符表 ^word 待查找的字符串(word)在行首; Word$ 待查找的字符串(word)在行尾; . 代表一定有一个任意字符的字符; 转义字符,将特殊符号的特殊意义去除; * 重复零个到无穷个的前一个字符; [list] 从字符集合的RE字符里面找出想要选取的字符; [n1-n2] 从字符集合的RE字符里面找出想要选取的字符范围; [^list] 从字符集合的RE字符里面找出不要的字符串或范围;^在中括号内表示反向选择,在中括号外表示定位在行首的意思; {n,m} 连续n到m个前一个RE字符,若为{n}则是连续n个的前一个RE字符,若为{n,}则是连续n个以上的前一个RE字符; 再次强调:正则表达式的特殊字符与一般在命令行输入命令的“通配符”并不相同,例如,在通配符当中的*代表的是零到无限多个字符的意思,但是在正则表达式中,*则是重复0到无穷多个前一个RE字符的意思。 sed工具:是一个管道命令,可以分析standard input的,而且sed还可以将数据进行替换、删除、新增、选取特定行等的功能; sed可以,以行为单位新增/删除功能;以行为单位的替换与显示功能;直接修改文件内容;部分数据的查找并替换的功能; 重点回顾: 正则表达式就是处理字符串的方法,它是已行为单位带进行字符串的处理行为; 正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序; 只要工具程序支持正则表达式,那么该工具程序就可以用来作为正则表达式的字符处理之用; 正则表达式与通配符是完全不一样的。通配符代表的是bash操作接口的一个功能,但正则表达式则是一种字符处理的表示方式; 使用grep或其他工具进行正则表达式的字符比较时,因为编码的问题会有不同的状态,因此,你最好将LANG等变量设置为C或者是en等英文语系; grep与egrep在正则表达式里面是很常见的的两个程序,其中egrep支持更严谨的正则表达式语法; 由于编码系统的不同,不同的语系会造成正则表达式选取数据的区别,因此可利用特殊符号如[:upper:]来替换编码范围较佳; 由于严谨度的不同,正则表达式之上还有更严谨的扩展正则表达式; 基础正则表达式的特殊符号有*,?,[],[-],[^],^,$等; 常见的正则表达式工具有grep、sed、vim; printf可以通过一些特殊符号来将数据进行格式化输出; 文本的比较中,可利用diff及cmp进行比较,其中diff主要用于纯文本文件方面的新旧版本比较; patch命令可以将旧版数据更新到新版; 第十三章:学习shell script 其实,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的; 实际上shell script在处理数据速度上不太好,因为shellscript用的是外部的命令与bash shell的一些默认工具,所以他会常常去调用外部的函数库,因此命令周期上面当然比不上传统的程序语言;左移shellscript用在系统管理上面是很好的一项工具,但使用在处理大量数值运算上,就不够好了,因为shell script的速度较慢,且实用的cpu资源较多,会造成主机资源的分配不良; 在shell script的编写中还需要用到下面的注意事项:命令的执行是从上而下、从左而右地分析与执行;命令的执行就如同第五章内提到的:命令、参数间的多个空白都会被忽略掉;空白行也将被忽略掉,并且[tab]按键所得的空白同样视为空格键;如果读取到一个enter符号,就尝试开始执行该行命令;至于如果一行的内容太多,则可以使用“[enter]”来扩展至下一行;“#”可作为批注。任何加在#后面的数据将全部被视为批注文字而被忽略; script执行方法:直接执行的方式来执行script,就是利用bash(sh)来执行脚本,会使用一个新的bash环境来执行脚本内的命令,在这种执行方式时,script是在子进程的bash内执行,当子进程完成后,子进程内的各项变量或操作将会结束而不会传回到父进程;利用source来执行脚本,在父进程中进行; test 命令用来检测某些文件或者是相关的属性; 关于某个文件的文件类型的判断:如test –e filename表示存在否; -e 该文件是否存在; -f 该文件是否存在且为文件; -d 该文件是否存在且为目录; -b 该文件是否存在且为一个block device设备; -c 该文件是否存在且为一个character divice设备; -S 该文件是否存在且为一个Socket文件; -p 该文件是否存在且为一个FIFO文件; -L 该文件是否存在且为一个连接文件; 关于文件的权限检测:如test –r filename表示可读否; -r 检测该文件是否存在且具有可读属性; -w 检测该文件是否存在且具有可写属性; -x 检测该文件是否存在且具有可执行属性; -u 检测该文件是否存在且具有SUID属性; -g 检测该文件是否存在且具有SGID属性; -k 检测该文件是否存在且具有Sticky bit属性; -s 检测该文件是否存在且为非空白文件; 两个文件之间的比较:如test file1 –nt file2 -nt 判断file1是否比file2新; -ot 判断file1是否比file2旧; -ef 判断file1与file2是否为同一文件,可用在判断hard link的判定上。主要意义在于判断两个文件是否均指向同一个inode; 关于两个整数之间的判定:例如test n1 –eq n2 -eq 两数值相等; -ne 两数值不等; -gt n1大于n2; -lt N1小于n2; -ge n1大于等于n2; -le n1小于等于n2; 判定字符串的数据 Test –z string 判定字符串是否为0,若为空字符串,则为true; Test –n string 判定字符串是否非为0,若string为空字符串,则为false; Test str1=str2 判定两个字符串是否相等,若相等回传true; Test str1!=str2 判定两个字符串是否不相等,若相等回传false; 多重条件判定,例如:test –r filename –a –x filename -a 两个条件同时成立!例如test –r file –a –x file,则file同时具有r与x权限,才回传true; -o 任何一个条件成立!例如test –r file –o –x file,则file具有r或x权限时,就可回传true; ! 反向状态,如test !-x file,file不具有x时,回传true; shell的默认变量:$0,执行脚本文件名;$1紧接在文件名后面的第一个参数,$2、$3、$4;$#,代表后接的参数个数;$@,代表$1、$2、$3、$4之意,每个参数是独立的,用双引号括起来;$*,代表“”$1c$2c$3c$4””,其中c为分隔符,默认为空格键,所以本例中代表“”$1 $2 $3 $4””之意; shift造成参数变量号码的偏移;将前面的几个参数拿掉,默认为1,后可接数字表示拿掉几个参数; 条件判断式: 单层、简单条件判断式: if [条件判断式] ;then 当条件判断式成立,可以进行的命令工作内容; fi ; 将if反过来写结束if之意; &&:代表AND; ||:代表OR;所以在使用中括号的判断式中,[ “$yn” = “y” –o “$yn” = “Y” ]可以替换为[“$yn” = “y” ] || [ “$yn” = “Y” ]; 多重、复杂条件判断式: if [条件判断式] ;then 当条件判断式成立,可以进行的命令工作内容; else 当条件判断式不成立,可以进行的命令工作内容; fi ; if [条件判断式1] ;then 当条件判断式1成立,可以进行的命令工作内容; elif [条件判断式2] ;then 当条件判断式2成立,可以进行的命令工作内容; else 当两条件判断式均不成立,可以进行的命令工作内容; fi ; 利用case …esac判断; case $变量名称 in “第一个变量名称”) 程序段 ;; “第二个变量内容”) 程序段 ;; *) 不包含第一个变量内容与第二个变量内容的其他程序执行段 exit 1 ;; esac function printit () { echo “your choice is $1” } case $1 in “one” ) printit ;; “two”) printit ;; “three” printit ;; *) echo “usage $0 (one/two/three)” ;; esac 不定循环(loop)while do done;until do done 固定循环 for var in con1 con2 con3 … do 程序段 done for另一种写法:for ((初始值;限制值;执行步长)) do 程序段 done 初始值:某个变量在循环当中的初始值,直接以i=1设置好; 限制值:当变量的值在这个限制值的范围内,就继续进行循环,例如i<=100; 执行步长:每做一次循环时变量的变化量; shell script的追踪与调试: sh [-nvx] scripts.sh -n:不要执行script,仅查询语法的问题;-v在执行script之前,现将script的内容输出到屏幕上;-x将使用的script内容显示到屏幕上;由sh –x的方式来将命令执行过程也显示出来,如此用户可以判断程序代码执行到哪一段时会出现相关的信息; 重点回顾: shell script是利用shell的功能所写的一个“程序”,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,已达到我们想要的处理目的。 shell script用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上就不够好了,因为shell script的速度较慢,且使用的CPU资源较多,造成主机资源分配不良; 在shell script的文件中,命令是从上而下的、从左而右地分析与执行; shell script的执行至少需要有r的权限,若需要直接命令执行,则需要拥有r和x的权限; 在良好的程序编写习惯中,第一行要声明shell(#!/bin/bash),第二行以后则声明程序用途、版本、作者等; 对谈式脚本可用read命令达成; 要创建每次执行脚本都有不同结果的数据,可用date命令利用日期达成; script的执行若以source来执行时,代表在父进程的bash内执行之意; 若需要进行判断式,可使用test或中括号来处理; 在script内,$0,$1,$2,$3…$@是由特殊意义的! 条件判断式可使用if…then来判断,若是固定变量内容的情况下,可使用case $var in…esac来处理; 循环主要分为不定循环以及固定循环,配合do、done来达成所需任务; 我们可以使用sh –x script.sh来进行程序的调试; 第十四章:linux账号管理与ACL权限设置 当输入账户密码后,系统做了下面步骤:先寻找/etc/passwd里面是否有你输入的账号,如果没有则跳出,如果有的话则将该账号对应的UID与GID读出来,另外,该帐号的主文件夹与shell设置也一并读出;再来则是核对密码表,这时linux会进入/etc/shadow里面找出对应的帐号与UID,然后核对一下你刚才输入的密码与里面的密码是否相符;如果一切OK的话,就进入shell控管的阶段; 跟用户账号有关的有两个非常重要的文件,一个是管理用户UID/GID重要参数的/etc/passwd,一个则是专门管理密码相关数据的/etc/shadow。 /etc/passwd文件结构:每一行都代表一个帐号,有几行就代表有几个账号在你的系统中!里面有很多账号是系统正常运行所必须要得,简称为系统账号; 第十七章:程序管理与SELlinux初探 在linux系统中:触发任何一个事件时,系统都会将他定义为一个进程,并且给于这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关的属性关系,给于这个PID一组有效的权限设置。 程序一般是放置在磁盘中,然后通过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程;为了操作系统可管理这个进程,因此进程有给与执行者的权限/属性等参数,并包括金城所需要的脚本与数据或文件数据等,最后再给于一个PID。系统通过这个PID来判断该process是否具有权限进行工作。 一个进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限。 程序:通过二进制程序放置在存储媒介中,如硬盘、光盘、软盘、磁盘等,以物理文件的形式存在; 进程:程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载到内存中,操作系统并给与这个内存内的单元一个标识符,可以说,进程就是一个正在运行中的程序; 当我们登录系统所得bash shell之后,在单一终端机下同时进行多个工作的行为管理。在进行工作管理的行为中,其实每个工作都是目前bash的子进程,即彼此之间是有相关性的。 makefile里面记录了源码如何编译的详细信息;