Linux入门基础(which,whereis,bash,history,man,date,ls,cat,echo)(第2天)
1:计算机的基础知识:CPU(中央处理器),memory(内存),I/O(输入输出设备)
中央处理器 (英语:Central Processing Unit,缩写:CPU),是计算机的主要设备之一,功能主要是解释计算机指令以及处理计算机软件中的数据。计算机的可编程性主要是指对中央处理器的编程。中央处理器、内部存储器和输入/输出设备是现代电脑的三大核心部件。1970年代以前,中央处理器由多个独立单元构成,后来发展出由集成电路制造的中央处理器,这些高度收缩的组件就是所谓的微处理器,其中分出的的中央处理器最为复杂的电路可以做成单一微小功能强大的单元。
中央处理器广义上指一系列可以执行复杂的计算机程序的逻辑机器。这个空泛的定义很容易地将在“CPU”这个名称被普遍使用之前的早期计算机也包括在内。无论如何,至少从1960年代早期开始(Weik 1961),这个名称及其缩写已开始在电子计算机产业中得到广泛应用。尽管与早期相比,“中央处理器”在物理形态、设计制造和具体任务的执行上有了极大的发展,但是其基本的操作原理一直没有改变。
早期的中央处理器通常是为大型及特定应用的计算机而定制。但是,这种昂贵的为特定应用定制CPU的方法很大程度上已经让位于开发便宜、标准化、适用于一个或多个目的的处理器类。这个标准化趋势始于由单个晶体管组成的大型机和微机年代,随着集成电路的出现而加速。IC使得更为复杂的中央处理器可以在很小的空间中设计和制造(在微米的数量级)。中央处理器的标准化和小型化都使得这一类数字设备和电子零件在现代生活中的出现频率远远超过有限应用专用的计算机。现代微处理器出现在包括从汽车到手机到儿童玩具在内的各种物品中。
运算器:算术、逻辑(部件:算术逻辑单元、累加器、寄存器组、路径转换器、数据总线)
控制器:复位、使能(部件:计数器、指令寄存器、指令解码器、状态寄存器、时钟发生器、微操作信号发生器)
Memory:随机存取存储器(英语:Random Access Memory,RAM),是与CPU直接交换数据的内部存储器,也叫主存。[1]它可以随时读写(刷新时除外,见下文),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。
主存(Main memory)即电脑内部最主要的存储器,用来加载各式各样的程序与数据以供CPU直接运行与运用。由于DRAM的性价比很高,且扩展性也不错,是现今一般电脑主存的最主要部分。2014年生产电脑所用的主存主要是DDR3 SDRAM,而2016年开始DDR4 SDRAM逐渐普及化,笔电厂商如华硕及宏碁开始在笔电以DDR4存储器取代DDR3L。
I/O:输入输出设备(I/O)是对将外部世界信息发送给计算机的设备和将处理结果返回给外部世界的设备的总称。 这些返回结果可能是作为用户能够视觉上体验的,或是作为该计算机所控制的其他设备的输入:对于一部机器人,控制计算机的输出基本上就是这部机器人本身,如做出各种行为。
第一代计算机的输入输出设备种类非常有限。通常的输入用设备是打孔卡片的读卡机,用来将指令和数据导入内存;而用于存储结果的输出设备则一般是磁带。随着科技的进步,输入输出设备的丰富性得到提高。以个人计算机为例:键盘和鼠标是用户向计算机直接输入信息的主要工具,而显示器、打印机、扩音器、耳机则返回处理结果。此外还有许多输入设备可以接受其他不同种类的信息,如数码相机可以输入图像。在输入输出设备中,有两类很值得注意:第一类是二级存储设备,如硬盘,光盘或其他速度缓慢但拥有很高容量的设备。第二个是计算机网络访问设备,通过他们而实现的计算机间直接数据传送极大地提升了计算机的价值。今天,国际互联网成就了数以千万计的计算机彼此间传送各种类型的数据。
2:计算机程序的运行模式:用户空间和内核空间
linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。
Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。从图中可以看出(这里无法表示图),每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。
内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。
虽然内核空间占据了每个虚拟空间中的最高1GB字节,但映射到物理内存却总是从最低地址(0x00000000)开始。对内核空间来说,其地址映射是很简单的线性映射,0xC0000000就是物理地址与线性地址之间的位移量,在Linux代码中就叫做PAGE_OFFSET。
内核空间和用户空间之间如何进行通讯?
内核空间和用户空间一般通过系统调用进行通信。
如何判断一个驱动是用户模式驱动还是内核模式驱动? 判断的标准是什么?
用户空间模式的驱动一般通过系统调用来完成对硬件的访问,如通过系统调用将驱动的io空间映射到用户空间等。因此,主要的判断依据就是系统调用。
内核空间和用户空间上不同太多了,说不完,比如用户态的链表和内核链表不一样;用户态用printf,内核态用printk;用户态每个应用程序空间是虚拟的,相对独立的,内核态中却不是独立的,所以编程要非常小心。等等。
还有用户态和内核态程序通讯的方法很多,不单单是系统调用,实际上系统调用是个不好的选择,因为需要系统调用号,这个需要统一分配。
可以通过ioctl、sysfs、proc等来完成。
内核态和用户态
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。
进程上下文和中断上下文
处理器总处于以下状态中的一种:
1、内核态,运行于进程上下文,内核代表进程运行于内核空间;
2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;
3、用户态,运行于用户空间。
用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。
硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。
3:可移植操作系统规范
移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。
Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。[1]
微软的Windows NT声称部分实现了POSIX标准。[2]
当前的POSIX主要分为四个部分[3]:Base Definitions、System Interfaces、Shell and Utilities和Rationale。
4:计算机程序的格式
不同的操作系统使用不用的格式,Windows是使用exe格式,unix-like和linux则是使用ELF标准。
EXE File 可执行程序 一种可在操作系统存储空间中浮动定位的可执行程序。MS-DOS和MS-WINDOWS下,此类文件扩展名为.exe。
WINDOWS操作系统中的二进制可执行文件,可执行文件分两种一种是后辍名为.COM另一种就是.EXE 了。
.COM一般用于DOS,在WINDOWS系统中的执行文件一般都是·EXE文件在 MS-DOS 中,用以标识可执行文件的文件扩展名。用户在提示行中输入不带 .exe扩展名的文件名后按 Enter 键就能运行可执行程序。
可执行和可链接格式 (英语:Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档、目的档、共享库和核心转储的标准文件格式,一般用于unix-like和linux中。
1999年,被86open项目选为x86架构上的类Unix操作系统的二进制文件格式标准,用来取代COFF。因其可扩展性与灵活性,也可应用在其它处理器、计算机系统架构的操作系统上。
5:计算机程序的构成
计算机程序是由指令加数据组成的。其中指令是只读的,数据则是可读写的。
6:系统调用(syscall),库调用
操作系统对于底层硬件的封装来为上层应用程序提供可被调用的功能。这就说明syscall和系统库是用来为上层应用服务的。例如:malloc(),free()函数等。
7:计算机编程语言的发展
汇编语言:也被称为微码编程,主要用于系统中某些与硬件相关的特有代码,驱动开发等。
高级语言c/c++:系统级应用,驱动程序等。
高级应用语言:java,python,php,javascript等,用来构建上层应用程序。
8:Linux发行版
Linux主要有3大发行版,分别是slackware,debian和redhat。其中基于slackware的比较著名的有suse发行版。基于Debian的有Ubuntu和linux mint等。redhat发行版分为企业版RHEL和桌面版fedora,其中CentOS是RHEL的社区版,目前已经被redhat公司收购。其他的还有,ArchLinux,Gentoo和LFS(Linux From Scratch)等其他发行版。
9:程序包管理器
这里只是稍微提及,后续文章会有详细介绍以及使用。
主要有2大类程序包管理器,RPM包和dpt包。
RPM:使用该程序包管理器的linux发行版有RHEL,Fedora,S.u.S.E,CentOS
DPT:使用该程序包管理器的linux发行版的主要是Debian这一分支的,比如Debian,Ubuntu,kali linux等。
10:自由软件的定义
中央处理器 (英语:Central Processing Unit,缩写:CPU),是计算机的主要设备之一,功能主要是解释计算机指令以及处理计算机软件中的数据。计算机的可编程性主要是指对中央处理器的编程。中央处理器、内部存储器和输入/输出设备是现代电脑的三大核心部件。1970年代以前,中央处理器由多个独立单元构成,后来发展出由集成电路制造的中央处理器,这些高度收缩的组件就是所谓的微处理器,其中分出的的中央处理器最为复杂的电路可以做成单一微小功能强大的单元。
中央处理器广义上指一系列可以执行复杂的计算机程序的逻辑机器。这个空泛的定义很容易地将在“CPU”这个名称被普遍使用之前的早期计算机也包括在内。无论如何,至少从1960年代早期开始(Weik 1961),这个名称及其缩写已开始在电子计算机产业中得到广泛应用。尽管与早期相比,“中央处理器”在物理形态、设计制造和具体任务的执行上有了极大的发展,但是其基本的操作原理一直没有改变。
早期的中央处理器通常是为大型及特定应用的计算机而定制。但是,这种昂贵的为特定应用定制CPU的方法很大程度上已经让位于开发便宜、标准化、适用于一个或多个目的的处理器类。这个标准化趋势始于由单个晶体管组成的大型机和微机年代,随着集成电路的出现而加速。IC使得更为复杂的中央处理器可以在很小的空间中设计和制造(在微米的数量级)。中央处理器的标准化和小型化都使得这一类数字设备和电子零件在现代生活中的出现频率远远超过有限应用专用的计算机。现代微处理器出现在包括从汽车到手机到儿童玩具在内的各种物品中。
运算器:算术、逻辑(部件:算术逻辑单元、累加器、寄存器组、路径转换器、数据总线)
控制器:复位、使能(部件:计数器、指令寄存器、指令解码器、状态寄存器、时钟发生器、微操作信号发生器)
Memory:随机存取存储器(英语:Random Access Memory,RAM),是与CPU直接交换数据的内部存储器,也叫主存。[1]它可以随时读写(刷新时除外,见下文),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。
主存(Main memory)即电脑内部最主要的存储器,用来加载各式各样的程序与数据以供CPU直接运行与运用。由于DRAM的性价比很高,且扩展性也不错,是现今一般电脑主存的最主要部分。2014年生产电脑所用的主存主要是DDR3 SDRAM,而2016年开始DDR4 SDRAM逐渐普及化,笔电厂商如华硕及宏碁开始在笔电以DDR4存储器取代DDR3L。
I/O:输入输出设备(I/O)是对将外部世界信息发送给计算机的设备和将处理结果返回给外部世界的设备的总称。 这些返回结果可能是作为用户能够视觉上体验的,或是作为该计算机所控制的其他设备的输入:对于一部机器人,控制计算机的输出基本上就是这部机器人本身,如做出各种行为。
第一代计算机的输入输出设备种类非常有限。通常的输入用设备是打孔卡片的读卡机,用来将指令和数据导入内存;而用于存储结果的输出设备则一般是磁带。随着科技的进步,输入输出设备的丰富性得到提高。以个人计算机为例:键盘和鼠标是用户向计算机直接输入信息的主要工具,而显示器、打印机、扩音器、耳机则返回处理结果。此外还有许多输入设备可以接受其他不同种类的信息,如数码相机可以输入图像。在输入输出设备中,有两类很值得注意:第一类是二级存储设备,如硬盘,光盘或其他速度缓慢但拥有很高容量的设备。第二个是计算机网络访问设备,通过他们而实现的计算机间直接数据传送极大地提升了计算机的价值。今天,国际互联网成就了数以千万计的计算机彼此间传送各种类型的数据。
2:计算机程序的运行模式:用户空间和内核空间
linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。
Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。从图中可以看出(这里无法表示图),每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。
内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。
虽然内核空间占据了每个虚拟空间中的最高1GB字节,但映射到物理内存却总是从最低地址(0x00000000)开始。对内核空间来说,其地址映射是很简单的线性映射,0xC0000000就是物理地址与线性地址之间的位移量,在Linux代码中就叫做PAGE_OFFSET。
内核空间和用户空间之间如何进行通讯?
内核空间和用户空间一般通过系统调用进行通信。
如何判断一个驱动是用户模式驱动还是内核模式驱动? 判断的标准是什么?
用户空间模式的驱动一般通过系统调用来完成对硬件的访问,如通过系统调用将驱动的io空间映射到用户空间等。因此,主要的判断依据就是系统调用。
内核空间和用户空间上不同太多了,说不完,比如用户态的链表和内核链表不一样;用户态用printf,内核态用printk;用户态每个应用程序空间是虚拟的,相对独立的,内核态中却不是独立的,所以编程要非常小心。等等。
还有用户态和内核态程序通讯的方法很多,不单单是系统调用,实际上系统调用是个不好的选择,因为需要系统调用号,这个需要统一分配。
可以通过ioctl、sysfs、proc等来完成。
内核态和用户态
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。
进程上下文和中断上下文
处理器总处于以下状态中的一种:
1、内核态,运行于进程上下文,内核代表进程运行于内核空间;
2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;
3、用户态,运行于用户空间。
用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。
硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。
3:可移植操作系统规范
移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。
Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。[1]
微软的Windows NT声称部分实现了POSIX标准。[2]
当前的POSIX主要分为四个部分[3]:Base Definitions、System Interfaces、Shell and Utilities和Rationale。
4:计算机程序的格式
不同的操作系统使用不用的格式,Windows是使用exe格式,unix-like和linux则是使用ELF标准。
EXE File 可执行程序 一种可在操作系统存储空间中浮动定位的可执行程序。MS-DOS和MS-WINDOWS下,此类文件扩展名为.exe。
WINDOWS操作系统中的二进制可执行文件,可执行文件分两种一种是后辍名为.COM另一种就是.EXE 了。
.COM一般用于DOS,在WINDOWS系统中的执行文件一般都是·EXE文件在 MS-DOS 中,用以标识可执行文件的文件扩展名。用户在提示行中输入不带 .exe扩展名的文件名后按 Enter 键就能运行可执行程序。
可执行和可链接格式 (英语:Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档、目的档、共享库和核心转储的标准文件格式,一般用于unix-like和linux中。
1999年,被86open项目选为x86架构上的类Unix操作系统的二进制文件格式标准,用来取代COFF。因其可扩展性与灵活性,也可应用在其它处理器、计算机系统架构的操作系统上。
5:计算机程序的构成
计算机程序是由指令加数据组成的。其中指令是只读的,数据则是可读写的。
6:系统调用(syscall),库调用
操作系统对于底层硬件的封装来为上层应用程序提供可被调用的功能。这就说明syscall和系统库是用来为上层应用服务的。例如:malloc(),free()函数等。
7:计算机编程语言的发展
汇编语言:也被称为微码编程,主要用于系统中某些与硬件相关的特有代码,驱动开发等。
高级语言c/c++:系统级应用,驱动程序等。
高级应用语言:java,python,php,javascript等,用来构建上层应用程序。
8:Linux发行版
Linux主要有3大发行版,分别是slackware,debian和redhat。其中基于slackware的比较著名的有suse发行版。基于Debian的有Ubuntu和linux mint等。redhat发行版分为企业版RHEL和桌面版fedora,其中CentOS是RHEL的社区版,目前已经被redhat公司收购。其他的还有,ArchLinux,Gentoo和LFS(Linux From Scratch)等其他发行版。
9:程序包管理器
这里只是稍微提及,后续文章会有详细介绍以及使用。
主要有2大类程序包管理器,RPM包和dpt包。
RPM:使用该程序包管理器的linux发行版有RHEL,Fedora,S.u.S.E,CentOS
DPT:使用该程序包管理器的linux发行版的主要是Debian这一分支的,比如Debian,Ubuntu,kali linux等。
10:自由软件的定义
自由使用;自由学习和修改;自由分发;自由创建衍生版;自由不代表免费
11:Linux的哲学思想
1、一切皆文件;
把几乎所有资源,包括硬件设备都组织为文件格式;
2、由众多单一目的小程序组成;
一个程序只实现一个功能,而且要做好;组合小程序完成复杂任务;
3、尽量避免跟用户交互;
目标:实现脚本编程,以自动完成某些功能;
4、使用纯文本文件保存配置信息;
目标:一款使用的文本编程器即能完成系统配置工作;
12:如何获取linux的发行版
这里提供几个镜像网站地址
阿里云开源镜像:http://mirrors.aliyun.com/
网易开源镜像: http://mirrors.163.com/
搜狐开源镜像: http://mirrors.sohu.com/
中科大开源镜像:https://mirrors.ustc.edu.cn/ 笔者最喜欢用
13:如何进入Linux图形界面
startx &命令即可进入图形界面,如果你的linux的图形界面是KDE,则命令是startkde &
14:终端介绍
终端:用户与主机交互,必然用到的设备;
终端可以分为物理终端,虚拟终端,模拟终端。
物理终端:直接接入本机的显示器和键盘设备;对应的设备文件是/dev/console
虚拟终端:附加在物理终端之上的以软件方式虚拟实现的终端,CentOS 6默认启动6个虚拟终端,快捷键为Ctrl+Alt+F#: [1,6] (本系列播客中的#表示数字)
图形终端:附加在物理终端之上的以软件方式虚拟实现的终端,但额外会提供桌面环境;
虚拟终端对应的设备文件路径:/dev/tty#
模拟终端:图形界面下打开的命令行接口,或者基于ssh协议或telnet协议等远程打开的界面
设备文件:/dev/pts/# [0,oo)
查看当前的终端设备的命令:tty
shell搜寻到的命令的路径会缓存至key-value结构中。可以使用hash命令查看
上面的命中表示右边的命令共执行了几次。
命令不但会被hash处理,而且还会被记录下来。history命令可以保存命令历史。
登录shell时,会读取命令历史文件中记录下的命令:~/.bash_history
登录进shell后新执行的命令只会记录在缓存中;这些命令会在用户退出时“追加”至命令历史文件中;
history:
-a: 追加本次会话新执行的命令历史列表至历史文件中;
-d: 删除历史中指定的命令;例如history -c 40
-c: 清空命令历史;
快捷操作:
!#: 调用历史中第#条命令;
!string:调用历史中最近一个以string开头的命令;
!!: 上一条命令
12:如何获取linux的发行版
这里提供几个镜像网站地址
阿里云开源镜像:http://mirrors.aliyun.com/
网易开源镜像: http://mirrors.163.com/
搜狐开源镜像: http://mirrors.sohu.com/
中科大开源镜像:https://mirrors.ustc.edu.cn/ 笔者最喜欢用
13:如何进入Linux图形界面
startx &命令即可进入图形界面,如果你的linux的图形界面是KDE,则命令是startkde &
14:终端介绍
终端:用户与主机交互,必然用到的设备;
终端可以分为物理终端,虚拟终端,模拟终端。
物理终端:直接接入本机的显示器和键盘设备;对应的设备文件是/dev/console
虚拟终端:附加在物理终端之上的以软件方式虚拟实现的终端,CentOS 6默认启动6个虚拟终端,快捷键为Ctrl+Alt+F#: [1,6] (本系列播客中的#表示数字)
图形终端:附加在物理终端之上的以软件方式虚拟实现的终端,但额外会提供桌面环境;
虚拟终端对应的设备文件路径:/dev/tty#
模拟终端:图形界面下打开的命令行接口,或者基于ssh协议或telnet协议等远程打开的界面
设备文件:/dev/pts/# [0,oo)
查看当前的终端设备的命令:tty
15:Linux交互式接口
人机如何交互?
答:启动终端后,在终端设备会附加一个交互式应用程序。Linux提供了2种交互式接口,分别是GUI(Graphical User Interface图形用户界面)和CLI(command-line interface命令行界面)。
Linux的桌面系统主流的有GNOME,KDE和XFCE。其中,GNOME使用GTK类库开发的,KDE是使用QT类库开发的,XFCE则是面向轻量级的桌面系统,消耗资源比较小。
CLI 命令行界面一般会提供shell,用于用户向操作系统发送命令。Linux上支持的shell很丰富,有sh,csh,tcsh,ksh,bash,zsh,其中最常用的是bash。本博客也是基于bash,候旭文章无特别说明的话,都是表示bash。
那么如何显示当前使用的shell呢?
# echo ${SHELL} 命令可以显示当前会话使用的shell,SHELL是环境变量,所以这里用$符号引用
显示当前系统支持的所有shell
# cat /etc/shells
16:命令提示符:prompt
linux的命令提示符是由PS1这个环境变量定义的。
root@kali:~# #号前面的就是表示命令提示符
管理员:显示为#
普通用户:显示为$
17:命令
在终端中输入命令,并按回车表示提请shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来;表现为一个或多个进程。
在shell中可执行的命令有两类:
内建命令:由shell自带的,而且通过某命令形式提供;
外部命令:在当前系统的某文件系统路径下有对应的可执行程序文件;
which,whereis可以查看外部命令存放在哪个路径下
区别内部或外部命令:
# type COMMAND 此命令可以区分出命令是属于shell内建或者是属于外部命令
比如:
如上可以看到cd命令是shel内建的,而netstat则是bin目录下的可执行文件(用于查看网络状态)。
Linux命令的格式是如何的?
COMMAND [OPTIONS...] [ARGUMENTS...]
选项:用于启用或关闭命令的某个或某些功能;
短选项:-c, 例如:-l, -h。多个短选项可合并使用,例如-l -h, 可写作-lh;
长选项:--word,例如:--long, --human-readable
参数:命令的作用对象
注意:
1、多选项,以及多参数和命令之间都应该使用空白字符分隔
2、取消命令执行:Ctrl+c
比如:
人机如何交互?
答:启动终端后,在终端设备会附加一个交互式应用程序。Linux提供了2种交互式接口,分别是GUI(Graphical User Interface图形用户界面)和CLI(command-line interface命令行界面)。
Linux的桌面系统主流的有GNOME,KDE和XFCE。其中,GNOME使用GTK类库开发的,KDE是使用QT类库开发的,XFCE则是面向轻量级的桌面系统,消耗资源比较小。
CLI 命令行界面一般会提供shell,用于用户向操作系统发送命令。Linux上支持的shell很丰富,有sh,csh,tcsh,ksh,bash,zsh,其中最常用的是bash。本博客也是基于bash,候旭文章无特别说明的话,都是表示bash。
那么如何显示当前使用的shell呢?
# echo ${SHELL} 命令可以显示当前会话使用的shell,SHELL是环境变量,所以这里用$符号引用
显示当前系统支持的所有shell
# cat /etc/shells
16:命令提示符:prompt
linux的命令提示符是由PS1这个环境变量定义的。
root@kali:~# #号前面的就是表示命令提示符
管理员:显示为#
普通用户:显示为$
在终端中输入命令,并按回车表示提请shell程序找到键入命令所对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来;表现为一个或多个进程。
在shell中可执行的命令有两类:
内建命令:由shell自带的,而且通过某命令形式提供;
外部命令:在当前系统的某文件系统路径下有对应的可执行程序文件;
which,whereis可以查看外部命令存放在哪个路径下
区别内部或外部命令:
# type COMMAND 此命令可以区分出命令是属于shell内建或者是属于外部命令
比如:
如上可以看到cd命令是shel内建的,而netstat则是bin目录下的可执行文件(用于查看网络状态)。
Linux命令的格式是如何的?
COMMAND [OPTIONS...] [ARGUMENTS...]
选项:用于启用或关闭命令的某个或某些功能;
短选项:-c, 例如:-l, -h。多个短选项可合并使用,例如-l -h, 可写作-lh;
长选项:--word,例如:--long, --human-readable
参数:命令的作用对象
注意:
1、多选项,以及多参数和命令之间都应该使用空白字符分隔
2、取消命令执行:Ctrl+c
比如:
18:文件系统
linux的文件系统是用于对文件的操作,比如创建,删除,管理文件等等。文件系统属于操作系统的功能之一,不同的操作系统对文件系统功能的实现可能不一样,但是基本目的都是为了管理文件。
C:\Program files\office11\word\word.exe 这是Windows文件的路径结构,相比于Windwos,linux的文件结构始于根目录,/etc/sysconfig/network-scripts/ifcfg-eth0,此文件表示以太网卡的配置文件。每一个文件都有2类数据,分别是普通的文件内容数据和文件的元数据(metadata),元数据表示文件的属性,比如文件创建的时间戳,文件是否可执行,文件大小等等,这些元数据都需要文件系统功能进行实现。
linux的文件名有4大主要要点:
1:文件名严格区分字符大小写;file1, File1, FILE1是不同的文件;
2:文件名可使用除/以外的任意字符,不建议使用特殊字符;/表示根目录,也表示路径分隔符;
3:文件名长度最长不能超过255个字符;
4:所有.开头的文件,均为隐藏文件;
19:路径
路径分为绝对路径和相对路径。
绝对路径:从根目录起始的路径;
相对路径:对当前位置起始的路径;
比如当前位置的表示方式:
(1) ./: ./sysconfig/network-scripts
(2) 省略上述符号./ : sysconfig/network-scripts
..:表示当前目录的上一级目录
当前目录,在linux中也被称为工作目录(working directory),可以使用pwd命令查看当前的工作目录。
比如:
笔者目前所处目录就是/etc/apache2目录下
linux的根目录下的结构由LSB(Linux Standard Base )规定。后续文章会有详解。
20:linux命令帮助的获取
linux的命令相当丰富,多达上千个命令可以用于管理linux,并不好记忆。很多时候必须要有一个好的方法来可以随时获取某一个命令的帮助文档。还记得上文说过linux的命令分为内建命令和外部命令吗,首先来说说外部命令,每一个外部命令都对应于一个可执行文件,位于文件系统某目录下。如果不知道某个命令在哪个目录下,可以使用which命令和whereis命令可以获取命令所在路径。
比如:
当你输入cat这个命令的时候,系统如何知道到哪里查找cat这个命令呢?这里还必须讲解一个环境变量,PATH。首先系统会检视PATH这个环境变量,因为该环境变量保存了搜寻可执行程序文件的路径。
如此一来,上面的which cat也是先查看PATH这个环境变量里的目录,并且是从左到右的顺序来查看cat命令在哪个目录下,找到即停止。
内部命令获取帮组的方式如下
# help COMMAND
外部命令获取帮助的方式比较多
(1) # COMMAND --help
# COMMAND -h
(2) 使用手册(manual)
# man COMMAND
(3) 信息页
# info COMMAND
(4) 程序自身的帮助文档
README
INSTALL
ChangeLog
(5) 程序官方文档
官方站点:Documentation
(6) 发行版的官方文档
(7) Google
linux的文件系统是用于对文件的操作,比如创建,删除,管理文件等等。文件系统属于操作系统的功能之一,不同的操作系统对文件系统功能的实现可能不一样,但是基本目的都是为了管理文件。
C:\Program files\office11\word\word.exe 这是Windows文件的路径结构,相比于Windwos,linux的文件结构始于根目录,/etc/sysconfig/network-scripts/ifcfg-eth0,此文件表示以太网卡的配置文件。每一个文件都有2类数据,分别是普通的文件内容数据和文件的元数据(metadata),元数据表示文件的属性,比如文件创建的时间戳,文件是否可执行,文件大小等等,这些元数据都需要文件系统功能进行实现。
linux的文件名有4大主要要点:
1:文件名严格区分字符大小写;file1, File1, FILE1是不同的文件;
2:文件名可使用除/以外的任意字符,不建议使用特殊字符;/表示根目录,也表示路径分隔符;
3:文件名长度最长不能超过255个字符;
4:所有.开头的文件,均为隐藏文件;
19:路径
路径分为绝对路径和相对路径。
绝对路径:从根目录起始的路径;
相对路径:对当前位置起始的路径;
比如当前位置的表示方式:
(1) ./: ./sysconfig/network-scripts
(2) 省略上述符号./ : sysconfig/network-scripts
..:表示当前目录的上一级目录
当前目录,在linux中也被称为工作目录(working directory),可以使用pwd命令查看当前的工作目录。
比如:
笔者目前所处目录就是/etc/apache2目录下
linux的根目录下的结构由LSB(Linux Standard Base )规定。后续文章会有详解。
20:linux命令帮助的获取
linux的命令相当丰富,多达上千个命令可以用于管理linux,并不好记忆。很多时候必须要有一个好的方法来可以随时获取某一个命令的帮助文档。还记得上文说过linux的命令分为内建命令和外部命令吗,首先来说说外部命令,每一个外部命令都对应于一个可执行文件,位于文件系统某目录下。如果不知道某个命令在哪个目录下,可以使用which命令和whereis命令可以获取命令所在路径。
比如:
当你输入cat这个命令的时候,系统如何知道到哪里查找cat这个命令呢?这里还必须讲解一个环境变量,PATH。首先系统会检视PATH这个环境变量,因为该环境变量保存了搜寻可执行程序文件的路径。
如此一来,上面的which cat也是先查看PATH这个环境变量里的目录,并且是从左到右的顺序来查看cat命令在哪个目录下,找到即停止。
内部命令获取帮组的方式如下
# help COMMAND
外部命令获取帮助的方式比较多
(1) # COMMAND --help
# COMMAND -h
(2) 使用手册(manual)
# man COMMAND
(3) 信息页
# info COMMAND
(4) 程序自身的帮助文档
README
INSTALL
ChangeLog
(5) 程序官方文档
官方站点:Documentation
(6) 发行版的官方文档
(7) Google
shell搜寻到的命令的路径会缓存至key-value结构中。可以使用hash命令查看
上面的命中表示右边的命令共执行了几次。
命令不但会被hash处理,而且还会被记录下来。history命令可以保存命令历史。
登录shell时,会读取命令历史文件中记录下的命令:~/.bash_history
登录进shell后新执行的命令只会记录在缓存中;这些命令会在用户退出时“追加”至命令历史文件中;
history:
-a: 追加本次会话新执行的命令历史列表至历史文件中;
-d: 删除历史中指定的命令;例如history -c 40
-c: 清空命令历史;
快捷操作:
!#: 调用历史中第#条命令;
!string:调用历史中最近一个以string开头的命令;
!!: 上一条命令
以上请读者自行实验验证。
下面详细介绍外部命令的使用帮助:
(1) # COMMAND --help
(2) man COMMAND
手册位于/usr/share/man/目录下,该目录下的手册是分章节的。
man1:表示用户命令
man2:表示系统调用
man3:表示C库调用
man4:表示设备文件以及特殊文件
man5:表示配置文件格式
man6:表示游戏
man7:表示杂项
man8:表示管理类命令
要查看指定章节的手册可以使用 man # COMMAND
man命令带有一个配置文件 /etc/man.config或者/etc/manpath.config
# man -M /PATH/TO/SOMEWHERE COMMAND: 到指定位置下搜索COMMAND命令的手册页并显示之;
帮助手册中的内容主要由以下段落组成:
NAME
SYNOPSIS
DESCRIPTION
OPTIONS
EXAMPLES
AUTHOR
REPORTING BUGS
SEE ALSO
下面详细介绍外部命令的使用帮助:
(1) # COMMAND --help
手册位于/usr/share/man/目录下,该目录下的手册是分章节的。
man1:表示用户命令
man2:表示系统调用
man3:表示C库调用
man4:表示设备文件以及特殊文件
man5:表示配置文件格式
man6:表示游戏
man7:表示杂项
man8:表示管理类命令
要查看指定章节的手册可以使用 man # COMMAND
man命令带有一个配置文件 /etc/man.config或者/etc/manpath.config
# man -M /PATH/TO/SOMEWHERE COMMAND: 到指定位置下搜索COMMAND命令的手册页并显示之;
帮助手册中的内容主要由以下段落组成:
NAME
SYNOPSIS
DESCRIPTION
OPTIONS
EXAMPLES
AUTHOR
REPORTING BUGS
SEE ALSO
SYNOPSIS中有些符号有必要提及下:
[]:可选内容
<>: 必选内容
a|b:二选一
...: 同一内容可出现多次
man命令的操作方法:
pace, ^V, ^f, ^F: 向文件尾翻屏;(^表示ctrl)
b, ^B: 向文件首部翻屏;
d, ^D: 向文件尾部翻半屏;
u, ^U: 向文件首部翻半屏;
RETURN, ^N, e, ^E or j or ^J: 向文件尾部翻一行;
y or ^Y or ^P or k or ^K:向文件首部翻一行;
q: 退出;
#:跳转至第#行;
1G: 回到文件首部
G:翻至文件尾部
文本搜索:
/KEYWORD: 以KEYWORD指定的字符串为关键字,从当前位置向文件尾部搜索;不区分字符大小写;n: 下一个 N:上一个
?KEYWORD:以KEYWORD指定的字符串为关键字,从当前位置向文件首部搜索;不区分字符大小写;n: 跟搜索命令同方向,下一个 N:跟搜索命令反方向,上一个
(3) info
info COMMAND
(4) 程序自身的帮助文档
/usr/share/doc/COMMAND-VERSION
(5) 程序官方文档
(6) 发行版的官方文档
http://www.redhat.com/docs
(7) Google
(8) slideshare
http://www.slideshare.net/
21:data命令的使用
data可以用于显示时间,也可以用于设置时间
date [OPTION]... [+FORMAT]:用于显示
FORMAT: 格式符号
%D
%F
%T
例子:echo “today is `date +%F--%T`”
date [MMDDhhmm[[CC]YY][.ss]]:用于设置
MM: 月分
DD:几号
hh: 小时
mm: 分钟
YY: 两位年份
CCYY: 四位年份
.ss: 秒钟
例子:date 060423561989.23 设置时间为1989年6月4号23点56分23秒
data可以用于显示时间,也可以用于设置时间
date [OPTION]... [+FORMAT]:用于显示
FORMAT: 格式符号
%D
%F
%T
例子:echo “today is `date +%F--%T`”
date [MMDDhhmm[[CC]YY][.ss]]:用于设置
MM: 月分
DD:几号
hh: 小时
mm: 分钟
YY: 两位年份
CCYY: 四位年份
.ss: 秒钟
例子:date 060423561989.23 设置时间为1989年6月4号23点56分23秒
linux有2中时钟,分别是硬件时钟和系统时钟。
硬件时钟:硬件级的时钟,准确性高
系统时钟:由Linux内核通过CPU的工作频率进行的计时
hwclock:用于显示硬件时钟
-s, --hctosys 以硬件时钟为准
-w, --systohc 以系统时钟为准
cal:查看日历的命令
22:目录相关
每个用户都有一个主目录,也叫做家目录。
root用户的主目录为 /root
普通用户的主目录为 /home/USERNAME
~ :此符号表示用户的主目录
cd命令详解:
硬件时钟:硬件级的时钟,准确性高
系统时钟:由Linux内核通过CPU的工作频率进行的计时
hwclock:用于显示硬件时钟
-s, --hctosys 以硬件时钟为准
-w, --systohc 以系统时钟为准
cal:查看日历的命令
22:目录相关
每个用户都有一个主目录,也叫做家目录。
root用户的主目录为 /root
普通用户的主目录为 /home/USERNAME
~ :此符号表示用户的主目录
cd命令详解:
cd 或 cd ~: 回当前用户的主目录
cd ~USERNAME: 切换至指定用户的主目录
cd -: 在上一个目录和当前目录之间来回切换
相关的环境变量:
PWD:保存了当前目录路径;
OLDPWD:上一次所在目录路径;
cd ~USERNAME: 切换至指定用户的主目录
cd -: 在上一个目录和当前目录之间来回切换
相关的环境变量:
PWD:保存了当前目录路径;
OLDPWD:上一次所在目录路径;
23:ls命令详解
ls用于显示指定路径下的文件列表;
ls [OPTION]... [DIR]...
-a, --all: 显示所有文件,包括隐藏文件(.开头的文件);
-l: 长格式
-rw-r--r-- 1 root root 44800 Aug 14 14:32 install.log
第1位表示文件类型,-(普通文件), d(目录), l(链接文件), b(块设备文件), c(字符设备文件), p(管道文件), s(socket文件),后续会有详细介绍。
rw-r--r--表示权限相关,3个一组,rw-表示文件的属主对此文件的权限,中间r--表示文件的属组对此文件的权限,最后的r--表示其他用户对此文件的权限
数字1表示文件被硬链接的次数
root root分别表示文件的属主(owner)和文件的属组(group)
44800表示文件的size
Aug 14 14:32表示文件最近一次被修改的时间
install.log 表示文件名
25:file命令,查看文件内容的类型
file /PATH/TO/SOMEWHERE
26:echo命令
-n: 禁止自动添加换行符号;
-e: 允许使用转义符;
\n: 换行
\t: 制表符
例子:cat -e "today\n is fine!"
例子:cat -e "today\n is fine!"
echo "$VAR_NAME": 变量会替换,双引号表弱引用
27:which命令
which:显示命令对应的程序文件路径
which [OPTION] COMMAND
--skip-alias:禁止显示别名
which:显示命令对应的程序文件路径
which [OPTION] COMMAND
--skip-alias:禁止显示别名
28:whatis命令
whatis:使用mkwhatis命令可将当前系统上所有的帮助手册及与之对应的关键字创建为一个数据库;
评论
发表评论