🐧 Linux
1. tar 压缩选项速查¶
| 选项 | 压缩格式 | 文件后缀 | 解压命令 |
|---|---|---|---|
-czf |
gzip | .tar.gz / .tgz |
-xzf |
-cjf |
bzip2 | .tar.bz2 |
-xjf |
-cJf |
xz | .tar.xz |
-xJf |
-caf |
自动检测 | 任意 | -xaf |
常用示例:
# 压缩
tar -czf archive.tar.gz /path/to/dir # gzip
tar -cjf archive.tar.bz2 /path/to/dir # bzip2
tar -cJf archive.tar.xz /path/to/dir # xz
# 解压
tar -xzf archive.tar.gz
tar -xjf archive.tar.bz2
tar -xJf archive.tar.xz
tar -xaf archive.tar.gz # 自动检测格式
gzip 与 bzip2 格式对比:
| gzip | bzip2 | |
|---|---|---|
| 魔数 (Magic) | 1f 8b |
42 5a ("BZ") |
| 头部结构 | 10 字节固定头 | 4 字节魔数 + 1 字节版本 |
| 压缩算法 | DEFLATE (LZ77 + Huffman) | Burrows-Wheeler + Huffman |
| 尾部 | CRC32 + 原始大小 (各 4 字节) | CRC + 原始大小 |
⚠️ 两者格式完全不同,不能互相替换或混合使用。
2. 容器管理完整指南¶
镜像与容器的关系¶
Containerfile/Dockerfile ← 配方(怎么装软件、配什么环境)
↓ podman build
镜像 (Image) ← 打包好的成品(只读,不动)
↓ podman run
容器 (Container) ← 跑起来的实例(活的,占内存)
| 概念 | 类比 |
|---|---|
| Containerfile | 菜谱(写清楚要什么材料、怎么做) |
| 镜像 (Image) | 做好的菜,放冰箱里不动,随时能端出来 |
| 容器 (Container) | 餐桌上正在吃的那盘菜(可以吃、可以加调料) |
- 镜像:只读模板,包含操作系统基础层 + 软件 + 配置文件,存在本地磁盘上,一个镜像可以同时跑多个容器
- 容器:镜像跑起来的实例,在镜像基础上加了一个可写层,占用 CPU 和内存
完整操作流程¶
准备工作(root 用户)¶
# 1. 创建用户并设置密码
useradd sashat
echo "redhat" | passwd --stdin sashat
# 2. 安装 podman
yum install podman -y
# 3. 配置镜像仓库
vim /etc/containers/registries.conf
unqualified-search-registries = ["registry.lab.example.com"]
[[registry]]
location = "registry.lab.example.com"
insecure = true
blocked = false
| 参数 | 含义 |
|---|---|
unqualified-search-registries |
不带域名前缀时默认搜索的仓库 |
insecure = true |
允许 HTTP 连接(考试内网无证书) |
blocked = false |
不阻止该仓库 |
构建镜像流程(sashat 用户)¶
# 1. 切换用户
ssh sashat@servera
# 2. 下载 Containerfile
wget http://content.example.com/Containerfile
# 3. 登录镜像仓库
podman login registry.lab.example.com
# Username: admin / Password: 321
# 4. 构建镜像
podman build -t modify_file:latest .
# ^ 点不能忘!
# 5. 查看构建结果
podman images
⚠️ podman build -t name:tag . 最后的 . 表示当前目录作为构建上下文,漏掉会报错。
导入/推送镜像流程¶
# 1. 从 tar 包导入镜像
podman load < rsyslog.tar
# 2. 打标签(镜像名必须匹配仓库地址)
podman image tag localhost/rsyslog:latest registry.lab.example.com/library/rsyslog:latest
# 3. 登录仓库
podman login registry.lab.example.com
# 4. 推送到仓库
podman push registry.lab.example.com/library/rsyslog:latest
⚠️ podman load 用 < 重定向读取,不能直接跟文件名。
运行容器¶
# 创建挂载目录
mkdir /home/sashat/syslog
# 运行容器
podman run -d --privileged \
-v /home/sashat/syslog:/var/log:Z \
--name logserver \
registry.lab.example.com/library/rsyslog:latest
# 进入容器执行命令
podman exec -it logserver /bin/bash
logger "This is a rhcsa exam"
# 验证
grep rhcsa /home/sashat/syslog/messages
skopeo inspect docker://registry.lab.example.com/library/rsyslog:latest
| 参数 | 含义 |
|---|---|
-d |
后台运行(detach) |
--privileged |
特权模式,允许容器访问宿主机设备 |
-v 宿主机:容器:Z |
挂载目录,:Z 为 SELinux 标签 |
--name |
给容器命名 |
-it |
交互模式 + 伪终端 |
rm vs rmi¶
| 命令 | 用途 | 删除对象 |
|---|---|---|
podman rm |
删除容器 | 运行中/已停止的容器 |
podman rmi |
删除镜像 | 镜像(i = image) |
⚠️ 用 podman images 确认镜像已删除。
Podman 容器 systemd 开机自启¶
为什么需要先运行临时容器再生成服务文件?¶
podman generate systemd 需要读取一个已存在的容器配置来生成 .service 文件。正确流程:
完整操作流程¶
# 1. 准备挂载目录(root)
mkdir /opt/txt.pdf
chown sashat:sashat /opt/txt.pdf
# 2. 切换到用户
ssh sashat@servera
# 3. 运行临时容器
podman run -d --name txt2pdf \
-v /opt/txt/:/opt/txt:Z \
-v /opt/pdf:/opt/pdf:Z \
localhost/modify_file:latest
# 4. 生成 systemd 服务文件
mkdir -p ~/.config/systemd/user
cd ~/.config/systemd/user
podman generate systemd txt2pdf --files --name new
# 5. 启用开机自启
systemctl --user daemon-reload
systemctl --user enable container-txt2pdf.service
# 6. 清理临时容器并重启服务
podman rm -f txt2pdf
systemctl --user restart container-txt2pdf.service
# 7. 验证
podman ps
| 命令 | 含义 |
|---|---|
podman generate systemd txt2pdf --files --name new |
根据容器配置自动生成 .service 文件 |
systemctl --user daemon-reload |
重新加载 systemd 用户级服务 |
systemctl --user enable |
设置用户级开机自启 |
⚠️ rootless 容器必须用用户级 systemd(--user),不能用系统级。
Podman 删除远程 Registry 中的错误镜像¶
问题: tag 错了本地镜像,push 到了远程 registry,需要删除
解决方法:
# 方法1:skopeo 删除
skopeo delete --force docker://registry.lab.example.com/library/rsyslog:latest
# 方法2:curl 调 API 删除
DIGEST=$(skopeo inspect docker://registry.lab.example.com/library/rsyslog:latest | python3 -c "import json,sys; print(json.load(sys.stdin)['Digest'])")
curl -X DELETE -k https://registry.lab.example.com/v2/library/rsyslog/manifests/$DIGEST
前提条件: Registry 需要开启 delete 功能(storage.delete.enabled: true),否则返回 405
本地清理: podman rmi -f <image> 可以本地取消 tag
3. 用户与权限管理¶
语法公式¶
示例¶
| 字段 | 值 | 含义 |
|---|---|---|
① %admins |
% = 组,admins = 组名 |
admins 组所有成员 |
② ALL |
主机名 | 在任何主机上生效 |
(root) |
目标用户 | 可切换到 root |
③ NOPASSWD |
无需密码 | 执行 sudo 不需要输密码 |
④ ALL |
命令范围 | 可执行任何命令 |
常见写法速查¶
# 用户 harry 可 sudo,需要密码
harry ALL=(root) ALL
# 用户 harry 可 sudo,不需要密码
harry ALL=(root) NOPASSWD:ALL
# wheel 组可 sudo(RHEL 默认)
%wheel ALL=(ALL) ALL
# 用户 bob 只能重启 httpd
bob ALL=(root) /usr/bin/systemctl restart httpd
# users 组可 sudo,不需要密码
%users ALL=(root) NOPASSWD:ALL
配置文件位置¶
⚠️ /etc/sudoers.d/ 下的文件名不要有 .(如 admin.conf),否则可能不被加载。
验证¶
密码策略 + chage 命令¶
全局默认策略:/etc/login.defs¶
| 参数 | 含义 | 默认值 |
|---|---|---|
PASS_MAX_DAYS |
密码最长有效天数(过期时间) | 99999 |
PASS_MIN_DAYS |
密码最短修改间隔(天) | 0 |
PASS_MIN_LEN |
密码最小长度(会被 PAM 覆盖) | 5 |
PASS_WARN_AGE |
密码到期前警告天数 | 7 |
考试常考:修改 PASS_MAX_DAYS 20 表示新用户密码 20 天后过期。
⚠️ /etc/login.defs 只对新创建的用户生效,已存在的用户不受影响。
验证新用户策略¶
chage 命令:精确控制单个用户¶
| 参数 | 含义 | 示例 |
|---|---|---|
-l |
列出用户的密码策略信息 | chage -l harry |
-M |
设置密码最大有效期(天) | chage -M 90 harry |
-m |
设置密码最短修改间隔(天) | chage -m 7 harry |
-W |
设置密码到期提前警告天数 | chage -W 14 harry |
-I |
密码过期后强制停用天数 | chage -I 30 harry |
-E |
设置账户过期日期 | chage -E 2026-12-31 harry |
-d |
设置上次改密码日期 | chage -d 2026-01-01 harry |
常用场景:
chage -M 90 harry # 密码 90 天过期
chage -I 3 harry # 过期后 3 天不改就锁定
chage -E 2026-12-31 intern1 # 账户 2026-12-31 过期
chage -d 0 harry # 强制下次登录必须改密码
chage -l 输出解读¶
Last password change : Jan 01, 2026
Password expires : Mar 02, 2026
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 90 ← 关键字段
Number of days of warning before password expires : 7
login.defs vs chage 区别¶
/etc/login.defs |
chage |
|
|---|---|---|
| 作用范围 | 全局默认,只影响新用户 | 单个用户,精确控制 |
| 生效时机 | 创建用户时读取 | 立即生效 |
| 适合场景 | 改默认策略 | 改已有用户 |
useradd -g 与 -G 的区别¶
-g(小写)= 主组(primary group)
- 指定用户登录时的默认组
- 用户只能有一个主组
- 示例:useradd -g admins harry → harry 的主组是 admins
-G(大写)= 附加组(supplementary groups)
- 指定用户额外属于的组,可以有多个(逗号分隔)
- 示例:useradd -G admins harry → harry 主组是默认的 harry 组,admins 是附加组
记忆技巧: 小 g = group(一个),大 G = Groups(多个)
验证: id harry 可以看到 gid(主组)和 groups(所有组)
4. 磁盘与存储管理¶
LVM 三层架构¶
| 层级 | 命令 | 含义 |
|---|---|---|
| 物理卷 (PV) | pvcreate |
把硬盘/分区注册进 LVM |
| 卷组 (VG) | vgcreate |
把 PV 合成一个大存储池 |
| 逻辑卷 (LV) | lvcreate |
从 VG 里切出一块空间 |
| 格式化 | mkfs |
创建文件系统 |
| 挂载 | mount |
接到目录树上 |
扩容逻辑卷¶
| 参数 | 含义 |
|---|---|
lvextend |
扩展逻辑卷大小 |
-r |
同时调整文件系统大小(自动 resize) |
-L 512M |
目标大小(绝对大小) |
⚠️ 传统方式需两步:先 lvextend 再 resize2fs(ext4)或 xfs_growfs(xfs)。加 -r 一步搞定。
创建逻辑卷(含 PE 大小设置)¶
题目要求: 卷组 myvg,逻辑卷 mylv,PE 大小 16M,LV 大小 50 个 PE(= 800M),文件系统 ext3,挂载 /mnt/mydata
# 1. 创建分区
fdisk /dev/vdb
# n → p → 默认分区号 → +1G
# 2. 设置分区类型为 LVM
# t → 分区号 → 8e
# 3. 保存
# w
# 4. 创建卷组,PE 大小 16M(关键!)
vgcreate -s 16M myvg /dev/vdb3
# 5. 创建逻辑卷(50 个 PE)
lvcreate -l 50 -n mylv myvg
# 6. 格式化为 ext3
mkfs.ext3 /dev/myvg/mylv
# 7. 创建挂载点并永久挂载
mkdir /mnt/mydata
echo '/dev/myvg/mylv /mnt/mydata ext3 defaults 0 0' >> /etc/fstab
mount -a
# 8. 验证
df -Th /mnt/mydata/
-L vs -l 区别¶
| 参数 | 含义 | 示例 |
|---|---|---|
-L(大写) |
指定绝对大小 | -L 800M |
-l(小写) |
指定PE 数量 | -l 50 |
PE (Physical Extent) 说明¶
- PE 是 LVM 最小的存储分配单位,默认 4M
- 逻辑卷大小必须是 PE 大小的整数倍
- 用
vgcreate -s 16M可以修改 PE 大小
易错点¶
| 易错点 | 正确做法 |
|---|---|
| PE 大小忘了改 | vgcreate -s 16M,不是默认 4M |
用 -L 而不是 -l |
-l 50(PE 数量),不是 -L 50M |
| 格式化用 ext4 | 题目要求 ext3 |
| 缩容顺序反了 | 必须先缩文件系统,再缩 LV(扩容顺序相反) |
⚠️ 扩缩容顺序相反: 扩容先扩 LV 再扩文件系统;缩容先缩文件系统再缩 LV。xfs 文件系统不能缩容。
Swap 交换区配置¶
完整流程¶
# 1. 创建分区
fdisk /dev/vdb
# n → p → 2 → +512M
# 2. 设置分区类型为 swap
# t → 2 → 82
# 3. 保存
# w
# 4. 格式化为 swap
mkswap /dev/vdb2
# 5. 临时启用
swapon /dev/vdb2
# 6. 写入 fstab 永久生效
echo '/dev/vdb2 swap swap defaults 0 0' >> /etc/fstab
# 7. 验证 fstab
swapoff -a
mount -a
swapon -a
# 8. 确认生效
free -m
Swap 是什么?¶
物理内存 (RAM) 不够用时,把不活跃的数据暂时放到硬盘上,这块硬盘空间就是 Swap。
关键参数说明¶
| 步骤 | 命令 | 含义 |
|---|---|---|
| 格式化 | mkswap /dev/vdb2 |
把分区格式化为 swap 格式 |
| 临时启用 | swapon /dev/vdb2 |
告诉内核开始使用这个 swap |
| 永久生效 | fstab 中 swap swap defaults 0 0 |
开机自动启用 |
| 停用 | swapoff -a |
停用所有 swap |
fstab 中 swap 条目格式¶
free -m 输出解读¶
易错点¶
| 易错点 | 正确做法 |
|---|---|
| 分区号选错 | vdb1 已被 LVM 用,swap 用 vdb2 |
| 没改分区类型 | 必须 t → 82 设为 swap 类型 |
| 只 swapon 没写 fstab | 必须写 fstab 否则重启失效 |
| 忘了验证 fstab | 写完用 swapoff -a && swapon -a 测试 |
fdisk Partition number 默认值¶
Partition number (1, 2, default 2):中默认是 2 的原因:/dev/vdb1已被占用- MBR 分区表的分区号从 1 开始编号,fdisk 检测到 1 号已被使用,所以默认给出第一个空闲号 2
- 如果磁盘是全新的,默认就是 1
- MBR 最多 4 个主分区(编号 1-4)
分区类型(Partition Type)与修改方法¶
分区类型是什么: 只是一个标签,告诉系统这个分区的用途,不影响实际功能
常见类型: - 83 = Linux(普通分区) - 82 = Linux swap - 8e = Linux LVM - fd = Linux RAID - ef = EFI System
修改方法:
- fdisk /dev/sdb → 按 t → 输入类型编号
- gdisk /dev/sdb → 按 t → 输入 GUID 代码
- parted /dev/sdb set 1 lvm on(非交互式)
- sfdisk /dev/sdb <<< ',8e'(脚本化)
RHCSA 考试流程(创建 LVM): 1. fdisk 创建分区 → t → 改为 8e(LVM) 2. pvcreate /dev/sdb1 3. vgcreate vg0 /dev/sdb1 4. lvcreate -n lv0 -L 500M vg0
注意: 改类型只是改标签,不丢数据;但 pvcreate 会写入 LVM 元数据,会清掉原有数据
MBR vs GPT 分区表类型¶
MBR(Master Boot Record): - 最大 2TB 磁盘 - 最多 4 个主分区(或 3主+1扩展,扩展里分逻辑分区) - BIOS 启动用 - 工具:fdisk、parted(默认 MBR)
GPT(GUID Partition Table): - 支持超 2TB 磁盘 - 最多 128 个主分区 - UEFI 启动用 - 工具:gdisk、parted
查看分区表类型:
- lsblk -f
- parted /dev/sdb print(看 Label:msdos=MBR,gpt=GPT)
- fdisk -l /dev/sdb(看 disklabel type)
创建分区表:
- fdisk /dev/sdb → 默认 MBR
- parted /dev/sdb mklabel msdos → MBR
- parted /dev/sdb mklabel gpt → GPT
RHCSA 考试: 一般用 MBR + fdisk,简单直接
5. Cron 计划任务完整指南¶
| cron 写法 | 含义 | 执行时间 |
|---|---|---|
*/2 |
每隔 2 分钟 | 0, 2, 4, 6, 8, ... |
2 |
每小时的第 2 分钟 | x:02:00 |
原理:* 表示"所有值",*/2 = "所有值中每隔 2 个取一个",即 0, 2, 4, 6...
常见例子:
- */5 → 每 5 分钟
- */10 → 每 10 分钟
- */15 → 每 15 分钟
一句话:*/数字 = 每隔 N 分钟,单独写数字 = 每小时的第 N 分钟
Cron 计划任务相关命令总结¶
一、Linux 系统 cron 命令¶
| 命令 | 含义 |
|---|---|
crontab -l |
查看当前用户的计划任务 |
crontab -l -u natasha |
查看指定用户的计划任务 |
crontab -e |
编辑当前用户的计划任务(交互式) |
crontab -r |
删除当前用户的所有计划任务 |
crontab mycron.txt |
从文件导入计划任务 |
cron 时间格式¶
┌────── 分钟 (0-59)
│ ┌──── 小时 (0-23)
│ │ ┌── 日 (1-31)
│ │ │ ┌ 月 (1-12)
│ │ │ │ ┌ 星期 (0-7, 0和7都是周日)
│ │ │ │ │
*/2 * * * * echo hello
特殊符号¶
| 符号 | 含义 | 示例 |
|---|---|---|
* |
每 | * * * * * 每分钟 |
*/n |
每隔 n | */5 * * * * 每5分钟 |
, |
列举 | 1,3,5 * * * * 第1、3、5分钟 |
- |
范围 | 1-5 * * * * 第1到5分钟 |
常见 cron 示例¶
- 每天凌晨2点:
0 2 * * * /scripts/backup.sh - 每周一早上8点:
0 8 * * 1 /scripts/report.sh - 每5分钟:
*/5 * * * * /scripts/check.sh
二、Ansible cron 模块¶
| 参数 | 含义 |
|---|---|
name |
任务描述(标识,用于删除) |
minute |
分钟 |
hour |
小时 |
day |
日 |
month |
月 |
weekday |
星期 |
job |
执行的命令 |
user |
执行用户 |
state |
present(创建) / absent(删除) |
创建:cron: name="任务描述" minute="*/2" user=natasha job="echo hello"
删除:cron: name="任务描述" state=absent(用 name 匹配精确删除)
三、系统 crontab vs Ansible cron¶
| 项目 | 系统 crontab | Ansible cron 模块 |
|---|---|---|
| 编辑方式 | crontab -e 交互式 |
Playbook 声明式 |
| 删除任务 | 手动删行或 crontab -r 清空 |
state: absent 按 name 精确删除 |
| 标识 | 无 | name 字段(Ansible 自动加注释) |
6. 系统监控脚本¶
脚本内容¶
ps 参数拆解¶
| 参数 | 含义 |
|---|---|
-x |
显示所有用户的进程,包括不依附终端的 |
-a |
显示所有终端(tty)上的进程 |
-o |
自定义输出格式(字段用逗号隔开) |
--sort=%cpu |
按 CPU 使用率升序排列 |
输出字段说明¶
| 字段 | 含义 |
|---|---|
user |
进程的所有者 |
pid |
进程 ID |
vsz |
虚拟内存大小(KB) |
rss |
实际占用的物理内存(KB) |
%cpu |
CPU 使用率 |
创建和运行¶
# 1. 创建脚本
vim /usr/local/bin/exam_sysinfo
# 2. 加执行权限
chmod +x /usr/local/bin/exam_sysinfo
# 3. 运行
exam_sysinfo
ps 其他常用参数¶
| 参数 | 含义 |
|---|---|
-ef |
显示所有进程 + 完整命令 |
-aux |
BSD 风格,显示所有进程 |
--sort=-%cpu |
降序排列(CPU 最高的在前面) |
--sort=-%mem |
按内存降序排列 |
⚠️ 脚本放在 /usr/local/bin/ 可以直接用名字运行,不用写全路径。
7. find 命令综合题¶
脚本内容¶
参数拆解¶
| 参数 | 含义 |
|---|---|
/usr |
从 /usr 目录开始搜索 |
-size +30k |
大于 30KB |
-size -50k |
小于 50KB |
-perm -4000 |
包含 SUID 权限位 |
-type f |
只找普通文件 |
> /root/myfile |
结果写入文件 |
两个 -size 同时使用是 AND 关系:30k < 文件 < 50k
特殊权限位¶
| 权限位 | 数字 | 含义 |
|---|---|---|
| SUID | 4000 | 执行时以文件所有者身份运行 |
| SGID | 2000 | 执行时以文件所属组身份运行 |
| SBIT | 1000 | 粘滞位(如 /tmp) |
创建和运行¶
vim /usr/local/bin/mysearch
chmod a+x /usr/local/bin/mysearch
/usr/local/bin/mysearch
cat /root/myfile
脚本命名说明¶
Linux 里文件扩展名不影响执行。系统只关心:
1. 文件有没有执行权限(chmod +x)
2. 文件开头有没有 shebang(#!/bin/bash)
.sh 后缀只是给人看的,考试/规范推荐不加后缀(像系统命令 ls、grep 一样)。
8. chattr -i 锁定文件属性¶
chattr +i /etc/resolv.conf # 加 immutable 属性,文件不可改/删/重命名(root 也不行)
chattr -i /etc/resolv.conf # 去掉 immutable 属性,恢复可编辑
用途:RHEL 7+ 的 /etc/resolv.conf 被 NetworkManager 管理,手动改 DNS 后用 chattr +i 锁死防止被覆盖;需要再改时先 chattr -i 解锁。
考试常考:改 DNS 配置前先解锁,改完再锁上。
9. free -m vs df -Th vs lsblk 三者对比¶
| free -m | df -Th | lsblk | |
|---|---|---|---|
| 看什么 | 内存 + swap | 文件系统空间 | 块设备结构 |
| 层级 | RAM 层 | 文件系统层 | 磁盘/分区层 |
| swap 相关 | ✅ 显示 swap 总量和使用 | ❌ 不显示 | ⚠️ 只标 [SWAP] 标记 |
| 能看到设备关系 | ❌ | ❌ | ✅ 树状展示 |
| 能看到可用空间 | ✅ 内存可用 | ✅ 磁盘可用 | ❌ 只有大小 |
为什么验证 swap 用 free -m 而不是 df -Th? swap 分区没有文件系统,df -Th 根本看不到它。
10. sed 替换命令详解¶
参数拆解¶
| 参数 | 含义 |
|---|---|
sed |
Stream Editor,流编辑器 |
-i |
原地编辑(in-place),直接修改文件 |
s/ |
替换命令(substitute) |
^Listen 80 |
匹配内容(^ = 行首锚定) |
Listen 82 |
替换内容 |
g |
全局替换(一行中多个匹配全换) |
正则说明¶
^行首锚定:只匹配行开头的,不匹配行中间的- 没有
^:一行中任何位置出现都替换 - 有
g:一行中所有匹配都替换 - 没有
g:只替换每行第一个匹配
常见用法¶
# 替换并备份原文件
sed -i.bak "s/old/new/g" file.conf
# 只输出不改文件(不加 -i)
sed "s/old/new/g" file.conf
# 删除空行
sed -i '/^$/d' file.conf
# 删除行首空格
sed -i 's/^[[:space:]]*//' file.conf
11. Bash 单引号与双引号的区别¶
无变量时两者等价:
- logger 'This is a rhcsa exam' 和 logger "This is a rhcsa exam" 效果相同
有变量时不同:
- 单引号:所见即所得,不解析变量 → echo '$VAR' 输出 $VAR
- 双引号:解析变量和命令替换 → echo "$VAR" 输出变量值
记忆: 字符串里有 $ 才需要考虑用哪种引号,纯文本随便用
12. Samba 共享配置详解¶
配置示例¶
[share]
path = /media/bbben/disk/share
browseable = yes
writable = yes
valid users = @bbben
create mask = 0660
directory mask = 2770
逐项说明¶
- [share]:共享名,客户端连接时显示的名字(如
\\IP\share) - path:共享目录的物理路径
- browseable = yes:在网络浏览中可见(no 则隐藏共享)
- writable = yes:允许写入(no 则只读)
- valid users = @bbben:
@表示用户组,只有 bbben 组内用户可访问(不带@是用户名) - create mask = 0660:新建文件权限 rw-rw----(属主6+同组6+其他0)
- directory mask = 2770:新建目录权限 rwxrws---(770 + setgid位2,子文件自动继承父目录组)
部署注意¶
- 确保系统有 bbben 组,用户已加入
- Samba 密码独立设置:
smbpasswd -a 用户名 - 目录权限:
chown root:bbben /media/... && chmod 2770 /media/... - 改完配置先
testparm检查语法,再systemctl restart smbd
查看连接与日志¶
sudo smbstatus:查看当前活跃的 SMB 连接- 日志目录:
/var/log/samba/ log.smbd:核心日志log.nmbd:名称解析日志log.<hostname>:按客户端主机名分文件
smb.conf 完整结构¶
[global] # 全局配置(workgroup、security、hosts allow、log level)
[homes] # 用户家目录共享(%S 自动指向当前用户目录)
[共享名] # 自定义共享(path、writable、valid users、create mask)
关键配置项¶
security = user:推荐模式,每个连接都要认证hosts allow:建议只放行需要的网段- 常用变量:
%m=客户端主机名,%M=客户端IP,%S=当前用户名
13. 终端传文件到服务器的方式¶
1. scp(最常用)¶
基于 SSH,简单直接,无断点续传。2. rsync(推荐,增量同步)¶
支持断点续传、增量同步,适合大文件和目录同步。3. sftp(交互式)¶
适合不确定路径时慢慢操作。4. cat + ssh(管道流,小文件)¶
适合传配置文件等小内容。5. ssh + tar(大批量传输)¶
打包压缩传输,一次性大量文件。6. lrzsz(rz/sz,终端内传)¶
需服务器安装 lrzsz,适合小文件,无断点续传。日常推荐¶
- 小文件 → scp
- 目录同步 → rsync
- 覆盖 90% 场景
14. macOS 与 Linux 服务管理体系对比¶
macOS 服务管理¶
1. launchd(核心机制)¶
- 系统级:
/Library/LaunchDaemons/(后台守护)、/Library/LaunchAgents/(登录启动) - 用户级:
~/Library/LaunchAgents/ - 管理命令:
launchctl list、launchctl load/unload - 配置文件:plist 格式
2. Homebrew Services(第三方,推荐)¶
brew services list/start/stop/restart- 简化了 launchd 的操作
3. 应用目录¶
/Applications/(系统级)、~/Applications/(用户级)
Linux 服务管理¶
systemd(核心)¶
- 服务文件:
/lib/systemd/system/ - 自定义服务:
/etc/systemd/system/ - 用户服务:
~/.config/systemd/user/ - 管理命令:
systemctl list-units --type=service、systemctl status/start/stop/enable/disable
关键区别¶
| 维度 | macOS | Linux |
|---|---|---|
| 服务管理 | launchd + brew services(两层) | systemd(一个管所有) |
| 服务配置 | plist 文件 | service 文件 |
| 查看端口 | lsof -i -P | grep LISTEN |
ss -tlnp |
| 包管理 | brew | apt/yum/dnf |
15. 运维学习路线与概念梳理¶
脚本、服务、容器的关系¶
脚本(shell/python)
↓ 注册为 systemd 服务 → systemctl 管理
↓ 打包为 Docker 镜像 → docker/podman 管理
↓ 镜像运行 → 容器(轻量隔离的"服务")
systemd 服务 vs Docker 容器¶
| 维度 | systemd 服务 | Docker 容器 |
|---|---|---|
| 管理工具 | systemctl | docker / podman |
| 隔离性 | 共享宿主机环境,无隔离 | 独立文件系统/网络/进程,强隔离 |
| 启动方式 | systemctl start xxx |
docker run xxx |
| 资源占用 | 轻,直接跑在宿主机 | 稍重(但比虚拟机轻很多) |
| 部署方式 | 手动装依赖、写 service 文件 | Dockerfile 一键构建 |
| 可移植性 | 换台机器要重新装环境 | 镜像在哪都能跑 |
| 适合场景 | 单机、简单服务 | 微服务、多环境、团队协作 |
systemd 服务示例¶
# /etc/systemd/system/my-app.service
[Unit]
Description=My App
[Service]
ExecStart=/usr/bin/python3 /opt/my-app/main.py
Restart=always
[Install]
WantedBy=multi-user.target
Docker 镜像示例¶
FROM python:3.11
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
学习路线¶
第一阶段(基础巩固): - systemd 服务管理 ✅ - Nginx 反向代理 ✅ - 进程管理、文件权限
第二阶段(自动化运维): - Shell 脚本(变量、条件、循环、函数、正则) - Crontab 定时任务 - 日志管理(journalctl、logrotate) - 网络排查(curl、dig、ss、tcpdump、iptables)
第三阶段(容器化): - Docker 基础(镜像、容器、Dockerfile、docker-compose) - Docker 网络和数据卷 - docker-compose 多容器编排
第四阶段(进阶方向): - 云原生/K8s(大规模容器编排) - CI/CD(GitHub Actions、Jenkins) - 监控告警(Prometheus + Grafana) - 安全加固(服务器安全)
建议下一步¶
- 写实用脚本练手(健康检查、备份、日志清理)
- 把知识库做成 Docker 镜像(练 Docker 基础)
- 考完 RHCSA/RHCE 后进入 Docker 阶段
核心:Shell 脚本 + Docker = 运维入门
16. apt update 与 apt upgrade 的区别¶
apt update:更新软件源索引(本地缓存的包列表),不安装任何软件apt upgrade:根据最新索引,实际升级已安装的软件包
为什么要先 update? - apt install/upgrade 查的是本地缓存的索引,不会实时访问远程服务器 - 不 update → 本地索引过期 → 可能装不上或装旧版本 - 类比:先去超市拿最新价目表,再按价格买东西
标准流程:sudo apt update && sudo apt upgrade -y
17. Alias 别名配置¶
配置文件:
- Linux bash:~/.bashrc
- Linux zsh / macOS zsh:~/.zshrc
- 全局:/etc/bash.bashrc 或 /etc/profile.d/
用法:
- 临时生效:alias python=python3
- 永久生效:写入 ~/.zshrc 或 ~/.bashrc,然后 source 加载
- 查看所有别名:alias
- 删除别名:unalias python
python3 vs python:很多 Linux 发行版默认只有 python3,没有 python,用 alias python=python3 即可解决
注意:python3 和 pip3 本身就是标准命令,不需要起别名。需要 alias 的是 python 和 pip(让它们指向 python3/pip3)。在 venv 虚拟环境里 python/pip 自动可用,不需要 alias。