鸟哥的 Linux 私房菜 Notes

第6章 Linux 文件与目录管理

6.4 文件与目录的默认权限与隐藏权限

6.4.3 文件特殊权限: SUID, SGID, SBIT

Set UID

当 s 这个标志出现在文件拥有者的 x 权限上时,此时被称为 Set UID,简称 SUID 的特殊权限.

SUID 的限制与功能:

  • SUID 权限仅对二进制程序有效
  • 执行者对于该程序要具有 x 的可执行权限
  • 本权限仅在执行该程序的过程中有效
  • 执行者将具有该程序拥有者的权限

SUID 不能用在 shell 脚本上面,shell 脚本只是将很多的二进制文件调用执行而已.

Set GID

当 s 在用户组的 x 时则称为 Set GID (SGID), 可用 ls 命令查看:

1
ls -l 

与 SUID 不同, SGID 可以针对文件或目录来设置。

如果是对文件,SGID 有如下的功能:

  • SGID 对二进制程序有用
  • 程序执行者对于该程序来说,需具备 x 的权限
  • 执行者在执行的过程中将会获得该程序用户组的支持

如果是对目录:

  • 用户若对于此目录有 r 与 x 的权限时,该用户能够进入此目录
  • 用户在此目录下的有效用户组 (effective group) 将会变成该目录的用户组
  • 若用户在此目录下具有 w 的权限,则用户建立的新文件,该新文件的用户组与此目录的用户组相同

Sticky Bit

目前只针对目录有效:

  • 当用户对于此目录具有 w, x 权限,即具有写入的权利
  • 当用户在该目录下建立文件或目录时,仅有自己与 root 才有权限删除该文件

SUID/SGID/SBIT 权限设置

  • 4 为 SUID
  • 2 为 SGID
  • 1 为 SBIT
    如: chmod 4755 filename.

添加这几个权限还能用 u+s, g+s, o+t.

第8章 文件与文件系统的压缩

在 Linux 下, 扩展名没有什么特殊意义.

很多 email 都有容量大约 25MB 每封信的限制.

8.2 Linux 系统常见的压缩指令

compress command

tar 可以将很多文件 “打包” 成为一个文件.

单纯的 tat 只是用来打包. 现在的版本有了压缩功能.

8.2.1 gzip, zcat/zmore/zless/zgrep

gzip 为了取代 compress.

压缩:

1
$ gzip -v 文件

解压缩:

1
$ gzip -d 文件

查看压缩文件的原始内容:

1
$ zcat 文件名.gz

还有 zmore, zless, zgrep 等.

-c 选项和重定向搭配:

1
$ gzip -c service > service.gz

znew 可以把 compress 命令形成的 .Z 文件转化成 gzip 格式.

8.2.2 bzip2, bzcat/bzmore/bzless/bzgrep

bzip2 为了取代 gzip 并提供更佳的压缩比.

其用法几乎和 gzip 相同.

8.2.3 xz, xzcat/xzmore/xzless/xzgrep

压缩比更高.

其用法和 bzip2/xz 一样.

8.3 打包指令: tar

将多个文件或目录包成一个大文件的功能, 被称为打包指令.

tar 并不会主动产生建立的文件名.

-f 后面跟文件名. 一般将 -f 选项从其他选项中独立出来.

如压缩:

1
$ tar -jcv -f filename.tar.bz2 +要被压缩的文件或目录

查询:

1
$ tar -jtv -f filename.tar.bz2

解压:

1
$ tar -jxv -f filename.tar.bz2 -C 想要在哪个目录解压

有时加上 -p 保留原本文件的权限和属性.

拿掉根目录的原因是防止覆盖.

可以只解开 .tar 中的单一文件.

使用 --exclude= 参数可以不包括某个文件或目录.

可以仅备份比某个时间更新的文件.

第13章 Linux 账号管理与 ACL 权限设置

13.1 Linux 的账号与用户组

13.1.1 用户标识符: UID 与 GID

账号的 ID 与 账号的对应在 /etc/passwd 中。

每个登录的用户至少都会获取两个 ID, 一个是用户 ID (User ID, UID), 一个是用户组 ID (Group ID, GID).

13.1.2 用户账号

输入账号和密码后,系统的处理:

  1. 先查找 /etc/passwd 里面是否有你输入的账号,如果有,则将账号对应的 UID 和 GID (在 /etc/group 中) 读出, 并将家目录与 Shell 设置也读出.
  2. 再来核对密码表。这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID.
  3. 如果一切正常,则进入 shell 管理阶段。

/etc/passwd/etc/shadow 的详细说明可见 man 5 passwdman 5 shadow.

/etc/passwd 文件结构

有七部分内容,用 : 隔开:

  1. 账号名称
  2. 密码
  3. UID
  4. GID
  5. 用户信息说明栏
  6. 家目录, 当账户登录时就会进入的目录
  7. shell

/etc/shadow 文件结构

同样以 : 分隔,共有九个字段:

  1. 账户名称
  2. 密码
  3. 最近修改密码的日期, 其计算的天数从 1971-1-1 开始
  4. 密码不可被修改的天数
  5. 密码需要重新修改的天数
  6. 密码需要修改期限前的警告天数
  7. 密码过期后的账号宽限时间
  8. 账号失效日期
  9. 保留

root 密码忘记的解决办法:

  • 重新启动后进入单人维护模式
  • 以 Live CD 启动后挂载根目录去修改 /etc/shadow

查看 shadow 是使用哪种加密的机制:

1
$ authconfig --test |grep hasing

13.1.3 关于用户组: 有效与初始用户组, groups, newgr

两个文件 /etc/group/etc/gshadow.

/etc/group 文件结构

  1. 组名
  2. 用户组密码
  3. GID
  4. 此用户组主持的账号名称

有效用户组 (effective group) 和初始用户组 (initial group)

初始用户组 (/etc/passwd 中的第4字段) 在用户一登录就会主动获取,不需要在 /etc/group 的第四个字段内写入该账号。

通常有效用户组的作用就是新建文件, 一个账号新建的文件,其所属用户组为有效用户组.

通过 groups 命令查看,第一个输出即为有效用户组,后面的为用户所属的其他用户组.

1
$ groups

