linux系统编程手册学习记录
记录Michael Kerrisk所写的Linux系统编程手册中的主要内容以及自己的见解,最近一次更新为2022.5.6
文章目录
前言
提示:第一章讲述Linux的发展历史,不是本笔记的重点,故略过:
第二章、LINUX基本概念
2.1内核
操作系统的含义
1.指完整的软件包。核心层软件+标准软件工具(图形界面,命令行,文本编辑器…)以windows为代表
2.狭义上,是指管理和分配计算机资源(CPU,RAM以及其他设备)的核心层软件。”内核“指的便是这部分的操作系统。
内核的职责
1.进程调度:Linux属于抢占式操作系统
2.内存管理:计算机内存增长的同时,软件的规模也保持相应的增长,故物理内存(RAM)仍属于有限资源,内核必须以公平,高效的方式在进程间共享这一资源
Linux采用了虚拟内存管理技术:
- 进程与进程之间、内核与内核之间彼此隔离,因此一个进程无法读取或修改内核或其他进程的内存内容
- 只需将进程的一部分保存在内存中:
降低了每个进程对内存的需求量
能在RAM中同时加载更多的进程
CPU的利用率更高,CPU空闲的概率变小
3.提供了文件系统:内核在磁盘之上提供有文件系统,允许对文件执行创建、获取、更新以及删除等操作
4.创建与终止进程:**内核可将新程序载入内存,为其提供运行所需的资源(比如CPU,内存及对文件的访问等)。**一个的程序就是进程,一旦进程执行完毕,内核需要释放其占用的资源
5.对设备的访问:计算机外接设备(鼠标,键盘,磁盘和磁盘驱动器等)可实现计算机与外部设备的通信 (io设备):
- 内核为程序访问设备提供了简化版的标准接口
- 仲裁多个进程对每一个设备的访问
6.联网:内核以用户进程的名义收发网络消息(数据包)。该任务包括将网络数据包路由至目标系统。
7.提供系统调用用户编程接口(API):进程可利用 内核入口点(也称为系统调用) 请求内核去执行各种任务。本书的主题就是Linux API
除了上述特性外,一般而言,诸如 Linux 之类的多用户操作系统会为每个用户营造一种 抽象:虚拟私有计算机(virtual private computer)。这就是说,每个用户都可以登录进入系统,独立操作,而与其他用户大致无干。例如:
- 每个用户都有属于自己的磁盘存储空间(主目录)
- 用户能够运行程序,而每一程序都能从 CPU 资源中“分得一杯羹”,运转于自有的虚拟地址空间中
- 这些程序还能独立访问设备,并通过网络传递信息
内核负责解决(多进程)访问硬件资源时可能引发的冲突,用户和进程对此则往往一无所知。
内核态和用户态
- 执行硬件指令可使CPU在两种状态下切换
- 虚拟内存区域划分为用户空间与内核空间
- 仅当处理器在内核态运行时,才能执行某些特定操作
2.2 Shell
shell是一种具有特殊用途的程序
- 读入用户输入的命令
- 执行相应的程序相应命令(命令解释器)
- 对shell脚本进行解释
在Linux系统中,shell只是一个用户进程
2.3 用户和组
系统会对每个用户的身份做唯一标识,用户隶属于多个组。
用户
系统的每个用户都拥有唯一的登录名(用户名)和与之相对应的整数型用户ID(UID)。系统密 码文件/etc/passwd为每个用户都定义有一行记录,除了上述两项信息外,该记录还包含如下信息。
- 组 ID:用户所属第一个组的整数型组 ID。
- 主目录:用户登录后所居于的初始目录。
- 登录 shell:执行以解释用户命令的程序名称。 该记录还能以加密形式保存用户密码。然而,出于安全考虑,用户密码往往存储于单独
的 shadow 密码文件中,仅供特权用户阅读。
实践:在Linux终端下用 vim /etc/passwd
从文件中我们可以看到,/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:(以倒数第二行为例)
实践:在Linux终端下用 vim /etc/shadow
文件以冒号为分隔符
说明:
1.账户名称
2.密码(账户未设置密码时为!!,设置密码后加密显示)
/etc/shadow文件中的这个字段里的数据存放着真正的密码,不过出于安全考虑,,这是经过加密的密码存储
- 如果为空,则对应用户没有口令,登录时不需要口令;
- 星号代表帐号被锁定;
- 双叹号表示这个密码已经过期了;
- 6开头的,表明是用SHA-512加密
- 1表明是用MD5加密;
- 2 是用Blowfish加密;
- 5 是用 SHA-256加密;
3.最近一次修改密码的日期
这个字段记录了最后一次修改密码的日期,那为什么是数字呢,其实这个日期是以1970年1月1日开始到你最后一次修改密码的总天数,例如上图,我都root最后一次修改密码距1970年1月1日18304天。
4.密码不可被更改的天数
这个字段记录了你的密码从最后一次更改开始多少天之内不能再更改,如果是0,则表示随时可以更改。
5.密码需要重新修改的天数
这个数字表示从密码被最后一次更改了之后多少天需要重新更改密码,并会再更改日期到来的前几天给出预警,否则该账户的密码会过期,如果为99999表示没有此要求。
6.密码修改前的预警天数
这个数字表示第五个字段中密码需要修改的最后期限之前的多少天给出预警,如上图7表示,密码需要修改的前7天提醒用户更改密码。
7.密码过期后的宽限日期
在第五个字段要求的更改密码的日期之前并没有更改密码,则密码将会过期,但不会马上失效,在这个字段表示过期后仍然可以用的天数,这个天数一过则密码失效。
8.账户失效日期
这个字段与第三个字段一样是从1970年1月1日开始的总天数,到了这个日期,则密码失效,尽管密码并没有过期,也会直接失效。
第九列暂时保留未使用。
组
出于管理目的,尤其是为了控制对文件和其他资源的访问,将多个用户分组是非常实用 的做法。
例如,某项目的开发团队人员需要共享同一组文件,就可以将他们编为同一组的成 员。在早期的 UNIX 实现中,一个用户只能隶属于一个组。BSD 率先允许一个用户同时属于 多个组,这一理念后来被其他 UNIX 实现纷纷效仿,并最终成为 POSIX.1-1990 标准。
每个用户 组都对应着系统组文件/etc/group 中的一行记录,该记录包含如下信息。
- 组名:(唯一的)组名称
- 组 ID(GID):与组相关的整数型 ID
- 用户列表:隶属于该组的用户登录名列表(通过密码文件记录的 group ID字段未能标识出的该组其他成员,也在此列),以逗号分隔。
实践:在Linux终端下用 vim /etc/group
超级用户
超级用户在系统中享有特权。超级用户账号的用户 ID 为 0,通常登录名为 root。 在一般 的 UNIX 系统上,超级用户凌驾于系统的权限检查之上。因此,无论对文件施以何种访问权 限限制,超级用户都可以访问系统中的任何文件,也能发送信号干预系统运行的所有用户进程。系统管理员可以使用超级用户账号来执行各种系统管理任务。