大家好!我是Guide哥,Java后端开发。一个会一点前端,喜欢烹饪的自由少年。
今天这篇文章中简单介绍一下一个Java程序员必知的Linux的一些概念以及常见命令。
如果文章有任何需要改善和完善的地方,欢迎在评论区指出,共同进步!笔芯!
1.从认识操作系统开始
正式开始Linux之前,简单花一点点篇幅科普一下操作系统相关的内容。
1.1.操作系统简介
我通过以下四点介绍什么是操作系统:
操作系统(OperatingSystem,简称OS)是管理计算机硬件与软件资源的程序,是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序,用于管理计算机硬件和软件资源。举例:运行在你电脑上的所有应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。操作系统存在屏蔽了硬件层的复杂性。操作系统就像是硬件使用的负责人,统筹着各种相关事项。操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。内核(Kernel)在后文中会提到。
1.2.操作系统简单分类
1.2.1.Windows
目前最流行的个人桌面操作系统,不做多的介绍,大家都清楚。界面简单易操作,软件生态非常好。
玩玩电脑游戏还是必须要有Windows的,所以我现在是一台Windows用于玩游戏,一台Mac用于平时日常开发和学习使用。
1.2.2.Unix
最早的多用户、多任务操作系统。后面崛起的Linux在很多方面都参考了Unix。
目前这款操作系统已经逐渐逐渐退出操作系统的舞台。
1.2.3.Linux
Linux是一套免费使用、开源的类Unix操作系统。Linux存在着许多不同的发行版本,但它们都使用了Linux内核。
严格来讲,Linux这个词本身只表示Linux内核,在GNU/Linux系统中,Linux实际就是Linux内核,而该系统的其余部分主要是由GNU工程编写和提供的程序组成。单独的Linux内核并不能成为一个可以正常工作的操作系统。很多人更倾向使用“GNU/Linux”一词来表达人们通常所说的“Linux”。
1.2.4.MacOS
苹果自家的操作系统,编程体验和Linux相当,但是界面、软件生态以及用户体验各方面都要比Linux操作系统更好。
1.3.操作系统的内核(Kernel)
我们先来看看维基百科对于内核的解释,我觉得总结的非常好!
内核(英语:Kernel,又称核心)在计算机科学中是一个用来管理软件发出的数据I/O(输入与输出)要求的电脑程序,将这些要求转译为数据处理的指令并交由中央处理器(CPU)及电脑中其他电子组件进行处理,是现代操作系统中最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法,来完成这些操作。有了这个,通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及IO设备)。早期计算机系统的设计中,还没有操作系统的内核这个概念。随着计算机系统的发展,操作系统内核的概念才渐渐明晰起来了!
简单概括两点:
操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。操作系统的内核是连接应用程序和硬件的桥梁,决定着操作系统的性能和稳定性。1.4.中央处理器(CPU,CentralProcessingUnit)
关于CPU简单概括三点:
CPU是一台计算机的运算核心(Core)+控制核心(ControlUnit),可以称得上是计算机的大脑。CPU主要包括两个部分:控制器+运算器。CPU的根本任务就是执行指令,对计算机来说最终都是一串由“0”和“1”组成的序列。1.5.CPUvsKernel(内核)
很多人容易无法区分操作系统的内核(Kernel)和中央处理器(CPU),你可以简单从下面两点来区别:
操作系统的内核(Kernel)属于操作系统层面,而CPU属于硬件。CPU主要提供运算,处理各种指令的能力。内核(Kernel)主要负责系统管理比如内存管理,它屏蔽了对硬件的操作。下图清晰说明了应用程序、内核、CPU这三者的关系。
1.6.系统调用
介绍系统调用之前,我们先来了解一下用户态和系统态。
根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:
用户态(usermode):用户态运行的进程或可以直接读取用户程序的数据。系统态(kernelmode):可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。说了用户态和系统态之后,那么什么是系统调用呢?
我们运行的程序基本都是运行在用户态,如果我们调用操作系统提供的系统态级别的子功能咋办呢?那就需要系统调用了!
也就是说在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
这些系统调用按功能大致可分为如下几类:
设备管理:完成设备的请求或释放,以及设备启动等功能。文件管理:完成文件的读、写、创建及删除等功能。进程控制:完成进程的创建、撤销、阻塞及唤醒等功能。进程通信:完成进程之间的消息传递或信号传递等功能。内存管理:完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。我在网上找了一个图,通过这个图可以很清晰的说明用户程序、系统调用、内核和硬件之间的关系。(太难了~木有自己画)
2.初探Linux
2.1.Linux简介
我们上面已经简单了Linux,这里只强调三点。
类Unix系统:Linux是一种自由、开放源码的类似Unix的操作系统Linux本质是指Linux内核:严格来讲,Linux这个词本身只表示Linux内核,单独的Linux内核并不能成为一个可以正常工作的操作系统。所以,就有了各种Linux发行版。Linux之父:一个编程领域的传奇式人物,真大佬!我辈崇拜敬仰之楷模。他是Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首要架构师。他还发起了Git这个开源项目,并为主要的开发者。
2.2.Linux诞生
年,LinusTorvalds进入芬兰陆军新地区旅,服11个月的国家义务兵役,军衔为少尉,主要服务于计算机部门,任务是弹道计算。服役期间,购买了安德鲁·斯图尔特·塔能鲍姆所著的教科书及minix源代码,开始研究操作系统。年,他退伍后回到大学,开始接触Unix。
Minix是一个迷你版本的类Unix操作系统,由塔能鲍姆教授为了教学之用而创作,采用微核心设计。它启发了Linux内核的创作。
年,LinusTorvalds开源了Linux内核。Linux以一只可爱的企鹅作为标志,象征着敢作敢为、热爱生活。
2.3.常见Linux发行版本有哪些?
LinusTorvalds开源的只是Linux内核,我们上面也提到了操作系统内核的作用。一些组织或厂商将Linux内核与各种软件和文档包装起来,并提供系统安装界面和系统配置、设定与管理工具,就构成了Linux的发行版本。
内核主要负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。
Linux的发行版本可以大体分为两类:
商业公司维护的发行版本,以著名的RedHat为代表,比较典型的有CentOS。社区组织维护的发行版本,以Debian为代表,比较典型的有Ubuntu、Debian。对于初学者学习Linux,推荐选择CentOS。
3.Linux文件系统概览
3.1.Linux文件系统简介
在Linux操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。也就是说在Linux系统中有一个重要的概念:一切都是文件。
其实这是UNIX哲学的一个体现,在UNIX系统中,把一切资源都看作是文件,Linux的文件系统也是借鉴UNIX文件系统而来。
3.2.inode介绍
inode是linux/unix文件系统的基础。那么,inode是什么?有什么作用呢?
硬盘的最小存储单位是扇区(Sector),块(block)由多个扇区组成。文件数据存储在块中。块的最常见的大小是4kb,约为8个连续的扇区组成(每个扇区存储字节)。一个文件可能会占用多个block,但是一个块只能存放一个文件。
虽然,我们将文件存储在了块(block)中,但是我们还需要一个空间来存储文件的元信息metadata:如某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等。这种存储文件元信息的区域就叫inode,译为索引节点:i(index)+node。每个文件都有一个inode,存储文件的元信息。
可以使用stat命令可以查看文件的inode信息。每个inode都有一个号码,Linux/Unix操作系统不使用文件名来区分文件,而是使用inode号码区分不同的文件。
简单来说:inode就是用来维护某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等信息。
简单总结一下:
inode:记录文件的属性信息,可以使用stat命令查看inode信息。block:实际文件的内容,如果一个文件大于一个块时候,那么将占用多个block,但是一个块只能存放一个文件。(因为数据是由inode指向的,如果有两个文件的数据存放在同一个块中,就会乱套了)
3.3.Linux文件类型
Linux支持很多文件类型,其中非常重要的文件类型有:普通文件,目录文件,链接文件,设备文件,管道文件,Socket套接字文件等。
普通文件(-):用于存储信息和数据,Linux用户可以根据访问权限对普通文件进行查看、更改和删除。比如:图片、声音、PDF、text、视频、源代码等等。目录文件(d,directoryfile):目录也是文件的一种,用于表示和管理系统中的文件,目录文件中包含一些文件名和子目录名。打开目录事实上就是打开目录文件。符号链接文件(l,symboliclink):保留了指向文件的地址而不是文件本身。字符设备(c,char):用来访问字符设备比如硬盘。设备文件(b,block):用来访问块设备比如硬盘、软盘。管道文件(p,pipe):一种特殊类型的文件,用于进程之间的通信。套接字(s,socket):用于进程间的网络通信,也可以用于本机之间的非网络通信。3.4.Linux目录树
所有可操作的计算机资源都存在于目录树这个结构中,对计算资源的访问,可以看做是对这棵目录树的访问。
Linux的目录结构如下:
Linux文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:
常见目录说明:
/bin:存放二进制可执行文件(ls、cat、mkdir等),常用命令一般都在这里;/etc:存放系统管理和配置文件;/home:存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示;/usr:用于存放系统应用程序;/opt:额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里;/proc:虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;/root:超级用户(系统管理员)的主目录(特权阶级o);/sbin:存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等;/dev:用于存放设备文件;/mnt:系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;/boot:存放用于系统引导时使用的各种文件;/lib:存放着和系统运行相关的库文件;/tmp:用于存放各种临时文件,是公用的临时文件存储点;/var:用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;/lost+found:这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。4.Linux基本命令
下面只是给出了一些比较常用的命令。推荐一个Linux命令快查网站,非常不错,大家如果遗忘某些命令或者对某些命令不理解都可以在这里得到解决。
Linux命令大全: