文章目录
- 一、Linux概述
- 1.1 体系结构
- 1.1.1 Linux内核
- 1.1.2 用户态与内核态
- 1.1.3 交换空间
- 1.1.4 CLI和GUI
- 1.2 开机启动过程
- 1.3 系统运行级别
- 1.4 Linux进程
- 1.4.1 Linux进程通信的方法
- 1.4.2 Linux进程状态
- 二、文件
- 2.1 Linux文件系统
- 2.2 目录结构
- 2.3 绝对路径和相对路径
- 2.4 日志文件
- 2.5 inode
- 2.6 硬链接和软链接
- 三、Shell
- 3.1 变量类型
- 3.2 if语句
- 3.3 数字比较
- 3.4 case语句
- 3.5 for语句
- 3.6 while语句
- 3.7 函数
- 3.8 执行Shell脚本的两种方式
- 3.9 数学运算
一、Linux概述
Linux是一套免费使用的类Unix操作系统,是一个基于POSIX(Portable Operating System Interface,是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称)和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。
Linux支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux内核主要负责的功能:系统内存管理、软件程序管理、硬件设备管理、文件系统管理。
Linux和Unix的区别:
Linux | Unix | |
---|---|---|
开源性 | 一款开源操作系统,不需要付费,即可使用 | 一款对源码实行知识产权保护的传统商业软件,使用需要付费授权使用 |
跨平台性 | 具有良好的跨平台性能,可运行在多种硬件平台上 | 跨平台性能较弱,大多需与硬件配套使用 |
可视化界面 | 除了进行命令行操作,还有窗体管理系统 | 只是命令行下的系统 |
硬件环境 | 对硬件的要求较低,安装方法更易掌握 | 对硬件要求比较苛刻,安装难度较大 |
用户群体 | 用户群体很广泛,个人和企业均可使用 | 用户群体比较窄,多是安全性要求高的大型企业使用,如银行、电信部门等,或者Unix硬件厂商使用,如Sun等 |
1.1 体系结构
从大的方面讲,Linux 体系结构可以分为两块:
用户空间(User Space) :用户空间又包括用户的应用程序(User Applications)、C 库(C Library) 。
内核空间(Kernel Space) :内核空间又包括系统调用接口(System Call Interface)、内核(Kernel)、平台架构相关的代码(Architecture-Dependent Kernel Code) 。
- 为什么 Linux 体系结构要分为用户空间和内核空间
现代CPU实现了不同的工作模式,不同模式下CPU可以执行的指令和访问的寄存器不同。
Linux 从CPU的角度出发,为了保护内核的安全,把系统分成了两部分。
用户空间和内核空间是程序执行的两种不同的状态,我们可以通过两种方式完成 用户空间到内核空间的转移:1)系统调用;2)硬件中断。
1.1.1 Linux内核
操作系统的内核是操作系统的核心部分。它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。
Linux内核本身并不是操作系统,它是一个完整操作系统的组成部分
。Linux发行商都采用Linux内核,然后加入更多的工具、库和应用程序来构建一个完整的操作系统。
Linux内核的常见功能:
- 1、进程管理
内核负责创建和销毁进程,并处理它们与外部世界的联系(输入和输出)。不同进程间通讯(通过信号,管道,或者进程间通讯原语)对整个系统功能来说是基本的,也由内核处理。另外,调度器,控制进程如何共享CPU,是进程管理的一部分。更通常地,内核的进程管理活动实现了多个进程在一个单个或者几个CPU之上的抽象。 - 2、内存管理
计算机的内存是主要的资源,处理它所用的策略对系统性能是至关重要的。内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间。内核的不同部分与内存管理子系统通过一套函数调用交互,从简单的malloc/free对到更多更复杂的功能。 - 3、文件系统
Unix在很大程度上基于文件系统的概念;几乎Unix中的任何东西都可看作一个文件。内核在非结构化的硬件之上建立了一个结构化的文件系统,结果是文件的抽象非常多地在整个系统中应用。
另外,Linux支持多个文件系统类型,就是说,物理介质上不同的数据组织方式。例如,磁盘可被格式化成标准Linux的ext3文件系统,普遍使用的FAT文件系统,或者其他几个文件系统。 - 4、设备控制
几乎每个系统操作终都映射到一个物理设备上。除了处理器,内存和非常少的别的实体之外,全部中的任何设备控制操作都由特定于要寻址的设备相关的代码来进行,这些代码称为设备驱动.。内核中必须嵌入系统中出现的每个外设的驱动,,从硬盘驱动到键盘和磁带驱动器。内核功能的这个方面是本书中的我们主要感兴趣的地方。 - 5、网络
网络必须由操作系统来管理,因为大部分网络操作不是特定于某一个进程:进入系统的报文是异步事件。报文在某一个进程接手之前必须被收集,识别,分发。系统负责在程序和网络接口之间递送数据报文,它必须根据程序的网络活动来控制程序的执行。另外,所有的路由和地址解析问题都在内核中实现。
1.1.2 用户态与内核态
Linux的体系架构:分为用户态与内核态。用户态与内核态与内核态是操作系统对执行权限进行分级后的不同的运行模式。
在cpu的所有指令中,有些指令是非常危险的,如果使用不当,将会造成系统崩溃等后果。为了避免这种情况发生,cpu将指令划分为特权级(内核态)指令和非特权级(用户态)指令。对于那些危险的指令只允许内核及其相关模块调用,对于那些不会造成危险的指令,就允许用户应用程序调用。
内核态(核心态,特权态):内核态是操作系统内核运行的模式。内核态控制计算机的硬件资源,如硬件设备,文件系统等等,并为上层应用程序提供执行环境。
用户态: 用户态是用户应用程序运行的状态。应用程序必须依托于内核态运行,因此用户态的态的操作权限比内核态是要低的,如磁盘,文件等,访问操作都是受限的。
系统调用: 系统调用是操作系统为应用程序提供能够访问到内核态的资源的接口。
- 用户态切换到内核态的几种方式
系统调用: 系统调用是用户态主动要求切换到内核态的一种方式,用户应用程序通过操作系统调用内核为上层应用程序开放的接口来执行程序。
异常: 当cpu在执行用户态的应用程序时,发生了某些不可知的异常。于是当前用户态的应用进程切换到处理此异常的内核的程序中去。
硬件设备的中断: 当硬件设备完成用户请求后,会向cpu发出相应的中断信号,这时cpu会暂停执行下一条即将要执行的指令,转而去执行与中断信号对应的应用程序,如果先前执行的指令是用户态下程序的指令,那么这个转换过程也是用户态到内核台的转换。
物理内存RAM(Random Access Memory 随机存储器):物理内存是计算机的实际内存大小,它直接与CPU交换数据,也被称为主存。
虚拟内存是操作系统为了更高效率使用物理内存的一种概念,它是对物理内存的抽象。Linux上的swap交换空间都是虚拟内存的一种实现技术。
1.1.3 交换空间
swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务。当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。
简单理解: 当某个应用程序所需的内存空间不够了,那么系统会判断当前物理内存是否还有足够的空闲可以分配给应用程序。如果有,则应用程序直接进入内存运行;如果没有,系统就根据某种算法(如:LRU)挂起一个进程,将挂起的进程交换到虚拟内存Swap中等待,并将应用程序调入内存执行。虚拟内存是被虚拟出来的,可以使用硬盘(不仅仅是硬盘)来作为虚拟内存。这就是为什么当我们运行一个所需内存比我们计算机内存还大的程序时,仍然可以正常运行,并感受不到内存的限制的原因。
1.1.4 CLI和GUI
- CLI
命令行界面(command-line interface,CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)。
通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。所以,图形用户界面的操作系统中,都保留着可选的命令行界面。 - GUI
图形用户界面(Graphical User Interface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。
1.2 开机启动过程
- 主机加电自检,加载BIOS硬件信息。
- 读取MBR的引导文件(GRUB、LILO)。
- 引导Linux内核。
- 运行第一个进程init (进程号永远为1)。
- 进入相应的运行级别。
- 运行终端,输入用户名和密码。
1.3 系统运行级别
运行级别0 | 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 |
---|---|
运行级别1 | 单用户工作状态,root权限,用于系统维护,禁止远程登陆 |
运行级别2 | 多用户状态(没有NFS) |
运行级别3 | 完全的多用户状态(有NFS),登陆后进入控制台命令行模式 |
运行级别4 | 系统未使用,保留 |
运行级别5 | X11控制台,登陆后进入图形GUI模式 |
运行级别6 | 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动 |
注:NFS是Network File System的缩写,即网络文件系统。
NFS的基本原则是“容许不同的客户端及服务端通过一组RPC(远程过程调用)分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。
1.4 Linux进程
1.4.1 Linux进程通信的方法
- 1、管道(pipe)
管道允许一个进程和另一个与它有共同祖先的进程之间进行通信; - 2、命名管道(FIFO)
类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建; - 3、信号(signal)
信号是比较复杂的通信方式,用于通知接收进程有某种事情发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持UNIX早期信号语义函数signal外,还支持语义符合POSIX.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD即能实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数的功能); - 4、内存映射(mapped memory)
内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它; - 5、消息队列(message queue)
消息队列是消息的连接表,包括POSIX消息对和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能成该无格式字节流以及缓冲区大小受限等缺点; - 6、信号量(semaphore)
信号量主要作为进程间以及同进程不同线程之间的同步手段; - 7、共享内存 (shared memory)
它使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。这是针对其他通信机制运行效率较低而设计的。它往往与其他通信机制,如信号量结合使用,以达到进程间的同步及互斥; - 8、套接字(Socket)
它是更为通用的进程间通信机制,可用于不同机器之间的进程间通信。起初是由UNIX系统的BSD分支开发出来的,但现在一般可以移植到其他类UNIX系统上:Linux和System V的变种都支持套接字。
1.4.2 Linux进程状态
- Linux进程不同的状态
1、不可中断状态:进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指进程不响应异步信号。
2、暂停状态/跟踪状态:向进程发送一个 SIGSTOP 信号,它就会因响应该信号 而进入 TASK_STOPPED 状态;当进程正在被跟踪时,它处于 TASK_TRACED 这个特殊的状态。正被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。
3、就绪状态:在 run_queue 队列里的状态。
4、运行状态:在 run_queue 队列里的状态。
5、可中断睡眠状态:处于这个状态的进程因为等待某某事件的发生(比如等待socket 连接、等待信号量),而被挂起。
6、zombie 状态(僵尸):父亲没有通过 wait 系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉。
7、退出状态。 - 这些进程用’ps’命令查看时,对应的符号
D:不可中断Uninterruptible(usually IO)。
R:正在运行,或在队列中的进程。
S:处于休眠状态。
T:停止或被追踪。
Z:僵尸进程。
W:进入内存交换(从内核2.6开始无效)。
X:死掉的进程。
二、文件
2.1 Linux文件系统
在Linux操作系统中,所有被操作系统管理的资源
,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件
。
在Linux系统中,有一个重要的概念:一切都是文件。其实这是Unix哲学的一个体现,而Linux是重写Unix而来,所以这个概念也就传承了下来。在Unix系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。
Linux支持5种文件类型,如下图所示:
2.2 目录结构
Linux文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:
- /bin: 存放二进制可执行文件(ls、cat、mkdir等),常用命令一般都在这里;
- /etc: 存放系统管理和配置文件;
- /home:
存放所有用户文件的根目录
,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示; - /usr : 用于存放系统应用程序;
- /opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里;
- /proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
- /root: 超级用户(系统管理员)的主目录;
- /sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等;
- /dev: 用于存放设备文件;
- /mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
- /boot:
存放用于系统引导时使用的各种文件
; - /lib : 存放着和系统运行相关的库文件 ;
- /tmp: 用于存放各种临时文件,是公用的临时文件存储点;
- /var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等)等;
- /lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。
2.3 绝对路径和相对路径
在Linux系统中,一个文件所在的目录有绝对路径和相对路径两种表示方式。
绝对路径:描述了在虚拟目录结构中该目录的确切位置,以虚拟目录根目录开始,相当于目录全名。以正斜线开始,比如:/usr/local
。
相对路径:允许用户执行一个基于当前目录位置的文件路径。
在相对路径中:
单点符(.):表示当前目录;
双点符(…):表示当前目录的父目录。
当前目录和上层目录: ./ ../
。
主目录: ~/
。
切换目录: cd
。
2.4 日志文件
常见的日志文件:
- /var/log/cron
这个文件记录了系统例行性工作调度的相关信息,如你的crontab调度有没有实际被进行?进行过程中有没有发生错误?/etc/crontab是否编写正确?在这个日志文件内都可以查询。 - /var/log/dmesg
该文件记录系统在开机时内核检测过程中所产生的各项信息
。由于centos默认将开机时内核的硬件检测过程取消显示,因此额外将数据记录在此文件中。 - /var/log/lastlog
该文件记录了系统上所有帐号最近一次登入系统时的相关信息。lastlog命令就是利用这个文件所记录的信息来显示结果。 - /var/log/maillog或/var/log/mail/
该文件或目录记录邮件的来往信息,其实主要记录SMTP和POP3(IMAP)协议提供者所产生的信息。 - /var/log/messages
该文件几乎记录了系统发生的所有错误信息(或者是重要的信息)
,所以这个文件相当重要;如果系统发生莫名的错误时,这个文件是必查的日志文件之一。
2.5 inode
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
使用 stat 命令可以查看文件的inode信息。每个inode都有一个号码,
Linux/Unix操作系统不使用文件名来区分文件,而是使用inode号码区分不同的文件。
inode也需要消耗硬盘空间,所以在格式化硬盘的时候,操作系统会将硬盘分为2个区域,一个区域存放文件数据,另一个区域存放inode所包含的信息,
存放inode的区域被称为inode table。
2.6 硬链接和软链接
建立软链接和硬链接的语法:
# 软链接
ln -s 源文件 目标文件
# 硬链接
ln 源文件 目标文件
软链接可以理解成快捷方式。它和windows下的快捷方式的作用是一样的;硬链接等于cp -p加同步更新
。
软链接文件的大小和创建时间和源文件不同。软链接文件只是维持了从软链接到源文件的指向关系。
硬链接文件和源文件的大小和创建时间一样。硬链接文件的内容和源文件的内容一模一样,相当于copy了一份。
三、Shell
3.1 变量类型
- 1、系统定义变量
系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过set命令查看。 - 2、用户定义变量
用户变量由系统用户来生成和定义,变量的值可以通过命令 “echo $<变量名>” 查看。
3.2 if语句
示例1:
if [ condition ]
then
if [ condition ]
then
commands1
else
commands2
fi
fi
示例2:
if [ condition ]
then
if [ condition ]
then
commands1
else
commands2
fi
else
commands3
fi
3.3 数字比较
在if-then中使用测试命令( -gt 等)来比较两个数字。示例:
#!/bin/bash
x=10
y=20
if [ $x -gt $y ]
then
echo “x is greater than y”
else
echo “y is greater than x”
fi
3.4 case语句
示例:
case 变量 in
值1 )
执行动作1
;;
值2 )
执行动作2
;;
值3 )
执行动作3
;;
....
* )
如果变量的值都不是以上的值,则执行此程序
;;
esac
示例2:
case "找工作条件" in
给的钱多)
给你工作...
;;
给股份)
给你工作...
;;
有发展前景)
可以试试...
;;
*)
bye bye !!
esac
3.5 for语句
示例:
for 变量 in 循环列表
do
命令1
命令2
….
最后命令
done
或:
for 变量 in 串行
do
执行命令
done
更详细的for语法可以参考:Shell中for循环的几个常用写法。
3.6 while语句
如同 for 循环,while 循环只要条件成立就重复它的命令块。示例:
while [ 条件 ]
do
命令…
done
do-while 语句的基本格式示例:
do
{
命令
} while (条件)
3.7 函数
函数定义示例:
# func_name 函数名
function func_name(){
#函数体内容
}
或
# func_name 函数名
func_name(){
#函数体内容
}
函数调用示例:
func_name parm
函数体中,可以通过$1 $2 …$9接受函数调用中的变量;函数可以通过return 返回函数执行的结果。
3.8 执行Shell脚本的两种方式
- 1、直接执行Shell脚本
示例:
sh sleep.sh
./sleep.sh
- 2、在后台执行脚本
一般都是使用&
在命令结尾来让程序自动运行(命令后可以不追加空格)。示例:
./sleep.sh &
3.9 数学运算
bash shell的内置命令let
可以进行整型数的数学运算。示例:
#! /bin/bash
…
…
let c=a+b