跳转至

🐧 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 rmi localhost/rsyslog:latest
podman rmi --all    # 删除所有镜像

⚠️ 用 podman images 确认镜像已删除。



Podman 容器 systemd 开机自启

为什么需要先运行临时容器再生成服务文件?

podman generate systemd 需要读取一个已存在的容器配置来生成 .service 文件。正确流程:

run 临时容器(配好所有参数) → generate systemd 生成服务文件 → 删除临时容器 → systemd 接管

完整操作流程

# 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. 用户与权限管理

语法公式

用户/组  主机=(目标用户)  NOPASSWD:命令

示例

%admins ALL=(root) NOPASSWD:ALL
  ①         ②          ③    ④
字段 含义
%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              ← 主配置文件(一般不动)
/etc/sudoers.d/admins     ← 额外配置文件(推荐在这里写)

⚠️ /etc/sudoers.d/ 下的文件名不要有 .(如 admin.conf),否则可能不被加载。

验证

su - harry
sudo id
# uid=0(root) gid=0(root) groups=0(root)  ← sudo 提权成功


密码策略 + chage 命令

全局默认策略:/etc/login.defs

vim /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 只对新创建的用户生效,已存在的用户不受影响。

验证新用户策略

useradd user1
chage -l user1
# Maximum number of days between password change : 20  ← 确认生效

chage 命令:精确控制单个用户

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) → 卷组(VG) → 逻辑卷(LV) → 格式化 → 挂载
   /dev/vdb      pvcreate      vgcreate     lvcreate      mkfs     mount
层级 命令 含义
物理卷 (PV) pvcreate 把硬盘/分区注册进 LVM
卷组 (VG) vgcreate 把 PV 合成一个大存储池
逻辑卷 (LV) lvcreate 从 VG 里切出一块空间
格式化 mkfs 创建文件系统
挂载 mount 接到目录树上

扩容逻辑卷

lvextend -r -L 512M /dev/exam/rhel
参数 含义
lvextend 扩展逻辑卷大小
-r 同时调整文件系统大小(自动 resize)
-L 512M 目标大小(绝对大小)

⚠️ 传统方式需两步:先 lvextendresize2fs(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 条目格式

设备文件      挂载目录  格式   选项      备份  自检
/dev/vdb2    swap     swap   defaults   0     0

free -m 输出解读

              total   used   free
Swap:           511      0    511     ← 看这行,511M ≈ 512M

易错点

易错点 正确做法
分区号选错 vdb1 已被 LVM 用,swap 用 vdb2
没改分区类型 必须 t82 设为 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. 系统监控脚本

脚本内容

#!/bin/bash
ps -xao user,pid,vsz,rss,%cpu --sort=%cpu

ps 参数拆解

ps -xao user,pid,vsz,rss,%cpu --sort=%cpu
   ① ②        ③              ④
参数 含义
-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 命令综合题

脚本内容

#!/bin/bash
find /usr -size +30k -size -50k -perm -4000 -type f > /root/myfile

参数拆解

参数 含义
/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 后缀只是给人看的,考试/规范推荐不加后缀(像系统命令 lsgrep 一样)。


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 -i "s/^Listen  80/Listen 82/g"

参数拆解

参数 含义
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,子文件自动继承父目录组)

部署注意

  1. 确保系统有 bbben 组,用户已加入
  2. Samba 密码独立设置:smbpasswd -a 用户名
  3. 目录权限:chown root:bbben /media/... && chmod 2770 /media/...
  4. 改完配置先 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(最常用)

scp 文件 用户名@IP:/远程路径/
scp -r 目录 用户名@IP:/远程路径/   # 传目录
基于 SSH,简单直接,无断点续传。

2. rsync(推荐,增量同步)

rsync -avz 本地目录/ 用户名@IP:/远程路径/
支持断点续传、增量同步,适合大文件和目录同步。

3. sftp(交互式)

sftp 用户名@IP
# put/get/lcd/cd 等交互命令
适合不确定路径时慢慢操作。

4. cat + ssh(管道流,小文件)

cat 本地文件 | ssh 用户名@IP "cat > /远程路径/文件"
适合传配置文件等小内容。

5. ssh + tar(大批量传输)

tar czf - /本地目录 | ssh 用户名@IP "tar xzf - -C /远程路径/"
打包压缩传输,一次性大量文件。

6. lrzsz(rz/sz,终端内传)

rz    # 上传(弹文件选择框)
sz 文件   # 下载
需服务器安装 lrzsz,适合小文件,无断点续传。

日常推荐

  • 小文件 → scp
  • 目录同步 → rsync
  • 覆盖 90% 场景


14. macOS 与 Linux 服务管理体系对比

macOS 服务管理

1. launchd(核心机制)

  • 系统级:/Library/LaunchDaemons/(后台守护)、/Library/LaunchAgents/(登录启动)
  • 用户级:~/Library/LaunchAgents/
  • 管理命令:launchctl listlaunchctl 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=servicesystemctl 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) - 安全加固(服务器安全)

建议下一步

  1. 写实用脚本练手(健康检查、备份、日志清理)
  2. 把知识库做成 Docker 镜像(练 Docker 基础)
  3. 考完 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 即可解决

注意python3pip3 本身就是标准命令,不需要起别名。需要 alias 的是 pythonpip(让它们指向 python3/pip3)。在 venv 虚拟环境里 python/pip 自动可用,不需要 alias。