Linux操作系统(二):初步了解Linux操作系统与基本操作
- Linux操作系统简介
- Linux的命令模式与命令的执行
- 初学操作系统的一些基本操作及概念的理解
- 各硬件设备在Linux中的文件名
- 计算存储机容量单位
一、Linux操作系统简介
1.1Linux是什么?操作系统/应用程序?
操作系统是实现计算机硬件资源有效控制及硬件资源分配的程序,提供计算机运行所需要的基本功能(如网络功能)。除此之外还提供开发软件的环境,所以操作系统也会提供一整组系统调用接口供开发应用程序使用。而Linux就是一个操作系统,它包含系统内核与系统调用接口两层,Linux属于计算机程序但不是应用程序。
1.2操作系统与硬件及应用程序的关系:
1.3操作系统与硬件之间的关系简析:
由1.2中的示图可以看到操作系统的内核与硬件是紧密相连的,硬件由操作系统的内核控制,每种操作系统都自己的内核,操作系统的内核基本上都是为特定的硬件而设计的。比如Linux最开始的时候就是针对386的计算机开发的,也就是说最初的Linux仅能驱动368的硬件。
由于不同的硬件它的功能函数不相同,所以所以操作系统不能在不同的硬件平台上运行,例如IBM的Power CPU与Intel的x86架构就不一样。
所以在2006年之前的苹果电脑使用的是IBM的PowerPC CPU硬件架构,所以当时的苹果电脑的操作系统Mac OS不能运行在windows系统所运行的X86硬件平台上,windows系统也不能安装到苹果电脑上。不过2006年之后苹果电脑使用的硬件是Intel的X86架构平台,所以这类苹果电脑能安装windows系统。
由于Linux是开源的操作系统,所以它的代码可以被修改成适合在各种硬件架构上运行,也可以说Linux具有可移植性。
1.4Linux的发展历史:
1961年由Fernando J. Corbató(费尔南多·何塞·科尔巴托)教授领导的团队,在麻省理工学院计算机中心研发的CTSS(兼容分时系统)于11月首次演示,后来成熟的CTSS经过修改在IBM7094上运行。可以到这个网站Multics了解CTSS相关的更多内容。
1969年Ken Thompson(肯·汤普森)针对一台DEC公司推出的PDP-7主机,使用汇编语言写了一组内核程序,同时还包括一些内核工具程序,以及一个小小的文件系统,这个系统就是Unix原型——Unics。这个系统有两个重要概念,分别是:
所有的程序或系统设备都是文件;
不管程序本身还是附属文件,所写的程序只有一个目标,且要有效的完成目标。
1973年DennisRitchie(丹尼斯·里奇)开发出C语言,并用C语言写出了一个正式的Unix内核。
1974年Ken Thompson(肯·汤普森)与DennisRitchie(丹尼斯·里奇)合作使用C语言重新改写并编译了Unics的内核,最后命名发布了Unix的正式版。
1977年重要的Unix分支——BSD诞生:由于Unix是以高级的C语言写成的,相对于汇编语言需要与硬件有密切的配合,C语言与硬件相关性没有那么大,这使得Unix很容易被移植。1973年隶属于美国电信巨头AT&T的贝尔实验室取得Unix源码后,针对大型主机的特性开始加以定制源代码,这使得Unix移植到另一台不同的主机成为可能。1973年以后便与学术界合作开发,最重要的就是加州伯克利大学的合作。伯克利大学的Bill Joy(比尔·乔伊)取得Unix的内核代码后,修改成适合自己的机器版本,并且增加了很多工具软件与编译器,最终命名为Berkeley Software Distribution(BSD)。
Bill Joy(比尔·乔伊)也是Unix行业Sum microsystem(太阳微系统)的创始人,Sum microsystem(太阳微系统)公司就是以BSD开发内核进行自己的商业Unix版本开发,后来可以安装到x86硬件架构上的FreeBSD就是BSD改版的。
1979年AT&T推出System V第七版Unix后,System V这个版本可以运行在X86个人计算机上,改变了Unix之前只能在服务器和大型工作站上运行的情况。因为商业考虑AT&T发行第七版Unix时特别提到“不可针对学生提供源代码”的限制,从此开始引起Unix行业的版权顾虑,引发很多版权纠纷。
1979年Andrew S.Tanenbaum(安德鲁·斯图尔特·塔能鲍姆)教授因为版权限制,为没有内核源代码提供给学生教学,教授为了避免版权纠纷,在完全不参考Unix内核代码的情况下,手写了Minix的Unix-like的内核程序,并且对Unix兼容。1984年开始编写代码,到1986年完成,并于次年出版Minix相关书籍,同时与新闻组(BBS及News)相结合。Minix版本并不是完全免费,无法在网络上提供下载,必须要通过磁盘/磁带购买。虽然很便宜,但由于没有网络上的流传,所以传播速度并不快,但购买磁盘时会附上Minix的源代码,这意味着用户可以学习Minix的内核程序。
1984年Richard Mathew Stallman(理查特·马修·斯托曼)发起GNU计划,GNU计划与FSF基金会成立。1983年斯托曼因为自己使用lisp操作系统是麻省理工学院的专利软件,无法共享。后来他接触到Unix,发现Unix可以在不同的机器间移植,虽然Unix依旧是专利然间,但基于的硬件架构还是比较开放,于是他开始将他基于Lisp编写的软件移植到Unix并将源代码公布出来。1984年开始发起GNU计划,这个计划的目的是:建立一个自由、开放的Unix操作系统。但建立一个操作系统太复杂,GNU计划仅仅他一个斯托曼,于是反其道而行之,他将Unix上运行的应用软件,在不参考源代码的情况下(避免吃官司)开发出同样功能的应用软件,并开放出来供别人免费试用。由于免费且功能差不多,很多人多直到并开始使用GNU软件,GNU官方网站。
GPL版权声明:斯托曼为了避免自己开源的软件被别人拿去做成专利软件,将GNU与FSF开发出来的软件,都是用GPL的版权声明,GPL强调的重点并不是“免费”,而是指“自由度”的软件,斯托曼进一步强调了自由的意义:用户可以自由的执行、复制、在发行、学习、修改与强化自由软件。一个软件使用GPL版权声明之后,他自然成了自由软件,这个软件具有的特色:
1.取得软件与源代码:你可以根据自己的需求来使用这个自右软件; 2.复制:你可以自由地复制该软件; 3.修改:你可以将修改过的程序,再度自由发行,而不会与原先的编写者冲突; 4.回馈:你应该将你修改过的程序回馈于社区; 5.修改授权:你不能将一个GPL授权的自由软件,在你修改后而将它取消GPL授权; 6.单纯销售:你不能单纯的销售自由软件;
GPL里的单纯销售并不是不能销售,而是除了销售软件本身应同时搭配售后服务与相关手册,这些就要工本费了。自由软件赖以生存的是“服务”,如果你购买了自由软件它会同时提供手册说明、一定时长的咨询和售后服务、软件升级与其他辅助工作等附加服务。
1988年Linus Torvalds(林纳斯·托瓦兹)在赫尔辛基大学基于Andrew S.Tanenbaum(安德鲁·斯图尔特·塔能鲍姆)教授的Minix操作系统公布的源码学习内核设计概念,但并基于Minix在Intel的368机器上开发应用,虽然他也认为Minix很棒,但由于他希望能实现多任务环境(即CPU具备执行多任务的特性),而Tanenbaum教授始终不愿意进行功能加强。于是他开始自己编写内核程序,并将源代码放到了GNU上供大家下载和修改,由于托瓦兹在FTP网站上的管理员放置的目录起名为Linux,从此大家就称这个内核为Linux。
由于Unix上的软件无法在Linux上运行,这时候托瓦兹有两种方法,一种是修改软件,让软件可以在Linux上运行;另一种则是修改Linux,让Linux符合软件能够运行的规范。由于Linux希望能兼容Unix,与是托瓦兹选择了第二种做法“修改Linux”。为了让所有软件都可以在Linux上运行,于是托瓦兹开始参考POSIX规范。POSIX是针对Unix与一些软件运行时的标准规范,只要依据这些规范来设计内核与软件,理论上就可以搭配在一起执行。因为兼容Unix,所以Linux也可以被称为Unix-like。
早期的Linux跟386硬件相关性很强,不具备移植性,后来因为开源社区的其他成员参与,在1994年Linux便被移植到很多硬件上。IBM、HP等公司的硬件都被Linux系统所支持,2019年的5.3版本开始支持X86的硬件。
1.5Linux的版本:
3.10.0-123.e17.x86-64 主版本.次版本.发布版本-修改版本
在3.0版本之前采用奇偶数版本分类,每个版本好的第二位即(次版本)为奇数时表示开发测试版,这个版本主要时内核开发工程师使用,用来新增内核代码,当这个版本被众多工程师测试没有问题之后加入下一个稳定版本内核中;每个版本号的次版本为偶数则表示为稳定版。例如2.5.xxx表示开发测试版,2.6.xxx表示稳定版。
在3.0版本之后则采用主线版和长期维护版,内核主要依据主线版本开发,例如3.10在3.9的架构下继续开发的新主线版本。旧的版本在新的主线版本出现之后,有两种处理机制,一种是结束开发,即程序代码已结束,不会有继续维护的状态;另一种机制为保持该版本的持续维护,亦长期维护版本。例如3.10即为长期维护版本,这个版本的程序代码会被持续维护更长时间,若程序代码有Bug或其他问题,内核维护者会持续进行程序代码的更新维护。
可以通过下面这个命令来查看当前系统的内核版本,然后再在Linux内核档案查看对应的值。
uname -r
1.6Linux发行版:
由于GNU的GPL授权并非不能从事商业行为,于是就有很多商业公司专门来销售Linux发行版,由于Linux的GPL版本声明,因此,商业公司所销售的Linux发行版通常都可以从互联网上面下载。由于发展Liniux发行版的社区与公司是在太多,例如有名的Red Hat、SUSE、Ubuntu、Fedora、Debian等,为了解决各个发行版之间可能存在的差异性问题,Linux发行版使用的内核都由Linux内核档案发布,这些发行版很多基础应用软件都是相同得,比如网页服务器Apache、电子邮件服务器Postfix/sendmail、文件服务器Samba等。
为了使Linux的发行版差异不至于太大,且让开发商开发时有所依据,还有Linux Standard Base(LSB)等标准来规范开发者,以及目录结构的File system Hierarchy Standard(FHS)标准规范。唯一的差别,可能就是该厂商开发出来的管理工具,以及套件管理的模式。基本上每个Linux发行版除了架构的严谨度与选择的套件内容外,其实差异并不太大。
如果要说发行版的区别的话,Linux发行版可以根据软件管理系统分为两大类:RPM、DPKG,软件管理工具通常也被称为包管理工具。
RPM由Red Hat公司制定实施,后被GNU开源操作系统接受并成为很多Linux系统RHEL的既定软件标准。
DPKG由Debian操作系统(UBUNTU)的DEB软件包管理工具。
关于Linux的包管理工具可以参考这篇博客:Linux包管理工具(rpm/dpkg,yum/apt,alien)
Linux应用汉化文档项目:B2D
Linux发行版下载与使用信息:https://distrowatch.com
二、Linux的命令模式与命令的执行
2.1命令语法(模式)
[ root@localhost ~ ] # command [ -options ] parameter1 parameter2 ...
命令语法解析:
[ root@localhost ~]:
root(当前用户名:超级管理员);@(表示连接服务的符号);localhost(主机名:本地主机);~(所在路径:~表示在当前的用户私有路径下),这里需要重点解释一下所在路径,当使用【Alt + Ctrl + F2】切换终端使用用户“aaa”登入时,这一段内容就是 [ aaa@localhost ~] ,但这时候的“~”所表示的路径与 [ root@localhost ~] 所表示的路径并不是一样的,可以使用【pwd】命令来查看当前所在的路径地址:
[root@localhost ~] # pwd
/root
--Alt + Ctrl + F2:aaa用户登入--
[aaa@localhost ~] $ pwd
/home/aaa
用户在自己的私有路径下有完全权限,关于权限问题的详细内容在下一节介绍。
$与#的区别:$表示当前用户是普通用户,#表示当前用户是管理员。
command:当前命名的名称,必须字段。
-options:表示命名的选项(我喜欢用面向对象的编程思维把“选项”理解为属性或方法),前面模板中用[]来包裹“选项”表示它是可选的,[]并不实际存在命令中。用来表示命令中这个字段为“选项”的是选项前面的"-","-"只是其简写方式,它的完全模式是"--"。
parameter1/parameter2:表示命令的参数,参数也是可选的,并不是命令的必须字段。
命令、选项、参数等这些字段之间使用空格来实现间隔和区分,不论多少个空格都会被视为一个空格。
回车键:表示立即执行当前的命令,如果命令太长需要换行可以使用(\)来转义回车键,使得命令连续到下一行,注意(\)后面要立即使用回车键,而不能有空格。
注意:命令中的字段是需要区分大小的,它们是有区别的。
2.2控制台编码问题及如何解决乱码?
当输出的文本字符不支持当前系统默认的字符编码时,就会出现乱码问题,要想解决这类问题首先需要了解输入的内容支持哪些编码,然后再将你的系统设置为对应的编码集即可。
查看当前系统支持的字符编码:
locale #执行这个命令打印出下面的内容,查看具体的字符集设置
LANG=en_US.utf8 #输出文本内容的字符集
LC_CTYPE="en_US.utf8"
..... #具体输出文本内容的字符集
LC_ALL= #用于设置数据同步更新的文本内容的字符集
如果出现编码问题,可以通过LANG设置全部输出文本内容的字符集,也可以通过设置具体的输出文本内容字符集来解决。
LANG=zh_CN.utf8 //设置完以后可以通过locale命令来查看输出字符集的变化,还可以通过date命令打印日期和时间来看看输出文本的差别
关于locale命令相关的内容可以查看这个文档:https://www.linuxcool.com/locale
2.3基础命令操作:
日期与时间命令
date //Mon May 9 18:45:22 PDT 2022 date +%Y/%m/%d //2022/05/09 date +%H:%M //18:48 cal //打印当前系统时间当月的日历 cal 2022 //打印2022年全年的日历 cal [month] [year] cal 5 2022 //打印指定日期2022年5月的日历
在控制台做数学计算操作的命令bc
[root@localhost ~]# bc //启动命令后会打印这一段信息,这是bc这个程序的一些版权信息 //bc 1.06.95 //Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software //Foundation, Inc. //This is free software with ABSOLUTELY NO WARRANTY. //For details type `warranty'. //然后光标就会停留在这里等待输出 //计算器的符号:+加法、-减法、*乘法、/除法、^指数、%余数 //输入一个式子回车就可以得到计算结果,可以做多次计算任务 ... //退出计算器的命令quit quit [root@localhost ~]#
2.4与命令行相关的快捷键
【Tab】:可以对命令、文件名、选项进行补齐,比如可以在 ca [ tab ][ tab ]后紧接着连续按两次【tab】,Linux控制台中会将所有ca开头的命令打印出来;在 ls -al ~/.Bash [ tab ][ tab ]后紧接着连续按两次【tab】,Linux控制台中会将当前用户目录下所有.Bash开头的文件名称全部打印出来;在 data -- [ tab ][ tab ]后紧接着连续按两次【tab】,Linux控制台中会将date命令的所有选项都打印出来。
【Ctrl】+ C:可以在输入错误时或者想停止某个命令执行时(比如死循环不停的输出,或者因为错误不停的打印错误提示),这时候可以直接使用【Ctrl】+ C停止执行并切换到新的一行。
【Ctrl】- D:表示直接退出当前登入,如果是文本客户端则会直接退出当前用户连接,文本客户端回退到用户登入状态,相当于exit命令;如果是在命令行窗口上,则会直接关闭当前命令行窗口。
【Shift】+ {[ Page UP ]|[ Page Down ]}:当输入内容非常多超出当前文本窗口时,可以使用这两个快捷键来实现翻页查看当前输入的内容。这两个键不常用,是在方向键上方的六个键中最右边的两个键,可能因为键盘大小限制Page会被简写为PG,例如:PGUP。
其他快捷键:
Ctrl + P / ↑:上一个执行的命令(可以向上翻多个); Ctrl + N / ↓:当使用Ctrl + P向上翻多个时,可以使用这个命令往下翻; Ctrl + B / ←:光标向左移动; Ctrl + F / →:光标向右移动; Alt + B:向左移一个单词; Alt + F:向右移一个单词; Ctrl + A:光标会移动到最前面; Ctrl + E:光标会移动到最末尾; Ctrl + U:从光标开始到头,剪切; Ctrl + K:从光标开始到尾,剪切; Ctrl + W:向前剪切一个单词;
Ctrl + Shift + C:复制; Ctrl + Shift + V:粘贴; Ctrl + L:清屏;(这与windows系统中的cls命令功能一致) Ctrl + T:交换光标处和前一个字符 Ctrl + R:搜索之前输入的命令,先按下组合键,然后输入用于搜索的字符,如果自动搜索出来的第一个命令不是你想要的,可以重复按下组合键来查询切换,切换到对应要查找的命令后就可以直接使用回车执行。也可以通过Ctrl + A 或者 Ctrl + E退出查询并切换到刚刚选定的命令头部或尾部,并且可以继续编辑命令 Ctrl + C:终止命令,可以终止当前正在执行的前面命令启动的程序,也可以在输入编辑命令时直接终止当前的编辑切换到新的空行上;
2.5Linux帮助系统:
command --help:
一般情况下无法拼写处整个命令时,使用【Tab】快捷键就可以解决,除了【Tab】这种补全的帮助方式,还有命令的[ --help]选项提供当前命令的帮助文档。
[ root@localhost ~] # date --help #--help可以简写为--h
man page:
如果帮助文档的内容不够详实,还可以使用man命令来查看命令的在线说明文档,内容会相对--help更丰富,比如下面查看date命令的在线文档:
[ root@localhost ~] # man date
如果文档内容超出窗口的话,可以使用回车键逐行往下查看,也可使用空格间主页查看。
从man命令的文档查看中退出:按下【Q】键就会自动退出。
man文本查看快捷键:
按键 | 进行工作 |
[Page Down] / 空格键 | 向下翻一页 |
[Page Up] | 向上翻一页 |
[Home] | 回到第一页 |
[End] | 去到最后一页 |
/string | 向【下】查找string这个字符串 |
?string | 向【上】查找string这个字符串 |
n,N | 当使用/string或?string来查找时,可以使用n来查找下一个,使用N来查找上一个 |
q | 结束当前man page |
man文档查看方式:
当使用man查看一个命令的在线文档时会在文档的第二行打印出 COMMAND(1~9) ,1~9分别表示命令的代号,可以根据这些代号来理解当前man查询的命令的基本含义,比如 man null 第二行会打印出NULL(4)。下面分别来介绍1~9所代表的含义:
代号 | 代表内容 |
1 | 用户在shell环境中可以操作的命令或可执行文件 |
2 | 系统内核可调用的函数与工具等 |
3 | 一些常用的函数(function)与函数库(library),大部分为C的函数库(libc) |
4 | 设备文件的说明,通常在在/dev下的文件 |
5 | 配置文件或是某些文件的格式 |
6 | 游戏(games) |
7 | 惯例与协议等,例如Linux文件系统、网络协议、ASCLL代码等的说明 |
8 | 系统管理员可用的管理命令 |
9 | 跟内核有关的文件 |
man文档有特殊的文档结构,每一部分的内容都有明确的分类:
标题 | 内容说明 |
NAME | 简短的命令、数据名称说明 |
SYNOPSIS | 简短的命令语法(syntax)简介 |
DESCRIPTION | 较完整的说明 |
OPTIONS | 针对SYNOPSIS部分中,有列举的所有可用的选项说明 |
COMMANDS | 当这个程序(软件)在执行时,可以在此程序(软件)中执行的命令 |
FILES | 这个程序或数据所使用或参考的或链接到的某些文件 |
SEE ALSO | 可以参考与这个命令或数据有关的其他说明 |
EXAMPLE | 一些可以参考的范例 |
info page:
所有Unix-like系统都可以用man来查询命令和相关文档,在Linux中还提供了另一种查看在线文档的方式,就是info page。
info与man的使用基本一致,只是在文档解构上有一些差异,如果不知道info怎么使用可以在info启动时按下【h】键来了解它提供的功能,关于info page更多内容可以参考这篇博客:Linux的info page。
最后不是所有命令和软件都会有在线帮助文档,更多的可能是一些离线版主文档,这些帮助文档会被统一放到 /usr/share/doc/ 目录下,可以直接使用文本编辑器或者直接将文档内容读取到控制台查看。
2.6文本编辑器nano:
nano text.txt #如果当前路径下没有text.txt文件就会创建新文件,如果有就直接打开该文件
当打开文件后,命令行窗口的最下方就会多出(^)组合的字母,后面会跟一些短语,这些就是nano编辑器的功能快捷键提示,(^)代表【Ctrl】键,也就是说【Ctrl】+ 字母就能使用对应的功能,下面对这些功能做一些简单的介绍:
【Ctrl】+ G:取得联机帮助(help); 【Ctrl】+ X:离开nano软件,若有修改过文件会提示是否需要保存; 【Ctrl】+ O:保存文件,若你有权限的话就能够保存文件; 【Ctrl】+ R:从其他文件中读取数据,可以将某个文件的内容复制到当前编辑的位置; 【Ctrl】+ W:查找字符串; 【Ctrl】+ C:说明目前光标所在的行数与列数的信息; 【Ctrl】+ _:可以直接输入行号,让光标移动到改行; 【Ctrl】+ Y:语法校验开启与关闭 【Ctrl】+ M:可以支持鼠标来移动光标的功能。
当使用【Ctrl】+X时如果此前有编辑文档,会提示是否保存保存文档(按键选择:Y/N),选择N则直接关闭nano程序,如果选择Y则会继续弹窗一行输入框,在这里可以进行重命名保存文件,如果不需要重命名保存文档就可以直接回车即可。
关于nano命令启动时还有比较丰富的选项,详细可以参考这篇博客:Linux 之 nano编辑器的使用。
2.7如何正确的关闭Linux:
1.观察系统的使用状态 2.通知在线用户关机的时刻 //whow 查看当前在线的用户;netstat -a 查看网络连接状态;ps -aux 查看后台执行的程序 3.将内存中的数据写入磁盘 4.提前设置关机时间
通过 su 命令切换至root身份,输入密码登入后使用使用 sync 将内存中的数据写入磁盘(sync一般用户只能更新自己的数据,root可以更新整个系统的数据);
使用shutdown命令关机
[ root@localhost ~ ] # /sbin/shutdown [ -options ] [时间] [警告信息]
在物理机上使用tty1~tty6任意用户身份都能够关机,如果使用远程工具就必须切换到root身份才能启动关机命令。
//shutdown的选项 -k :不要真的关机,只是发送警告信息出去(可以用来提示还没退出的用户准备关机,而不是真的关机) -r :在将系统的服务停掉之后就重新启动 -h :将系统服务停掉后,立即关机 -c :取消已经在进行的shutdown命令内容(当前面启动一次真实的shutdown关机命令后,可以用这个选项在执行一次shutdown命令用来取消关机)
通过以下示例来了解shutdown命令的时间设置:
shutdown -h now //立即关机,其中now相当于时间为0的状态(当前时间) shutdown -h 20:25 //系统在今天的20点25分关机,若当天的时间已经超过设置的时间20:25则是第二天的20:25分关机,比如这个指令是在当天的21点启动执行的,则要到第二天的20:25分关机。 shutdown -h +10 //系统将在十分钟之后关机 shutdown -r now //系统立即重新启动 shutdown -r +30 "The system will reboot" //再过30分钟会重新启动,并会立即将后面的警告信息发送出去。 shutdown -k now 'This system will reboot' //发出关机警告,但不会实质关机
使用reboot、halt、poweroff命令关机或重新启动
这三个命令底层都是调用systemctl这个管理命令,功能差异不大,可以使用man查看它们的文档。
sync; sync; sync; reboot #将数据写入磁盘然后重新启动;
halt #系统停止,屏幕可能会保留系统已经停止的信息;
poweroff #系统关机,所以没有提供额外的电力,屏幕空白;
关于systemctl在后面有关于系统管理员的博客,会有详细的解析,这里只需要知道这些命令的使用方式即可。
三、初学操作系统的一些基本操作及概念的理解
3.1终端:terminal
在Linux操作系统(一):vmware虚拟机及CtenOS操作系统安装中的4.4中就介绍过X-Windows和命令行模式的切换做了简单的操作介绍,任何时候我们要使用操作系统都需要一个接口,在前面的1.2中介绍过操作系统与硬件及应用程序的关系,操作系统包含内核和系统接口,内核是用来调用计算机的硬件设备,系统接口就是用来提供给应用程序调用的,但在我们日常的工作和学习中并不需要我们手动的去调用操作系统的接口,这是因为我们平时实际上是在图形化界面或者命令行模式下通过一些输入操作来间接的调用操作系统接口。
实际上在图形化界面中的鼠标输入和命令行的文本输入,都是在一种叫做终端应用程序上输入我们的操作,这个中间程序会基于我们输入操作去调用相对应的系统接口,然后再由系统调用硬件资源去处理我们输入需要做的工作,也就是说我们平时使用操作系统时并不是直接调用系统接口,而是调用用户终端程序的接口。
终端程序分为GUI和CLI两类:
GUI:全称Graphical User Interface,译为图形用户接口。 CLI:全称command-line interface,译为命令行接口。
Linux中图形用户接口程序比较流行的有:GNome、KDE,关于这一部分不做过多的解析,如果想了解他们可以到网上查阅相关资料。
Linux中命令行接口程序比较常见的有:bash、zsh、sh、csh、tcsh、ksh,这些命令行接口程序本质上都是shell命令行脚本语言解释器。
关于脚本语言的简单介绍:如果不了解什么是脚本语言建议先查找相关资料了解,个人建议对脚本语言最好的了解途径就是可以尝试学习一些简单的JavaScript编程,因为JavaScript也是一款脚本语言。脚本语言的另一个名称叫做动态语言,那么与之相对应的就是静态语言,比如常见的静态语言有C、C++、Java等,静态语言简单的来说就是要将我们编写的程序先编译成机器可以直接执行的二进制文件,然后才可以在操作系统上运行。我们平时所编写的程序代码实际上都是可以直接给程序员阅读的文本文件代码,而操作系统上运行的代码实际上是二进制文件,静态语言是将文本文件代码先统一编译成二进制文件然后再放到操作系统上运行。而动态语言是将我们编写的代码放到一个解释器中,这个解释器会读取一段文本文件代码编译运行然后再读取一段编译运行,像JavaScript的解释器最出名的就是浏览器v8引擎,v8引擎就是负责解析JavaScript脚本语言,当然v8不仅仅是JavaScript的解释器,这里就不做过多的额外介绍了,如果这一部分不理解的话就可以到浏览器的控制台尝试写一些JavaScript代码进行测试理解。
关于文本文件代码这个描述我不知道是否准确,意思就是我们平时写的代码是一堆我们程序员可以读的懂的字符,而二进制文件里面全是0和1,Shell的代码也就是我们读得懂的字符程序代码,它为什么可以直接在命令行中编写然后执行,就是因为有提供编译执行环境的CLI解释器。这些解释器会提供丰富的命令(接口)供我们调用,在命令行工具中编写的命令实际上是这些解释器提供的文本接口,当我们输入一串命令并执行时解释器就会将这一串文本代码基于相对应的解释器编译然后调用系统接口执行。
但是需要注意的是,终端的命令行接口程序它都不是终端本身,严格来说终端本身只是提供了输入输出接口,它们自身不一定会提供编译和运行代码的的接口,像Linux的CLI会集成一系列的shell解释器来负责编译和调用运行。就算是图形用户接口程序实际上也是由输入输入的图形化界面和调用系统接口两部分组成,这一部分的解析是为了后面的远程终端做铺垫,后面会讲到关于ssh协议,这个协议就是将远程端口上输入的命令加密传输到实际操作设备上,在实际操作设备上通过网络服务接收到命令然后再编译执行,通过前面的解析就很好理解终端它们的实际的底层逻辑就是负责输入输出,底层实际是需要解释器来提供实际的编译运行来支持。图形用户接口程序也一样,将远程的输入传输入传输到实际操作机器上,实际操作机器再去执行相关任务。
所以终端(terminal)实际上包含两部分内容,一部分是负责输入输出,另一部分负责编译运行(调用系统接口执行相关任务),而不仅仅是一个图形化界面或者命令行输入输出工具。
3.2远程链接
这里暂时不会对远程连接的网络原理做详细的分析,只是为了初学Linux操作系统时如何使用远程连接的CLI,远程连接本身也是一个终端,通常把远程连接终端叫做虚拟客户端,与之相对应的就是物理客户端,还是回顾一下在上一篇博客Linux操作系统(一):vmware虚拟机及CtenOS操作系统安装中的4.4中有提到过Linux是多用户操作系统,也就是说在同一台Linux机器上同时支持多个用户一起使用,要使用计算机就需要操作的端口,在最开始的时候是在同一台机器上连接多台显示器,每一台显示器就是一个终端,随着技术的发展产生了在同一个显示器上提供多个用户的操作界面或窗口,这种使用窗口的方式提供的用户操作界面就是虚拟客户端。
但是需要注意的是虚拟客户端不仅仅是远程连接客户端,在现代的计算机上我们通常只链接一台显示器,在这一台显示器上可以通过系统虚拟化创建多个客户端窗口,每个窗口上可以使用不同的用户登入使用系统资源,在上一篇博客Linux操作系统(一):vmware虚拟机及CtenOS操作系统安装中的4.4中介绍的通过【Crtl + Alt + F1 ~ F6】启动多个命令行终端其实都是虚拟客户端,但我们只有一个显示器这是怎么实现的呢?
在前面的3.1中提到过一个终端由输入输出设备和解释器组成,那这两者是如何协同工作的呢?实际上在操作系统中每一个终端对应着一个用户进程,到这里你可能会追问什么是进程呢?如果这样追问下去估计可以写几本书了,这里可以暂时将进程理解为管理设备和解释器协同工作的中心枢纽,每一个进程代表着一个用户在使用操作系统,每一个进程通过接收输入设备的输入操作,然后进程调用输入指令相对应的解释器编译运行程序实现具体的工作任务,然后将程序运行的结果输出到输出设备上,这里的输入设备一般就是鼠标和键盘、输出设备一般就是显示器。那么操作系统是如何将一个显示器、鼠标、键盘实现多个用户切换的呢?
在Linux中它将所有硬件设备都用文件的方式来表示,每个用户进程都可以去读取这些文件来使用,这样就可以实现多用户的虚拟化终端,实际上在一台设备上多个用户同时操作仅仅是从我们人的角度来看待,对于计算机来说实际上都是一个用户,这就是在前面我们提到的CTSS(兼容分时系统),这是因为CPU的实际每秒的数据吞吐量远超我们人的操作速度,每当我们切换到一个用户界面时它可能已经将上一个用户的任务运行完在等待另一个用户的操作了,即便可能同时存在多个用户的同时操作,操作系统会将不能及时处理的用户任务缓存到内存设备上,然后等待上一个用户任务处理完成以后再来处理。
有了上面的铺垫就可以来解释什么是远程连接的终端,在最开始的CTSS(兼容分时系统)一个显示器就代表一个用户,在一台主机上会有多个显示器的连接物理接口供多台显示器连接,但它们仅仅只是多个物理终端,而不是远程连接。所谓远程连接是指在另一台计算机设备上通过网络链接的方式链接到主机然,通常我们将被链接的主机称为服务器,发起连接的主机称为客户端。
远程链接时我们使用的输入输出设备是客户端的设备,客户端通过网络向服务器发起连接成功后会在服务器上创建一个用户进程,这个用户进程会监听服务器上的网络设备,客户端将输入数据通过网络发送给服务器。服务器上的用户进程从网络设备上接收到客户端发送过来的数据,调用相对应的解释器解析运行程序,然后将执行结果通过网络发送回客户端。客户端将接收到的数据通过输出设备输出。
基于xshell的客户端远程连接:
Xshell是基于ssh协议的远程连接客户端程序,至于什么是ssh协议在后面的计算机网络相关内容中会做详细的解析,这里暂时只需要知道ssh基于TCP连接的可以实现将客户端输入的命令加密发送到服务器上,可以实现远程连接的当然不仅仅只有ssh协议,这里暂时不做过多的介绍,后面在计算机网络部分再介绍。
Xshell的官方地址:http://www.xshellcn.com/
安装很简单,如果知道怎么下载安装的可以到网络上搜索相关教程,虚拟机的完了连接模式建议采用桥接模式或者网络地址转换,当然还有主机模式现阶段也不是不可以,只是因为主机模式虚拟机不能直接访问主机以外的网络,不方便下载东西或使用主机同一个局域网络下的其他主机上远程连接虚拟机。关于虚拟机的网络模式可以参考这篇博客:VMware下网络配置三种模式对比(桥接模式,主机模式,网络地址转换)。
要实现网络连接当然不能少了IP地址和端口,ssh的默认端口是22,查看当前虚拟机的IP可以通过以下两种方案:
ip addr list
ifconfig
执行这两个命令都可以得到网络配置相关数据的列表,找到列表中的eth0中的inet addr的值即当前虚拟机在当前网络上的ip地址,然后再远程客户端Xshell中执行 ssh [虚拟机IP地址] 命令连接到你的虚拟机,执行命令后输入用户名和密码登入,这时候就可以在远程客户端Xshell中通过命令来操作你的linux了。
有可能会因为虚拟机启动了防火墙导致连接不成功,如果不确定虚拟机是否启动防火墙,可以虚拟机的上使用 ping [物理主机的ip地址] 来测试你的虚拟机是否能够成功连接到物理主机,如果没有报错就没问题,如果连接失败很可能是当前虚拟机启动防火墙导致的,可以在虚拟机上通过以下这两个命令来关闭当前虚拟机的防火墙:
iptables -L -n //查看防火墙相关信息 iptables -F //关闭防火墙,这种关闭只是当前关闭,下次重新启动虚拟机防火墙依然会启动,也就是只是停止当前启动的防火墙,如果需要禁用防火墙在不同的CentOS版本中命令有一些差异,详细参考下面的内容 //CentOS 7: systemctl stop firewalld.service //停止当前启动的防火墙 systemctl disable firewalld.service //禁用防火墙 //CentOS 6: service iptable stop //停止当前启动的防火墙 chkconfig iptables off //禁用防火墙
关于以上的这些操作和命令这里先不做其他详细的解析,这里就介绍上面这些使用方法和目的就好,到这里通过上一篇博客的虚拟机安装和这一篇博客的一些基本操作,Linux的学习准备工作完成了,后面的博客会针对Linux的具体内容逐个解析。
四、各硬件设备在Linux中的文件名
在Linux系统中,每个设备都被当做一个文件来对待,比如SATA接口的硬盘的文件名为/dev/sd[a-d],其中,括号内的字母为a-d当中任意一个,即/dev/sda、/dev/sdb、/dev/sdc、/dev/sdd这个四个文件分别表示四个硬盘。
设备 | 设备在Linux中的文件名 |
SCSI、SATA、USB磁盘驱动器 | /dev/sd[a-p] |
U盘 | /dev/sd[a-p](与SATA相同) |
Virtio接口 | /dev/vd[a-p](用于虚拟机内) |
软盘驱动器 | /dev/fd[0-7] |
打印机 |
/dev/IP[0-2](25针打印机) /dev/usd/ip[0-15](USB接口) |
鼠标 |
/dev/input/mouse[0-15](通用) /dev/psaux(PS/2接口) /dev/mouse(当前鼠标) |
CD-ROM、DVD-ROM |
/dev/scd[0-1](通用) /dev/sr[0-1](通用,CentOS较常见) /dev/cdrom(当前CD-ROM) |
磁带机 |
/dev/ht0(IDE接口) /dev/st0(SATA/SCSI接口) /dev/tape(当前磁带) |
IDE磁盘驱动器 | /dev/hd[a-d](旧式系统才有) |
五、计算存储机容量单位
比特(bit):简写b,位的意思。
字节(Byte):简写B,字节的意思,一个字节表示8个比特,即1B=8b。
一般情况下将字节作为基础单位,字节后面包括千字节(KiB)、兆字节(MiB)、吉字节(GiB)、太字节(TiB)等,单位采用210进制,即1024进制。
需要注意的是在国际单位制SI里,1KiB等于1000Byte,而不是1024Byte,所以在很多商业消费产品描述中1兆(MB)表示的是1000KB,而不是1024KB,转换成字节(B)则是1000*1000B,与实际的计算机容量计算相差1024*1024B-1000*1000B=48576B,所以需要注意这其中可能产生的歧义。
然后需要注意的是前面说的商业消费产品采用的计量单位是国际单位制SI的计量标准,而采用210进制是国际电工委员会IEC标准,这两者的区别就是SI采用1000进制,IEC采用1024进制。两者使用的单位简写也是有区别的,在SI标准没有中间的“i”,像千字节SI使用KB而IEC使用KiB,兆字节SI使用MB而IEC使用MiB。
倍数 | 英文缩写 | 英文单位名称 | 中文单位名称 |
1b | b | bit | 位(比特) |
8b | B | Byte | 字节 |
210B | KiB | Kilo binary Byte | 千字节 |
220B | MiB | Mega binary Byte | 兆字节 |
230B | GiB | Giga binary Byte | 吉(咖)字节 |
240B | TiB | Tera binary Byte | 太(拉)字节 |
250B | PiB | Peta binary Byte | 拍(它)字节 |
260B | EiB | Exa binary Byte | 艾(可萨)字节 |
270B | ZiB | Zetta binary Byte | 泽(它)字节 |
280B | YiB | Yotta binary Byte | 尧(它)字节 |