十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
就像我们了解的Windows和Mac OS,linux也是一个操作系统。如下图,linux就是系统调用接口和内核那两层。
景宁畲族自治网站建设公司创新互联,景宁畲族自治网站设计制作,有大型网站制作公司丰富经验。已为景宁畲族自治上千提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的景宁畲族自治做网站的公司定做!
通过上面的说明,我们知道了 Linux 其实就是一个操作系统最底层的核心及其提供的核心工具,任何人均可取得核心码与可执行这个核心程序,并且可以修改。此外,由于linux参考POSIX设计规范,于是 兼容UNIX操作系统,故可称为Unix Like的一种。
为了让一般使用者能够接触到linux,很多的商业公司和非盈利团体,就将linux kernal(含tools)与可运行的软件整合起来,加上自己具有创意的工具程序,这个工具程序可以让用户以光盘/DVD或者透过网络直接安装和管理linux系统。这个 kernal+softwares+tools的可完全安装 ,我们称其为 linux distribution(可完全安装套件、linux发布商套件)
对于linux来说,所有的程序和系统装置都是文件, 一切都是文件。
由于利用 Linux 来开发产品或distributions 的社群/公司与个人很多,若是每个人都用自己的想法来配置文件放置的目录,就会造成个人不能使用他人的linux系统的PC。因为你根本不知道一些基本的配置,文件在哪里,这就造成了混乱。所以,就有所谓的 Filesystem Hierarchy Standard(FHS) 标准出炉了。
也就是说,FHS 的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。
事实上,这个 FHS仅是规范出在根目录 ( / ) 底下各个主要的目录应该是要放置什么样的文件而已。 FHS 定义出两层规范出来,第一层是 / 底下的各个目录应该要放置什么样内容的文件数据,例如 /etc 应该要放置设定档, /bin 与 /sbin 则应该要放置可执行档等等。第二层则是针对 /usr 及 /var 这两个目录的次目录来定义的。 例如 /var/log 放置系统登录文件、 /usr/share放置共享数据等等。
在一个文件系统中,我们总有一个被称为 根目录 的东西,这个根目录里包含了所有其他目录和文件。
在Windows中,可以有好几个根目录,比如说C盘(C:\)是你的硬盘的根目录,H盘可能是你的光盘驱动器的根目录。
Linux中有且只有一个根目录,就是 / 。
如果以较为完整的树状目录来视察的话, 可以将整个 Linux 的树状目录绘制成下图:
Linux是一个真实的、完整的 多用户多任务 的操作系统,多用户多任务就是可以在系统上建立多个用户,而多个用户可以在同一时间内登录同一系统执行各自不同的任务,而互不影响。例如某台Linux服务器上有4个用户,分别是root、www、ftp和MySQL,在同一时间内,root用户可能在查看系统日志,管理维护系统;www用户在修改自己的网页程序;FTP用户可能在上传软件到服务器;MySQL用户在执行自己的sql查询,每个用户互不干扰,有条不紊地进行着自己的工作,而每个用户不能越权访问,比如www用户不能执行MySQL用户的查询操作,FTP用户不能修改www用户的网页程序,由此可知, 不同用户具有不同的权限,每个用户在权限允许的范围内完成不同的任务,Linux正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。
Linux下用户是根据角色定义的,具体分为三种角色:
超级用户 :系统管理员,拥有对系统的最高管理权限,默认是root用户
普通用户 :只能对自己目录下的文件进行访问和修改,具有登录系统的权限,例如上面的www、FTP用户等
虚拟用户 :也叫“伪”用户,这类用户最大的特点就是不能登录系统,他们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如系统默认的bin、adm、nobody用户等,一般运行的web服务,默认就是使用的nobody用户,但是nobody用户是不能登录系统的。
Linux是一个多用户多任务的分时操作系统,如果要使用系统资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统。这个账户和用户是一个概念,通过建立不同属性的用户,一方面,可以合理的利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。
每个用户有用一个唯一的用户名和用户口令。
用户组是具有相同特征用户的逻辑集合 ,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有10个用户的话,就需要授权10次,显然这种方法不太合理;另一种方法就是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中,那么所有的用户就具有了和组一样的权限,这就是用户组。 用户分组是Linux系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,很大程度上简化了管理工作。
用户和用户组的关系有:
一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员
一对多:即一个用户可以存在多个用户组中,那么此用户具有多个组的共同权限。
多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限
多对多:多个用户可以存在多个组中。
linux的语言是c语言写的,c语言是严格区分大小写的,linux命令中大小写也是完全不同的。
终端展现:
登录linux终端后,linux默认的命令行提示信息的格式:
说明 :有些命令即使你使用su root 切换到root用户,仍无法执行。所以还是建议使用su – root
x (access directory): x 与能否进入该目录有关
相对路径就是相对当前你所在路径开始算。
绝对路径是从linux最底层的根(/)开始算。
其中:在Linux中,绝对路径是从/(根目录)开始的,路径最前面是/的话就是绝对路径。
相对路径是直接输入当前路径下的文件夹或者以 . 或 .. 开始算的,.表示用户当前操作所处的位置,.. 表示上一级目录。
举个例子:
/home/oracle 这个路径就是绝对路径
./home/oracle 这个就是相对路径,例如现在在/test路径下,此条路径换算成绝对路径为/test/home/oracle
../home/oracel 这个也是相对路径,例如现在在/test路径下,此条路径换算成绝对路径为:/home/oracel
注意后面两个的对比,..是回到上一级然后在往后算。
使用pwd命令可以查看当前所在的绝对路径。‘
如题中提出的问题,答案如下:
由于不清楚相对路径是相对于哪个路径,这里默认在/目录下。
用相对路径名从usr/bin跳到/home/staff/john/project
答:cd ../../home/staff/john/project 或者 cd /home/staff/john/project
用绝对路径名从usr/bin跳到/temp
答:cd ../../temp 或者 cd /temp
用相对路径名从usr/bin跳到/etc/rc.d
答:cd ../../etc/rc.d 或者 cd /etc/rc.d
跳转路径可以直接输入绝对路径
每个Linux使用者在安装Linux时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值。如果估计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统、清除硬盘、重新对硬盘分区,然后恢复数据到新分区
逻辑卷管理器LVM(Logicl Volume Manager),通过使用逻辑卷管理器对硬盘存储设备进行管理,可以实现硬盘空间的动态划分和调整,而且可以将零碎的空间进行整合
• 物理卷(PV-Physical Volume)
物理卷在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘
• 卷组(VG-Volumne Group)
卷组建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组
• 逻辑卷(LV-Logical Volume)
逻辑卷建立在卷组之上,卷中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组
逻辑卷管理器和是主分区还是逻辑分区没有关系
vgdisplay 里的PE Size是指逻辑卷的最小单位。假设PE Size是4M;比如我向里写东西。我一个文件可能只占用1B的容量,但是我先占上4M,其他的也是,不足4M我也先占上4M。等到每个块都用了,但是每个块都有剩余位置的时候,会把每个区的剩余位置都拼凑一下,以供使用。但是只要还有没被占用的块,都不会使用用过的块。逻辑卷大小为这个PE Size的整数倍
处在它所在的文件夹的时候是无法卸载的
我现在想创建两个卷组,vg1和vg2。sdc1和sdc2给vg1,sdc3和sdc4给vg2
修改卷组属性,用来设置卷组是否处于活动状态,活跃状态的时候卷组无法被删除,非活动状态的卷组才能被删除掉。VG Status:resizable是表示可被调整大小的状态。lvremove时有可能因为逻辑卷里东西过多导致删除逻辑卷的时候假删除,即逻辑卷没了,但是里面东西还在,这时卷组觉得它里面还有东西,就会处于活跃状态,这时需要↓
接下来resize1要用来做块(逻辑卷)的放大,resize2要用来做块的缩小。设备放大时不论是挂载状态下或非挂载状态下都可以做放大,即在线放大。但是缩小的话设备要是非挂载的状态,即离线缩小
df -lh
发现size大小变小了。之前给的resize1是800M,resize2是784M,这里的大小表示文件系统(filesystem)大小(即这个设备能存多少东西),剩下的容量mkfs,挂载的时候都会损耗一定的容量大小。文件系统大小不会随着块的变大或缩小而改变,需要手动才能改变文件系统大小。
❉ 放大要先放大块的大小,再放大文件系统的大小
lvresize -L +200M /dev/vg3/resize1 放大逻辑卷
如果不带+,会出现warning,+时是在原有基础之上加200M,不加+的话就是将现有逻辑卷的大小调整成200M。如果比之前设置的逻辑卷小的话就证明是要将其缩小,会造成数据丢失
resize2fs /dev/vg3/resize1 调整文件系统大小,但是不会管你到底是放大还是缩小,就是将文件系统调整到它可以变大的最大程度
df -lh 看设备容量变大了
❉ 缩小的时候要先将文件系统缩小,再缩小逻辑卷的大小
umount /mnt/rs2/
resize2fs /dev/vg3/resize2 700M
出现提示 [请先输入e2fsck -f /dev/vg3/resize2 命令],将处于多个块当中的内容整理到一起,以便进行缩小。但是也不能百分百保证数据不丢失
e2fsck -f /dev/vg3/resize2
resize2fs /dev/vg3/resize2 700M
lvresize -L 700M /dev/vg3/resize2
mount /dev/vg3/resize2 /mnt/rs2/ 重新挂载回来
df -lh 看系统里设备和文件系统挂载的使用情况
发现size变小了,缩小成功
ls -al命令来观察文件权限,每个文件的权限都用10位表示,其中第一段占1位,表示第一个字符代表这个文件的类型(目录,文件或链接文件)。
若为“d”则是目录,若为“-”则是文件,若为“l”则表示链接文件,若为“”则表示为设备文件里面的可供存储的周边设备,若为“c”则表示为设备文件里面的串行端口设备,如键盘鼠标。
第二段占3位,表示权限,均为[rwx]的三个参数的组合。其中r表示可读,w表示可写,x表示可执行,如果没有权限,则会显示减号“-”。
扩展资料:
Linux命令注意事项:
Linux的命令(也包括文件名等等)对大小写是敏感的,也就是说,如果你输入的命令大小写不对的话,系统是不会做出你期望的响应的。
Linux常用的命令:
clear,这个命令是用来清除屏幕的,它不需要任何参数,和dos下面的cls具有相同的功能,如果你觉得屏幕太紊乱,就可以使用它清除屏幕上的信息。
目录切换(cd),使用cd(Change Directory)命令可以在不同目录之间切换。
列出目录中的文件(ls),在Linux命令行终端中使用的最多的命令就是这个ls,它可以帮助我们列出当前目录下都有哪些文件。
参考资料来源:百度百科-Linux命令
开发十年经验总结,阿里架构师的手写Spring boot原理实践文档
阿里架构师的这份:Redis核心原理与应用实践,带你手撕Redis
Tomcat结构原理详解
说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案: 在 Linux 系统中,进程和线程几乎没有区别 。
Linux 中的进程其实就是一个数据结构,顺带可以理解文件描述符、重定向、管道命令的底层工作原理,最后我们从操作系统的角度看看为什么说线程和进程基本没有区别。
首先,抽象地来说,我们的计算机就是这个东西:
这个大的矩形表示计算机的 内存空间 ,其中的小矩形代表 进程 ,左下角的圆形表示 磁盘 ,右下角的图形表示一些 输入输出设备 ,比如鼠标键盘显示器等等。另外,注意到内存空间被划分为了两块,上半部分表示 用户空间 ,下半部分表示 内核空间 。
用户空间装着用户进程需要使用的资源,比如你在程序代码里开一个数组,这个数组肯定存在用户空间;内核空间存放内核进程需要加载的系统资源,这一些资源一般是不允许用户访问的。但是注意有的用户进程会共享一些内核空间的资源,比如一些动态链接库等等。
我们用 C 语言写一个 hello 程序,编译后得到一个可执行文件,在命令行运行就可以打印出一句 hello world,然后程序退出。在操作系统层面,就是新建了一个进程,这个进程将我们编译出来的可执行文件读入内存空间,然后执行,最后退出。
你编译好的那个可执行程序只是一个文件,不是进程,可执行文件必须要载入内存,包装成一个进程才能真正跑起来。进程是要依靠操作系统创建的,每个进程都有它的固有属性,比如进程号(PID)、进程状态、打开的文件等等,进程创建好之后,读入你的程序,你的程序才被系统执行。
那么,操作系统是如何创建进程的呢? 对于操作系统,进程就是一个数据结构 ,我们直接来看 Linux 的源码:
task_struct 就是 Linux 内核对于一个进程的描述,也可以称为「进程描述符」。源码比较复杂,我这里就截取了一小部分比较常见的。
我们主要聊聊 mm 指针和 files 指针。 mm 指向的是进程的虚拟内存,也就是载入资源和可执行文件的地方; files 指针指向一个数组,这个数组里装着所有该进程打开的文件的指针。
先说 files ,它是一个文件指针数组。一般来说,一个进程会从 files[0] 读取输入,将输出写入 files[1] ,将错误信息写入 files[2] 。
举个例子,以我们的角度 C 语言的 printf 函数是向命令行打印字符,但是从进程的角度来看,就是向 files[1] 写入数据;同理, scanf 函数就是进程试图从 files[0] 这个文件中读取数据。
每个进程被创建时, files 的前三位被填入默认值,分别指向标准输入流、标准输出流、标准错误流。我们常说的「文件描述符」就是指这个文件指针数组的索引 ,所以程序的文件描述符默认情况下 0 是输入,1 是输出,2 是错误。
我们可以重新画一幅图:
对于一般的计算机,输入流是键盘,输出流是显示器,错误流也是显示器,所以现在这个进程和内核连了三根线。因为硬件都是由内核管理的,我们的进程需要通过「系统调用」让内核进程访问硬件资源。
PS:不要忘了,Linux 中一切都被抽象成文件,设备也是文件,可以进行读和写。
如果我们写的程序需要其他资源,比如打开一个文件进行读写,这也很简单,进行系统调用,让内核把文件打开,这个文件就会被放到 files 的第 4 个位置,对应文件描述符 3:
明白了这个原理, 输入重定向 就很好理解了,程序想读取数据的时候就会去 files[0] 读取,所以我们只要把 files[0] 指向一个文件,那么程序就会从这个文件中读取数据,而不是从键盘:
同理, 输出重定向 就是把 files[1] 指向一个文件,那么程序的输出就不会写入到显示器,而是写入到这个文件中:
错误重定向也是一样的,就不再赘述。
管道符其实也是异曲同工,把一个进程的输出流和另一个进程的输入流接起一条「管道」,数据就在其中传递,不得不说这种设计思想真的很巧妙:
到这里,你可能也看出「Linux 中一切皆文件」设计思路的高明了,不管是设备、另一个进程、socket 套接字还是真正的文件,全部都可以读写,统一装进一个简单的 files 数组,进程通过简单的文件描述符访问相应资源,具体细节交于操作系统,有效解耦,优美高效。
首先要明确的是,多进程和多线程都是并发,都可以提高处理器的利用效率,所以现在的关键是,多线程和多进程有啥区别。
为什么说 Linux 中线程和进程基本没有区别呢,因为从 Linux 内核的角度来看,并没有把线程和进程区别对待。
我们知道系统调用 fork() 可以新建一个子进程,函数 pthread() 可以新建一个线程。 但无论线程还是进程,都是用 task_struct 结构表示的,唯一的区别就是共享的数据区域不同 。
换句话说,线程看起来跟进程没有区别,只是线程的某些数据区域和其父进程是共享的,而子进程是拷贝副本,而不是共享。就比如说, mm 结构和 files 结构在线程中都是共享的,我画两张图你就明白了:
所以说,我们的多线程程序要利用锁机制,避免多个线程同时往同一区域写入数据,否则可能造成数据错乱。
那么你可能问, 既然进程和线程差不多,而且多进程数据不共享,即不存在数据错乱的问题,为什么多线程的使用比多进程普遍得多呢 ?
因为现实中数据共享的并发更普遍呀,比如十个人同时从一个账户取十元,我们希望的是这个共享账户的余额正确减少一百元,而不是希望每人获得一个账户的拷贝,每个拷贝账户减少十元。
当然,必须要说明的是, 只有 Linux 系统将线程看做共享数据的进程 ,不对其做特殊看待 ,其他的很多操作系统是对线程和进程区别对待的,线程有其特有的数据结构,我个人认为不如 Linux 的这种设计简洁,增加了系统的复杂度。
在 Linux 中新建线程和进程的效率都是很高的,对于新建进程时内存区域拷贝的问题,Linux 采用了 copy-on-write 的策略优化,也就是并不真正复制父进程的内存空间,而是等到需要写操作时才去复制。 所以 Linux 中新建进程和新建线程都是很迅速的 。