守护进程
Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。
守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源。
一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。
孤儿进程
父进程结束了,而它fork的一个或多个子进程还在运行,那么这些子进程就成为孤儿进程(father died)。孤儿进程一般由init进程(进程号PID = 1)收养。
僵尸进程
子进程退出了,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但仍保留了进程的状态信息(包括进程号,退出状态,运行时间等),需要父进程调用wait或waitpid去获取并释放,如果父进程没有释放子进程,那么子进程的状态信息仍然保存在系统中,进程号也不会释放,这种进程称为僵死进程。
运行级别
- 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动。
- 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆。
- 运行级别2:多用户状态(没有NFS)。
- 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式。
- 运行级别4:系统未使用,保留。
- 运行级别5:X11控制台,登陆后进入图形GUI模式。
- 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。
注:NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。目前NFS主要有两个版本(NFSv2,NFSv3)两个版本,而NFSv2和NFSv3除了3版本支持更多的新特性以外,最主要的区别应该就是NFSv2是使用UDP协议进行传输的,所以NFSv2的连接在复杂网络环境下可能没有那么可靠,而NFSv3同时支持UDP和TCP协议。
启动级别(init 0-6)
0:停机或者关机
1:单用户模式
2:多用户模式,不能使用NFS(Net File System)
3:完全多用户模式(标准的运行级别)
4:安全模式
5:图形化(即图形界面)
6:重启
Linux启动过程
Linux启动是从加电 BIOS自检开始,进入到Grub(一个功能强大的多系统引导程序,专门处理Linux与其它操作系统共存的问题)加载bootfs。bootfs主要包括: bootloader和 kernel (内核),而bootloader主要用来启动内核。内核其实只有三件工作:
- 探测当前硬件设备:通过硬件中断就可以得知。
- 根据探测到的硬件设备初始化相关驱动
- 挂载根文件系统
Linux内核当中只包含最基本的硬件驱动,例如硬盘、键盘、CPU、内存、I/O等,其他的驱动则放到文件系统当中,由内核根据需求再进行加载,驱动被放置在文件系统当中,但内核只有在驱动初始化之后才能挂载文件系统。为了解决这个“先有鸡还是先有蛋”的问题,Linux引入了initrd 文件。initrd文件全称是
bootloader initialized RAM disk
,本质是由bootloader初始化的一个内存文件系统,与initramfs、rootfs、tmpfs等同属ramfs范畴,都是内存文件系统。initrd文件当中包含有:lib、bin、sbin、usr、proc、sys、var、dev、boot等目录,所以我们可以认为 initrd就是一个完整的虚拟根文件系统。initrd文件存在的目的就是为了在内核态和用户态之间建立一个桥梁,让内核加载initrd文件系统中的硬件驱动,再通过读写方式挂载用户态的根文件系统。
此时Linux启动顺序就变为: bootloader启动内核,并且将 initrd 文件中的内容加载到内存当中。内核就会通过 initrd中所包含的 init脚本完成各种硬件设备的初始化和加载工作,而后内核顺利加载根文件系统。这一步做完之后,内核运行根文件系统当中的/sbin/init进程,创建操作系统的1号进程,此后内核就会将操作系统控制权移交给用户空间的Init进程,当前环境由内核态转移到了用户态。用户态的 init进程开始读取/etc/inittab脚本来执行相应的脚本,从而完成系统初始化,主要包括:设置时间、设置字体、设置随机数生成器、设置网络、设置防火墙,等等。
FHS
文件系统层次化标准(Filesystem Hierarchy Standard)是根据以往无数 Linux 系统用户和开发者的经验而总结出来的,是用户在 Linux 系统中存储文件时需要遵守的规则。
目录名称 | 应放置文件的内容 |
---|---|
/boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
/dev | 以文件形式存放任何设备与接口 |
/etc | 配置文件 |
/home | 用户家目录 |
/bin | 存放单用户模式下还可以操作的命令 |
/lib | 开机时用到的函数库,以及/bin 与/sbin 下面的命令要调用的函数 |
/sbin | 开机过程中需要的命令 |
/media | 用于挂载设备文件的目录 |
/opt | 放置第三方的软件 |
/root | 系统管理员的家目录 |
/srv | 一些网络服务的数据文件目录 |
/tmp | 任何人均可使用的“共享”临时目录 |
/proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
/usr/local | 用户自行安装的软件 |
/usr/sbin Linux | 系统开机时不会使用到的软件/命令/脚本 |
/usr/share | 帮助与说明文件,也可放置共享文件 |
/var | 主要存放经常变化的文件,如日志 |
/lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
inode
Linux 把每个文件的权限与属性记录在inode 中,而且每个文件占用一个独立的 inode 表格,该表格的大小默认为 128 字节,里面记录着如下信息:
- 该文件的访问权限(read、write、execute)。
- 该文件的所有者与所属组(owner、group)。
- 该文件的大小(size)。
- 该文件的创建或内容修改时间(ctime)。
- 该文件的最后一次访问时间(atime)。
- 该文件的修改时间(mtime)。
- 文件的特殊权限(SUID、SGID、SBIT)。
- 该文件的真实数据地址(point)。
而文件的实际内容则保存在 block 块中(大小可以是 1KB、2KB 或 4KB),一个 inode 的默认大小仅为 128B(Ext3),记录一个 block 则消耗 4B。当文件的 inode 被写满后,Linux 系统会自动分配出一个 block 块,专门用于像 inode 那样记录其他 block 块的信息,这样把各个block 块的内容串到一起,就能够让用户读到完整的文件内容了。
在 Linux 系统中存在硬链接和软连接两种文件。
- 硬链接(hard link)
可以将它理解为一个“指向原始文件 inode 的指针”,系统不为它分配独立的 inode 和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的 inode 连接数就会增加 1;而且只有当该文件的 inode 连接数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件 inode 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。
- 软链接(也称为符号链接[symbolic link])
仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与 Windows 系统中的“快捷方式”具有一样的性质。
SSH认证过程
前提:客户端使用工具生成一个密钥对并将客户端生成的公钥拷贝到服务器。
- 当客户端发送登陆请求(包含IP、用户名)。
- 服务器会在本地的
./ssh/authorized_keys
中是否有对应用户公钥。 - 若存在对应用户的公钥则随机生成一个随机数并使用客户端拷贝过来的公钥进行加密,然后发送给客户端。
- 客户端得到服务器发来的加密随机数后使用私钥进行解密,然后将解密后的随机数发送给服务器。
- 服务器收到客户端发来的随机数后,与之前其生成的随机数进行对比,如果一致则认证成功。
SELinux 安全子系统
SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。RHEL 7 系统使用SELinux 技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。例如,在自己的电脑上下载了一个美图软件,当您全神贯注地使用它给照片进行美颜的时候,它却在后台默默监听着浏览器中输入的密码信息,而这显然不应该是它应做的事情。SELinux 安全子系统就是为了杜绝此类情况而设计的,它能够从多方面监控违法行为:对服务程序的功能进行限制(SELinux 域限制可以确保服务程序做不了出格的事情);对文件资源的访问限制(SELinux 安全上下文确保文件资源只能被其所属的服务程序进行访问)。
SELinux 服务有三种配置模式(持久化配置路径:/etc/selinux/config
)
- enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
- permissive:遇到服务越权访问时,只发出警告而不强制拦截。
- disabled:对于越权的行为不警告也不拦截。
获得当前 SELinux服务的运行模式
1 | [root@localhost /]# getenforce |
查看指定目录安全上下文
1 | [root@localhost html]# ls -Zd /var/www/html |
semanage
semanage 命令用于管理 SELinux 的策略,格式为“semanage [选项] [文件]”。SELinux 服务极大地提升了 Linux 系统的安全性,将用户权限牢牢地锁在笼子里。semanage 命令不仅能够像传统 chcon 命令那样—设置文件、目录的策略,还可以管理网络端口、消息接口(这些新特性将在本章后文中涵盖)。使用 semanage 命令时,经常用到的几个参数及其功能如下所示:
- -l 参数用于查询。
- -a 参数用于添加。
- -m 参数用于修改。
- -d 参数用于删除。
例:向httpd服务网站数据目录中新添加一条 SELinux 安全上下文,让/home/wwwroot
目录以及里面的所有文件能够被 httpd 服务程序所访问到:
1 | [root@localhost html]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot |
文件存储结构
Linux正统的文件系统(如ext2、ext3)一个文件由目录项、inode和数据块组成。
目录项: 包括文件名和inode节点号。
inode:文件索引节点,包含文件的属性(如读写属性、owner等,以及指向数据块的指针)。
数据块:文件的具体内容存放地。
LVX
linux virtual server
,Linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统,负载均衡实现了很好可伸缩性,节点数目可以增长到几千,甚至几万。后期也由很多用户参与开发LVS辅助工具和辅助组件,最出名的就是alexandre
为LVS编写的keepalived
,它最初专门用于监控LVS,之后又加入VRRP实现高可用功能。
负载调度器,真实服务器群节点一起被称为LVS,LVS负载调度器(有时也称为负载均衡器),接收服务的所有接入服务集群的请求,并决定集群中的哪个节点应该回复其请求。
VPPR
虚拟路由冗余协议VRRP(Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信。
参考
《Linux就该这么学》