Linux知识总结、

时间:2024.5.13

vim(脚本编程、配置文件修改)

vim:功能强大的全屏幕文本编辑器,他的作用是建立、编辑、显示文本文件。它没有菜单,只有命令,并且他支持所有的语言。Emacs,UltraEdit.

Vi工作模式:命令模式、插入模式、编辑模式。缺省进入的是命令模式(键盘的任何输入,系统都会把它当成一个命令),输入相应的插入命令(),编辑模式(正在编辑的文档,做出一些相应的设置,保存、查找、设置行号、定义快捷键等??)

命令模式:a(光标后)A(行后);i(光标前)I(行前);o(行下面)O(行上面);$(行尾);0(行首);H(屏幕上端);M(中央);L(下端)。

定位:set nu(设置行号) set nonu(取消行号) gg(第一行) G(最后一行):8 (定位到第八行)

删除:x(删除光标所在字符,numb+x,包括光标所在的两个字符)

dd(删除光标当前所在行,numb+dd删除N行); dG(删除光标所在行到末尾的内容);:10,20d(删除第十行到第二十行之间的内容)。

剪切:dd(剪切当前行)ndd(剪切从当前行一下行,当前行也包括在内)

复制:yy、Y(复制当前行)nyy、nY(复制当前行一下的n行);p、P(粘贴在当前光标所在行下或行上)

替换和取消命令(在编辑一些文档的事后,没必要在有错误的时候进入插入模式进行写该,或者是命令模式删除再进入插入模式进行输入,改动比较少的时候,完全没这个必要):r(替换光标所在处字符); R(从光标所在处开始替换字符,按Esc结束,提示为replace) 搜索和替换命令:/ftp (找到文档中ftp关键词的文件);n(下个ftp文件;)大小写混合时候记不清楚哪个是大写,哪个是小写,查找时候困难,因为Linux是严格区分大小写的,可以用set ic(开启查找是忽略大小写功能);set noic(关闭查找是忽略大小写功能) 替换::%s/ftp/lamp/g (将全文关键字ftp的替换成lamp)

制定替换范围::4,10s /lamp/ftp/g(把第四行到第十行之间关键字lamp替换成ftp) c会询问 保存和退出的命令::wq(保存退出)如果用户没有写权限:wq!(强行保存退出,覆盖原文件),但不是说任何人没有写权限,用wq!都可以,前提是只有这个文件的所有者或者是root才可以,许多限定对root都是无效的,root很特殊。

不保存退出::q!(有的时候不想保存,想退出)

保存不退出::w(直接保存,并没有退出)甚至可以另存为:w /root/services.bak

导入其他文件内容到本文件中编辑::r /etc/issue (把issue内容导进来)

vi中执行命令(有时候用vi编辑一些系统文件或者是写脚本的时候,比如说些一个备份脚本,需要查询环境,理论上来说不需要退出vi)::!ls -l /etc (回车就回来了)

导入和命令一起用(可以把一个命令执行的结果导入vi中去,有时候脚本需要备注信息,说明脚本是用来干什么的,写上公司的版权信息,谁编写的脚本,最后一次更新时间):r !date 把系统当前的时间导入vi编辑文件中。

map(定义快捷键)::ctrl+p —— map ^P I#<ESC>在光标所在行首部出入#号,直接用ctrl+P 即可完成。(因为I可以跳至行首并且进入插入模式。)

map ^E ichao1990116@126.com 使用快捷键插入自己的邮箱,方便他人联系你咨询你写的脚本的作用。

map ^B 0x(0可以跳至行首,但不进入插入模式)。

:4,8s/^/#/g (4,8s指定范围,/分分隔符,^表示要在行首,/引出要添加的符号,比如

#,然后分隔符+g等于执行。c也可以,不过会询问。在第四行到第八行+上了#号)

:4,8s/^#//g (第一个分隔符后面写^#表示我要对行首#做替换,第二个分隔符后面什么也没写就表示我要替换为空,就是删除。然后分隔符+g等于执行。如果比没有^就会替换该行所有#为空。表示我把从第四行到第八行行首的#删除或者是替换为空。)

如果真的要把vi当做开放工具,但是并不是所有语言都是用#来做注释的。例如// 如果按照刚才那种方法是行不通的,显然是行不通的。

第三讲讲过find,命令别名点的时候提到过转义符,让命令或者符号使用它本意。如果其实删除的时候原本是不会有提示的,之所以有提示是因为他定义了别名-i 才会有提示。转义符\ ,1,5s/^\/\//g (\/\/表示插入了两个//,这样就OK了,在行首插入两个//,呵呵.)

:ab(你输入一个a自动变成b。):

mymail chao1990116@126.com

快捷键定义多了容易忘记,如果你有经常需要输入比较长的信息,你还不想定义快捷键,可以用这种方法来帮助你实现,太强大了?

如果需要这些快捷键永远生效需要编辑vim的配置文件(linux里面每一个用户都需要有一个宿主目录,如果用户没有宿主目录,在许多linux和unix里面是不允许登录的。宿主目录的路径可以指定,root目录在/root,users目录在/home,如samlee用户的目录在/home/samlee在宿主目录下有个.vimrc配置文件):vi /root/.vimrc 或 vi ~/.vimrc (~表示宿主目录) 里面是空的,可以把日常需要用的快捷键写入里面,例如:set nu ;

map ^P I#<ESC>编辑任何文件都是有效的,而不是像刚才保存退出后之后快捷键就没效了。

命令(前三章)

find /etc -name init* -a -type f -a -

atime -1 -exec ls -l {} \;

匹配文件内容中的关键字:grep ftp

/etc/services

配置文件和命令重名:可以用man 5 查看配置

文件。

gzip 只能压缩文件,不能压缩目录。不保留

原文件(原文件直接成压缩包)。

gunzip(解压)

tar打包目录(Internet 二进制包源代码包

.tar .gz) -c create产生打包文件

-v 显示执行过程 -f制定压缩后文件名 -z打

包并同时压缩

file 判断文件内容。

.zip 默认win和Linux通用的格式

