一.命令行使用技巧

1. 核心概念(内核、shell、Linux、开源)

概念 通俗解释 核心作用
内核 (Kernel) Linux 的 “大脑”,操作系统的核心程序 管理硬件(CPU / 内存 / 硬盘)、分配系统资源、控制进程运行
Shell 内核和用户之间的 “翻译官” 接收用户输入的命令,翻译成内核能理解的语言,返回执行结果(常见:bash、zsh)
Linux 基于内核的开源操作系统 由内核 + Shell + 各种工具程序(如 ls、cat)组成,可运行在服务器 / 嵌入式等设备
开源 (Open Source) 软件的源代码公开可查 用户可自由查看、修改、分发代码(如 Linux 内核源码可下载编译),区别于 Windows 闭源

示例:你输入 ls /,Shell 接收命令并传给内核,内核读取根目录文件列表,Shell 再把结果展示给你。

2. Linux 中命令录入方式

  • 直接录入:终端中直接输入命令(如 ls),按回车执行;
  • 快捷键复用:按 调用上一条命令, 调用下一条,避免重复输入;
  • 命令行编辑:光标移到任意位置修改命令(按 ←/→ 移动,Backspace 删除);
  • 多行命令:用 \ 换行录入(适合长命令),示例:

    bash

    运行

    # 多行录入一条命令
    cp \
    /etc/passwd \
    /tmp/passwd.bak
    

3. 命令行高频快捷键(新手必记)

快捷键 作用
Tab 命令 / 路径补齐(下文重点讲)
Ctrl + A 光标跳到命令行开头
Ctrl + E 光标跳到命令行结尾
Ctrl + U 删除光标前所有字符
Ctrl + K 删除光标后所有字符
Ctrl + C 终止当前运行的命令(比如卡死的程序)
Ctrl + L 清屏(等同于 clear 命令)
Ctrl + D 退出当前终端 / Shell
Alt + . 粘贴上一条命令的最后一个参数(超实用)

示例:输入 cp /etc/passwd /tmp/ 后按回车,再输入 vim ,按 Alt + . 会自动补全为 vim /tmp/

4. 命令行补齐(Tab 键)