newgrp: 有效用户组的切换

你想要切换的用户组必须是你已经有支持的用户组。

这个命令可以修改目前用户的有效用户组,而且使用另一个 shell 提供此功能。用户的环境设置不会有影响,但是其用户组权限会重新计算。

/etc/gshadow 文件结构

  1. 组名
  2. 密码栏
  3. 用户组管理员账号
  4. 有加入该用户组支持的所属账号
    gshadow 的最大功能是建立用户组管理员。

13.2 账号管理

13.2.1 新增与删除用户: useradd, 相关配置文件,passwd, usermod, userdel

useradd 参考文件

useradd 的默认值查看:

1
# useradd -D

其内容位于 /etc/default/useradd

passwd

1
# passwd

后面不接账号就是修改自己的密码。

利用 standard input 建立用户的密码:

change

显示纤细的密码参数:

1
# change -l 账号名

usermod

对账号设置进行调整.

userdel

删除用户的相关数据。

13.2.2 用户功能

chsh

change shell 的简写。
选项及参数:

  • -l, 列出目前系统上可用的 shell
  • -s, 设置修改自己的 shell
    1
    # echo "abc543cc" | passwd --stdin vbird2

13.4 用户身份切换

13.4.1 su

单纯使用 su - 代表使用 login-shell 的变量文件读取方式登录系统, 若使用者名称没有加上去, 则代表切换为 root 的身份.

若要完整地切换到新用户的环境, 必须要使用 su - usernamesu -l username, 才会连同 PATH, USER, MAIL 等变量都转换成新用户的环境.

13.4.2 sudo

仅有 /etc/sudoers 文件下的用户才能使用 sudo.

第14章 磁盘配额 (Quota) 与高级文件系统管理

14.1 磁盘配额 (Quota) 的应用与实践

Quota 用于限制用户对磁盘的使用容量.

14.1.1 什么是磁盘配额

磁盘配额的一般用途

  • 针对网站服务器
  • 针对邮件服务器
  • 针对文件服务器
  • 限制某一用户组所能使用的最大磁盘配额
  • 限制某一用户所能使用的最大磁盘配额
  • 限制某一目录 (directory) 的最大磁盘配额

du 命令会计算目录的磁盘使用率.

磁盘配额的使用限制

  • ext 文件系统仅能针对整个文件系统, xfs 可以使用 project 模式来设计不同目录的磁盘配额
  • 内核必须支持磁盘配额
  • 只对一般身份用户有效
  • 若启用 SELinux, 非所有目录均可设置磁盘配额, 其会加强某些特殊的权限控制,默认情况下仅能针对 /home 进行设置

磁盘配额可以管理 block 和 inode, 限制 inode 的使用量即管理用户可以建立的文件数量.

hard 和 soft 限制:

  • hard, 不能超过
  • soft, 有 grace time
    hard 值一般高于 soft 值。 默认的 soft 值为 7 天.

14.1.2 一个 xfs 文件系统的磁盘配额实践范例

14.1.3 实践磁盘配额流程 -1 :文件系统的支持与查看

不要在根目录下进行磁盘配额设置.

第15章 计划任务(crontab)

15.1 什么是计划任务

15.1.1 Linux 计划任务的种类: at, cron

  • at, 处理仅执行一次就结束的任务,即突发性任务, 需 atd 服务
  • cron, 所设置的任务会循环的执行,即例行任务,每隔一段时间就执行,需 crond 服务

15.2 仅执行一次的计划任务

15.2.1 atd 的启动和 at 的运行方式

在 Ubuntu 下安装 atd 服务:

1
2
sudo apt update
sudo apt install at

手动启动:

1
2
3
sudo systemctl restart atd
sudo systemctl enable atd
sudo systemctl status atd

at 的运行方式

使用 at 命令来产生所要运行的任务,并以文本文件的方式写入 /var/spool/at 目录内等待 atd 服务的执行。

可以利用 /etc/at.allow/etc/at.deny 两个文件实现对 at 的限制。

添加后的工作情况为:

  1. 先找寻 /etc/at.allow 文件,写在这个文件的用户才能使用 at
  2. 如果 /etc/at.allow 文件不存在,则找寻 /etc/at.deny 文件,写在 /etc/at.deny 中的用户不能使用 at
  3. 如果两个文件都不存在,那么只有 root 用户可以使用 at 命令

不希望某些用户使用 at,就将那个用户的账号写入 /etc/at.deny, 一个账号写一行。

15.2.2 实际运行单一计划任务

使用:

1
at [-mldv] TIME

at 命令的选项和参数:

  • -m : 应该是 mail, 当 at 的任务完成后,即便没有输出信息,也会发送 email 通知
  • -l : 应该是 list, at -l 相当于 atq, 列出目前系统上所有该使用者的 at 计划
  • -d : 应该是 delete, at -d 相当于 atrm, 可以取消一个在 at 计划中的任务
  • -c : 应该是 code, 可以列出后面接的该项任务的实际命令内容

最重要的是 TIME 参数, 其格式为:

  • HH:MM
  • HH:MM YYYY-MM-DD
  • HH:MM[am|pm] [Mouth] [Date]
  • HH:MM[am|pm] + number [minutes|hours|days|weeks]
    可以有 now + ... 方式。

使用 at 时会进入 at shell 的环境执行命令,所以命令最好用绝对路径。

at 的执行和终端环境无关,如果要显示 Hello:

1
echo "Hello" > /dev/tty1

即通过终端设备处理.

由于 at 计划任务的使用,系统会将该项 at 任务独立出你的 bash 环境,直接交给系统的 atd 程序来接管。

at 任务的管理

使用 atq 查询,atrm 删除。

batch: 系统有空时才执行后台任务

batch 命令也是调用 at 来执行。

它是在 CPU 任务负载小于 0.8 时才执行你的任务。

任务负载,即 CPU 在单一时间点所负责的任务数量, 而不是 CPU 的使用率。

CPU 的任务负载大,代表 CPU 必须要在不同的任务之间执行频繁的任务切换。

不论是 crontab 还是 at, 其最小单位都是分钟,即它们的任务都是”每分钟检查一次”来处理。

15.3 循环执行的计划任务

15.3.1 用户的设置

