本文为操作系统复习笔记,临时上传以供移动端阅读。
[TOC]
Linux系统管理
Linux启动
1. Linux启动流程分析
大体过程如下。
- 1、主机加电自检,加载 BIOS 硬件信息。
- 2、读取 MBR 的引导文件(GRUB、LILO)。
- 3、引导加载 Linux 内核。
- 4、运行第一个进程 init (进程号永远为 1)。
- 5、进入相应的运行级别。
- 6、运行终端,输入用户名和密码。
(1) 内核引导
当计算机打开电源后,首先是 BIOS 开机自检,按照 BIOS 中设置的启动设备(通常是硬盘)来启动。自检完成后从 MBR(主引导记录) 中读取 BootLoader(启动引导程序),Linux 中最常见的 BootLoader 就是 GRUB。
之后 BootLoader 会加载操作系统内核。操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
(2) 运行init
内核加载完毕,会完成硬件检测和驱动程序加载。完成之后则会运行第一个进程,也就是 /sbin/init 进程。init 进程是系统所有进程的起点,可以把它比拟成系统所有进程的老祖宗,没有这个进程系统中任何进程都不会启动。
init 进程首先是需要读取配置文件 /etc/inittab。配置文件就各种调用进行设置。
(3) 系统初始化
许多程序需要开机启动。它们在 Windows 叫做”服务“(service),在 Linux 就叫做”守护进程“(daemon)。init 进程的一大任务,就是去运行这些开机启动的进程。
Linux 允许为不同的场合,分配不同的开机启动程序,这就叫做”运行级别“(runlevel)。也就是说,启动时根据”运行级别” 确定要运行哪些程序。比如 Apache 用作服务器时需要启动 ,用作桌面就不需要。
Linux 系统有 7 个运行级别(runlevel):
- 运行级别 0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动。
- 运行级别 1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆。
- 运行级别 2:多用户状态(没有 NFS)。
- 运行级别 3:完全的多用户状态(有 NFS),登陆后进入控制台命令行模式。
- 运行级别 4:系统未使用,保留。
- 运行级别 5:X11 控制台,登陆后进入图形 GUI 模式。
- 运行级别 6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动。
在 init 的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit,也就是调用执行了 /etc/rc.d/rc.sysinit,而 rc.sysinit 是一个 bash shell 的脚本,它主要是完成一些系统初始化的工作, rc.sysinit 是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
1 | l5:5:wait:/etc/rc.d/rc 5 |
这一行表示以 5 为参数运行 /etc/rc.d/rc,/etc/rc.d/rc 是一个 Shell 脚本,它接受 5 作为参数,去执行 /etc/rc.d/rc5.d/ 目录下的所有的 rc 启动脚本,/etc/rc.d/rc5.d/ 目录中的这些启动脚本实际上都是一些连接文件,而不是真正的 rc 启动脚本,真正的 rc 启动脚本实际上都是放在 /etc/rc.d/init.d/ 目录下。
而这些 rc 启动脚本有着类似的用法,它们一般能接受 start、stop、restart、status 等参数。/etc/rc.d/rc5.d/ 中的 rc 启动脚本通常是 K 或 S 开头的连接文件,对于以 S 开头的启动脚本,将以 start 参数来运行。而如果发现存在相应的脚本也存在 K 打头的连接,而且已经处于运行态了(以 /var/lock/subsys/ 下的文件作为标志),则将首先以 stop 为参数停止这些已经启动了的守护进程,然后再重新运行。
这样做是为了保证是当 init 改变运行级别时,所有相关的守护进程都将重启。
至于在每个运行级中将运行哪些守护进程,用户可以通过 chkconfig 或 setup 中的 “System Services” 来自行设定。
(4) 建立终端
rc 执行完毕后,返回 init,这时基本系统环境已经设置好了,各种守护进程也已经启动了。
init 接下来会打开 6 个终端,以便用户登录系统。在 inittab 中的以下 6 行就是定义了 6 个终端:
1 | 1:2345:respawn:/sbin/mingetty tty1 |
2. 应用开机自启
比如开机自启 Zookeeper:
- 新建一个脚本 zookeeper。
- 为新建的脚本 zookeeper 添加可执行权限,命令是:chmod +x zookeeper。
- 把 zookeeper 这个脚本添加到开机启动项里面,命令是:chkconfig –add zookeeper。
- 查看是否添加成功,命令是:chkconfig –list。
Linux进程管理
1. 查看进程
(1) ps
查看某个时间点的进程信息。
示例一:查看自己的进程:
1 | # ps -l |
示例二:查看系统所有进程:
1 | [nano@localhost ~]$ ps -aux |
示例三:查看特定的进程
1 | # ps aux | grep threadx |
(2) pstree
查看进程树。
示例:查看所有进程树。
1 | # pstree -A |
(3) top
实时显示进程信息。包含任务队列信息、进程信息、CPU 信息、物理内存信息、交换分区信息。
示例:两秒钟刷新一次
1 | $ top -d 2 |
指定查看某个进程:
1 | $ top -p 14253 |
(4) netstat
查看占用端口的进程。
示例:查看特定端口的进程,比如查看 MySQL 开没有。
1 | # netstat -anp | grep 3306 |
2. 进程状态