压缩目录(保留原文件) zip -r newdir.zip newdir (可以直接压缩目录)如果是bz2或 者gzip想压缩文件夹必须先用tar打包然后才 能再压缩。

压缩文件不加 -r

.bz2(只能压缩文件,不能压缩目录,压缩比

非常强悍,gzip的升级版,其实只是增加了一

个选项 -k 保留源文件,但是压缩比很高): 压缩:bzip2 -k moon -k(保留原文件) 解压:bunzip2 moon.bz2

也可以压缩成.tar.bz2文件:先用tar打包目

录,再用bz2压缩打包文件。

write 发信息(用户)

wall 广播(所有人)

ping 测试网络是否连通

内核—shell--用户

bashell:在目录下面执行能自动补全文件名 。

history看历史命令— !numb 可以执行以

前的命令不过最多用的还是翻页键。

命令别名:alias 例如为什么ll在linux可以

用在Unix不可以用就是因为系统定义了别

名如果有连接选项必须用“”引起来定

义别名:alias copy=cp alias xrm="rm -r"

撤销别名 unalias copy

输入输出重定向:同标准I/O一样,shell对于

每个进程预先定义3个文件描述(0、1、2)。

分别对应于:

0(STDIN)标准输入—键盘;

1(STDOUT)标准输出—显示器,投影 2(STDERR)标准错误输出—显示器。

所谓重定向是指输入不从键盘输入,输出不从

显示器输出。可以把输出的结果显示到一个

文件中。

输出重定向:0> 0>>

ls -l /tmp > /tmp.msg 查看重定向文件可

以用cat等? date查看当前系统时间。>

会覆盖以前的内容,所以必须用>>才可以追

加内容,防止覆盖,以实现脚本自动化。 输入重定向:输入的内容可以是事先写好的。

1< 1<<

举例:wall< /etc<issue.net

错误输出重定向:2> 2>>不能省略2 cp -R /usr /backup/usr.bak2> /bak.error

大于号可以用来判断执行动作是否出错,如果

出错可以讲错误信息保存在目标录像里面,方

便管理员上线后对动作执行结果进行查找,备

份尤其重要。如果执行结果是对的,目标文件 管道(重要):将一个命令的输出传给另一个

命令,作为另一个命令的输入。

管道的最B之处在于可以让不起眼的命令发挥

出,居牛B的作用。举例:

ls -l /etc | more (更容易观看)

grep(查找某个文件里面所在的关键词,并且

可以把该行列出来)

举例:ls -l /etc | grep init | wc -l 查

看etc目录下面包含init的文件有多少个(一 个文件有多少行,或者一个目录下文件有多 少个)。

命令连接符:1. ; 让很多命令依次执行。 举例:pwd ; ls ; date 比如在写系统计划 人任务时需要。

2.&&(逻辑与)

command1 && command2

成功执行

失败不执行

write 情书< /home/love.txt&& rm

/home/love.txt 发完了马山删除,保证

marry受到才删除,不然情书还没发就被删,

白写了。

||(逻辑或):

command1 && command2

成功不执行

失败执行

举例:还是些情书~

write Mary < /home/samlee/love.txt ||

mail Mary < /home/samlee/love.txt

第一个命令执行成功,不发邮箱,执行不成功

,就发邮件。

3.命令替换符 ~ ~

我想查看命令touch文件的详细信息,分两步

which touch得到touch路径 ls -l

/bin/touch 查看详细信息。

如果知道命令替换:

ls -l ~ which touch~ 和上者结果一样。

和管道略有不同,是将一个命令的结果作为

另一个命令的参数。管道择是将一个命令的

输出结果作为下一个命令的输入。写脚本的时

候比较方便,因为不用版本的linux路径可能

不太一样,如果记忆不出路径,这种方法用以

来比较灵活。

软件包管理(第六章)

linux软件包管理,可以分为两个大的方面:redhat系列软件包管理(很多版本)。debian系列软件包管理(ubuntu),管理稍有区别。

软件包的选择上追求的是稳定,管理方面追其实用性,并不是说越新越好。软件包命名形式:sudo-1.7.2p1-5.el5.i386.rpm 其中包括软件名(sudo),版本号(1.7.2p1),发行号(5.e15),和硬件平台(i386)(1)卸载

#rpm -e sudo rpm(表示是rpm包,redhat开发的一种2进制包的管理方式,所以后缀名都是.rpm)注意:如果其他软件包有依赖关系,卸载时会产生提示信息,可使用--nodeps强行

卸载。卸载的时候需要用到软件名称(sudo),安装的时候需要软件包名(sudo-1.7.2p1-5.el5.i386.rpm ),i386硬件平台(遵循intelPC硬件平台。不同硬件平台的软件包是不同的。)有时候卸载一个软件包会有这样的提示:比如说我想卸载samba(实现windows和linux之间进行系统共享的软件包)rpm -e samba

因为有依赖的关系,因为另外一个软件包需要它。理论上来说把samba卸载掉依赖的数据包就毫无价值了,可以先卸载依赖的数据包,再卸载samba。如果非要直接卸载掉samba,也是可以的。

rpm -e --nodeps samba (不考虑任何软件包依赖于该软件包。强行卸载。理论上不建议这么做,除非你对系统有很深了解,对软件包有很深的依赖,那么如果依赖的软件包有10个呢?那么就比较麻烦了,这就是为什么后来引入yama的原因)linux所有软件和配置文件都是通过二进制文件形式进行存储和安装的。