建立循环任务需使用 crontab 这个命令。

配置文件有:

  • /etc/cron.allow
  • /etc/cron.deny
    前者的优先级同样高于后者。

使用 crontab 建立计划任务之后,该项任务会被记录到 /var/spool/cron/dmtsai 中。cron 每执行一项任务都会被记录到 /var/log/cron 这个日志文件中。

语法:

1
crontab [-u username] [-l|-e|-r]

选项和参数:

  • -u : 只有 root 才能执行这个任务,或者帮其他使用者建立/删除 crontab 任务
  • -e : edit, 编辑 crontab 任务内容
  • -l : list, 查看 crontab 任务内容
  • -r : remove, 删除所有的 crontab 任务内容,若仅删除一项,使用 -e 选项
    每项任务(即每行)都有六个字段:
  • 分钟, 0~59
  • 小时, 0~23
  • 日期, 1~31
  • 月份, 1~12
  • 周, 0~7
  • 命令
    几个特殊字符:
  • *, 任何时候
  • ,, 分隔时段
  • -, 一段时间
  • /n, 每隔 n 个单位

15.3.2 系统的配置文件

crontab -e 这个 crontab 是 /usr/bin/crontab 这个可执行文件。

/etc/crontab 是一个文本文件。

cron 会每分钟去读取一次 /etc/crontab/var/spool/cron 文件。

由于 cron 是读取到内存当中,所以在修改完 /etc/crontab 这个文件后,可能不会立即执行,这个时候需要重启 crond 服务: sudo systemctl restart crond.

15.3.3 一些注意事项

15.4 可唤醒停机期间的工作任务

anacron 命令,执行时间到了但却没有执行的计划任务。也就是说, 过了 crontab 需要执行任务的时间, 但是由于各种原因 crontab 并没有执行, anacron 就会检测到这类没有被执行的任务, 并执行.

15.4.1 什么是 anacron

anacron 也是每小时被 crond 执行一次,然后 anacron 再去检测相关的计划任务有没有被执行,如果有超过期限的任务在,就执行该任务,执行完毕或无需执行任何任务时,anacron 就停止。

第16章 进程管理与 SELinux 初探

Linux 得程序通常称为 fork-and-exec 的流程。

进程都会借由父进程以复制 (fork) 的方式产生一个一模一样的子进程,然后被复制出来的子进程再以 exec 的方式执行实际要执行的进程,最终就成为一个子进程。

常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户的各项任务,因此这些常驻程序就被称为: 服务 (daemon).

16.1.2 Linux 的多人多任务环境

在 Linux 下执行一个命令时,系统会将相关的权限、属性、进程代码与数据等均加载到内存,并基于这些进程一个进程标识符(PID), 最终该命令可以执行的任务则与这个 PID 的权限有关。

多重登录环境的七个基本终端界面

Linux 会默认启动六个终端登录环境的进程。

16.2 任务管理 (job control)

16.2.1 什么是任务管理

放入后台的任务是不可以用 ctrl + c 终止的。

16.2.2 job control 的管理

bash 只能够管理自己的任务而不能管理其他 bash 的任务。

在命令后加上 & 代表将该命令丢到后台中,此时 bash 会给予这个命令一个任务号码 (job number).

利用数据流重定向处理输出信息:

1
$ tar -zpcvf /tmp/tec.tar.gz /etc > /tmp/log.txt 2>&1 &

将目前任务丢到后台中暂停 – ctrl + z

默认情况下,使用 [ctrl+z] 丢到后台的程序都是暂停状态。

查看目前后台任务状态

使用 jobs 命令:

1
$ jobs [-lrs]

几个参数:

  • -l : 除了列出 job number 与命令串外,同时列出 PID 号码
  • -r : 仅列出正在后台 run 的任务
  • -s : 仅列出正在后台 stop 的任务
    使用 jobs -l 后,观察 + - 号,其中 + 代表默认的使用任务,也就是说仅输入 fg 就会被拿到前台中来处理.

将后台任务拿到前台处理: fg

fg 即 foreground.

1
fg %jobnumber

jobnumber 是任务号码,前面的 % 可有可无。

让任务在后台下的状态变成运行中: bg

Stopped 的任务变为 Running.

管理后台当中的任务:kill

1
2
$ kill -signal %jobnumber
$ kill -l

选项和参数:

  • -l : 列出目前 kill 能够使用的信号 (signal) 有哪些
  • signal : 代表给予后面接的那个任务什么样的指示,可以用 man 7 signal 查询
  • -1 : 重新读取一次参数的配置文件
  • -2 : 代表由键盘输入 [ctrl]-c 同样的操作
  • -9 : 立即强制删除一个任务
  • -15 : 以正常方式终止一项任务

16.2.3 脱机管理问题

任务管理中的后台是 bash 的后台,而不是系统的后台。

使用 nohup 命令, 其可以在脱机或注销系统后,还能够让任务继续执行:

1
2
$ nohup [命令与参数] <== 在终端前台中的任务
$ nohup [命令与参数] <== 在终端后台中的任务

nohug 命令并不支持 bash 的内置命令。

使用 nohug 的信息输出会被重定向到 ~/nohup.out

16.3 进程管理

16.3.1 查看进程

ps 命令的两个常用选项:

  • ps -l : 查看自己 bash 的进程
  • ps aux : 查看所有系统运行的进程

一般来说 ps aux 会按照 PID 的顺序来排序显示。

如果你发现某个进程的 CMD 后面接上了 时,就代表该进程是僵尸进程。

top : 动态查看进程的变化

使用方式:

1
$ top [-d数字] | top [-bnp]

参数和选项:

  • -d : 后面接秒数,就是整个进程界面更新的秒数。默认是5秒
  • -b : 以批量的方式执行 top, 通常搭配数据流重定向来将批量的结果输出为文件
  • -n : 与 -b 搭配,表示执行几次 top 的输出结果
  • -p : 指定某个 PID 来执行查看监测
    top 默认使用 CPU 使用率作为排序依据,可换。

pstree

1
$ pstree [-A|U] [-up]

选项与参数:

  • -A : 各进程树之间的连接以 ASCII 的方式
  • -U : 各进程树之间的连接以 Unicode 的方式
  • -p : 同时列出每个进程的 PID
  • -A : 同时列出每个进程的所属账号名称