| 状态 | 说明 |
|---|---|
| R | running or runnable (on run queue) |
| D | uninterruptible sleep (usually I/O) |
| S | interruptible sleep (waiting for an event to complete) |
| Z | zombie (terminated but not reaped by its parent) |
| T | stopped (either by a job control signal or because it is being traced) |
3. 关闭进程
(1) kill命令
关掉进程。命令格式:
1 | $ kill [信号] PID |
进程信息常用 1, 9,15。只能识别进程号。
(2) killall命令
关掉进程。使用进程名杀死进程。
4. 进程优先级
表示进程优先级的参数有 Priority 和 Nice。
1 | [nano@localhost ~]$ ps -el |
这里 PRI 和 NI 就是这两个参数。数值越小优先级越高,PRI 是内核动态调整的,普通用户只能调整 NI 值,且只能增大。仅 root 用户可以将 NI 值设为负值。
nice 命令可以给新执行的命令直接赋予 NI 值,但是不能修改已经存在进程的 NI 值。
关闭 Apache 服务并重启设置优先级为 5。
1 | $ service http stop |
renice 命令可以给已经存在的进程设置优先级。
1 | renice -10 12345 |
5. 父进程与子进程
(1) SIGCHLD
当一个子进程改变了它的状态时(停止运行,继续运行或者退出),有两件事会发生在父进程中:
- 得到 SIGCHLD 信号。
- waitpid() 或者 wait() 调用会返回。
其中子进程发送的 SIGCHLD 信号包含了子进程的信息,比如进程 ID、进程状态、进程使用 CPU 的时间等。
在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息,父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息。
(2) wait()
1 | pid_t wait(int *status) |
父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,之后 wait() 函数会销毁子进程并返回。
如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 -1,同时 errno 被置为 ECHILD。
参数 status 用来保存被收集的子进程退出时的一些状态,如果对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL。
(3) waitpid()
1 | pid_t waitpid(pid_t pid, int *status, int options) |
作用和 wait() 完全相同,但是多了两个可由用户控制的参数 pid 和 options。
pid 参数指示一个子进程的 ID,表示只关心这个子进程退出的 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。
options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 waitpid() 调用变成非阻塞的,也就是说它会立即返回,父进程可以继续执行其它任务。
(4) 孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。
(5) 僵尸进程
一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。
僵尸进程通过 ps 命令显示出来的状态为 Z(zombie)。系统所能使用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。
要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 进程所收养,这样 init 进程就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程。
Linux系统资源管理
1. 资源查看
(1) vmstat命令
用于监控系统资源,可以监控 CPU 使用、进程状态、内存使用等信息。
1 | [nano@localhost ~]$ vmstat |
(2) free命令
查看内存使用状态。free 命令是一个快速查看内存使用情况的方法,它是对 /proc/meminfo 收集到的信息的一个概述。这个命令用于显示系统当前内存的使用情况,包括已用内存、可用内存和交换内存的情况。
默认情况下 free 会以字节为单位输出内存的使用量。
1 | [nano@localhost ~]$ free |
如果想以其他单位输出内存的使用量,需要加一个选项,-g 为GB,-m 为MB,-k 为KB,-b 为字节。
1 | free -g |
使用 -t 选项查看所有内存的汇总,使用这个选项会在输出中加一个汇总行。
1 | [nano@localhost ~]$ free -t |
(3) 查看CPU信息
CPU 主要信息保存在 /proc/cpuinfo 这个文件中。查看就行。
1 | [nano@localhost ~]$ cat /proc/cpuinfo |
top 命令也可以看 CPU 状态信息。
dstat 命令每秒 CPU 使用率情况获取,一秒刷新一次。
1 | [root@localhost nano]# dstat |
Linux网络管理
1. 基础命令
- 查看当前系统的网卡信息:ifconfig。
- 查看与某台机器的连接情况:ping。
- 查看当前系统的端口使用:netstat -an。
2. 限制IP访问
Linux 下最直接限制 IP 访问的方式有两种:
(1) hosts.allow和hosts.deny
使用 hosts.allow 和 hosts.deny 来设置 IP 白名单和黑名单,/etc/ 目录下。优先级为先检查 hosts.deny,再检查hosts.allow,后者设定可越过前者限制。冒号前面是服务进程名称,通常系统进程在 /etc/inetd.conf 中指定,比如in.ftpd,in.telnetd,in.sshd。
其中 IP 地址范围的写法有若干中,主要的三种是:
- 网络地址-子网掩码方式:216.64.87.0/255.255.255.0。
- 设置地址范围:216.64.(即以 216.64 打头的 IP 地址)。
- 缩略子网掩码方式:216.64.87.0/255.255.255.0 – 216.64.87.0/24。
设置好后,要重新启动。
1 | $ /etc/rc.d/init.d/xinetd restart |
下面是设置例子:
- 限制所有的 ssh,除非从 216.64.87.0 - 127 上来。
1 | hosts.deny: |
- 封掉 216.64.87.0 - 127 的 telnet。
1 | hosts.deny |
- 限制所有人的 TCP 连接,除非从 216.64.87.0 - 127 访问。
1 | hosts.deny |
- 限制 216.64.87.0 - 127 对所有服务的访问。
1 | hosts.deny |
(2) iptables命令
iptables 是防火墙相关的命令,可以用来限制 IP 登录。
Linux定时任务crontab
crontab 命令常见于 Unix 和类 Unix 的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行。通常 crontab 储存的指令被守护进程激活,crond 常常在后台运行。这类作业一般称为 cron jobs。
1. crontab文件
crontab 文件包含送交 cron 守护进程的一系列作业和指令。每个用户可以拥有自己的 crontab 文件;同时,操作系统保存一个针对整个系统的 crontab 文件,该文件通常存放于 /etc 或者 /etc 之下的子目录中,而这个文件只能由系统管理员来修改。
crontab 文件的每一行均遵守特定的格式,由空格或 tab 分隔为数个领域,每个领域可以放置单一或多个数值。 cron 服务是 Linux 的内置服务,但它不会开机自动启动,可以用以下命令启动和停止服务:
1 | /sbin/service crond start |
要把 cron 设为开机自动启动,需要在 /etc/rc.d/rc.local 脚本中加入 /sbin/service crond start。
1 | [nano@localhost ~]$ crontab -l # 查看当前用户的crontab |
2. 操作符号
在一个区域里填写多个数值的方法:
- 逗号(’,’)分开的值,例如:“1, 3, 4, 7, 8”。
- 连词符(’-‘)指定值的范围,例如:“1-6”。
- 星号(’‘)代表*任何可能的值**。例如,在“小时域”里的星号等于是“每一个小时”。
- 某些 cron 程序的扩展版本也支持斜线(’/‘)操作符,用于表示跳过某些给定的数。例如,“/3”在小时域中等于“0, 3, 6, 9, 12, 15, 18, 21”等被 3 整除的数;。
3. 时间设置
前 5 个域称之分时日月周,方便记忆。
1 | # 文件格式说明 |
从第六个域起,指明要执行的命令。
4. 例子
- 每 1 分钟执行一次 command:
1 | * * * * * command |
- 每小时的第 3 和第 15 分钟执行:
1 | 3,15 * * * * command |
- 在上午 8 点到 11 点的第 3 和第 15 分钟执行:
1 | 3,15 8-11 * * * command |
- 每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟执行:
1 | 3,15 8-11 */2 * * command |