安装:如果要安装一个软件包,现在想把sudo再安装上去命令:rpm -ivh sudo-1.7.2p1-5.e15.i386.rpm ( i安装install;v显示这个命令执行的时候详细信息;h安装进度)在安装之前首先要获得这个软件包,有两种方式:1.系统光盘含有的一个软件包,从系统光盘就可以安装了。(什么样来挂载光盘,在linux中有挂载的概念,linux中所有的东西都是文件,硬件设备也是文件,光驱也是文件。它都会以文件的形式来存储,它放在device目录下面不能直接调用,它需要有一个挂载点。挂载点说的通俗点就是一个空目录。很多时候我们习惯将光盘放在mnt下面,linux有一个习惯就是把临时挂载的文件放在mnt目录下面。那你说我死活就是不放在这个目录下面,在别的地方创建一个目录当然也是可以的。创建 mkdir /mnt/cdrom 执行的时候有挂载的命令,mount /dev/ cdrom /mnt/cdrom(/dev/cdrom光盘原文件挂载到/mnt/cdrom)然后可以看到提示,说是device这个块得文件是写保护的,挂载的时候是只读。看到提示的时候就代表挂载成功了,那么我们现在访问/mnt/cdrom这个目录就相当于访问光盘上的内容。)2.如果是安装光盘中不存在的软件包,是从网络上下载的软件包,直接使用rpm -i 就可以安装了。redhat5的目录居然是Server,晕死!找了半天!ls找麻烦了。我们可以用 ls | grep sudo 查找到。用Tab补全,不要傻乎乎一个一个的敲键盘。

rpm -ivh sudo......(用Tab补全,安装成功) 怎么查看一个软件包是否已经安装套系统中,直接用rpm -q sudo(文件包名就可以了)

查询系统中已经安装的软件包中与samba相关软件包有哪些:rpm -qa | grep samba (其中q是查询,a是所有,其实前面那一句是查询系统里面所有的软件包,后面那一句是约束条件,只查询与samba相关的软件。可以看到与samba相关的软件包可以有多个。换句话说,也是就如果你要把samba卸载理论上你是需要把这几个与samba相关联的软件包都卸载掉的,所以要知道怎么样进行查询。)

关于安装的选项:1.--excludedocs ;

rpm -ivh --excludedocs samba-client-3.0.23c-2.i386.rpm(这个选项的作用是不安装软件包中的文档文件,linux里面很多软件包都有很相详细的文档,也就是说你对这个软件包相当的熟悉了,不需要看帮助文档,那么加上这个选项安装的时候就不会安装了。)

2.--prefix PATH(将软件包安装到由PATH指定的路径下,理论上是可以指定路径的。但是对于rpm包来讲这个指定的意义不大,因为大部分rpm包都不允许改变他们的安装目录。命令: rpm -ivh --prefix=/user/local/sudo sudo-1.7.2p1-5.e15.i386.rpm 这样就可以把安装的路径指定在/user/local ;rpm的制作者在生产rpm包的时候都规定了它在Linux系统中的存放的目录,你是改变不了的。linux不想windows一样有注册表的概念,而且文件的存放位置东一个西一个,卸载的时候容易遗漏,而linux中则不存在注册表的概念,卸载的时候也会循序规则把相应路径的文件全部卸载,不会存在遗漏。)

3.--test 安装软件包之前测试一下,能发现其依赖的软件包,冲突等??

还有三种情况需要了解:1.理论上来说已经被安装就不需要重新再安装了,但是有的时候例如在windows里面使用软件的时候不小心删除了它的一些文件,导致其不能运行或者运行不正常,可以重新按照原路径重新安装下。那么在linux里面可以用一个选项实现,命令:rpm -ivh --replacepkgs sudo-1.7.2p1-5.e15.i386.rpm

这个命令就执行了一个覆盖安装的过程,如果你需要的话。

2.在windows里面例如软件比较老了,系统检测到新的文件,提示要更新到最新的版本。这个时候在安装的时候可能会提示文件冲突,在windows碰到这种提示,一般我们都选择覆盖。如果在linux里面也出现这种文件冲突,那么可以使用命令:rpm -ivh --replacefiles sudo-1.7.2p1-5.e15.i386.rpm

(这个时候它会把这个文件进行一个覆盖)

3.第三种情况就是比较挠头的问题,出现了依赖的关系,有很多时候软件包之间是有依赖关系的,比如说我们现在安装一个软件包,它需要c的编译器,那么如果你没有安装c的编译器,那么这个软件包没有办法运行或使用,这是很有可能的。那么在安装软件包的时候系统提示"失败的依赖关系",理论上这种情况下应该先安装它依赖的软件包,然后才能使用这个软件,如果不这样,这个软件包十有八九是运行不了的。当然如果你要强行安装,也不是不可以,使用--nodeps,忽略依赖性,强行安装,这个软件包也会被安装上,根据李明大师的经验这个软件包十有八九是用不了。rpm没有很好的解决依赖的关系,例如安装A,提示依赖B,然后去安装B,有提示依赖C,这样会把人头搞的很大,这也就是为什么yum会诞生的原因,但是rpm还是有其管理方法的。

4.软件包升级 rpm -Uvh sudo-1.8.0p1-5.e15.i386.rpm(其中U是升级的意思。)

YUM包的管理

YUM应用上面有两个好处:1.自动解决软件包依赖关系(假如说你想安装软件包A,yum会自动把依赖于软件包A的其他软件包自动安装上去,不需要你自己去找)。2.方便你软件包的升级(在rpm软件包中,如果我们想升级软件包,需要下载下来最新的软件包,然后把新的版本用rpm -U再执行安装升级才可以。但是用YUM以后不要去找,我们缺省在centOS或者任何一个redhat系列的linux安装完以后,它都会自动指向一个rpm的源,这个源你也可以自定义修改指向其他地方)。

YUM选项

需要链接互联网,自己在局域网制定一个源也可以,但是在解决问题的时候没有任何价值,因为你需要手动更新这个源,如果能连Inter网,直接执行intel上的yum源就行了。 rpm -e sudo

yum install sudo (它实际上会在互联网上寻找sudo的软件包,然后检查依赖关系然后完成整个过程。它会下载安装包,然后完成使用的过程。提示complete)