16.3.2 进程的管理

进程的管理是通过给予该进程一个信号 (signal) 去告知该进程你想要让它做什么。

主要信号的代号、名称及内容:

  • 1 SIGHUP 启动被终止的进程,可让该 PID 重新读取自己的配置文件
  • 2 SIGINT 相当于键盘输入 [ctrl]-c 来终止一个进程
  • 9 SIGKILL 强制中断一个进程的执行
  • 15 SIGTERM 以正常方式结束进程的方式终止进程
  • 19 SIGSTOP 相当于键盘输入 [ctrl]-z 来暂停一个进程
    使用:
    1
    $ kill -signal PID

通过命令的内容来终止进程 – killall

1
$ killall [-iIe] [-signal] [command name]

参数:

  • -i : interactive, 在删除时会出现提示字符
  • -I : 忽略大小写
  • -e : exact, 表示接完整命令,但不能超过 15 个字符, 如 /bin.bash 是完整的,bash 不算完整

其可以将系统当中所有以某个命令启动的进程全部删除。

16.3.3 关于进程的执行顺序

需考虑进程的优先级 (priority) 和 CPU 调度。

Priority 和 Nice 值

Linux 给予进程一个优先级 (Priority, PRI), PRI 值越低代表越优先.

如果要调整进程的优先级,就要通过 nice 值,即 NI.

1
PRI (new) = PRI (old) + NI

注意项:

  • nice 值可调整范围为 -20 ~ 19
  • root 可随意调整自己或它人的进程的 nice 值,且范围为 -20 ~ 19
  • 一般用户仅可调整自己进程的 nice 值,且范围为 0 ~ 19
  • 一般用户仅可将 nice 值调高

nice : 新执行的命令即给予 nice 值

1
$ nice [-n 数字] command

renice : 已存在的进程的 nice 重新调整

1
$ renice [number] PID

16.3.4 查看系统资源信息

  • free,查看内存使用情况
  • uname, 查看系统与内核相关信息
  • uptime,查看系统启动时间与任务负载
  • netstat,追踪网络或 socket 文件
  • dmesg, 分析内核产生的信息
  • vmstat, 检测系统资源变化

16.4 特殊文件与进程

16.4.1 具有 SUID/SGID 权限的命令执行状态

SUID 特点:

  • SUID 权限仅对二进制程序有效
  • 执行这对于该程序需要具有 x 的可执行权限
  • 本权限仅在执行该程序的过程中有效 (run-time)
  • 执行者将具有该程序拥有者的权限
    查询整个系统的 SUID/SGID 的文件:
    1
    $ find / -perm /6000