Tab 是 Linux 最常用的效率快捷键,核心作用是自动补全命令 / 路径 / 文件名,避免输错:

  • 补全命令:输入 mk 按 Tab,会自动补全为 mkdir(如果唯一);
  • 补全路径:输入 cd /e 按 Tab,会自动补全为 cd /etc/
  • 补全文件名:输入 cat /tmp/pa 按 Tab,会补全为 cat /tmp/passwd.bak(如果该文件存在);
  • 两次 Tab:如果有多个匹配项(比如输入 cd /u 按两次 Tab),会列出所有可选路径(/usr//var/ 等)。

5. 命令行获取帮助(--help /man)

方式 1:--help(简单帮助,新手首选)

bash

运行

# 查看ls命令的基本用法
ls --help

# 查看mkdir命令的帮助
mkdir --help

特点:输出简洁,只显示核心参数和用法。

方式 2:man(手册页,详细帮助)

bash

运行

# 查看ls的完整手册(按q退出)
man ls

# 查看vim的手册(按/搜索关键词,比如输入/insert找插入模式)
man vim

man 手册的操作键:

  • ↑/↓:上下翻页;
  • /关键词:搜索(比如 /option 找参数说明);
  • q:退出手册。


二. Linux 下文件管理

1. 核心文件管理命令

命令 作用 实操示例
touch 创建空文件 / 更新文件时间 touch test.txt(创建 test.txt)
mkdir 创建目录 mkdir -p /tmp/a/b(递归创建多级目录)
rm 删除文件 / 目录 rm test.txt(删文件);rm -rf /tmp/a(强制删目录)
cp 复制文件 / 目录 cp /etc/hosts /tmp/(复制文件);cp -r /etc/yum /tmp/(复制目录)
mv 移动 / 重命名 mv test.txt /tmp/(移动);mv old.txt new.txt(重命名)
cat 查看文件内容(短文件) cat /etc/passwd(查看用户信息)
head 查看文件开头(默认前 10 行) head -5 /etc/passwd(查看前 5 行)
less 分页查看长文件 less /var/log/messages(按↑/↓翻页,q 退出)
vim 编辑文件(核心编辑器) vim test.txt(进入编辑,i 编辑,:wq 保存退出)
file 查看文件类型 file /bin/ls(显示:ELF 64 位可执行文件)
wc 统计行数 / 单词数 / 字节数 wc -l /etc/passwd(统计行数)
ls 列出文件 / 目录 ls -l(详细列表);ls -a(显示隐藏文件)

2. Linux 二级目录的作用(必记)

Linux 系统的核心目录各司其职,新手需记住:

目录 作用
/bin 所有用户可执行的基础命令(ls、cat 等)
/etc 系统配置文件(如 passwd、hosts)
/home 普通用户的家目录(如 /home/lee)
/root root 用户的家目录
/tmp 临时文件(重启后可能清空)
/var 可变数据(日志、缓存、邮件等)
/usr 系统软件安装目录(类似 Windows 的 Program Files)
/dev 硬件设备文件(如硬盘 /dev/sda,终端 /dev/pts/0)

3. 文件寻址(相对路径 vs 绝对路径)

绝对路径:从根目录 / 开始的完整路径,唯一且准确。示例:/etc/passwd/home/lee/test.txt

相对路径:相对于当前所在目录的路径,依赖当前位置。示例:你在 /home/lee 目录下,test.txt 就是相对路径(对应绝对路径 /home/lee/test.txt);../root/ 表示 “当前目录的上一级目录下的 root 目录”。

# 绝对路径:无论在哪,都能找到文件
cat /etc/passwd

# 相对路径:先进入/home,再访问lee目录
cd /home
cat lee/test.txt

4. 文件批处理(通配符 / 特殊字符)

(1)通配符(匹配文件 / 目录名)

符号 含义 示例
* 匹配任意长度的任意字符 ls *.txt(所有 txt 文件);rm /tmp/*(删除 tmp 下所有文件)
? 匹配 1 个任意字符 ls test?.txt(匹配 test1.txt、testa.txt 等)
[[:alpha:]] 匹配任意字母(大小写) ls [[:alpha:]].txt(匹配 a.txt、B.txt 等)
[[:digit:]] 匹配任意数字 ls [[:digit:]].txt(匹配 1.txt、9.txt 等)
[[:lower:]] 匹配小写字母 ls [[:lower:]].txt(匹配 a.txt、z.txt 等)
[[:upper:]] 匹配大写字母 ls [[:upper:]].txt(匹配 A.txt、Z.txt 等)
[[:alnum:]] 匹配字母 + 数字 ls [[:alnum:]].txt(匹配 a.txt、9.txt 等)
[[:punct:]] 匹配标点符号 ls [[:punct:]].txt(匹配!.txt、@.txt 等)
[[:space:]] 匹配空格 / 制表符 (较少直接用,多用于脚本匹配空白)

(2)[] 和 {} 的区别

符号 含义 示例
[] 匹配括号内的单个字符 ls [123].txt(匹配 1.txt、2.txt、3.txt)
{} 生成多个字符串(批量创建 / 操作) touch {a,b,c}.txt(创建 a.txt、b.txt、c.txt);cp file{,.bak}(复制 file 为 file.bak)
# 用{}批量创建文件
touch test{1..5}.txt  # 创建test1.txt到test5.txt

# 用[]匹配文件
ls test[135].txt      # 只显示test1、3、5.txt

# 用*匹配所有txt文件
rm *.txt              # 删除所有txt文件

三、Linux 输入和输出

1. 字符设备

字符设备是 Linux 系统中以单个字符为单位读写数据的硬件设备,属于 “设备文件”(存储在/dev目录),是操作系统与外部设备的交互接口。

  • 核心特征:按字符流式读写,无缓存(或小缓存),比如键盘按一下输出一个字符。
  • 常见字符设备:终端(/dev/pts/0)、键盘、鼠标、串口、打印机等。
# 1. 查看当前终端对应的字符设备文件路径
echo $TTY  # 输出示例:/dev/pts/0

# 2. 查看字符设备的属性(ls -l结果第一位为c,代表字符设备)
ls -l /dev/pts/0
# 输出示例:crw--w---- 1 root tty 136, 0 1月 13 10:00 /dev/pts/0
# 解析:c=字符设备,rw--w----=权限,136,0=设备号

2. 输入和输出的基本原理

Linux 将所有输入输出抽象为 “文件描述符(FD)”,程序通过文件描述符读写数据,核心有 3 个默认描述符:

  • stdin(标准输入):文件描述符 = 0,默认从键盘读取数据;
  • stdout(标准输出):文件描述符 = 1,默认将正确结果输出到终端;
  • stderr(标准错误):文件描述符 = 2,默认将错误信息输出到终端。所有程序的输入 / 输出本质都是对这 3 个描述符的读写操作。

# 查看当前bash进程的文件描述符($$代表当前进程PID)
ls -l /proc/$$/fd
# 输出示例:
# lrwx------ 1 root root 64 1月 13 10:05 0 -> /dev/pts/0 (stdin指向当前终端)
# lrwx------ 1 root root 64 1月 13 10:05 1 -> /dev/pts/0 (stdout指向当前终端)
# lrwx------ 1 root root 64 1月 13 10:05 2 -> /dev/pts/0 (stderr指向当前终端)

3. 输出重定向

将程序的 stdout(1)或 stderr(2)输出内容覆盖写入到文件(而非终端),核心语法:

命令 > 文件:等价命令 1> 文件,覆盖标准输出到文件;

命令 2> 文件:覆盖标准错误到文件。关键特征:目标文件不存在则创建,存在则清空原有内容。

# 1. 标准输出重定向(将find的正确结果覆盖写入/mnt/lee)
find /etc -name passwd > /mnt/lee
# 查看结果(仅包含正确找到的passwd文件路径)
cat /mnt/lee
# 输出:
# /etc/pam.d/passwd
# /etc/passwd

# 2. 标准错误重定向(将find的错误信息覆盖写入/mnt/err)
find /etc -name passwd 2> /mnt/err
# 查看结果(仅包含权限不足等错误信息)
cat /mnt/err
# 输出示例:
# find: ‘/etc/sudoers.d’: 权限不够
# find: ‘/etc/pki/rsyslog’: 权限不够

4. 追加

将程序的 stdout(1)或 stderr(2)输出内容追加写入到文件末尾(不覆盖原有内容),核心语法:

  • 命令 >> 文件:等价命令 1>> 文件,追加标准输出到文件;
  • 命令 2>> 文件:追加标准错误到文件。关键特征:原有内容保留,新内容写在文件末尾。
# 1. 先写入基础内容到/mnt/lee
echo "初始内容" > /mnt/lee

# 2. 追加标准输出到/mnt/lee(保留初始内容)
find /etc -name passwd >> /mnt/lee

# 3. 查看结果(初始内容+新增的passwd路径)
cat /mnt/lee
# 输出:
# 初始内容
# /etc/pam.d/passwd
# /etc/passwd

# 4. 追加错误信息到/mnt/err(多次执行不会清空原有错误)
find /etc -name passwd 2>> /mnt/err

5. 输入重定向

让程序从文件读取数据(而非默认的键盘 stdin),核心语法:

  • 命令 < 文件:等价命令 0< 文件,将文件内容作为程序的标准输入。适用场景:替代手动键盘输入,批量给程序传数据。
# 1. 先创建测试文件
echo "hello linux" > /mnt/lee

# 2. 输入重定向:tr从/mnt/lee读取内容,将小写转大写
tr 'a-z' 'A-Z' < /mnt/lee
# 输出:HELLO LINUX

# 3. 统计/etc/passwd的行数(替代手动输入)
wc -l < /etc/passwd
# 输出示例:45(表示/etc/passwd有45行)

6. 多行录入

通过<<EOF(EOF 为自定义结束标记,可替换为任意字符如 END),手动输入多行内容作为程序的 stdin,输入到EOF时停止录入。适用场景:脚本中批量输入文本、给命令传多行参数。

# 多行录入:将输入的多行内容转大写
tr 'a-z' 'A-Z' <<EOF
hehe
haha
xixi
EOF
# 输出:
# HEHE
# HAHA
# XIXI

# 备注:EOF前后无空格,结束时单独输入EOF即可停止

7. 管道

管道符|:将前一个命令的 stdout 作为后一个命令的 stdin,实现命令联动。关键限制:仅传递标准输出(stdout),标准错误(stderr)不会被管道传递,仍输出到终端。

# 1. 简单管道:echo输出的内容通过管道给tr转大写
echo "haha" | tr 'a-z' 'A-Z'
# 输出:HAHA

# 2. 多命令联动:find找到passwd路径,统计行数
find /etc -name passwd | wc -l
# 输出:2(仅统计正确结果的行数,错误信息直接输出到终端)

# 3. 多行内容管道处理
echo -e "haha\nhehe" | tr 'a-z' 'A-Z'
# 输出:
# HAHA
# HEHE

8. 错误输出通过管道

默认管道仅传递 stdout,需先将 stderr(2)重定向到 stdout(1),让错误信息也通过管道传递,核心语法:

  • 命令 2>&1 | 后续命令:将 stderr 重定向到 stdout,再通过管道传递;
  • 命令 &> 文件 | 后续命令:等价写法(所有输出重定向)。
# 1. 错误输出通过管道:统计find的所有输出(正确+错误)行数
find /etc -name passwd 2>&1 | wc -l
# 输出示例:17(包含2行正确结果+15行错误信息)

# 2. 对比:未重定向时仅统计正确结果行数
find /etc -name passwd | wc -l
# 输出:2(错误信息直接打印到终端,不参与管道)

9. 输出复制

通过tee命令,将程序的 stdout 同时输出到终端文件(一份输出,两处留存),核心语法:

  • 命令 | tee 文件:覆盖写入文件;
  • 命令 | tee -a 文件:追加写入文件。适用场景:既想看实时输出,又想保存结果到文件。

# 1. 输出复制:find的所有输出既显示到终端,又保存到/mnt/file
find /etc -name passwd 2>&1 | tee /mnt/file
# 终端会打印正确+错误信息,同时/mnt/file也会保存相同内容

# 2. 统计输出行数(验证内容一致)
wc -l /mnt/file
# 输出示例:17(和管道统计的行数一致)

# 3. 追加模式:保留原有文件内容
find /etc -name passwd 2>&1 | tee -a /mnt/file

四、用户管理

1. 用户存在的意义

Linux 是多用户多任务操作系统,用户是系统权限管控的核心载体,其存在的本质是通过 3A 机制 实现对系统资源的安全管理:

  • 认证(Authentication):验证用户身份,确认 “你是谁”。比如登录时输入用户名 + 密码,系统校验是否匹配;
  • 授权(Authorization):给通过认证的用户分配操作权限,决定 “你能做什么”。比如允许 lee 用户读写 /mnt/sc 目录,禁止其修改系统配置;
  • 审计(Audit):记录用户的所有操作行为,追溯 “你做过什么”。比如通过日志查看 lee 用户何时执行了 rm 命令、修改了哪些文件。

2. 用户涉及的系统配置文件

Linux 把用户 / 组的所有信息存储在纯文本配置文件中,root 拥有唯一修改权限,核心文件如下:

  • /etc/passwd:存储所有用户的基本信息(用户名、UID、GID、家目录、Shell 等),所有用户可读;
  • /etc/group:存储所有用户组的基本信息(组名、GID、组成员),所有用户可读;
  • /etc/shadow:存储用户的加密密码及密码策略(有效期、过期时间等),仅 root 可读,保障密码安全;
  • /etc/skel/.*:用户家目录模板,新建用户时,该目录下的所有隐藏文件(如 .bashrc)会自动复制到用户家目录;
  • /var/spool/mail/username:用户的邮件存储目录(username 为用户名);
  • /home/username:用户的家目录(默认路径),用户拥有该目录的读写权限。
# 1. 查看/etc/passwd(以lee用户为例)
grep "lee" /etc/passwd
# 输出示例:lee:x:2000:2000::/home/lee:/bin/bash
# 解析:用户名:密码占位符:UID:GID:注释:家目录:登录Shell

# 2. 查看/etc/group(以shengchan组为例)
grep "shengchan" /etc/group
# 输出示例:shengchan:x:2001:lee,westos
# 解析:组名:密码占位符:GID:组成员

# 3. 查看/etc/shadow(仅root可读)
grep "lee" /etc/shadow
# 输出示例:lee:$6$xxxx:19687:0:90:7:::
# 解析:用户名:加密密码:最后修改时间:最小有效期:最大有效期:警告期::过期时间

# 4. 查看/etc/skel目录的模板文件
ls -a /etc/skel
# 输出示例:.  ..  .bash_logout  .bash_profile  .bashrc

# 5. 查看用户邮件目录(以lee为例)
ls -l /var/spool/mail/lee

# 6. 查看用户家目录
ls -l /home/lee

3. 用户管理命令

3.1 useradd(创建用户)

创建新用户,可通过参数自定义 UID、主组、附加组、家目录等,核心参数:

  • -u:指定 UID(唯一,建议大于 1000,避免与系统用户冲突);
  • -g:指定主组(必须是已存在的组);
  • -G:指定附加组(多个组用逗号分隔);
  • -M:不创建家目录;
  • -s:指定登录 Shell(如 /bin/bash 可登录,/sbin/nologin 禁止登录);
  • -c:添加用户注释(如 “生产部 - lee”);
  • -d:自定义家目录(默认 /home/用户名)。
# 1. 创建基础用户lee(默认参数)
useradd lee

# 2. 创建自定义用户westos
useradd -u 2001 -g shengchan -G caiwu,jishu -c "生产部-westos" -d /home/westos -s /bin/bash westos

# 3. 验证用户创建结果
id westos
# 输出示例:uid=2001(westos) gid=2001(shengchan) 组=2001(shengchan),2002(caiwu),2003(jishu)

3.2 usermod(修改用户)

修改已存在用户的属性,核心参数:

  • -l:修改用户名(原用户名→新用户名);
  • -g:修改主组;
  • -G:覆盖附加组(会清空原有附加组);
  • -aG:追加附加组(保留原有,新增);
  • -c:修改注释;
  • -d:修改家目录(仅改配置,不移动文件);
  • -md:修改家目录并移动原有文件;
  • -s:修改登录 Shell;
  • -L:锁定用户(禁止登录);
  • -U:解锁用户。
# 1. 修改westos用户名为westos_new
usermod -l westos_new westos

# 2. 给westos_new追加jishu组(保留原有附加组)
usermod -aG jishu westos_new

# 3. 锁定lee用户
usermod -L lee

# 4. 解锁lee用户
usermod -U lee

# 5. 修改lee的登录Shell为禁止登录
usermod -s /sbin/nologin lee

3.3 userdel(删除用户)

删除用户,核心参数 -r:删除用户的同时,删除其家目录和邮件目录(不加 -r 仅删用户,保留家目录)。

# 1. 仅删除用户lee(保留家目录)
userdel lee

# 2. 彻底删除用户westos_new(含家目录+邮件)
userdel -r westos_new

3.4 passwd(密码管理)

管理用户密码,核心参数:

  • -S:查看密码状态(是否锁定、有效期等);
  • -d:清空密码(用户无需密码即可登录,不建议);
  • -e:强制用户下次登录修改密码;
  • -x:设置密码最大有效期(天);
  • -n:设置密码最小有效期(天,期间不能改密码);
  • -w:设置密码过期前警告天数;
  • --stdin:非交互设置密码(适合脚本)。
# 1. 交互式设置lee密码
passwd lee

# 2. 非交互设置lee密码(脚本常用)
echo "123456" | passwd --stdin lee

# 3. 查看lee密码状态
passwd -S lee
# 输出示例:lee PS 2026-01-13 0 90 7 -1 (密码已设置,使用SHA512加密)

# 4. 强制lee下次登录改密码
passwd -e lee

# 5. 设置lee密码最大有效期90天,警告期7天
passwd -x 90 -w 7 lee

3.5 chage(密码策略管理)

精细化管理密码策略(比 passwd 更全面),核心参数:

  • -d 0:强制用户下次登录修改密码(等价 passwd -e);
  • -W:密码过期前警告天数;
  • -m:密码最小有效期;
  • -M:密码最大有效期;
  • -E:账号过期时间(格式 YYYY-MM-DD);
  • -I:密码过期后锁定账号的天数。
# 1. 强制lee下次登录改密码
chage -d 0 lee

# 2. 设置lee密码有效期:最小7天,最大90天,警告7天
chage -m 7 -M 90 -W 7 lee

# 3. 设置lee账号2026-12-31过期
chage -E 2026-12-31 lee

# 4. 查看lee的密码策略(交互式)
chage -l lee
# 输出示例:
# 最近一次密码修改时间                    :1月 13, 2026
# 密码过期时间                    :4月 13, 2026
# 密码失效时间                    :从不
# 账户过期时间                    :12月 31, 2026
# 两次改变密码之间相距的最小天数          :7
# 两次改变密码之间相距的最大天数          :90
# 在密码过期之前警告的天数        :7

4. 权力下放(sudo)

给普通用户赋予 root 权限(无需共享 root 密码),核心规则:

  • /etc/sudoers:sudo 配置文件,直接编辑无语法检测,易出错;
  • visudo:编辑 /etc/sudoers 的专用命令(有语法检测,推荐);
  • sudo 命令:普通用户执行特权命令(需验证自身密码,可配置免密)。

# 1. 编辑sudoers配置文件(推荐用visudo)
visudo
# 在文件末尾添加以下规则:
# 规则1:lee用户免密执行所有命令
# lee ALL=(ALL) NOPASSWD: ALL
# 规则2:westos用户仅能执行重启sshd的命令(需验证密码)
# westos ALL=(ALL) /usr/bin/systemctl restart sshd

# 2. 普通用户lee执行特权命令(免密)
su - lee
sudo ls /root  # 可查看root目录(普通用户默认无权限)
sudo systemctl restart sshd  # 可重启sshd服务

# 3. 普通用户westos执行指定命令(需验证密码)
su - westos
sudo systemctl restart sshd  # 输入westos密码后执行
sudo rm -fr /root  # 执行失败(未授权)

五. Linux 系统中的权限管理

1. 权限读取

1.1 元数据是什么?

元数据(Metadata)是描述文件 / 目录属性的信息,而非文件的实际内容。比如文件的大小、修改时间、权限、属主等,都是元数据;而文本文件里的文字、图片文件的像素数据,是文件内容。

1.2 文件属性种类

Linux 中文件的核心属性(元数据)包含以下类别:

  • 基础类型:普通文件(-)、目录(d)、软链接(l)、块设备(b)、字符设备(c)等;
  • 权限属性:属主(u)、属组(g)、其他(o)的读(r)、写(w)、执行(x)权限;
  • 归属属性:属主(文件拥有者)、属组(文件所属组);
  • 大小 / 时间:文件大小(字节)、创建时间、修改时间、访问时间;
  • 存储属性:inode 号(索引节点号)、磁盘块位置等。
1.3 元数据的存储位置

元数据存储在磁盘的 inode(索引节点) 中:

  • inode 是文件系统的核心结构,每个文件 / 目录对应唯一的 inode;
  • 文件名不存储在 inode 中,而是存储在目录的 block(数据块)里,目录本质是 “文件名→inode 号” 的映射表;
  • 可通过stat命令查看文件的 inode 号及完整元数据。
# 1. 查看文件基础属性(ls -l 读取核心权限/归属元数据)
ls -l /etc/passwd
# 输出示例:-rw-r--r-- 1 root root 1245 1月 13 09:00 /etc/passwd
# 解析:
# -rw-r--r--:类型(-=普通文件)+ 权限(属主rw-、属组r--、其他r--)
# 1:硬链接数
# root root:属主、属组
# 1245:文件大小(字节)
# 1月 13 09:00:修改时间

# 2. 查看完整元数据(stat 命令)
stat /etc/passwd
# 输出示例:
#   文件:/etc/passwd
#   大小:1245        块:8          IO 块:4096   普通文件
# 设备:803h/2051d    Inode:1234567    硬链接:1
# 权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
# 最近访问:2026-01-13 09:05:10.000000000 +0800
# 最近更改:2026-01-13 09:00:00.000000000 +0800
# 最近改动:2026-01-13 09:00:00.000000000 +0800
# 创建时间:-
# 关键:Inode=1234567 就是元数据存储的索引节点号

2. 更改文件所有人 / 所有组

  • chown:修改文件 / 目录的属主属组(可同时修改,也可单独修改),仅 root 有权限执行;
    • 语法:chown [属主][:属组] 文件/目录(冒号可替换为点);
    • -R:递归修改(针对目录,修改目录及所有子文件 / 子目录)。
  • chgrp:仅修改文件 / 目录的属组,仅 root 或文件属主(且属主属于目标组)有权限执行;
    • 语法:chgrp [属组] 文件/目录
    • -R:递归修改。
# 准备测试文件/目录
mkdir /mnt/test_perm
touch /mnt/test_perm/file.txt

# 1. chown 用法
# 1.1 仅修改属主为lee
chown lee /mnt/test_perm/file.txt
ls -l /mnt/test_perm/file.txt  # 输出:-rw-r--r-- 1 lee root 0 1月 13 10:00 file.txt

# 1.2 同时修改属主为root、属组为shengchan
chown root:shengchan /mnt/test_perm/file.txt
ls -l /mnt/test_perm/file.txt  # 输出:-rw-r--r-- 1 root shengchan 0 1月 13 10:00 file.txt

# 1.3 递归修改目录的属组为caiwu
chown -R :caiwu /mnt/test_perm
ls -l /mnt/test_perm  # 输出:drwxr-xr-x 2 root caiwu 4096 1月 13 10:00 test_perm

# 2. chgrp 用法
# 2.1 仅修改属组为jishu
chgrp jishu /mnt/test_perm/file.txt
ls -l /mnt/test_perm/file.txt  # 输出:-rw-r--r-- 1 root jishu 0 1月 13 10:00 file.txt

# 2.2 递归修改目录属组为shengchan
chgrp -R shengchan /mnt/test_perm

3. 文件普通权限

普通权限是 Linux 最基础的权限管控,分为 3 类对象、3 种权限,可用字符或数字表示:

3.1 权限对象
  • u(user):属主(文件拥有者);
  • g(group):属组(文件所属组);
  • o(other):其他用户(既不是属主,也不属于属组);
  • a(all):所有用户(u+g+o)。
3.2 权限类型(字符 / 数字对应)
字符 数字 含义(文件) 含义(目录)
r 4 可读取文件内容 可列出目录内文件(ls)
w 2 可修改 / 删除文件内容 可创建 / 删除 / 重命名目录内文件
x 1 可执行文件(如脚本 / 程序) 可进入目录(cd)
- 0 无对应权限 无对应权限
3.3 chmod 命令

修改普通权限,支持两种方式:

  • 数字方式:直接指定 u/g/o 的权限数值之和(如 770 = u=rwx (7) + g=rwx (7) + o=---(0));
  • 字符方式:按对象 + 操作 + 权限修改(如 u+x:给属主加执行权限)。

# 准备测试文件/目录
touch /mnt/test_perm/script.sh
mkdir /mnt/test_perm/dir

# 1. 数字方式修改权限
# 1.1 给script.sh设置属主rwx、属组rw-、其他---(760)
chmod 760 /mnt/test_perm/script.sh
ls -l /mnt/test_perm/script.sh  # 输出:-rwxrw---- 1 root shengchan 0 1月 13 10:10 script.sh

# 1.2 给dir设置属主rwx、属组r-x、其他r-x(755)
chmod 755 /mnt/test_perm/dir
ls -l /mnt/test_perm | grep dir  # 输出:drwxr-xr-x 2 root shengchan 4096 1月 13 10:10 dir

# 2. 字符方式修改权限
# 2.1 给script.sh的属组加x权限
chmod g+x /mnt/test_perm/script.sh
ls -l /mnt/test_perm/script.sh  # 输出:-rwxrwx--- 1 root shengchan 0 1月 13 10:10 script.sh

# 2.2 给dir的其他用户移除r权限
chmod o-r /mnt/test_perm/dir
ls -l /mnt/test_perm | grep dir  # 输出:drwxr-x--x 2 root shengchan 4096 1月 13 10:10 dir

# 2.3 给所有用户加w权限(仅示例,谨慎使用)
chmod a+w /mnt/test_perm/file.txt
ls -l /mnt/test_perm/file.txt  # 输出:-rw-rw-rw- 1 root shengchan 0 1月 13 10:10 file.txt

4. 默认权限

umask(权限遮罩值)是系统预设的 “权限过滤规则”,决定新建文件 / 目录的默认权限:

  • 核心规则:
    • 目录默认权限 = 777 - umask(目录默认有执行权限,否则无法进入);
    • 文件默认权限 = 666 - umask(文件默认无执行权限,避免安全风险);
  • 系统默认 umask:
    • root 用户:022(新建目录 755,文件 644);
    • 普通用户:002(新建目录 775,文件 664);
  • 临时修改 umask:直接执行umask 数值(仅当前终端生效);永久修改需编辑/etc/profile~/.bashrc

# 1. 查看当前umask值
umask  # 输出示例:0022(root用户)

# 2. 验证默认权限(umask=022)
mkdir /mnt/test_umask_dir
touch /mnt/test_umask_file
ls -l /mnt | grep test_umask
# 输出:
# drwxr-xr-x 2 root root 4096 1月 13 10:20 test_umask_dir(777-022=755)
# -rw-r--r-- 1 root root 0 1月 13 10:20 test_umask_file(666-022=644)

# 3. 临时修改umask为000
umask 000

# 4. 验证修改后的默认权限
mkdir /mnt/test_umask_dir2
touch /mnt/test_umask_file2
ls -l /mnt | grep test_umask2
# 输出:
# drwxrwxrwx 2 root root 4096 1月 13 10:20 test_umask_dir2(777-000=777)
# -rw-rw-rw- 1 root root 0 1月 13 10:20 test_umask_file2(666-000=666)

# 5. 恢复默认umask(root)
umask 022

5. 特殊权限

特殊权限是普通权限的补充,解决普通权限无法覆盖的场景,共 3 类,可叠加在普通权限前(数字表示):

特殊权限 数字 作用(文件) 作用(目录) 典型场景
SUID(Set UID) 4 执行文件时,进程继承文件属主的权限 无意义 /bin/passwd(普通用户可修改 /etc/shadow)
SGID(Set GID) 2 执行文件时,进程继承文件属组的权限 目录内新建文件 / 子目录,继承该目录的属组 团队共享目录(所有文件归同一组)
Sticky Bit(粘滞位) 1 无意义 目录内的文件仅属主可删除(即使目录是 777) 公共目录(/tmp)
# 1. SUID示例(给/bin/ls添加SUID)
chmod 4755 /bin/ls  # 4(SUID)+ 755(普通权限)
ls -l /bin/ls  # 输出:-rwsr-xr-x 1 root root 123456 1月 13 08:00 /bin/ls
# 备注:s替代x,表示SUID生效;执行ls时,普通用户拥有root权限(仅示例,谨慎修改系统命令)

# 2. SGID示例(团队共享目录)
mkdir /mnt/share_dir
chmod 2770 /mnt/share_dir  # 2(SGID)+ 770(普通权限)
ls -l /mnt | grep share_dir  # 输出:drwxrws--- 2 root shengchan 4096 1月 13 10:30 share_dir
# 验证:普通用户lee在该目录新建文件,属组继承shengchan
su - lee
touch /mnt/share_dir/lee_file.txt
ls -l /mnt/share_dir/lee_file.txt  # 输出:-rw-rw---- 1 lee shengchan 0 1月 13 10:30 lee_file.txt
exit

# 3. Sticky Bit示例(公共目录防误删)
mkdir /mnt/public_dir
chmod 777 /mnt/public_dir  # 先设777
chmod 1777 /mnt/public_dir  # 加粘滞位(1+777=1777)
ls -l /mnt | grep public_dir  # 输出:drwxrwxrwt 2 root root 4096 1月 13 10:35 public_dir
# 验证:普通用户lee无法删除timinglee的文件
su - lee
touch /mnt/public_dir/lee_file.txt
exit
su - timinglee
rm -fr /mnt/public_dir/lee_file.txt  # 输出:rm: 无法删除'/mnt/public_dir/lee_file.txt': 不允许的操作
exit

# 恢复系统默认(可选)
chmod 755 /bin/ls

6. 权限列表 ACL

ACL(Access Control List)突破 “属主 / 属组 / 其他”3 类权限限制,可给单个用户 / 组单独设置权限,是精细化权限管控的核心方式。

  • 核心命令:
    • setfacl:设置 / 修改 / 删除 ACL(注意:你输入的setfac是笔误);
    • getfacl:查看 ACL 规则(注意:你输入的getfac是笔误)。
  • 核心参数(setfacl):
    • -m:添加 / 修改 ACL 规则;
    • -m d::设置默认 ACL(目录新建文件 / 子目录继承);
    • -x:删除指定 ACL 规则;
    • -b:清空所有 ACL 规则;
    • -R:递归设置(针对目录)。
# 准备测试目录
mkdir /mnt/test_acl
touch /mnt/test_acl/file.txt

# 1. 添加ACL规则
# 1.1 给用户lee添加rwx权限
setfacl -m u:lee:rwx /mnt/test_acl
# 验证:ls -l 末尾显示+,表示开启ACL
ls -l /mnt | grep test_acl  # 输出:drwxrwxr-x+ 2 root root 4096 1月 13 10:40 test_acl
# 查看详细ACL规则
getfacl /mnt/test_acl
# 输出关键内容:
# user::rwx
# user:lee:rwx
# group::r-x
# mask::rwx
# other::r-x

# 1.2 给组caiwu添加rw权限
setfacl -m g:caiwu:rw /mnt/test_acl/file.txt
getfacl /mnt/test_acl/file.txt
# 输出关键内容:
# group::r--
# group:caiwu:rw-

# 2. 设置默认ACL(目录继承)
setfacl -m d:g:jishu:rwx /mnt/test_acl
# 验证:新建文件继承jishu组的rwx
touch /mnt/test_acl/new_file.txt
getfacl /mnt/test_acl/new_file.txt
# 输出关键内容:
# default:group:jishu:rwx
# group:jishu:rwx

# 3. 删除ACL规则
# 3.1 删除lee用户的ACL
setfacl -x u:lee /mnt/test_acl

# 3.2 清空所有ACL
setfacl -b /mnt/test_acl
ls -l /mnt | grep test_acl  # 输出:drwxrwxr-x 2 root root 4096 1月 13 10:40 test_acl(+消失)

7. 文件扩展属性(attr)

attr 是 Linux 的高级文件属性管控,可实现比 ACL 更严格的限制(即使 root 也受约束),核心命令:

  • chattr:设置 / 移除扩展属性;
  • lsattr:查看扩展属性。
  • 核心属性:
    • +i:不可修改 / 删除(锁定):无法新建、修改、删除文件 / 目录;
    • -i:移除锁定;
    • +a:仅可追加:只能向文件写内容,无法修改 / 删除;
    • -a:移除追加限制。
# 准备测试文件/目录
touch /mnt/test_attr.txt
mkdir /mnt/test_attr_dir

# 1. +i属性(锁定)
chattr +i /mnt/test_attr.txt
# 验证:无法修改/删除
echo "test" > /mnt/test_attr.txt  # 输出:-bash: /mnt/test_attr.txt: 权限不够
rm -fr /mnt/test_attr.txt  # 输出:rm: 无法删除'/mnt/test_attr.txt': 不允许的操作

chattr +i /mnt/test_attr_dir
touch /mnt/test_attr_dir/new.txt  # 输出:touch: 无法创建'/mnt/test_attr_dir/new.txt': 权限不够

# 2. 查看扩展属性
lsattr /mnt/test_attr.txt  # 输出:----i----------- /mnt/test_attr.txt
lsattr -d /mnt/test_attr_dir  # -d:查看目录本身属性,输出:----i----------- /mnt/test_attr_dir

# 3. +a属性(仅可追加)
chattr -i /mnt/test_attr.txt  # 先解锁
chattr +a /mnt/test_attr.txt
echo "append content" >> /mnt/test_attr.txt  # 成功
echo "override" > /mnt/test_attr.txt  # 失败:权限不够
rm -fr /mnt/test_attr.txt  # 失败:不允许的操作

# 4. 移除属性(解锁)
chattr -a /mnt/test_attr.txt
chattr -i /mnt/test_attr_dir
# 验证:可正常操作
echo "test" > /mnt/test_attr.txt
rm -fr /mnt/test_attr_dir/new.txt

六.进程管理

1. 进程与线程

进程:程序的运行实例,是操作系统资源分配的基本单位。每个进程拥有独立的内存空间、CPU 时间片、文件描述符等资源,比如运行vimping都会生成一个独立进程。

线程:进程内的最小执行单元,是 CPU调度的基本单位。线程共享所属进程的内存、资源,一个进程可包含多个线程(如浏览器进程下有渲染线程、网络线程等)。

通俗理解:进程是 “工厂”,线程是工厂里的 “工人”,工厂(进程)分配资源,工人(线程)具体干活。

2. 进程状态

Linux 进程的核心状态(可通过ps/top查看):

状态标识 名称 含义
R Running 运行 / 就绪:要么正在占用 CPU,要么等待 CPU 调度
S Sleeping 睡眠:等待事件(如 IO、信号),可被唤醒
T Stopped 停止:被信号(如 Ctrl+Z)暂停,需手动唤醒
Z Zombie 僵尸:进程已终止,但父进程未回收其资源
D Uninterruptible 不可中断睡眠:等待硬件 IO,无法被信号打断

3. 进程查看命令

3.1 ps 命令

查看进程列表,默认显示当前终端的进程,ps aux可查看系统所有进程(a = 所有用户,u = 显示用户信息,x = 无终端的进程)。

# 查看当前终端进程
ps
# 输出示例:
#    PID TTY          TIME CMD
#   1732 pts/0    00:00:00 bash
#  28027 pts/0    00:00:00 ping
#  28028 pts/0    00:00:00 ps

# 查看所有进程(含状态、用户、CPU占用)
ps aux | grep vim  # 过滤vim相关进程

3.2 pidof 命令

根据进程名精准查询 PID(进程唯一标识),无匹配则无输出。

# 后台运行vim,生成进程
vim &  # 输出:[1] 27942([1]是后台进程编号,27942是PID)
# 查询vim的PID
pidof vim  # 输出:27942

# 停止后台vim进程(后续实操用)
kill -9 27942

3.3 pgrep 命令

按条件过滤进程(如用户、进程名),-l显示进程名,-u指定用户。

# 切换到lee用户,后台运行多个vim
su - lee
vim &  # 输出:[1] 28012
vim &  # 输出:[2] 28013
vim &  # 输出:[3] 28015
exit  # 返回root

# 查看lee用户的所有进程(显示PID+进程名)
pgrep -lu lee
# 输出示例:
# 27979 bash
# 28012 vim
# 28013 vim
# 28015 vim

3.4 top 命令

实时监控进程,动态显示 CPU、内存占用、进程状态等,按q退出,P按 CPU 排序,M按内存排序。

# 启动实时监控
top
# 操作:按P查看CPU占用最高的进程,按q退出

4. 进程前后台调用

  • 命令 &:将进程直接放入后台运行(部分进程仍会占用终端输出);
  • Ctrl+Z:将前台运行的进程暂停,并打入后台;
  • jobs:查看后台进程列表(显示进程编号、状态、命令);
  • fg 进程编号:将后台进程调回前台运行;
  • bg 进程编号:将后台暂停的进程唤醒,在后台继续运行。

# 步骤1:前台运行ping命令
ping www.baidu.com
# 输出:持续打印ping的结果(进程状态为R)

# 步骤2:Ctrl+Z暂停进程,打入后台
^Z  # 按下Ctrl+Z
# 输出:[1]+  已停止               ping www.baidu.com(状态为T)

# 步骤3:查看后台进程
jobs
# 输出:[1]+  已停止               ping www.baidu.com

# 步骤4:将后台暂停的ping调回前台
fg 1
# 输出:ping恢复前台运行,继续打印结果

# 步骤5:再次Ctrl+Z暂停,后台唤醒运行
^Z  # 暂停
bg 1  # 唤醒后台运行
# 输出:[1]+ ping www.baidu.com &
# 此时ping在后台运行,仍会向终端输出结果

# 步骤6:后台运行vim(补充示例)
vim &  # 输出:[2] 28030(后台停止状态)
jobs  # 可看到两个后台进程

5. 进程优先级

  • 优先级范围:-20(最高优先级)~ 19(最低优先级),默认优先级为0
  • nice:启动进程时指定优先级(nice -n 优先级 命令);
  • renice:修改运行中进程的优先级(renice -n 优先级 PID);
  • 查看优先级:ps -l(NI 列显示 nice 值,即优先级)。
# 步骤1:查看默认优先级
ping www.baidu.com &  # 后台运行ping,PID假设为28040
ps -l | grep ping
# 输出示例(NI列=0):
# F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
# 0 T     0 28040  1732  0  80   0 - 36633 signal pts/0    00:00:00 ping

# 步骤2:启动进程时指定优先级(优先级=5)
nice -n 5 ping www.baidu.com &  # PID假设为28041
ps -l | grep 28041
# 输出NI列=5,优先级降低

# 步骤3:修改运行中进程的优先级(改为8)
renice -n 8 28040
ps -l | grep 28040
# 输出NI列=8,优先级已调整

6. 进程信号

信号是操作系统向进程发送的指令,常用kill/killall发送,核心信号:

信号编号 名称 作用
1 HUP 重载进程配置(不终止进程,如 sshd)
9 KILL 强制终止进程(无法忽略,必终止)
15 TERM 正常终止进程(默认,进程可忽略)
19 STOP 暂停进程(等价 Ctrl+Z)
18 CONT 恢复暂停的进程(等价 bg)

# 步骤1:启动测试进程
ping www.baidu.com &  # PID假设为28050

# 步骤2:暂停进程(信号19)
kill -19 28050
jobs  # 显示ping为“已停止”

# 步骤3:恢复进程(信号18)
kill -18 28050
jobs  # 显示ping为“运行中”

# 步骤4:正常终止(信号15,默认)
kill 28050  # 等价kill -15 28050

# 步骤5:强制终止(信号9,用于无法正常终止的进程)
ping www.baidu.com &  # PID假设为28051
kill -9 28051
jobs  # 显示ping为“已杀死”

# 步骤6:批量终止进程(killall)
ping www.baidu.com &
ping www.taobao.com &
killall ping  # 终止所有ping进程

7. 守护进程

守护进程:后台长期运行的系统进程,无终端关联,负责提供系统服务(如 sshd、crond、firewalld);管理工具:systemctl(CentOS7+),替代传统service,支持启动、停止、开机自启等操作。

# 步骤1:查看sshd守护进程状态
systemctl status sshd
# 输出:显示“active (running)”表示运行中

# 步骤2:停止sshd(谨慎操作,远程连接会断开)
systemctl stop sshd

# 步骤3:启动sshd
systemctl start sshd

# 步骤4:设置开机自启
systemctl enable sshd

# 步骤5:禁止开机自启
systemctl disable sshd

# 步骤6:重载配置(不终止进程,信号1)
systemctl reload sshd

七. Linux下的软件管理

1.软件的类型

类型 适用系统 特点
压缩包(tar.gz/zip) 所有 Linux 绿色包(直接解压用)/ 源码包(需编译./configure && make && make install
DEB Debian/Ubuntu 需用dpkg/apt管理
RPM RHEL/CentOS/Fedora 需用rpm/dnf/yum管理,依赖需手动解决(dnf 可自动解决依赖)

2. RPM 命令

# 安装(需手动解决依赖)
rpm -ivh 包名.rpm  # -i安装 -v详细 -h进度条
# 查询已安装包
rpm -qa | grep 包名  # 查所有已装包中包含指定名称的
rpm -ql 包名         # 查包安装的文件列表
# 卸载
rpm -e 包名         # 卸载(不删配置文件)
# 校验
rpm -V 包名         # 检查包文件是否被修改

3.利用镜像搭建本地软件仓库

```bash
[root@localhost ~]# mkdir  /rhel9                #挂载光驱读取镜像内容
[root@localhost ~]# mount /dev/cdrom   /rhel9/    #手动挂载光驱
[root@localhost ~]# vim /etc/rc.d/rc.local        #开启自动运行mount动作实现自动挂载
mount /dev/cdrom   /rhel9/

    
[root@localhost ~]# chmod +x /etc/rc.d/rc.local


#设定软件仓库指向
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# vim rhel.repo
[AppStream]
name = AppStream
baseurl = file:///rhel9/AppStream
gpgcheck = 0

[BaseOS]
name = BaseOS
baseurl = file:///rhel9/BaseOS
gpgcheck = 0

#检测软件仓库是否可用
[root@localhost yum.repos.d]# dnf list httpd

4.dnf软件管理命令

# 基础操作
dnf install 包名 -y    # 安装(-y自动确认)
dnf remove 包名 -y     # 卸载
dnf update 包名        # 更新指定包
dnf update             # 更新所有包
dnf search 关键词      # 搜索包
dnf info 包名          # 查包详情
dnf list 包名          # 查包是否可安装/已安装
dnf clean all          # 清空缓存
dnf makecache          # 生成缓存
# 进阶
dnf install 包名 --downloadonly --destdir 目录  # 仅下载不安装
dnf history            # 查看dnf操作历史
dnf provides 命令      # 查命令由哪个包提供(如dnf provides docker)

5.网络软件仓库的使用

```bash
#比如加载docker容器的网络repo源:
https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
redhat.repo  rhel.repo

[root@localhost yum.repos.d]# vim docker.repo
[docker]
name  = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0


#测试
[root@localhost yum.repos.d]# dnf search  docker
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 "rhc" 或 "subscription-manager" 进行注册。

docker                                                                48 kB/s |  42 kB     00:00
===================================== 名称 和 概况 匹配:docker =====================================
docker-buildx-plugin.x86_64 : Docker Buildx plugin for the Docker CLI
docker-ce-rootless-extras.x86_64 : Rootless support for Docker
docker-compose-plugin.x86_64 : Docker Compose plugin for the Docker CLI
docker-model-plugin.x86_64 : Docker Model Runner plugin for the Docker CLI
pcp-pmda-docker.x86_64 : Performance Co-Pilot (PCP) metrics from the Docker daemon
podman-docker.noarch : Emulate Docker CLI using podman
========================================= 名称 匹配:docker =========================================
docker-ce.x86_64 : The open-source application container engine
docker-ce-cli.x86_64 : The open-source application container engine
```

6.epel源的使用

#epel源的地址:
https://mirrors.aliyun.com/epel-archive/9.6-2025-11-11/Everything/x86_64/
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# vim epel.repo
[epel]
name = epel
baseurl = https://mirrors.aliyun.com/epel-archive/9.6-2025-11-11/Everything/x86_64/
gpgcheck = 0

#测试:
[root@localhost ~]# dnf search  ansible
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 "rhc" 或 "subscription-manager" 进行注册。

epel                                                                  13 MB/s |  20 MB     00:01
上次元数据过期检查:0:00:11 前,执行于 2026年01月14日 星期三 15时46分05秒。
==================================== 名称 和 概况 匹配:ansible =====================================
ansible.noarch : Curated set of Ansible collections included in addition to ansible-core

```

7.自建软件仓库的方法

```bash
#为了把网络软件仓库中的软件下载下来后分享给本地主机,或者直接把网上下载下来的rpm加入到软件仓库中
[root@localhost ~]# dnf install httpd -y        #通过http共享自建软件仓库
[root@localhost ~]# systemctl enable --now httpd
[root@localhost ~]# mkdir  /var/www/html/software        #建立共享目录
[root@localhost ~]# dnf install docker-ce --downloadonly  --destdir /mnt/
[root@localhost mnt]# mv /mnt/* /var/www/html/software/        #将下载下来的软件存放到共享目录
[root@localhost software]# dnf install createrepo -y    #此软件用来扫描rpm软件包信息并记录生成
                                                        #软件包信息库
[root@localhost ~]# ls /var/www/html/software/
containerd.io-2.2.1-1.el9.x86_64.rpm          docker-ce-cli-29.1.4-1.el9.x86_64.rpm
docker-buildx-plugin-0.30.1-1.el9.x86_64.rpm  docker-ce-rootless-extras-29.1.4-1.el9.x86_64.rpm
docker-ce-29.1.4-1.el9.x86_64.rpm             docker-compose-plugin-5.0.1-1.el9.x86_64.rpm

[root@localhost ~]# createrepo -v /var/www/html/software/        #采集软件包信息
                                                        #注意在目录中不能有不是rpm类的文件

#测试:
[root@localhost dnf]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
docker.repo  epel.repo  redhat.repo  rhel.repo
[root@localhost yum.repos.d]# vim software.repo
[software]
name = software
baseurl = http://172.25.254.129/software/
gpgcheck = 0

[root@localhost yum.repos.d]# dnf info docker-ce.x86_64
名称         : docker-ce
时期         : 3
版本         : 29.1.4
发布         : 1.el9
架构         : x86_64
大小         : 22 M
源           : docker-ce-29.1.4-1.el9.src.rpm
仓库         : software      #软件仓库信息
概况         : The open-source application container engine
URL          : https://www.docker.com
协议         : Apache-2.0
描述         : Docker is a product for you to build, ship and run any application as a
             : lightweight container.
             :
             : Docker containers are both hardware-agnostic and platform-agnostic. This means
             : they can run anywhere, from your laptop to the largest cloud compute instance
             : and everything in between - and they don't require you to use a particular
             : language, framework or packaging system. That makes them great building blocks
             : for deploying and scaling web apps, databases, and backend services without
             : depending on a particular stack or provider.

八.Linux下的网络管理

1. 网络基础命令
ip addr          # 查IP(替代ifconfig)
ip route         # 查路由
ping IP          # 测试连通性
telnet IP 端口   # 测试端口(如telnet 172.25.254.129 80)
nc -zv IP 端口   # 更高效的端口测试
ss -ntlp         # 查监听端口(替代netstat)
hostnamectl set-hostname 主机名  # 修改主机名
2. 网卡配置
# 方式1:nmcli(推荐,NetworkManager)
nmcli connection show  # 查网卡连接
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.15.129/24 ipv4.gateway 192.168.15.1 ipv4.dns 8.8.8.8
nmcli connection up eth0
# 方式2:修改配置文件(/etc/sysconfig/network-scripts/ifcfg-eth0)
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.15.129
NETMASK=255.255.255.0
GATEWAY=192.168.15.1
DNS1=8.8.8.8
NAME=eth0
DEVICE=eth0
ONBOOT=yes
3. 防火墙管理
firewall-cmd --list-all  # 查防火墙规则
firewall-cmd --add-service=http --permanent  # 放行http服务
firewall-cmd --reload  # 重载规则

 九.Linux下的本地存储管理

1. 磁盘管理命令
lsblk            # 查磁盘/分区
fdisk -l         # 查磁盘分区详情
parted -l        # GPT分区工具
mkfs.xfs /dev/sdb1  # 格式化分区为xfs(RHEL9默认)
mount /dev/sdb1 /data  # 挂载分区
2. 自动挂载(/etc/fstab)
# 编辑fstab
vim /etc/fstab
# 新增行(格式:设备 挂载点 文件系统 选项 备份 检测)
/dev/sdb1 /data xfs defaults 0 0
# 验证(无报错即OK)
mount -a
3. 磁盘配额 / 逻辑卷(LVM)
# LVM核心命令(创建逻辑卷)
pvcreate /dev/sdb1 /dev/sdc1  # 创建物理卷
vgcreate vg_data /dev/sdb1 /dev/sdc1  # 创建卷组
lvcreate -L 10G -n lv_data vg_data  # 创建逻辑卷(10G)
mkfs.xfs /dev/vg_data/lv_data  # 格式化
mount /dev/vg_data/lv_data /data  # 挂载

附加内容1:系统引导过程及修复

1.系统引导过程

页-1

引导过程问题修复

磁盘引导阶段问题复现

[root@node10 ~]# fdisk  -l
Disk /dev/nvme0n1:100 GiB,107374182400 字节,209715200 个扇区
磁盘型号:VMware Virtual NVMe Disk
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x41d4cac9
​
设备           启动     起点      末尾      扇区  大小 Id 类型
/dev/nvme0n1p1 *        2048   2099199   2097152    1G 83 Linux
/dev/nvme0n1p2       2099200  10307583   8208384  3.9G 82 Linux swap / Solaris
/dev/nvme0n1p3      10307584 209715199 199407616 95.1G 83 Linux
​
​
#找到有启动分区的硬盘
[root@node10 ~]# dd if=/dev/zero of=/dev/nvme0n1  bs=446 count=1

磁盘引导问题表象

企业微信截图_20260117103048

解决方式:

1.关机

2.插入可安装系统的设备

3.从此设备启动

企业微信截图_20260117103618

企业微信截图_20260117103732

企业微信截图_20260117104150

企业微信截图_20260117104446

aabbcc

2.文件引导阶段

[root@node10 ~]# ll /boot/grub2/grub.cfg     #主引导文件
[root@node10 ~]# ll /boot/loader/entries/    #子引导文件存放目录
总用量 8
-rw-r--r--. 1 root root 484  1月 12 11:04 e9601ae8622741aca4cdac907392c8df-0-rescue.conf
-rw-r--r--. 1 root root 460  1月 14 10:23 e9601ae8622741aca4cdac907392c8df-5.14.0-570.12.1.el9_6.x86_64.conf
​

问题复现之主引导文件修复

[root@node10 ~]# rm -rf /boot/grub2/grub.cfg
​
#系统并未重启
[root@node10 ~]# grub2-mkconfig  > /boot/grub2/grub.cfg    #修复完成

当文件丢失后系统重新启动

报错

企业微信截图_20260117140723

修复过程

企业微信截图_20260117114933

当手动引导启动系统后,需要修复自动引导文件,否则系统重启后仍然要手动引导

修复自动引导文件

[root@node10 ~]# grub2-mkconfig  > /boot/grub2/grub.cfg    #修复完成

子引导文件修复

引导文件如果被误删除

[root@node10 ~]# rm -fr /boot/loader/entries/*

报错效果

企业微信截图_20260117140723

修复方法

当修复子启动文件后网卡的名称设定参数就丢失了需要重新设定,此参数和系统修复本身无关

[rootenode18 ~]# grubby --update-kernel ALL --args net.ifnames=0

修复内核文件

企业微信截图_20260117151327

内核文件丢失

_20260117151422

内核丢失报错

解决方式

1.用系统安装设备进入挽救模式

企业微信截图_20260117151935

从光驱启动后选择进入挽救环境,此处参看磁盘进到修复的进入过程

进入挽救模式后

在修复完成后需要按照最开始调整启动设备的方式把硬盘设备设定为第一启动项

以上方法同样适用与系统初始化文件丢失

附加内容二:日志管理

在系统中日志管理的方法通常使用rsyslog,

rsyslog并不能生成程序日志,他是用来采集程序日志并存到到系统相应位置的工具

默认rsyslog在系统中的日志:

/var/log/messages   #系统服务日志,常规信息,服务报错
/var/log/secure     #系统认证信息日志
/var/log/maillog    #系统邮件日志信息
/var/log/cron       #系统定时任务信息
/var/log/boot.log   #系统启动日志信息

自定义日志采集路径

/etc/rsyslog.conf       #日志采集服务的配置文件
日志类型.日志级别               日志存放路径  
日志类型
auth        #用户认证
authpriv    #服务认证
cron        #时间任务
kern        #内核类型
mail        #邮件
news        #系统更新信息
user        #用户
日志级别
none #不采集
debug #程序排错信息
info #程序常规运行信息
notice #重要信息的普通日志
waring #程序警告
err #程序报错
crit #严重级别会导致系统软件不能正常工作
alert #系统中立即要更改的信息
emerg #系统的严重问题日志
#示例
#把用户认证类型的常规运行信息存放到/var/log/auth_test.log文件中
auth.info                   /var/log/auth_test.log
​
​
#所有日类型日志的所有级别日志存放到/var/log/all.log
*.*                        /var/log/all.log
​
​
#除了用户认证的信息日志外的所有日志
*.*;auth.none
  • 实验,把系统中所有日志存放到/var/log/lee.log中,但是此日志不包含服务类型的认证日志

  • 把服务类型的认证日志存放到/var/log/server_auto.log 中

[root@node10 ~]# vim /etc/rsyslog.conf
#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

#在文件中写入一下信息
*.*;authpriv.none                                       /var/log/lee.log
authpriv.*                                              /var/log/server_auto.log


[root@node10 ~]# systemctl restart rsyslog.service

#验证
[root@node10 ~]# ll /var/log/lee.log
-rw------- 1 root root 0  1月 17 16:49 /var/log/lee.log

[root@node10 ~]# >/var/log/lee.log

[root@node10 ~]#  ssh -l root 172.25.254.10

[root@node10 ~]# cat  /var/log/lee.log
Jan 17 16:50:23 node10 systemd[1]: session-6.scope: Deactivated successfully.
Jan 17 16:50:23 node10 systemd-logind[786]: Session 6 logged out. Waiting for processes to exit.
Jan 17 16:50:23 node10 systemd-logind[786]: Removed session 6.
Jan 17 16:50:26 node10 systemd[1]: Starting SSSD Kerberos Cache Manager...
Jan 17 16:50:26 node10 systemd[1]: Started SSSD Kerberos Cache Manager.
Jan 17 16:50:26 node10 sssd_kcm[2031]: Starting up
Jan 17 16:50:27 node10 systemd-logind[786]: New session 7 of user root.
Jan 17 16:50:27 node10 systemd[1]: Started Session 7 of User root.
Jan 17 16:50:27 node10 systemd[1]: Starting Hostname Service...
Jan 17 16:50:27 node10 systemd[1]: Started Hostname Service.
[root@node10 ~]# cat /var/log/server_auto.log
Jan 17 16:50:23 node10 sshd[1811]: Received disconnect from 172.25.254.10 port 37832:11: disconnected by user
Jan 17 16:50:23 node10 sshd[1811]: Disconnected from user root 172.25.254.10 port 37832
Jan 17 16:50:23 node10 sshd[1805]: pam_unix(sshd:session): session closed for user root
Jan 17 16:50:27 node10 sshd[2028]: Accepted password for root from 172.25.254.10 port 34804 ssh2
Jan 17 16:50:27 node10 sshd[2028]: pam_unix(sshd:session): session opened for user root(uid=0) by root(uid=0)
 


时间同步

1.设定实验环境

a.时间同步服务器

ip:172.25.254.30 火墙:关闭

[root@node1 ~]# systemctl disable --now firewalld
[root@node1 ~]# systemctl mask firewalld
Created symlink /etc/systemd/system/firewalld.service → /dev/null.

b.客户端 ip:172.25.254.40

火墙:不做要求 确保此主机可以和172.25.254.30通信

2.配置时间同步服务器服务端 在172.25.254.30主机中

a.安装服务

[root@node1 ~]# dnf install chrony -y

b.编写时间服务器配置文件

[root@node1 ~]# vim /etc/chrony.conf
#pool 2.rhel.pool.ntp.org iburst


# Allow NTP client access from local network.
allow 0.0.0.0/0

# Serve time even if not synchronized to a time source.
local stratum 10


[root@node1 ~]# systemctl stop chronyd.service
[root@node1 xia]# timedatectl  set-time "2026-09-09 22:22:22"
[root@node1 xia]# timedatectl
               Local time: 三 2026-09-09 22:22:28 CST
           Universal time: 三 2026-09-09 14:22:28 UTC
                 RTC time: 三 2026-09-09 14:22:29
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

          
[root@node1 ~]# systemctl start chronyd

c.在客户端测试

[root@node2 ~]# dnf install chrony -y
[root@node2 ~]# vim /etc/chrony.conf
pool 172.25.254.30 iburst
[root@node2 xia]# systemctl restart  chronyd
[root@node2 xia]# chronyc sources -v

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^? 172.25.254.30                10   6     3     1  -79639m[-79639m] +/-  417us
[root@node2 xia]# date
2026年 09月 09日 星期三 22:25:54 CST

更多推荐