测试升级:yum check-update sudo (如果不写sudo,就表示检查所有软件包的升级,一般别那么写。一般用yum安装基本上都是最新的,而光盘安装未必是最新的软件包,可以用于检查老的软件包版本用于升级。如果检查到有新的软件包,会提升升级。为什么要升级软件包?一个软件包在发布应用的过程难免会有一些漏洞,会有一些问题,要进行修复,有的问题可能不重要,有的问题则会造成一些黑客的侵入,所以建议经常用的软件包最好经常升级,这是十分必要的。可以检查升级,也可以直接升级,如果直接升级命令:yum update sudo 就可以升级了,比较方面,如果用rpm则需要到互联网上去自己查找,并且下载下来再安装。可以把其他linux的源执行一台机器A的目录下面,然后升级用yum升级,或者是rpm手动升级。其他linux用yum升级自动去A的目录下拿最新版本的软件包,这样可以减少同时去

internet上面下载所占用的带宽,类似于WSUS.)

查询这个源上面有哪些软件包:yum list | more 查找具体软件包时候的命令:yum list | grep sudo 这个查找是查找yum源上面的软件包。还有一个就是yum info sudo能查看这个软件包的信息,学习的时候使用,知道软件包是做什么用的,什么时候发布的,版本,这是很有价值的信息,或者任何一个要安装软件包的介绍。在安装之前最好查看一下要安装的软件包的内容。yum remove sudo 卸载软件包,确定sudo是否在系统中已经安装可以用yum list | grep sudo 还有一种方法rpm -q sudo 来检测,要使用灵活,如果只是确定该软件包是否安装,用rpm -q sudo就可以了。可以详细的看一下yum帮助 man yum. 软件包是可以信任的,因为更新的软件包的网站是官方的,所以是可以信任的。用rpm的时候下载软件包,最好不要去小网站,下载的软件包可能存在隐患.RPM包的管理,其实RPM很多情况下是很好用的,它查询快。1、查询文件隶属于的软件包:rpm -qf(系统或者软件包安装文件丢失了,还没有备份,想恢复至少要确定文件属于哪一个软件包,或者是清除文件的时候,确定这个文件隶属于哪个文件包,它有什么作用,这个命令十分重要,不管是文件或者命令都可以查询的到。) 2.查询软件包的信息:rpm -qi name(它和yum info name作用差不多,都是查询系统已经安装的软件包有什么作用;如果是还没有安装的软件包,我也知道它是有什么作用,可以rpm -qip name)3.查询软件包安装了哪些文件在系统里面:rpm -ql names rpm -qlp names(装备在系统中安装的哪些文件)(软件包到底装了哪些文件在系统里面,这个命令很重要,能让我们清除的看到软件包所安装的所有文件和其路径(包括其文件和命令,因为在linux看来都是文件,看看文件和命令,差不多这个软件包就会用了。如果还不会用,可以看看帮助。)/etc下面都是软件包的配置文件, usr/下面都是命令。) rpm -qlp 文件全名(可以看文件没有安装之前将要在系统里面安装哪些信息) 4:查看软件包的帮助文件rpm -qd names

rpm -qdp names(查看还没安装的软件包的帮助文档)

5:查看配置文件:rpm -c names (安装之后的配置文件)查看没有安装到系统中的rpm包的配置文件 rpm -c names

就像以前讲过的引导流程,里面的服务肯定不是都需要启动的。rpm -qf vncserver 得到信息(vnc-server)它的软件包名是什么, rpm -qi vnc-server 得到他的作用,如果不需要它可以设置系统每隔运行级别的脚本设置为不启动。

这是一个理念和用法,一定要理解。rmp的查询能帮助我们解决很多问题。vi中定义了许多快捷键,其中一个快捷键不想用,不想删除,可以用#注释掉。但是使用的时候提示错误,why? 因为#不是标准的注释符,配置文件是vim,要有解决问题的思路, rpm -qa | grep vim (安装包未必只有一个,而且名字也未必很规范,所以要使用 rpm -qa | grep vim) 基本上在绝大版本的软件包中它的实例文档都叫example

命令rpm -ql vim-common | grep example

查询出vimrc_example.vim 进入查看。

man info 获得vim的帮助信息,看他的软件包有没有实例文档,发现原来vim的配置文件中的注释符号很特别,不是#而是"。

引导流程解析(第五章)

系统引导流程:1.固件(firmware)(CMOS/BIOS)——POST加电自检(不能称之为硬件因为是一段控制程序,又不能简单的称之为软件,因为它固化在主板上,所以叫固件。不同的硬件平台它的固件是不一样的,linux主要应用在PCserver上,所以他的固件平台是CMOS/BIOS,CMOS是固化在主板上的那段程序,而BIOS是操作CMOS的管理控制界面,不

同的硬件平台上他的固件程序也是不同的。)

固件设置:安全设置(密码,调整引导介质的顺序,电源管理,系统硬件设置)。Linux—硬件时钟:和操作系统无关,固化在硬件上面,所以Linux里面叫做hwclock,在linux系统里面的时钟—软件时钟,需要同步软硬件的时间,不然有些服务会出现time error,有时甚至需要同步局域网或者是Internet上面的时间。命令:hwclock(固件时钟) date(系统时钟),一般这两个时钟应该是同步的,有些时候可能会不一样,同步这两个时钟,不需要用man查看详细信息,只需要hwclock --help ; 如果硬件时钟和软件时钟都是错的,可以通过set 如果help给出的信息不详细,可以用man, man date

date 121211302011.23 (20xx年1212日11点30分23秒) hwclock查看帮助,新添加的硬件必须被固件识别出来以后才有可能被用,不然直接设置没意义。固件自检之后没有问题之后会读取MBR