16.4.2 /proc/* 代表的含义

进程都是在内存中的,而内存中的数据又都是写入到 /proc/* 这个目录下的. 主机上面的各个进程的 PID 都以目录的形式存在于 /proc 中。

/proc 目录下的文件,相关的文件对应相关的内容。

16.4.3 查询已使用文件或已执行进程使用的文件

fuser: 借由文件 (或文件系统) 找出正在使用该文件的进程

lsof: 列出被进程所使用的文件名称

pidof: 找出某个正在执行的进程的 PID

16.5 SELinux 初探

16.5.1 什么是 SELinux

SELinux 是 Security Enhanced Linux 的缩写

MAC (Mandatory Access Control) 可以实现针对特定的程序和特定的文件资源来进行权限的控制.

当初设计的目标: 避免资源误用

SELinux 是整合到内核的一个模块,更多内容可参考 链接

SELinux 是在进行进程,文件等详细权限配置时依据的一个内核模块。

传统的文件权限与帐号的关系: 自主访问控制

各种权限设置对 root 是无效的.

DAC, Discretionary Access Control, 自主访问控制, 即,当某个进程想要对文件进行读写时,系统就会根据进程的拥有者和用户组,对比文件的权限,只有通过权限检查,才可以读写文件的方式.

以策略规则制定进程读取特定文件: 强制访问控制 (MAC)

MAC, Mandatory Access Control, 强制访问控制。用户的权限根据进程而定,root 所获取的权限也不一定是 root.

默认情况下,httpd 这个进程仅能在 /var/www/ 这个目录下读取文件.

16.5.2 SELinux 的运行模式

  • 主体 (subject), SELinux 主要管理的就是进程
  • 目标 (Object), 主体进程能否读写的目标资源一般就是文件系统.
  • 策略 (Policy), 这些策略内还会有详细的规则 (rule) 来指定不同的服务是否开放某些资源的读写

SELinux 的重点是保护进程读取文件系统的权限.

第17章 认识系统服务(daemon)

17.1 什么是 daemon 与服务(service)

系统为了某些功能必须提供一些服务,这个服务就叫做 service, 完成 service 的程序叫 daemon. 也就是说, daemon 是程序,service 是功能。

服务的名称建立之后,在Linux 中使用时,通常在服务的名称后面加上一个 ‘d’, 这个 ‘d’ 代表的就是 daemon 的意思。

17.1.1 早期 System V 的 init 管理操作中 daemon 的主要分类(Optional)

服务的启动、关闭与查看等方式

所有的服务启动脚本放置于 /etc/init.d 目录。

处理方式:

  • 启动: /etc/init.d/daemon start
  • 关闭: /etc/init.d/daemon stop
  • 重新启动: /etc/init.d/daemon restart
  • 查看状态: /etc/init.d/daemon status

服务启动的分类

服务的依赖性问题

运行级别的分类

基本上 Linux 提供了7个运行级别, 分别是 0、1、2、3、4、5、6.

链接文件名(SXXdaemon)的功能为: S 为启动该服务,XX 是数字, 为启动顺序.

制定运行级别默认要启动的服务

通过以下命令操作:

  • 默认要启动: chkconfig daemon on
  • 默认不启动: chkconfig daemon off
  • 查看默认为启动与否: chkconfig –list daemon

运行级别的切换操作

从命令行界面 (runlevel3) 切换到图形界面 (runlevel5), 只需用 init 5 即可。

这里的命令行界面就是 tty 界面。Ubuntu 上也可行。

17.1.2 systemd 使用的 unit 分类

旧的 init 启动脚本是”一项一项任务依序启动”的模式,速度较慢。

systemd 让所有服务同时启动。

systemd 可以兼容 init 的启动脚本,旧的 init 的启动脚本能够通过 systemd 来管理。

全部的 systemd 都用 systemctl 这个管理程序进行管理,而 systemctl 支持的语法有限制。

如果某个服务启动是管理员手动执行(即直接输入 daemon),而不是使用 systemctl, 那么 systemd 将无法检测到该服务,无法进一步管理。

systemd 的配置文件放置目录

systemd 将过去 daemon 执行脚本通通称为一个服务单位(unit), 每种服务单位用功能区分.

配置文件所在目录:

  • /usr/lib/systemd/system: 每个服务最主要的启动脚本设置
  • /run/systemd/system: 系统执行过程中产生的服务脚本,其脚本的优先级高于 /usr/lib/systemd/system
  • /etc/systemed/system: 管理员根据主机系统的需求建立的执行脚本,其优先级比 /run/systemd/system

systemd 的 unit 类型分类说明

通过扩展名判断。

17.2 通过 systemctl 管理服务

systemd 只有 systemctl 这个命令来处理。

17.2.1 通过 systemctl 管理单一服务 (service unit) 的启动/开机启动与查看状态

服务的启动一般有两个阶段:

  • 开机时要不要启动
  • 现在要不要启动

systemctl 命令语法:

1
$ systemctl [command] [unit]

[command] 主要有:

  • start
  • stop
  • restart
  • enable, 设置下次开机时,后面的 unit 会被启动
  • disable
  • status
  • is-active
  • is-enable

不应该使用 kill 的方式来关闭一个正常的服务。

第18章 认识与分析日志文件

18.1 什么是日志文件

就是记录系统活动信息的几个文件.

Linux 常见的日志文件名

日志文件的权限通常是设置为仅有 root 能够读取.

常见的日志文件有:

  • /var/log/boot.log : 只会存储本次开机的信息
  • /var/log/cron
  • /var/log/dmesg
  • /var/log/lastlog
  • /var/log/maillog
  • /var/log/messages
  • /var/log/secure
  • /var/log/wtmp, /var/log/failing, 记录正确登录系统者的账户信息与错误登录时所使用的账户信息
  • /var/log/httpd/, /var/log/samba/

日志文件所需相关服务 (daemon) 与程序

日志文件的产生一般有两种方式:

  • 由软件开发商自行定义写入的日志文件与相关格式, 如 WWW 软件 apache
  • 另 Linux 发行版提供的日志文件管理服务来统一管理

可以使用 logrotate 工具来自动化处理日志文件容量与更新. 其将就的日志文件更改名字,然后建立一个空的日志文件,新的日志文件重新开始记录,旧的记录在保存一段时间之后可以自动删除.

针对日志文件所需的功能,需要的服务与程序有:

  • systemd-journald.service, 最主要的信息记录者,由 systemd 提供
  • rsyslog.service, 主要收集登录系统与网络等服务的信息
  • logrotate, 日志文件的轮循功能

systemd 有自己的日志文件管理服务 – systemd-journald.service. 其记录主要放在内存中。可以通过 journalctl 以及 systemctl status unit.service 来查看各个不同服务的日志文件.

18.1.2 日志文件内容的一般格式

一般来说,系统产生的信息并记录下来的内容,都会记录这些重要内容:

  • 事件发生的日期与时间
  • 发生此事件的主机名
  • 启动此事件的服务名称或命令与函数名称
  • 该信息的实际内容
    这些信息的详细度是可以更改的.

18.2 rsyslog.service: 记录日志文件的服务

18.2.1 rsyslog.service 的配置文件: /etc/rsyslog.conf

这个文件规定了:

  • 什么服务
  • 什么等级信息
  • 需要被记录在哪里 (设备或文件)

服务名称

rsyslogd 主要还是通过 Linux 内核提供的 syslog 相关规范来设置数据的分类.

每种服务所产生的数据量差异是很大的.

Linux 内核的 syslog 支持的服务类型主要有: (可使用 man 3 syslog 查看)

  • 0, kern
  • 1, user
  • 2, mail
    1. daemon
  • 4, auth
  • 5, syslog
  • 6, lpr
  • 7, news
  • 8, uucp
  • 9, cron
  • 10 authpriv
  • 11 ftp
  • 16 ~ 23, local0 ~ local7

信息等级

基本上,Linux 内核的 syslog 将信息分为 8 个主要的信息等级,根据 syslog.h 的定义,信息名称与数值的对应如下:

  • 7 debug
  • 6 info
  • 5 notice
  • 4 warning (warn)
  • 3 err (error)
  • 2 crit
  • 1 alert
  • 0 emerg (panic)

等级越靠近 0 则代表系统出现致命问题.

在信息等级之前还有 [.=!] 链接符号:

  • . 代表”比后面还要严重的等级(含该等级)都被记录下来”
  • .= 代表所需要的等级就是后面接的等级
  • .! 代表不等于,就是除了该等级外的其他等级都记录

信息记录的文件名或设备或主机

常见的放置处:

  • 文件的绝对路径
  • 打印机或其他
  • 用户名称
  • 远程主机
  • * 代表目前在线的所有人

服务,daemon 与函数名称

daemon 是软件.

service 通常是启动 daemon 的脚本设置.

18.2.2 日志文件的安全性设置

rsyslogd 的日志文件只要被编辑过就无法继续记录.

可以使用 chattr 增加属性来让日志文件仅能被增加而不能被删除.

1
chattr +a /var/log/admin.log

18.2.3 日志文件服务器的设置

18.3 日志文件的论循 (logrotate)

第19章 开机流程, 模块管理与 Loader

19.1 Linux 的启动流程分析

19.1.1 启动流程一览

Boot loader 可以指定使用哪个内核文件来启动,并实际加载到内核中解压缩与执行。此时内核就能够开始在内存中活动,并检测所有硬件信息与加载适当的驱动程序来使整台主机开始运行,等到内核检测硬件与加载驱动程序完毕后,操作系统便开始运行.

19.1.2 BIOS, boot loader 与 kernel 加载

BIOS, 无论传统 BIOS 还是 UEFI BIOS 都会被简称为 BIOS.

在个人计算机架构下,启动整个系统首先就要让系统去加载 BIOS (Basic Input Output System), 并通过 BIOS 程序去加载 CMOS 信息,并且借由 CMOS 内的设置取得主机的各项硬件配置. 在取得这些信息后,BIOS 会进行启动自我检测 (Power-on Self Test, POST), 然后开始执行硬件检测的初始化,并设置 PnP 设备,之后再定义出可启动的设备顺序,接下来就会开始进行设备的数据读取.

Boot loader 位于启动设备的第一个扇区中。

boot loader 的功能

loader 的主要功能是识别操作系统的文件格式.

由于不同操作系统的文件格式不一致,因此每种操作系统都有自己的 boot loader.

通常操作系统默认都会安装一份 loader 到它根目录所在文件系统的 boot sector 上.

boot loader 主要的功能如下:

  • 提供选项:用户可以选择不同的启动选项, 这也是多重引导的重要功能
  • 加载内核文件: 直接指向可启动的程序区域来启动操作系统
  • 转交其他 loader: 将启动管理功能转交给其他 loader 负责

内核文件一般被放置在 /boot 里,并去名为 /boot/vmlinuz.

Linux 内核可以通过动态加载内核模块,这些模块放置在 /lib/modules 目录内。

由于模块放置到磁盘根目录内,因此启动的过程中内核必须要挂在根目录,这样才能够读取内核模块提供的加载驱动程序功能.

一般来说,Linux 发行版都会将非必要的功能且可以编译成为模块的内核功能,编译成为模块.

虚拟文件系统 (Initial RAM Filesystem) 一般使用的文件名为 /boot/initrd/boot/initramfs, 这个文件可以通过 boot loader 来加载到内存中,然后这个文件会被解压缩并且在内存中模拟成一个根目录.

19.1.3 第一个程序 systemd 及使用 default.target 进入启动程序分析

systemd 最主要的功能就是准备软件执行的环境,包括系统的主机名,网络设置,语言设置,文件系统格式及其他服务的启动等.

要知道系统服务的启用流程,最简单的方法就是:

1
systemctl list-dependencies graphical.target

19.1.4 systemd 执行 sysinit.target 初始化系统,basic.target 准备系统

19.1.5 systemd 启动 multi-user.target 下的服务

各种主机服务以及提供服务器功能的网络服务的启动,大多附属与 multi-user.target.

一般服务的启动脚本设置都放在下面的目录内:

  • /usr/lib/systemd/system , 系统默认的服务启动脚本设置
  • /etc/systemd/system , 管理员自己开发与设置的脚本设置

将服务放到 /etc/systemed/system/multi-user.target.want 下就可以在启动时启动它.

当系统完成启动后,还想要系统额外执行某些程序的话,可以将程序命令或脚本的绝对路径名称写入到 /etc/rc.d/rc.local 这个文件下。 当 rc.local 具有可执行权限时才会被执行。

提供 tty 界面与登录服务

multi-user.target 下面的 getty.target 操作界面选项是提供 tty 界面。

用户登录服务也是在 multi-user.target 下。

19.1.6 systemd 启动 graphical.target 下面的服务

如果 default.targetmulti-user.target,这个步骤就不会执行.

19.1.7 启动过程会用到的主要配置文件

几个常见的比较重要的配置文件:

关于模块: /etc/modprobe.d/*.conf/etc/modules-load,d/*.conf

  • /etc/modprobe.d/*.conf 是可以加上模块参数的位置
  • /etc/modules-load.d/*.conf 是单纯加载模块的位置

systemctl restart systemd-modules-load.service 可重新加载模块.

19.2 内核与内核模块

在整个启动的过程当中,是否能够成功驱动我们的主机的硬件设备是内核 (kernel) 的工作。

内核一般为压缩文件,因此在使用内核之前,就的要将它解压缩后,才能加载到内存当中.

内核与模块的存放位置:

  • 内核: /boot/vmlinuz/boot/vmlinuz-version
  • 内核解压缩所需的 RAM Disk: /boot/inistramfs/boot/inistramfs-version
  • 内核模块: /lib/modules/version/kernel/lib/modules/$(uname -r)/kernel
  • 内核源代码: /usr/src/linux/usr/src/kernels (默认不安装)

添加新硬件支持:

  • 重新编译内核,并加入最新的硬件驱动程序源代码
  • 将该硬件的驱动程序编译成为模块,在启动时加载该模块

19.2.1 内核模块与依赖性

检查 /lib/modules/$(uname -r)/modules.dep 这个文件,其记录了内核支持的模块的各项依赖性.

使用 depmod 命令之后,该程序会跑到模块标准放置目录 /lib/modules/$(uname -r)/kernel,并一句相关目录的定义将全部的模块读取出来分析,最终将分析的结果写入 modules.dep 文件中.

19.2.2 查看内核模块

使用 lsmod 命令可以查看目前内核加载了多少模块.

显示的内容包括:

  • 模块名称 (Module)
  • 模块的大小 (Size)
  • 次模块是否被其他模块所使用 (Used by)

使用 modinfo 命令,可以查看在内核中的模块,也可以查看某个模块文件.

19.2.3 内核模块的加载与删除

使用 modprobe 这个命令来加载模块,modprobe 会主动查找 modules.dep 的内容,先解决了模块的依赖性后,才决定需要加载的模块有哪些. 其可加载也可删除.

insmod 需要提供完整文件名的模块。

内核模块一定是 .ko 结尾的。

19.2.4 内核模块的额外参数设置: /etc/modprobe.d/*.conf

19.3 Boot Loader: Grub2

19.3.1 boot loader 的两个 stage

在 BIOS 读完信息后,接下来就是回到第一个启动设备的 MBR 去读取 boot loader.

Linux 将 boot loader 的程序代码执行与设置值加载分成两个阶段 (stage):

  • Stage 1: 执行 boot loader 主程序, 这个主程序必须被安装在启动区,即 MBR 或启动扇区 (boot sector)
  • Stage 2: 主程序加载配置文件,通过 boot loader 加载所有配置文件与相关的环境参数文件, 一般来说,配置文件都在 /boot
    1
    ls -l /boot/grub2

19.3.2 grub2 的配置文件 /boot/grub2/grub.cfg 初探

grub2 的优点:

  • 识别与支持较多文件系统,并且可以使用 grub2 的主程序直接在文件系统中查找内核文件
  • 启动时可以自行编辑与修改启动设置选项,类似 bash 的命令模式
  • 可以动态查找配置文件,而不需要在修改配置文件后重新安装 grub2

磁盘与分区在 grub2 中的代号

1
2
3
(hd0,1)     # 一般的默认语法,由 grub2 自动判断分区格式
(hd0,msdos1) # 此磁盘的分区为传统的 MBR 模式
(hd0,gpt1) # 此磁盘的分区为 GPT 模式

注意点:

  • 以查找顺序作为硬盘的编号
  • 第一个查找到的硬盘为 0 号,第二个为 1 号
  • 每快硬盘的第一个分区代号为 1
    由于 BIOS 可以调整磁盘的启动顺序,所以 hdnn 会变.

19.3.3 grub2 配置文件维护 /etc/default/grub/etc/grub.d

19.3.4 instramfs 的重要性与建立新 initramfs 文件

initramfs 内所包含的模块大多是与启动过程有关,而主要以文件系统及硬盘模块为主.

一般来说,需要 initramfs 的时刻为:

  • 根目录所在磁盘为 SATA, USB 或 SCSI 等接口设备
  • 根目录所在文件系统为 LVM, RAID 等特殊格式
  • 根目录所在文件系统为非传统 Linux 支持的文件系统
  • 其他必须要内核加载时提供的模块

19.3.5 测试与安装 grub2

19.3.6 启动钱的额外功能修改

选项部分的画面就是 menuentry 后面的文字.

19.3.7 关于启动画面与终端画面的图形显示方式

19.4 启动过程的问题解决

Linux 无法顺利启动时,可进入 rescue 模式去处理.

19.4.1 忘记 root 密码的解决之道

19.4.2 直接启动就以 root 执行 bash 的方法

第20章 基础系统设置与备份策略

20.1 系统基本设置

使用 hwclock 是将正确时间写入 BIOS 时间记录.

使用 ntpdate 手动校时:

1
ntpdate s2m.time.edu.cn

s2m.time.edu.cn 是北京大学提供的时间服务器.

20.1.3 语系设置

/etc/locale.conf 是语系的配置文件,可以用 localectl 来查看目前的系统语系:

1
localectl

20.1.4 防火墙建议设置

防火墙是一种网络数据的过滤方式,它可以根据你服务器启动的服务来设置是否开放,也能够针对对你信任的用户开放.

相关设置项目:

  • 服务
  • 端口
  • 富规则 (rich rule)
  • 接口 : 就是这个区域主要是针对那一个网卡来做规范, 如 eth0

20.2 服务器硬件数据的收集

20.2.1 使用 dmidecode 查看硬件设备

dmidecode 可用于查看 CPU 型号,主板型号与内存相关的型号等.

语法:

1
dmidecode -t type

选项:

  • 1 : 详细的系统信息,含主板的型号与硬件的基础信息等
  • 4 : CPU 的相关信息,包括倍频,外频,内核数,内核线程数等
  • 9 : 系统的相关插槽格式,包括 PCI, PCI-E 等的插槽规格说明
  • 17 : 每一个内存插槽的规格,若有内存, 则列出该内存的容量与型号

20.2.2 硬件资源的收集与分析

内核所检测到的各项硬件设备,会被记录在 /proc/sys 当中.

lspci, lsusb, iostat 命令.

lspci 的所有数据都是从 /proc/bus/pci 目录中获取。

在线更新对应文件:

1
update-pciids

lostat 可用 sudo pacman -S sysstat 来安装.

20.2.3 了解磁盘的健康状态

smartd 服务, SMART 是 Self-Monitoring, Analysis and Reporting Technology System 的缩写.

需要被检测的磁盘支持 SMART 协议.

smartd 提供一个命令 smartctl.

20.3 备份要点

20.3.1 备份数据的考虑

20.3.2 哪些 Linux 数据具有备份的意义

通常粗分为两大类:

  • 系统基本设置信息
  • 类似网络服务的内容数据

操作系统本身需要备份的文件

主要跟 帐号与系统配置文件 有关, 包括 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 以及 /home 下的用户家目录,一般将 /etc 目录备份下来,几乎所有的配置文件都可以被保存.

用户的邮件,/var/spool/mail 内容也需要备份.

  • /etc/ 整个目录
  • /home/ 整个目录
  • /var/spool/mail/
  • /var/spool/{at/cron}/
  • /boot/
  • /root/
  • /usr/local//opt

网络服务的数据库方面

  • 软件本身的配置文件, 如 /etc/ 整个目录,/usr/local 整个目录
  • 软件服务提供的数据,以 WWW 为例: /var/www 整个目录或 /srv/www 整个目录

推荐备份的目录

  • /etc/
  • /home/
  • /root/
  • /var/spool/mail/, /var/spool/cron/, /var/spool/at/
  • /var/lib/

不需要备份的目录

  • /dev
  • /proc, /sys, /run
  • /mnt, /media
  • /tmp

20.4 备份的种类,频率与工具的选择

20.4.1 完备备份之累积备份 (incremental backup)

即将根目录 (/) 整个系统都备份下来.

累计备份指在系统进行完第一次完整备份后,经过一段时间的运行,比较系统与备份文件之间的差异,仅备份有差异的文件.

累积备份使用的备份软件

常见的有 dd, cpio, xfsdump/sfsrestore 等.

dd 可以直接读取磁盘的扇区而不理会文件系统,缺点是速度较慢. 其需要使用额外的脚本程序处理.

xfsdump 可直接进行累积备份

tar 命令也可用于备份. 常配合 date 命令

1
tar -jpcvf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql

可将备份用脚本配合 crontab 去执行.

20.4.2 完整备份之差异备份 (Differential backup)

20.5 鸟哥的备份策略

第23章 X Window 设置介绍

Linux 上的图形用户界面模式称为 X Window System. 其对于 Linux 来说只是一个软件。

23.1 什么是 X Window System

名称由来, X 在英文顺序的 W(indow) 后面,有下一代的新窗口之意。因此叫做 X Window System.

23.1.1 X Window System 的发展简史

在 UNIX-like 上面的图形用户接口(GUI)被称为 X 或 X11.

23.1.2 主要组件: X Server/X Client/Window Manager?Display Manager

X Window System 是基于网络架构的GUI. 意思就是 X Client 从网络上获取需求,X Server 来呈现(即绘制图像)。需要网络提供数据。

基本可以分成 X Server 和 X Client 两个组件。

X Server 管理硬件,X Client 是应用程序。

具体内容:

  • X Server, 负责硬件管理、屏幕绘制与提供字体功能。其管理的设备包括: 键盘、鼠标、手写板、显示器、屏幕分辨率与色彩深度、显卡(包括驱动程序)与显示字体等。
    X Window System 是软件,有自己的配置文件,其设置与 Linux 不一定相同。

每台客户端主机都需要安装 X Server, 而服务器则是提供 X Client 软件,以提供客户端绘图所需要的数据。

  • X Client, 负责 X Server 要求的事件的处理. 其主要工作为处理来自 X Server 的操作,将该操作处理为绘图数据,再将这些绘图数据传回给 X Server. 每个 X Client 并不知道其他 X Client 的存在。

X Window Manager: 特殊的 X Client, 负责管理所有的 X Client 软件。

Display Manager: 提供登录需求。如 GNOME 的 gdm(GNOME Display Manager).

23.1.3 X Window System 的启动流程

要启动 X Window System, 首先要启动管理硬件和绘图的 X Server, 然后才加载 X Client.

可在命令行输入 startx 来启动 X 窗口。

startx 是一个 shell 脚本,会主动帮忙用户建立他们的 X 所需要引用的配置文件。

语法:

1
$ startx [X Client 参数] -- [X Server 参数]

startx 最重要的任务是找到用户或是系统默认的 X Server 与 X Client 的配置文件。用户能通过外接参数来修改配置文件的内容。

实际上启动 X 的是 xinit 这个程序,startx 仅找出设置值。

xinit 的语法:

1
xinit [client option] -- [server or display option]

默认情况下,输入 startx 等于 xinit /etc/X11/xinit/xinitrc -- /etc/X11/xinit/xserverrc

xinit 主要在启动 X Server 和加载 X Client, 但这个 xinit 所需要的参数是由 startx 帮忙查找。

X 启动的时候可以指定启动的接口。

在 X Window System 的环境下,称 6000 端口为第 0 个显示接口,即 hostname:0. 通常写为 :0

23.1.4 X 启动流程测试

第24章 Linux 内核编译与管理

内核控制主机的所有硬件并提供系统所有的功能.

内核 (kernel) 是整个操作系统的最底层, 它负责整个硬件的驱动, 以及提供各种系统所需的内核功能, 包括防火墙功能, 是否支持 LVM 或磁盘配额等文件系统功能.

想要让计算机完成的工作, 都需要通过内核的帮助. 想要让计算机完成的工作, 都必须要有内核支持才可以.

内核本质上就是一个文件, 其包含了驱动主机各项硬件的检测程序与驱动模块.

这个内核文件通常被命名为 vmlinuz-xxx, 有时也不一定, 因为一台主机上面可以拥有多个内核文件, 只是启动的时候仅能选择一个来加载.

什么是内核模块 (kernel module) ? 也就是 Linux 的模块化设置, 由于硬件更新快, 需要不断添加. 将类似驱动的东西独立出内核, 编译成模块, 然后内核可以在系统正常运行的过程当中加载这个模块, 这样就能在不需要修改内核的前提下, 只需要编译出适当的模块, 并加载它.

模块放在 /lib/modules/(uname -r)/kernel 中.

24.1.2 更新内核的目的

除了 BIOS (或 UEFI) 之外, 内核是操作系统最早被加载到内存的东西, 它包含了所有可以让硬件和软件工作的信息.

可重新编译内核来去除掉很多用不到的功能.

内核的主要工作就是管理硬件.

获取最新稳定版内核代码:

保存原本设置: 利用 patch 升级内核源代码

每次内核发布时, 除了发布完整的内核压缩文件之外, 也会发布该版本与前一版本的差异性 patch 文件. 每个内核的 patch 仅有针对前一版的内核来分析.

24.1.5 内核源代码的解压缩, 安装, 查看

Linux 内核文件一般建议放在 /usr/src/kernels/ 下.

其中的 Documentation 目录下有说明.

24.2 内核编译前的预处理与内核功能选择

整个内核编译的重要工作就是选择你想要的功能.

24.2.1 硬件环境查看与内核功能要求

24.2.2 保持干净源代码: make mrproper

处理掉编译过程的目标文件 (*.o) 以及配置文件.

进入内核所在目录后:

1
make mrproper

其会将内核功能选择文件也删除, 因此一般在内核编译之前进行这个操作.

删除目标文件之类的编译过程产生的中间文件:

1
make clean 

24.2.3 开始选择内核功能

内核功能的选择, 最终会在如 /usr/src/kernels/linux-3.10.89/ 下面产生一个名为 .config 的隐藏文件, 这个文件就是 /boot/config-xxx 文件.

常见的建立方法

几条命令, 具体见书

关于整个内核功能选择的建议:

  • 肯定内核一定要的功能, 直接编译到内核中
  • 可能在未来会用到, 那么尽量编译成模块
  • 不知道功能, 保留默认值或将它编译成为模块

24.2.4 内核功能详细选项选择

具体看书.

24.3 内核的编译与安装

我的 Archlinux 的内核源代码位于 /lib/modules/5.19.12-arch1-1/kernel 规则为: /lib/modules/$(uname -r)/build/lib/modules/$(uname -r)/source 这两个链接文件.

除了 make 和 gcc 外, kernel-devel 这个软件也要安装.

需要了解到: 内核, 内核模块, 驱动程序模块, 内核源代码与头文件的相关性.


鸟哥的 Linux 私房菜 Notes
http://example.com/2022/08/24/鸟哥的-Linux-私房菜-Notes/
作者
Jie
发布于
2022年8月24日
许可协议