目录
在任何一本教材上,都可以看到操作系统的定义。这些定义虽然没什么问题,但是对于初学者来说理解起来还是会一脸懵的。这里通过一些简单的例子,带着大家理解 "什么是操作系统" 。首先不妨先思考几个问题:
思考:是先有计算机(硬件)还是先有操作系统呢?
先有计算机,换言之操作系统是在有了计算机后诞生的产物。
思考:为什么要有操作系统?
因为单纯的硬件计算机操作起来效率特别低,难度特别高。是为了降低计算机的使用难度的。
思考:显示器是硬件吗?
是的,printf、cout (软件)向显示器打印,本质就是向硬件写入数据(硬件)。
也就是说,软件实际上是可以操作硬件的,那这个操作具体是怎么完成的呢?在计算机的整个结构中,最底层被称之为 "硬件" 。
所谓的硬件就是键盘、显示器、网卡、显卡等各种设备……在底层它们都叫硬件。这些硬件之间的组织方式,在后面讲解。
百度百科:操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。
根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。操作系统是人与计算机之间的接口,也是计算机的灵魂。
通过上面得到一个既定的事实:软件在操作硬件。在硬件层上还存在着一个软件层,被称之为 "驱动软件层" 。可以通过驱动软件层帮上层实现对硬件的基本访问。每一种硬件都有一种与之匹配的驱动程序。
举个例子:在 Windows 中使用鼠标,鼠标没有插入计算机中时我们滚动鼠标时没有反应的,但当我们把鼠标插入到USB接口中的一瞬间,此时滚动可能还是没有反应的(当然,现在鼠标的响应已经时间短的让人难以察觉了),即使鼠标在物理上已经插入到计算机USB接口中了。大概过了几秒电脑驱动提示音响了一声,此时鼠标就和电脑相连接了。
当我们往计算机新增一个设备时,刚开始插入的时候短暂期间其实都是没有反应的,过了一会它就有反应了,这个 "过了一会" 操作系统在做什么呢?
操作系统在根据你的硬件帮你选择对应的驱动程序。也就是说,它的核心工作是能够给上层提供访问硬件的接口,就好比写C++代码,封装一个类,类里面封装了各种成员方法,我们这么做不就是想让我们定义出来的对象可以使用类中定义的成员方法来进行操作吗?所以我们写类写方法就是为了让类给我们提供接口。
一般而言,一种硬件都会有厂商给我提供对应的驱动软件,获取驱动的方式,一般而言是由 OS 帮我们获取与安装的。这些对用户来说是透明的。
驱动软件层:帮上层实现对硬件的基本访问。再往上,还有一层软件层,我们一般把它称之为 OS Kernel(操作系统内核)。狭义上来讲,这个就是我们的操作系统。
操作系统的内部它一般会有四大构成:① 进程管理 ② 文件管理 ③ 内存管理 ④ 驱动管理。
操作系统的核心工作是帮助我们进行这上面这些内容的管理工作。再再往上就是 "用户层" 了,比如我们的图形化界面、各种库,用户的一些应用程序等。
为什么要有操作系统?
可以分成 "对上" 和 "对下" 来说明:
上面提了这么多,这些都可以归结成一个词:管理
管理的目的:① 对上:提供一个良好稳定的运行环境 ② 对下:管理好软硬件资源。
从而整体达到提高操作效率的目的,这就叫操作系统。软件管理软件,这合理吗?人管人,软件管理软件,这很合理。
总结:操作系统是一款软件,用来进行对软硬件资源进行管理的软件。
操作系统知道是什么了,那什么是Linux操作系统呢?这就如同现实中有中国银行、中国建设银行、中国农业银行…… 操作系统也有不同的种类:Windows,Linux,MacOS...... Linux操作系统也就是操作系统的一种罢了,不管它有多么特别,它最终都是围绕刚才所说的 "向上和向下" 展开的。
为什么要进行指令操作?
指令操作对于非专业人员,没有必要。对于专业人员,可以必要,也可以不必要。
但是,对于我们学习 OS 原理、编程、指令操作,必须需要掌握。
用图形化界面不香吗?是先有指令,还是现有图形化界面?
早期的操作系统,是键盘给OS、计算机数据的。
如何输入数据给计算机?打字机 → 计算机键盘(从打字机演化过来的)。
有没有想过,为什么我们键盘上是按 QWER 的顺序,还不是 ABCD 去排列的?其实是历史原因导致的,这是根据使用频率去设计的。
先有指令操作,后有的操作系统,刚开始的时候全部都是支持指令操作的。如果对计算机图形化的内容感兴趣,可以百度了解了解。Windows 也是有指令操作的,也就是 cmd 命令提示符。
指令操作显著的缺点就是操作成本高,所以当时操作系统公司为了 "迎合" 用户,都去开发了图形化界面。再回到问题本身:那为什么要学习指令呢?指令的意义是什么?
因为指令操作距离 OS 更近,便于我们更好地掌握 OS。
所以学习指令除了学习指令本质外,更是为了接近操作系统的特性。
Linux严格意义上说的是一个操作系统,我们称之为:Kernel(核心), 但我们一般用户,是不能直接使用Kernel的,而是通过Kernel的 "外壳" 程序,也就是所谓的shell,来与Kernel进行 "沟通 " 。
如何理解?为什么不能直接使用Kernel? 从技术角度,shell的最简单定义:命令行解释器(command Interpreter)主要包含: 将使用者的命令翻译给核心(Kernel)处理。 同时,将核心的处理结果翻译给使用者。
对比Windows GUI,我们操作Windows 不是直接操作Windows内核,而是通过图形接口,点击,从而完成我们的 操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
帮助理解:如果说你是一个害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头让你心动的女嘉宾小花。你看上了小花,但是有不好意思直接表白,那就让你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。
所以为什么不能直接使用kernel,而是要通过shell:
① 降低操作 OS 的成本:用户不善于和内核沟通,需要通过外壳来做解释。
② shell 保护操作系统:外壳的存在让内核不会暴露给用户,用户所有的非法、不合理操作会直接被外壳拦住,某种意义上来说是对操作系统的一种保护。
我们的 CentOs7常用的命令行解释器(shell),叫做 bash。
它是存在于 /usr/bin 目录下的一个可执行文件:
他们两个之间有什么关系呢? shell 是所有解释器的统称,bash 是具体的一款解释器。bash 属于 shell 中的一种,常见的 shell 工具:sh、bash、csh、tcsh、ash 等。它们的关系就像是 Linux 和 CentOS7.6 的关系,一个是统称的,一个是具体的。
什么是权限?
① 约束人的(对人进行分类)
② 需要对应的事物具有特定的属性
Linux 的用户分为 root 和普通用户,root 为超级用户,就像 Windows 系统中的管理员。
- 超级用户:可以在 Linux 系统下做任何事情,不受限制。
- 普通用户:在 Linux下做有限的事情。
超级用户的命令提示符是 # ,普通用户的命令提示符是 $ 。命令 : su [ 用户名 ]功能 :切换用户。例如,要从 root 用户切换到普通用户 user ,则使用 su user 。 要从普通用户 user 切换到 root 用户则使用 su root( root 可以省略),此时系统会提示输入 root 用户的口令。
当前系统当中是不存在任何一个用户的,只有一个 root,也只能有一个超级用户。
如果我想给自己创建一个用户,该如何创建呢?(注意,前提是 root )
在前面讲指令时我们用的都是root 用户,确认当前你是哪个用户,可以输入 whoami 指令:
当前是root,所以可以输入adduser 新用户名(添加一个普通用户),创建完后,当前我们创建的用户是不能进行登陆的,我们还需要给它设置密码(这里非常不建议root密码和普通用户密码设置成一样)。
当然,如果密码设置的太简单,会出现 BAD PASSWORD 的提示,但这也仅仅是个建议。随后再输入一遍确认密码即可,这和我们网站注册一样,需要你 "确认密码" :
成功后会显示: all authentication tokens updated successfully.
此时我们就把用户添加好了。
添加用户后,想登陆一下刚刚创建的用户。
但是现在是处于 root下的,可以直接su 普通用户名,然后输入普通用户名进行切换,但建议先 "退出登录" ,我们可以输入exit,回车,然后双击所有会话中的建立的会话,之后就可以登录刚才创建的用户了,输入用户名和密码就行:(这里也建议不要选记住用户名/密码)
登陆成功后,可以输入whoami查询当前用户。
值得注意的是,现在命令行界面的前缀由 # 变为 $ 了,上面说了,# 代表 root管理员权限,$ 代表普通用户。
如果想删除一个用户呢?接下来就来看看如何删除一个用户。切换到 root:直接输入su,然后输入root的密码,输出ls /home即可查看用户:
通常情况/home路径下只有保存的用户,但是之前为了方便演示,把一个目录建立在里面了,现在进入home目录然后,把linux_3删掉:
再建立两个用户来方便演示:
userdel -r 普通用户名(删除用户),现在删除rtx3用户(现在是root超级用户)
此时发现,第一次userdel rtx3已经删掉rtx3这个用户了,只是在home目录下的rtx3目录没有删,所以不能在新建一个rtx3用户,如果rtx3用户没有被删掉,应该是像新建rtx2用户一样显示:用户已经存在。所以我们删了rtx3用户后,应该在home删掉rtx3目录:
普通用户转到root用户我们已经讲过了,在 root 用户下,想要切到普通用户甚至连密码都不需要输,当然,如果你是普通用户想切换到另一个普通用户,当然还是需要输入密码的。
root 什么身份都可以切,由此可见 root 账号非常重要。
为了方便演示,我们切换到rtx2用户,然后进入/home/rtx2路径下建立几个文件和目录:
当我们输入 ll 显示详细信息时,你有没有注意到第一部分的drwx等信息?
我们既然要学习权限,我们重点要理解 ls -l 显示的若干的字母组合。
drwxrwxr-x
-rw-rw-r--
第一列的第一个字符,叫做 "文件类型" 。
Linux 中不是以文件名后缀区分文件类型的,而是通过 ls -l 显示的第一个字符区分文件类型的。这有点颠覆我们的直觉,因为 Windows 是文件末尾 [ .类型 ] 的格式去区分文件类型的,而在 Linux 下文件类型跟后缀没有关系。确实是这样,这里就不验证了。
在Windows 下,这里的 a.txt 这就是一个文本,但是在 Linux 是完全不关心你后缀是什么的。Linux 的文件后缀纯属摆设,写后缀只是是为了给自己或者他人看的。
概念:Linux 是根据第一列第一个字符去区分文件的类型的。
d :目录(文件夹)- : 普通文件,文本、源代码、可执行文件、第三方动态库等。l : 软链接(类似 Windows 的快捷方式)b :块设备文件(例如硬盘、光驱等)p :管道文件c :字符设备文件(例如屏幕等串口设备)s :套接口文件
所以现在输入ll出来的第一个字母知道是什么意思了,
既然 Linux 文件后缀纯属摆设,那我们把 test.c 改成 test.txt,然后用 gcc 编译可以吗?
这是不行的,gcc是Linux下的一个软件,Linux下不看后缀,但是gcc看。
虽然 Linux不以文件名后缀区分类型,但是 Linux 并不排斥以后缀做文件类型。
权限 = 人 + 事物属性,所以权限的概念以及操作都是围绕人和概念的属性展开的。
Linux 上,对文件的权限:这个文件谁能访问?这个文件谁不能访问?
对应的文件应该具备的某种属性:
读(r/4):read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限。写(w/2):write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限。执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限。“—”表示不具有该项权限。
rwx的位置都是固定的,所以上面的属性排列组合就有下面8种情况:
八进制数值表示方法:
(利用八进制数值进行操作,用起来会非常的方便,等下面讲完文件的修改操作后再详细讲解)
在 Linux 系统中,人分三类:
① 文件的拥有者 owner ② 文件的所属组 grouper ③ 文件的其他用户 other
root 和普通用户都可称为文件的拥有者、所属组、其他用户,他们并不冲突,反而是相互补充的。其他用户是出了拥有者和所属组外的所有用户。(不会被记录)
然后详细信息的第一个字母后的九个字母也能知道是什么意思了,前三个是拥有者的权限,中间三个是所属组的权限,后三个是其他用户的权限,后面的数字先不管,后面的两个名字分别是文件的拥有者和所属组,这里都是rtx2。
chmod功能: 设置文件的访问权限。格式: chmod [ 参数 ] 权限 文件名。常用选项:R -> 递归修改目录文件的权限。说明: 只有文件的拥有者和root才可以改变文件的权限。
chmod 命令权限值的格式:
用户表示符 +/-= 权限字符:+: 向权限范围增加权限代号所表示的权限-: 向权限范围取消权限代号所表示的权限=: 向权限范围赋予权限代号所表示的权限用户符号:u:拥有者ownerg:所属组groupero:其它用户othera:所有用户all
现在我们是文件的拥有者,下面来随意演示一下:对file1.txt操作:
对code1操作:
前面说了rwx位置是不变的,而且有就是有没有就是没有,所以可以用二进制表示:
000到111最大是7,所以我们的修改权限还可以以八进制进行修改:
如果只没有 r 权限,允许进入目录、允许在该目录/文件下创建(写入),只不过是不允许查(看):
如果只没有 w 权限,允许进入,允许在该目录下查看文件列表,但是不允许(写)创建:
(需要注意的是,如果一个目录的其他用户other有w权限,那么该目录下无论谁创建的文件其他用户就都能删除了,这是下面的粘滞位要说的内容)
如果只没有 x 权限,允许在该目录下查看文件列表,允许创建,但是不允许进入:
其它的组合差不多一样,比如:如果同时没有 rw 权限,允许进入,但是不允许创建和查看目录下的文件列表:(注意:不是文件内容,文件的内容是否可以查看由文件自己的权限决定)
比如在code1创建一个file3.txt,然后写入点东西:
需要注意的是权限只会被认证一次,如果你像上面即使拥有者也是所属组,此时你会先被认证为拥有者,如果拥有者权限什么都没有,而所属组权限什么都有,那么你的权限还是什么都没有。
还有 rwx 权限对root超级用户是没有用的,它可以随便读写进入,它甚至可以改你的权限,当然它改后,拥有者还是可以改过来,所以一般只有root和拥有者可以改权限。在公司,root用户你是不能拿到的,一般只是普通用户,所以以后操作尽量在普通用户下操作。
Linux 下一切皆文件,目录也是文件。再结合 "文件 = 内容 + 属性" 去理解。目录里面保存的是部分文件的 "属性" 。(文件名和 id 之间是有对应的映射关系的,有可能被系统缓存了)
chown 用户名 文件名(修改文件的拥有者)
如果我是一个文件的拥有者,我想把文件给别人:
被禁止了,当你想给其他人东西的时候,要不要经过其他人的同意?当然需要,这里我们可以用 sudo 指令强制给其他人,(在前面的chown rtx code1前加sudo)(sudo 有关一个叫信任列表的东西,你现在输入如果出现报错是因为 root 没有把你添加到信任列表里,这个后面讲完 vim 之后再说。在 /etc/sudoers 路径下。)当然我们还可以直接切换成 root,通过 root 去给,其他人不要也得要:
通过修改文件的拥有者,我们还能验证一个文件的创建者和拥有者不一定是同一个人
chown 用户名 文件名(修改文件的所属组)
和 chown 一样的用法,我们在root下,可以用 chgrp 指令改变文件的所属组 grouper。
默认权限:① 默认目录的起始权限:777(rwx) ② 默认普通文件的权限:666(rw-)
在前面的学习发现目录没有x权限很麻烦,所以一般目录默认创建的权限都有x。默认创建后的权限一定是上面两种吗?
为了方便演示和形成好习惯,我们删掉rtx2里的文件和目录(删不掉可以切换到root删掉再切回来),在rtx2里创建一个linux_2目录,然后进入linux_2目录新建几个文件和目录:
有同学就发现了,上面不是说应该是 777 和 666,为什么这里是 775 和 664 呢?因为系统中有一个默认的 "权限掩码" ,叫做 umask:
默认权限 != 最终权限,Linux 中的最终权限 = 默认权限 "去掉" umask 中存在的权限。
umask 权限掩码:凡是在权限掩码中出现的权限,都不应该在最终权限中出现。
输入umask查看你的机器的权限掩码:
最终权限 = 默认权限 & (~umask) -----(默认权限按位与上umask的二进制按位取反)
只看umask的后三位,按着下面图心算一下就是这样的:(记得smask取反)
umask 是可以修改的:首先输入umask,跟着输入要改的值,四位,第一位是0,:
按照 最终权限 = 默认权限 & (~umask) ,想要最终权限和默认权限一样,那就把umask改成0000了,不过一般习惯改为0002,这里改回来,然后把演示的文件删一部分。
共享目录:
Linux 下可以存在一些目录,拥有者和所属组是 root,其他人允许以 other 的身份在该目录下进行文件的创建、读取、删除和修改等操作:
这里的tmp目录就是共享目录 。
注意事项:在一个共享目录下的文件,你不让我写,不让我读,但防不住我删除。(讲w权限的时候讲了)
比如,有两个普通用户A和B都在 root 的共享目录下创建了几个文件,用户A不想让用户B访问它的文件,于是就 chmod 把 other 的 rw 全撤了,于是用户B急了,恼羞成怒,啊你不给我用你也别想用了,得不到就毁掉!直接给你把文件删了。此时B是可以删A创建的文件的,(讲w权限的时候讲了)如果不想让别人删,那么这个共享目录的其他用户other不应该有 w 权限。
此时应该是 root 使用 chmod o-w 去掉其他用户other的 w 权限,那么此时B不能删除A的文件了,但是A也不能删除自己的文件了,因为A也是这个共享用户的其他用户,而且A和B都不能创建新文件了,也不能往文件里写东西了,这就需要粘滞位来解决。
如果你仍然是想在共享目录下形成临时文件,但又怕别人给你删了,你可以给共享的 <目录> 加上粘滞位来解决。
注意,是给目录加粘滞位。即你共享哪个目录,你就在哪个目录下加上粘滞位。我们下面来介绍一下 Sticky bit ——粘滞位。
chmod +t 目录名(添加粘滞位)
粘滞位只能给目录加,只能给其他用户other加:
为了方便演示,这里切换到root新建一个类似上面tmp共享目录的共享目录mytmp,把mytmp的权限改为777,然后切换到rtx2进入这个目录创建一个文件:
此时rtx2.txt是我rtx2创建的文件,我只想自己rwx这个文件,不想其它人有,所以改一下,但是此时其他用户,(这里切换到root用户再新建一个djs用户),切换到djs用户,djs还是可以删除rtx2.txt:
上面说了:如果你仍然是想在共享目录下形成临时文件,但又怕别人给你删了,你可以给共享的 <目录> 加上粘滞位来解决。
这里切换到root,然后对我们的共享目录mytmp:chmod +t 目录名(添加粘滞位)
这里的mytmp共享目录的其他用户的权限就变成wrt了,这个t你可以看作x的特殊情况,然后切换rtx2再重新创建一个rtx2.txt文件:重复上面的步骤
目录设置了粘滞位 t 后,作为 other 就无法随意地删除其他用户的文件了。不过 root 还是想删就删,想干什么就干什么。普通用户再怎么进行文件操作,对 root 都是无效的。
1. 如果系统的umask设置为244,创建一个新文件后,它的权限( )
A.--w-r--r--
B.-r-xr--r--
C.-r---w--w-
D.-r-x-wx-wx
2. 关于沾滞位,一下描述正确的是( )[多选]
A.其它用户在设置了沾滞位的目录下不可以删除别人的文件
B.其它用户在设置了沾滞位的目录下不可以创建文件
C.使用chmod +t 设置目录沾滞位
D.使用chmod +x 设置目录沾滞位
3. 在Linux中,file.sh文件的权限为-rw-r--r-x,其对应权限用数值形式表示为( )
A.775
B.745
C.645
D.643
4. linux下给文件start.sh设置权限为自己可读可修改可执行,组内用户为可读可执行不可修改,其余用户没有任何权限,那么设置该文件权限的命令为 ( )
A.chmod start.sh 706
B.chmod start.sh 750
C.chmod start.sh 705
D.chmod start.sh 777
1. C
umask是linux下设置文件默认创建权限掩码, 文件给定权限与掩码取反相与得到实际权限
默认创建普通文件给定权限666(不给予可执行权限),
666 & (~244) = 422 -> 100010010 -> -r---w--w-
2. AC
沾滞位的作用:在设置的沾滞位的目录下,其它用户可以创建文件,但是只能删除自己的文件,不可以删除别人的文件;可以通过chmod +t设置其它用户权限位中的沾滞位
3. C
linux下文件的权限外在表示为-rw-r--r-x
但是在系统中使用二进制位存储,也就是使用0和1表示是否具备操作的权限,因此该权限被表示为:-110100101,以每3个比特位表示一个八进制数字,则转换为三个8进制数字为645
4. B
自己可读可修改可执行:111 ->7
组内用户为可读可执行不可修改:101->5
其余用户没有任何权限:000->0
因此整体转换后的权限为:750
权限就先讲到这里了。下一篇:零基础Linux_5(开发工具_上)yum和vim和gcc/g++和gdb。
(穿越回来复习顺便贴个下篇链接:零基础Linux_5(开发工具_上)yum和vim和gcc/g++和gdb_yum g++-CSDN博客)