2.MBR:(MasterBootRecord——主引导记录;硬盘实际上是分成不同的盘片,每一个盘片上都会有一个读写磁头,编号就好比012??编写下去,同样在硬盘上面还有两个概念一个叫柱面,一个叫扇区。MBR位于硬盘的0柱面、0磁头、1扇区。在完成固件自检之后,会跳转到硬盘的MBR读取数据(要读取硬盘数据,读取硬盘的第一个位置必须是MBR),MBR中保存了三个东西:Bootloader(自举程序)、Partition table(磁盘分区表)、Magic Number(结束标志字)Bootloader——(载入内核):自检完成之后、读取硬盘MBR、加载BootLoader之后的所有动作都是由BootLoader(载入内核)完成的,Windows、Unix、Linux都必须有一个BootLoader,而Linux中的BootLoader叫做GRUB,Window的Bootloader叫做ntldr(其中NT是以前Windows内核一个名称,从9X系统比尔盖茨挖过来一名Unix工程师,改写优化了9X系列的内核,推出了NT,最早的Windows服务器版是NT,但NT并不是network的缩写,而是NewTeachnology的缩写,NT就是内核的一个代号,LDR—Loader,所以加起来就是ntldr,bootini中记录了windows启动时的内容,只要添加和修改就可以完成多系统的启动) Kernel(内核),自举程序(grub)最大作用就是启动的事后载入系统的内核,vi /etc/grub.config 可以看到kernel的位置。

kernel /vmlinuz-2.6.18-194.el5 ro root=LABEL=/ rhgb quiet

因为它是一个压缩文件,所以载入的时候需要解压,所以linux后面有一个z的标记,(2.6.18)是内核的版本号,2表示主版本号,6次版本号,18表示末版本号。其实次版本号比较重要。(如果为奇数:内核是测试版。如果是偶数:正式版)升级内核的时候尽量使用正式版,不要使用测试版。内核叫vmlinuz(单独的一个可执行文件)——可以用命令ls /boot 查看到。 3:载入内核Kernel——驱动硬件;

内核里面包含了硬件的驱动程序。也就是识别这个硬件,如果系统没有办法调用这个硬件,我们就必须安装该硬件的驱动程序,甚至编写该硬件的驱动程序,更通俗的也就是让linux认识这个硬件。这和固件的检测是不一样的,固件的检测是在物理层上,也就是在硬件上检测这个硬件是否可用(例如线是否插好等?)。而内核的驱动硬件是在操作系统软件的层次上识别这个硬件是否可以被调用,启动的时候内核会有一个识别硬件的过程。这个是内核干的第一件事,第二件事是内核其实就是在启动一个进程就完成了自己在引导过程中的使命,即启动一个进程init.

4.init(系统启动的第一个进程,initialization初始化的缩写):它在启动以后会读取它的配置文件inittab,执行缺省默认的运行级别,完成引导的过程,在unix和linux里面。init可以称作第一个可以启动和存在的进程,它的特点:PID(ProcessID)恒为1;PPID(没一个操作系统里面启动一个服务都必须对应一个进程,这个进程都要有一个数字的标示,内核在调用进程的时候都是通过PID进行管理,但是PID是每次动态分配的,每次启动进程它的PID都不一

样,但是init这个进程很特殊,他的PID恒为1)查看命令:ps -le | more

但它必须向一个更高级的功能负责:(PortreeveProcessID副进程)为0的内核调度器(Kernelscheduler),从而获得CPU时间。——linux是一个分时的多用户多任务的操作系统。分时:CPU分成小的时间片,任务排队处理。在每一个CPU循环周期中分给每一个任务一点的时间,如果能够处理完某任务则就结束,如果处理不完则进入下一个循环周期。问题是谁来分配CPU时间,谁来做进程切换,这个工作就是由PPID为0了内核调度器负责。它是用来分配CPU时间和进程切换的(所以它是PID为1的进程的副进程)。在很多unix里面并没有体现内核调度器,不过在linux里面会有一个简单的体现。

父子进程的关系:如果一个进程启动或衍生出来另外一个进程,这个时候他们就产生了一个父子关系(就像init进程和内核调度器的关系一样),在进程管理中有一个基本的概念,父进程终止,子进程必须终止,也就是说关闭了一个父进程,这个父进程下次不管有多少个子进程,都必须被自然终止。

linux中有两种情况:1.孤儿进程(父进程终止,子进程因为某种特殊的原因没有终止,在系统发现以后,会自动把它的父进程变为init,所以init是所有进程的父进程)。

2.僵尸进程(也就是说父子进程之间是有联系的,如果子进程终止,父进程要切断这种联系。这才是正常的管理方式。但现在,儿子死了,父亲肯定应该知道,但是这个父亲不知道,还在尝试着和儿子联系,这个时候就麻烦了,这个子进程就会变成僵尸进程。)以上这两种进程都是不允许存在的,以上是两种父子进程之间的关系。

5.读取执行配置文件/etc/inittab(来完成后续所有的引导)这是samlee在linux中介绍的第一个配置文件,像Apache的samban它会把后缀名叫成conf. 这是一种命名的习惯。看一下这个文件的内容:vi /etc/inittab

内容:

# Default runlevel. The runlevels used by RHS are:

# 0 - halt (Do NOT set initdefault to this)

# 1 - Single user mode

# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)

# 3 - Full multiuser mode

# 4 - unused

# 5 - X11

# 6 - reboot (Do NOT set initdefault to this)

linux运行级别(类似于windows F8 :安全模式、带网络的安全模式、命令行的安全模式)linux也有像windows那样可以借助不同的模式在系统发生错误是进行排错,这就是运行级别。

(Default runlevels默认运行级别):这些运行级别广泛的运用在rhs中.不同版本的linux运行级别未必一样,但是管理的方式都是一样的。从0到6的七种运行级别。

0—halt(类似于shutdown关机;很少用);

1—Single user mode(单用户模式—只有root可以登录;没有图形界面,因为它是修复模式,类似于windows的安全模式,什么时候用安全模式,什么时候用单用户模式); 2—Multiuser(多用户模式,没有图形界面,所有服务都会正常启动、用的多、没有NFS服务、NetworkFileSystem—网络文件系统,最早由sam公司开发的一个服务,NFS可以实现unix和linux之间的文件共享,也就是说只要是unix系列的操作系统,他们可以用NFS进行文件共享,而且NFS比较简单,很好设置,但是安全性并不好,现在基本已经很少应用到NFS,应该用SSH服务或者FTP等?)

3—Full multiuser mode(完整的多用户模式,没有图形界面,所有服务都会正常启动、用的

多)

4—unused(自定义,可以自定义服务)

5—X11(图形化的多用户模式。缺省运行级别(linux安装完之后默认的运行级别),和3的区别就是由图形界面;X_windows可以缩写为X,而X11则是X_windows版本号,都是指linux的图形环境)

6—reboot(重启,很少用,攻击比较好玩,修改配置文件之后让它不断的重启,如果入到这种情况,黑客不是写的脚本,就是修改了init Default runlevel)

不同与windows的是linux切换运行级别的时候不需要重启,直接使用命令就可以切换。 命令:1、查看当前的运行级别:runlevel 输出结果(N 3 表示以前现在都是3,也就说没至始至终都没切换过运行级别; S 3 其中S表示切换之前的运行级别,切换之后的运行级别。)

2.切换当前运行级别:init 1(切换到1运行级别)

查看文件中没有注释的行: grep -v "^#" /etc/inittab | more (双引号表示排除的字符,^表示行首) man inittab (用man的时候只能写文件名,不能写绝对路径,是不可以的。inittab分为四个显示部分id:runlevel:action:process)

id:标记条目的唯一性;(警局档案的编号,谁会关系警局档案的编号啊,可以忽略)

run-levels:指定一个运行级别,或者多个(我可用板砖拍他,同时还可以用刀砍他一种或同时多种)。如果是空的,表示从0到6每个运行级别都执行。

action:指定这行语句它的脚本或命令运行的状态(在他上洗手间的时候下手)

process:制定要运行的脚本或命令(核心部分,其实前三个都是对process的修饰,这个process要在什么状态下运行,这个process要在哪个运行级别来运行,这个process的ID,这个process可以是一个命令,或者可以是一个shell脚本,我们都可以把他写在这里,让它执行。人们肯定最关心的是李明老师把高乐峰老师给揍。)

action常用取值:1.initdefault(系统默认的运行级别)

第一个需要了解inittab文件中的一段内容:id:5:initdefault:

2.wait(表示process中指定的命令或脚本,并等其结束再运行其他命令,也就是inittab文件在判断系统缺省运行级别以后,要启动这个运行级别里面对应的脚本,这脚本必须执行完,才能进行下一步的操作。这就是安装很多服务时候必须等到它执行完,才能进行下一步的操作的原因。)

3.once(执行process中指定的命令,不等待其结束,不过在缺省的inittab文件中并没有用到这个action)

4.ctrlaltdel(不管你再任何运行级别用ctrlaltdel时候会触发一个命令(可以触发是进程也可以是命令)/sbin/shutdown -t3 -r now t是秒 r是reboot now是马上)

5.sysinit:只要系统启动就会执行。不管是在哪个运行级别“空”只要系统启动,进行初始化,这个脚本都会执行(这个脚本叫做/etc/rc.d/rc.sysinit,这个脚本具体是干什么的——完成系统服务程序启动,如系统环境变量设置、设置系统时钟、加载字体、检查加载文件系统、生成系统启动信息日志文件等.这是一个比较典型的shell脚本,可以用vi进行观察,可以看到他在每次系统启动的事后都会执行,如果你有一个脚本需要每次系统启动都执行并且在任何运行级别,你可以将此脚本insert到此文本的末尾)系统是怎么知道不同运行级别执行的服务是不一样的,这取决与另外一个脚本——/etc/rc.d/rc (其作用是判断系统启动时运行级别,并启动运行级别对应的服务)

——

l0:0:wait:/etc/rc.d/rc 0

l1:1:wait:/etc/rc.d/rc 1

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

l6:6:wait:/etc/rc.d/rc 6

(判断默认运行级别,调用/etc/rc.d/rc脚本,执行相应运行级别目录的服务程序,完成相应运行级别的初始化设置。它是一个可执行文件,实际上也是一个shell脚本,了解shell脚本很重要,有助于更深入的认识。)——判断完之后怎么来完成后续的一个引导,我们要知道系统里面有这样一个服务信息保存目录:/etc/rc.d/rc{0123456}.d,分别存放对应于运行级别的服务程序脚本的符号链接,链接到init.d目录中的相应脚本。

例如grep initdefault /etc/inittab (查看inittab文件缺省的运行级别,如果缺省的运行级别是3,这个时候它会找到运行级别为3的这行 /etc/rc.d/rc这个语句所对应的条目。然后读取/etc/rc.d/rc3.d这个目录下面的启动脚本;在/etc/rc.d下面保存了七个运行级别对应的服务启动脚本存放的目录,分别是rc0.d到rc6.d ,所以系统设置为缺省运行级别以后,也就是说是空0到6,它就会执行不同运行级别对应目录下的启动程序,来完成系统后续的引导。)目录下面有两种文件,定义了怎么样来启动不同运行级别对应的程序:S12syslog开头;K开头(S-start K-kill 表示要在这个运行级别启动这个服务和要在这个运行级别把这个服务给干掉,假如现在系统缺省的运行级别为3,它启动的时候会自动读取/etc/rc.d/rc3.d目录下所有S开头的脚本把它启动,其实不写K不就行了,因为除了启动的就是不启动的,那么干嘛还要多此一举写它呢?这是为了我们在做一个操作的时候可以进行判断和执行。比如说我现在运行级别是5,我先切换到运行级别3,或者我现在运行级别是3,我想切换到1,那就带来了一个问题是,我从运行级别5切换到运行级别3,我要关闭那些服务,至少X_window是要关闭的,但系统怎么知道?就是通过K进行判断的,所以在切换运行级别的时候系统会一句于K判断哪些运行级别是需要关闭掉的,这个时候它是有价值的。) S12syslog(第二部分12表示启动的顺序,理论上来说数字越小优先级越高,linux启动的时候总会有许多启动的脚本,那么我们总要有一个启动的顺序,如果数字相同就按照脚本创建的顺序进行启动。)S12syslog(第三部分定义了脚本名称syslog,不是很重要,最重要的是第一部分S和K)。有一个管理的原则,就是授予用户最小的权限,同时开启系统最少的服务,你开启的服务越多,被别人攻击的可能性就越大,同时服务开启还要占用系统的资源。有的时候不需要启动这个脚本,如果直接删除以后想用的时候会比较麻烦,例如:S03vmware-tools 可以改名 vm S03vmware-tools s03vmware-tools 这样就可以了,只有大写S启动的时候才会被执行,小写s不会。这样就方便以后查找和使用。

si::sysinit:/etc/rc.d/rc.sysinit (runlevel:空;action:sysinit )

快捷键设置:

Run geetty in standard runlevells

1:2345:respawn:/sbin/mingetty tty1

1:2345:respawn:/sbin/mingetty tty2

1:2345:respawn:/sbin/mingetty tty3

1:2345:respawn:/sbin/mingetty tty4

1:2345:respawn:/sbin/mingetty tty5

1:2345:respawn:/sbin/mingetty tty6

定义了这六个终端,这个终端在于宁级别2345都可以使用的到,它是通过/sbin/mingetty这个命令来进行启动。启动使用终端可以用ctrl+alt+F1-F6 都是可以使用的。因为在虚拟机

中它定义的快捷键有冲突,设置下VM快捷键,把ctrl和alt都启用。然后在ctrl+alt+F1就可以进入一个命令行的终端login: 这个时候ctrl+alt+F6就进入到第六个终端。F7回到X_windows,甚至可以增在一个终端,F7,这个时候F7就是命令终端,F8就是X_window,作用并不大。

这里面也有action—respawn(一旦这个process制定的命令终止,便重新运行该命令。也就是说这个终端是不能被终止的,exit虽然退出了,但并没有被终止,而是重新弹出让你登录的user 和password窗口。);powerfail(当出现电源错误时执行process制定的命令,不等待其结束。);powerokwait(当电源恢复时执行process制定的命令)

grep -v "^#" /etc/inittab(这用这个文件的时候,主要选项有以下这么几个:分别是定义系统的运行级别,启动系统运行的脚本,通过/etc/rc.d/rc 这个脚本判断系统缺省的运行级别,然后执行相对应的服务目录里面的服务程序。)运行级别为3的脚本存放在/etc/rc.d/rc3.d中,而/etc/rc3.d目录中的文件和他完全一样。其实/etc/rc3.d是一个软链接目录,linux真正存放的目录是/etc/rc.d/rc3.d。但是有一些unix例如HPUNIX,Selorise,AIX 他们这些运行级别服务脚本存放的目录都是在/etc/rcN.d下面。所以linux诞生的时候为了和unix有很好的兼容性就出现了这么一个设置。

定制系统服务,是启动的还是关闭的。有一个问题是,这些服务在系统启动的过程中可以自启动,也可以不启动,假如在系统启动以后我们需要手动关闭某个服务应该怎么做。那么我们需要掌握另外一个目录:/etc/rc.d/init.d(该目录下包含各个运行级别的服务程序脚本,你的linux在启动的时候安装了多少个服务,这些服务对应的脚本都是放在这个目录下面,所以在系统启动之后我们如果想手动开启或者关闭某个服务,就是在/etc/rc.d/init.d/ 目录下面找到这个服务的启动程序。比如说我们想找到一个远程登录的服务叫做:sshd ,/etc/rc.d/init.d/sshd 回城会弹出使用它的参数,最常用的就包括start; stop; restart reload重新读取这个服务的配置文件,和restart的区别就是reload不需要重启服务,因为很多服务重启会有一个终端的过程 status 状态; condrestart 不管以前这个服务有没有启动,它都会先执行stop再执行start,它会检测这个进程现在是否在运行,如果在运行的话它再执行一个restart的过程,如果这个进程没有在运行就不会执行。其实这些服务缺省都会存放在/etc/rc.d/init.d下面,同样为了保存和unix的兼容性,如果你想省事,可以直接访问/etc/init.d 得到的内容是一样的。因为/etc/init.d就是一个软连接目录,前面讲过在/etc/rc.d 这个目录下存放着每一个运行级别对应的启动脚本存放的目录,实际上我们以ls rc/rc.d/rc5.d 为例,实际上这里存放的文件,我们如果看它们详细的信息,会看到它们都是软连接,以S99smartd为例,可以看到它实际上是链接到/init.d/smartd的脚本,只是做了一个重命名,多了一个大写的S,系统会自动的执行这个脚本,最终找到的都是源文件。所有运行级别(0-6)它的启动脚本都是来自于/etc/rc.d/init.d/下面启动程序的软链接。S99smartd-> .. /init.d/smartd)

设置自启动程序:1、ln -s(生成软链接,比如说我们现在自己添加了一个服务,我们需要让这个服务能够自动执在某个运行级别,比如说我写了一个简单的脚本放在 vi /etc/rc.d/init.d/msg.script目录下面,我让它在某个运行级别自动执行,或者安装了一个服务,都是一样的道理,我就做很简单的操作,做一个时间查询 date >> /root/msg.today who >> /root/msg.today free >> /root/msg.today 查看用户有哪些,查看内存信息,用前面讲过的输出重定向,都把它写入到msg.today文件里面。我希望这个脚本能够在每一个运行级别都可以运行,当然你要给它一个可执行的权限,chmod u+x /etc/rc.d/init.d/msg.script 这是一个前提条件,否则脚本是没有本法自动执行的。如果你希望在某个运行级别自动执行某个脚本或者服务,那么最简单直接的方法就是通过ln -s /etc/rc.d/init.d/msg.script /etc/rc.d/rc3.d/S100msg.script (让它在运行级别3启动,然后S开头,再写上数字,再写上

脚本的名称msg.script,就可以了)这个时候系统在引导的过程执行前面讲过的引导流程,然后会判断系统缺省的运行级别。如果是运行级别3,就会启动以大写S开头的脚本。其实100是顺序,不重要,这个时候他会自动找到/etc/rc.d/init.d/msg.script 这个脚本,也就是说生成一个软链接放在系统启动时不同的运行级别,并以S开头,就完成了我们的目的。)2、如果不是想添加的服务,而是现有的服务,我们想设置它启动还是关闭,我们可以在/etc/rc.d/rc3.d目录下面直接用mv 把大写S改成小写s就可以了,而且还方便以后查询再使用。chkconfig --list(查看,会列出系统里面所有已经安装的服务,他们缺省的启动状态. list也可以单独的查看某个服务。chkconfig --list sshd 定义某一服务在某个个运行级别是关闭的还是启动的,chkconfig --level 制定一个运行级别或者 --levels 制定多个运行级别;写上服务的名称;on 或者off,就可以进行控制了,比如说sshd我希望它是在运行级别2345都是关闭的,可以用命令 chkconfig --levels 2345 sshd off)

3.ntsysv (对当前运行级别中服务进行设置。当然也是可以改其他运行级别的服务,只要+上 --level 3就可以更改运行级别3的,界面不是命令行vim显示,而是类似于CDE图形界面显示,还有下拉框,比较友好,带*号的是启动的,空的是不启动的,挺好的,呵呵~,tab可以切换。)

简单应用:1.dmesg(查看系统启动时所有信息,最重要的信息就是启动系统流程中Kernel驱动硬件的信息。用grep可以查看硬件信息,识别出来必然有型号。 dmesg | grep eth0 ,如果什么信息都没有,说明网卡没有被系统识别出来。

识别硬盘 dmesg | grep sda或b 第一块硬盘第二块硬盘,在引导过程阶段判断硬件是否被Kernel识别的范式。同样如果在系统启动的过程中,启动到相应的运行级别对应的脚本时候,怎么知道这些脚本启动成功了还是失败了?如果在运行一个服务出现状况的时候你想判断到底是哪里出现了问题,我们可以看相应的日志文件,linux里面系统所有的日志文件都会存放在ls /var/log 目录里面可以通过查询messages文件,可以查找某一个服务在messages里面的信息, grep sshd /var/log/messages 如果没有信息,多数都是正常的,都可以等到信息。可以帮助我们判断这个服务在系统启动的过程中是否出现错误。)

整体流程firmware(CMOS/BIOS物理层次检测所有硬件是否能正常工作)——读取硬盘的第一个位置MBR(主引导分区)中存放的自居程序:Bootloader(GRUB)——载入Kernel——在系统层次上驱动硬件和启动进程init——init进程在启动以后会读取系统的配置文件/etc/inittab完成后续系统引导——initdefault判断系统缺省的运行级别——执行脚本/etc/rc.d/rc.sysinit(这个脚本不管系统在任何运行级别都会被执行,来进行系统的基本服务的加载)——根据initdefault缺省运行级别设置——执行etc/rc.d/rc脚本(会判断你的initdefault)——然后启动对应的启动目录下面的对应程序/etc/rc.d/rcN.d/S或K程序。——弹出username、password(认证用户名和密码是否有效)——

调用一个硬件首先需要在硬件层面识别,然后再操作系统层面识别,才可以使用。

更多相关推荐:
Linux基础知识的总结

Linux基础知识总结一课程结构一预科部分1初始Linux1了解Linux的历史2对Linux操作系统的认知3体会Linux的优点4理解Linux的基本思想2学会如何安装Linux操作系统3掌握Linux下的常...

linux基础知识总结

linux基础知识总结1linux概述11linux结构111linux的四部分可以把Linux系统看作由四部分构成内核用户界面文件结构和实用工具bin普通用户的可执行文件系统的任何用户都可以执行该目录中的命令...

Linux考试知识点总结

Linux服务器配置与应用考试覆盖范围知识点总结考前★绝密知识点覆盖率95%总结人:敌无小新时间:20xx年x月x日晚此复习题尽量保密,被老师发现可能会重考,慎重带入考场!1.安装软件的方法?RPM包,源码…

linux知识点整理

Linux实用教程第一章1第二章2第三章3第四章3第五章7第六章9第七章11第八章15第九章17第十章20第十一章第十二章额外知识点30第一章30第二章30第三章30第八章30第十章31第十一章31第十二章31...

Linux知识点总结

第一章1Linux是多用户多任务操作系统2程序是计算机完成一项任务的指令集合3数据是由程序使用或生成的不同类型的信息4软件分为三大类1系统软件2应用软件3支撑软件5系统软件包括操作系统编译程序汇编程序数据库管理...

Linux笔试面试知识点总结

Linux笔试面试知识点总结在Linux的笔试中常会考察一些知识点。这里我们就来总结一下有可能出现的知识点都有哪些。1.在Linux系统中,以文件方式访问设备。2.Linux内核引导时,从文件/etc/fsta…

linux专业知识总结

建议初级Linux用户不要规划太过复杂的区一般分两个区就好一个是用于保存系统和数据的根分区另外一个是交换分区交换分区的大小与物理内存同大即可而根分区则需要根据Linux系统安装占用资源的大小和需要保存数据的多少...

linux基础知识点

pwd命令查看当前目录cd命令切换目录命令lslist命令列出子目录和文件信息参数a显示所有文件包括以开头的隐藏文件l以长格式显示文件或子目录的信息R递归显示目录及下级子目录结构S以文件大小排序F在目录名后面标...

常用Linux知识点

第一章Linux系统简介及安装一Linux简介1Linux是开放源代码的操作系统在Internet服务器领域占据很大市场2组成内核基本库应用程序3版本内核版稳定版次版本号为偶数开发版奇数发行版RedHatSus...

Suse Linux必会的知识点

linux必须会的几个知识点一创建用户创建一个用户组bigtide组ID20xx创建一个用户lichang用户ID20xx家目录homelichangshell是csh属于bigtide组groupaddbig...

S1《Linux系统管理》知识点总结

Linux系统管理S1Linux系统管理课程总结第一章Linux系统简介及安装一Linux简介1Linux是开放源代码的操作系统在Internet服务器领域占据很大市场2组成内核基本库应用程序3版本内核版稳定版...

linux常用命令总结,超级实用

Linux常用命令总结文件操作1cd切换文件目录2pwd查看当前文件目录3lslsalbin以长列表的形式列出目录bin下的所有文件包括隐藏文件p若所列文件是目录文件则在其后显示斜杠t按时间顺序排列而非按名字h...

linux知识总结(32篇)