20260608第二周
- Linux 系统中,用户和组的定义以及密码信息存放于哪四个核心配置文件中?请用表格详细说明每个文件各字段的含义,并解答:为什么有了 /etc/passwd 还需要 /etc/shadow?/etc/shadow 中用户的密码字段以 $6$ 开头,这代表什么加密算法?后面的字符串是如何构成的?
用户和组相关的核心配置文件:
- /etc/passwd :用户账户信息
举例:baguette:x :1000:1000:baguette:/home/baguette:/bin/bash
| 字段名 | 含义 | 举例 |
|---|---|---|
| 用户名 | 登录名 | baguette |
| 密码占位符 | 密码占位符 | X |
| UID | 用户 ID 1000+ 为普通用户 | 1000 |
| GID | 用户主组的组 ID,对应 /etc/group 中的一条记录 | 1000 |
| 家目录 | 用户登录后的初始目录 | /home/baguette |
| 登录shell | 用户登录后使用的 shell | /bin/bash |
- /etc/shadow :用户密码信息(仅 root 可读)
举例:baguette:$y$j9T$13DoxUW4ex5xq0ENuoms21$KOJSSUjo9yF4IhJmPpb.LGHH4PLQF6WIGq4vXuoXyPA:20617:0:99999:7:::
| 字段名 | 含义 | 举例 |
|---|---|---|
| 用户名 | 登录名 | baguette |
| 加密密码 | 空或 *、! 表示禁止登录 | $y$j9T$13DoxUW4ex5xq0ENuoms21$KOJSSUjo9yF4IhJmPpb.LGHH4PLQF6WIGq4vXuoXyPA |
| 上次更改日期 | 从 1970‑01‑01 起,到上次密码修改的天数 | 20617 |
| 最小使用天数 | 两次密码修改之间必须经过的最少天数 | 0 无限制 |
| 最大使用天数 | 密码有效的最多天数,超过后必须修改 | 99999 |
- /etc/droup :用户组账户信息
举例:baguette:x:1000:orange
| 字段名 | 含义 | 举例 |
|---|---|---|
| 组名 | 组的名称,唯一 | baguette |
| 密码占位符 | 密码占位符 | X |
| GID | 组 ID | 1000 |
| 家目录 | 用户登录后的初始目录 | /home/baguette |
| 组成员列表 | 以逗号分隔的用户名,表示将这些用户加入该组 | orange |
- ** /etc/gshadow : 组密码信息(仅 root 可读)**
baguette:!::orange
| 字段名 | 含义 | 举例 |
|---|---|---|
| 组名 | 与 /etc/group 中的组名一致 | baguette |
| 加密密码 | 组管理员的密码(很少使用),空、! 或 * 表示无密码 | |
| 组管理员列表 | 可以修改组密码和成员的用户列表,逗号分隔 | |
| 组成员列表 | 除主组外,哪些用户属于该组,逗号分隔 |
为什么有了 /etc/passwd 还需要 /etc/shadow:
将哈希密码翻入到/etc/shadow仅root可读中,只让普通用户看到占位符,隔离了敏感信息,提高了安全性
/etc/shadow 中用户的密码字段以 $6$ 开头,这代表什么加密算法?后面的字符串是如何构成的?:
SHA‑512 哈希算法算法 ,完整的密码字段格式:
$id$salt$hashed_password
-
详细说明 r (读)、w (写)、x (执行) 权限在文件和目录上的本质区别?
文件:
r-可以读取文件的内容cat
w-可以修改文件的内容vim
x-可以执行文件 /bin/bash *.sh
目录:
r-可以查看目录中的文件列表 ls
w-可以创建,删除,重命名文件 touch
x-可以进入该目录 cd
如果一个普通用户对某个目录仅有 w 权限,但没有 x 权限,他能在这个目录下创建文件吗?为什么?
不能
修改目录你的内容在目录中创建查出文件的前提时必须能进入到该目录
创建一个目录:首先要进入目标目录 -
什么是 umask?说明其计算逻辑。若系统全局默认 umask 为 022,为什么新创建的文件默认权限是 644,而新建目录是 755?如果是 umask 023 呢?
umask:决定linux系统中新创建文件或者目录的默认权限
计算逻辑:最大初始权限 - umask
文件默认不应该具备可执行权限--所以文件默认最大权限666
而目录需要进入目录才能访问--所以目录默认最大权限777
umask 022 时
文件:最大初始权限 666 (110 110 110)
umask 022 (000 010 010) 取反后为 755 (111 101 101)
按位与 110 100 100 = 644 (rw-r--r--)
目录:最大初始权限 777 (111 111 111)
取反后的 umask 仍是 755
按位与 111 101 101 = 755 (rwxr-xr-x)
umask 023 时
umask 023 (000 010 011) 取反 → 754 (111 101 100)
文件:666 & 754 = 110 100 100 = 644 (rw-r--r--)
目录:777 & 754 = 111 101 100 = 754 (rwxr-xr--) -
详解 Linux 的三种特殊权限:SUID、SGID、Sticky(粘滞位)的作用、表现形式(在 ls -l 输出中的字符位置及大小写区别)以及它们各自的生产应用场景。
SUIO:当一个可执行文件设置了 SUID 位,任何用户执行该文件时,进程将拥有文件所有者(通常是 root)的权 限,而不是执行者的权限。提升权限的作用
在 ls -l 输出中,所有者执行位(原本为 x 或 -)被替换为:
s(小写):表示文件有执行权限且设置了 SUID。
S(大写):表示没有执行权限却设置了 SUID
SGID:
执行该文件的进程将继承文件所属组的权限,而不是执行者所在的主组。
当目录设置了SGID 在该目录下创建的文件或者子目录,其所属组将自动继承父目录的组drwxrwsr-x
例如:团队协作目录:所有成员创建的文件都自动属于同一组,便于组内共享
STICKY:粘滞位
只有文件的所有者,目录的所有者才能删除或者重命名该目录中的文件,即使其他用户队该目录有写权限
t(小写):目录有执行权限且设置了粘滞位。drwxrwxrwt.
T(大写):目录没有执行权限却设置了粘滞位。
应用常见:防止他人误删数据
-
对比 locate 和 find 命令的工作机制、优缺点及适用场景。为什么新建一个文件后,立刻用 locate 搜不到?如何解决?
locate:基于预构建的文件名数据库,只检索查询数据库速度快,非实时更新,只能按文件名匹配
find:便利文件系统目录树,速度慢但是结果准确,支持文件名 权限 大小 修改时间 文件类型 所有者组合逻辑查询
locate 搜索的数据库不是实时更新的。系统通常通过 cron 每天执行一次 updatedb 命令来刷新数据库。因此新建的文件尚未被记录到数据库中。需要手动更新数据库sudo updatedb
快速查找常见文件:locate
需要实时结果或者复杂条件:find
需要保证准确性:find
大范围模糊搜索:locate+grep -
在 ubuntu 环境中,如何使用 cat 和 EOF 标志,非交互式地向系统配置文件 /etc/hosts.bak 中追加以下三行内容?
192.168.1.100 k8s-master 192.168.1.101 k8s-node1 192.168.1.102 k8s-node2

为什么原命令失败?
sudo cat <
shell 看到 >> /etc/hosts.bak,先尝试以当前用户身份打开文件准备追加。此时因权限不足立即报错,命令甚至还未运行 sudo cat。
关键点:重定向是由当前 shell 处理的,不受 sudo 影响。
- 创建一个名为 sysadm 的系统用户组,指定 GID 为 2000。创建一个名为 ops_user 的系统用户,要求:其主组为 sysadm,附加组为 wheel(或 sudo)。其家目录指定为 /data/home/ops_user,且在创建时自动建立家目录。指定其登录 Shell 为 /bin/bash。生产中需要临时禁用和启用用户 ops_user 的登录权限,分别写出锁定和解锁的命令。如何利用非交互式命令(如 chpasswd)将用户 ops_user 的密码修改为 Ops@2026#Sec?
baguette@baguette-VMware-Virtual-Platform:~$ sudo groupadd -g 2000 sysadm
baguette@baguette-VMware-Virtual-Platform:~$ sudo useradd -g sysadm -G wheel -d /data/home/ops_user -m -s /bin/bash ops_user
useradd:“wheel”组不存在
baguette@baguette-VMware-Virtual-Platform:~$ sudo groupadd wheel
baguette@baguette-VMware-Virtual-Platform:~$ cat /etc/passwd | grep ops_user
ops_user:x:1002:2000::/data/home/ops_user:/bin/bash
baguette@baguette-VMware-Virtual-Platform:~$ echo "ops_user:Ops@2026#Sec" | sudo chpasswd
baguette@baguette-VMware-Virtual-Platform:~$ cat /etc/shadow | grep ops_user
cat: /etc/shadow: 权限不够
baguette@baguette-VMware-Virtual-Platform:~$
baguette@baguette-VMware-Virtual-Platform:~$ sudo cat /etc/shadow | grep ops_user
ops_user:$y$j9T$PcXmMs0yl0wjxr1wNYqyJ0$UZT6tM2/8Sbi/l/iSJeyf7bYO4q.Cc13MEcggIFRA44:20617:0:99999:7:::
baguette@baguette-VMware-Virtual-Platform:~$ sudo passwd -l ops_user
passwd:密码已更改。
baguette@baguette-VMware-Virtual-Platform:~$ sudo passwd -u ops_user
passwd:密码已更改。
- 现有一个目录 /data/shares。为了防止被普通用户误删,我们需要保证:所有用户都可以在该目录下创建文件 and 目录。用户只能删除自己创建的文件,不能删除其他用户的文件。请写出创建该目录并设置相应权限的完整命令。
设置粘滞位 + 赋予所有用户完整权限。
baguette@baguette-VMware-Virtual-Platform:~$ sudo mkdir /data/shares
#第一位 1:代表粘滞位(Sticky Bit) 后三位 777:代表标准的文件权限,即 rwxrwxrwx,让所有用户都能读、写、执行
baguette@baguette-VMware-Virtual-Platform:~$ sudo chmod 1777 /data/shares
baguette@baguette-VMware-Virtual-Platform:~$ ls -la /data
总计 16
drwxr-xr-x 4 root root 4096 6月 13 22:19 .
drwxr-xr-x 24 root root 4096 6月 13 22:09 ..
drwxr-xr-x 3 root root 4096 6月 13 22:09 home
drwxrwxrwt 2 root root 4096 6月 13 22:19 shares
-
为了防止恶意软件或人为失误修改系统核心文件 /etc/resolv.conf,我们需要将其设置为“即使是 root 用户也无法修改和删除,只能读取”。请写出设置和撤销此状态的命令。
sudo chattr +i /etc/resolv.conf
sudo chattr -i /etc/resolv.conf -
很多时候在编写 Python 脚本或 YAML 配置文件时,我们希望将 Vim 的 Tab 键自动转换成 4 个空格,并且显示行号。请写出要在当前用户的家目录下的配置文件中添加哪些属性行?
当前用户的家目录下创建或编辑 ~/.vimrc 配置文件:
# 将 Tab 转换为空格
set expandtab
# 设置 Tab 键对应的空格数
set tabstop=4
# 设置缩进时使用的空格数
set shiftwidth=4
# 显示行号
set number
- 在 Vim 中,如何非交互地将当前打开的文件中,第 10 行到第 50 行之间的所有 http:// 字符串替换为 https://?
:10,50s#http://#https://#g




- 生产环境磁盘空间告急,请写出一条命令:在 /var/log/目录中,查找所有文件名以 .log 结尾、大小大于 50MB 且在 7 天以前修改过的普通文件,并将它们打包压缩备份至 /tmp/log_backup.tar.gz,随后将原文件安全删除。
sudo find /var/log -type f -name "*.log" -size +50M -mtime +7 -print0
| sudo tar -czvf /tmp/log_backup.tar.gz --null -T - --remove-files
find /var/log -type f -name "*.log" -size +50M -mtime +7 -print0
---type f 限制查找普通文件
查找符合条件的文件,-print0 以空字符分隔文件名(应对空格或特殊字符)。
tar -czvf /tmp/log_backup.tar.gz --null -T - --remove-files
-c:创建归档;-z:通过 gzip 压缩;-v:显示处理过程;-f:指定归档文件。
--null:指示 -T 读取由 null 分隔的文件名。
-T -:从标准输入读取文件列表(即 find 传递来的列表)。
--remove-files:安全删除,仅在文件被成功添加到归档后才删除原文件。
-
演示如何使用 tar 工具打包 /etc 目录,但是排除掉 /etc/udev 和 /etc/selinux 这两个子目录。
tar -czvf etc_backup.tar.gz --exclude=/etc/udev --exclude=/etc/selinux /etc
没有指定目录存放到当前目录下ls -l etc_backup.tar.gz -
假设有一个名为 user_info.txt 的文件,每行格式如下:username:department:phone_number:address。请分别使用以下工具提取:
-
使用 cut 提取第一列的用户名。
cut -d: -f1 user_info.txt
-d: 指定冒号为字段分隔符
-f1 提取第一个字段
![image]()
-
使用 tr 将文本中的 : 替换为空格。
tr ':' ' ' < user_info.txt
![image]()
-
-
有些同学在删除查找到的千万级临时文件时,直接运行 find /tmp -name "*.tmp" -exec rm -f {} ;,请解答:
-exec 命令 {} ;(每文件执行一次)- 该命令有什么性能弊端?
逐个执行子进程:-exec rm -f {} ; 会对每一个匹配到的文件单独调用一次 rm 命令消耗大量 CPU 和内存。
上下文切换开销:频繁的进程创建与销毁导致系统上下文切换急剧增加,磁盘 I/O 也可能因大量小操作而效率低下。
整体耗时极长:在机械硬盘或网络文件系统上,这种逐文件操作可能耗时数小时甚至数天 - 如何使用 xargs 进行优化?其运行原理是什么?
find /tmp -name "*.tmp" -print0 | xargs -0 rm -f
find 使用 -print0 将输出文件名以空字符(\0) 分隔(而非默认的换行符)。
xargs -0 读取由空字符分隔的输入,将多个文件名分批传递给 rm 命令,每批默认数量取决于系统限制(通常几千个)。
相比 -exec {} ;,xargs 极大减少了 rm 进程的启动次数(千万文件可能只需数千次甚至更少),显著降低系统开销。 - 若文件名包含空格,优化命令会有何安全隐患?如何彻底规避?
如果使用未加 -0 的 xargs 命令(如 find ... -print | xargs rm),xargs 默认以空白字符(空格、制表符、换行符) 作为分隔符。
若文件名包含空格,会被拆分为多个参数传给 rm 必须使用 -print0 与 -0 配对,确保空字符作为唯一分隔符
- 该命令有什么性能弊端?
-
研发部要求在 Rocky 环境下,导入 1000 个格式为 testuser001 到 testuser1000 的测试账号,并要求设置不同的初始随机密码。请回答:
-
为什么不能直接写 for 循环调用 useradd + passwd?
性能差,每次调用都需要创建独立进程
密码设置复杂passwd默认是交互式命令
错误处理困难:如果创建失败,会导致后续流程中断 -
请使用 newusers 和 chpasswd 给出一种高效率的一体化解决方案。
-
[5]
-
基础正则表达式(BRE)与扩展正则表达式(ERE)在元字符支持上有何本质区别?请举例说明在 grep 和 sed 命令中,若使用 ERE 应如何加选项或进行转义?
核心区别:ERE 支持更多元字符(如 +、?、|、(、)、{、})作为特殊字符,而 BRE 中这些字符默认是字面意义,若要作为正则元字符使用,必须用反斜杠 \ 进行转义。
grep 命令:
默认:使用 BRE。启用 ERE:-E
BRE 方式(匹配 "ab" 后跟一个或多个 "c" 需要转义 +)
echo "abcc" | grep 'abc+' # 输出: abcc
ERE 方式(直接使用 +)
echo "abcc" | grep -E 'abc+' # 输出: abcc
sed命令:
默认:使用 BRE。启用 ERE:-E
BRE 方式(匹配连续两个 a 需要转义 {})
echo "aaa" | sed 's/a{2}/X/' # 输出: Xa
ERE 方式(无需转义 {})
echo "aaa" | sed -E 's/a{2}/X/' # 输出: Xa -
简述 sed 命令的模式空间(Pattern Space)和保持空间(Hold Space)的概念,它是如何实现流编辑的?并简述 awk 的工作循环(即 BEGIN、主输入循环、END 的执行顺序和优先级),并列出其至少 5 个常用内置变量的含义。
sed 的模式空间与保持空间
概念
模式空间(Pattern Space):sed 读取每一行文本时,会将其存入模式空间。随后对模式空间中的内容执行编辑命令(如 s/old/new/、d、p 等),处理结束后默认输出模式空间的内容并清空,再读入下一行。
保持空间(Hold Space):一个辅助缓冲区,用于暂存数据。用户可通过 h(复制模式空间到保持空间)、H(追加)、g(替换模式空间为保持空间)、G(追加)、x(交换)等命令,在模式空间和保持空间之间移动数据,实现跨行的复杂操作(如保留前一行、反转行序等)。
流编辑原理:读取 → 执行 → 输出
- 从输入流读取一行,去掉尾部换行符,放入模式空间。
- 依次应用所有给出的编辑命令(对模式空间进行修改)。
- 若未使用 -n 选项,则输出模式空间的内容(自动添加换行符)。
- 清空模式空间,重复步骤1,直到文件结束。
----awk---- - BEGIN块:读取任何输入行之前先执行一次,用于初始化变量、打印表头、设置分割符
- 主输入循环:队输入的每一行自动执行,每输入一行,会依次匹配 pattern{ action }规则,若p为真则执行对应的action,pattern可以是正则表达式,条件表达式或省略(匹配所有行)
- END块:在所有输入行处理完毕后执行一次。常用于输出汇总结果,关闭文件等
5个常用内置变量:
$0-当前输入行的完整内容
$n-当前行的第n个字段
NF-当前行的字段总数
NR-当前已处理的输入行总数
FS-输入字段分隔符,默认为空格或制表符
RS-输入记录分隔符,默认为换行符
- 对比 MBR 分区方案与 GPT 分区方案,并解答:在生产环境中面对 4TB 大容量磁盘,应该选择哪种分区方案?为什么?简述 Ext4 文件系统与 XFS 文件系统的差异,它们在进行逻辑卷缩减时有什么重大区别?
- 物理卷(PV)、卷组(VG)、逻辑卷(LV)和物理盘区(PE)这四个概念是如何层层关联的?相比传统物理分区,LVM 的核心优势是什么?说明 RAID-0, RAID-1, RAID-5, RAID-10 的区别,并从“容错性、磁盘利用率、读写性能、最少盘数”这几个维度进行横向对比。
| 特性 | MBR (Master Boot Record) | GPT (GUID Partition Table) |
|---|---|---|
| 最大容量支持 | 2 TB(因为分区表使用32位扇区地址) | 18 EB(使用64位扇区地址) |
| 最大分区数量 | 4 个主分区(或 3 个主分区 + 1 个扩展分区) | 通常 128 个,理论上无限 |
| 分区表冗余 | 无备份,损坏后可能导致整个磁盘无法引导 | 磁盘末尾有备份分区表,更安全 |
| 引导方式 | 仅支持 BIOS 引导(Legacy) | 支持 UEFI 引导(也可兼容 BIOS 通过保护 MBR) |
| 校验机制 | 无,只有简单的 Magic 签名 | 分区表带有 CRC32 校验,可检测错误 |
| 兼容性 | 旧系统、老硬件完全支持 | 需要 UEFI 主板或较新的操作系统(如 Windows 8+,Linux 内核 2.6.24+) |
| 特性 | Ext4 | XFS |
|---|---|---|
| 最大文件大小 | 16 TB | 8 EB |
| 最大文件系统 | 1 EB | 8 EB |
| 适合场景 | 通用,小文件性能好,兼容性广 | 大文件、高并发流媒体,数据库 |
| 在线扩展 | 支持(resize2fs) | 支持(xfs_growfs) |
| 在线缩减 | 不支持(但可卸载后缩小,有风险且复杂) | 不支持(完全不能缩小) |
| 日志模式 | 支持多种(writeback, ordered, journal) | 仅支持 ordered/journal,默认效率高 |
| 元数据 | 采用 B-tree 加速,但略慢于 XFS | 采用 B+树,大目录查找快 |
EXT4:必须先卸载,然后缩小文件系统,再缩小逻辑卷
XFS:不支持缩减
----LVM 概念及核心优势----
物理卷(PV):对磁盘或分区执行 pvcreate 后,成为 LVM 底层物理存储单元。
卷组(VG):将多个 PV 聚合为一个统一的存储池(vgcreate)。
物理盘区(PE):VG 将每个 PV 划分为固定大小的块(默认 4 MB),PE 是 VG 的最小分配单元。
逻辑卷(LV):从 VG 的 PE 池中按需分配若干 PE 组成 LV(lvcreate)。LV 对上层应用表现为块设备(如 /dev/vg0/lv0)。
关联流程:
PV(/dev/sdb1) → 加入 VG(vg_data) → VG 包含 PE 池 → 分配 PE 给 LV(lv_home) → 格式化后挂载使用。
LVM 核心优势
动态扩容/缩容:可在线扩展 LV 大小(甚至跨物理磁盘),无需重新分区或停机。
快照(Snapshot):创建 LV 的瞬间副本,用于备份或测试。
跨磁盘存储:将多个小磁盘或分区合并为一个大的 VG,再按需分配 LV,提高空间利用率。
条带化与镜像:支持 LVM 级别的 RAID 功能(LVM RAID,如 lvcreate --type raid1)。
灵活重命名:卷组和逻辑卷可以在线重命名,不影响挂载点。
---RAID 级别对比---
| RAID 级别 | 容错性 | 磁盘利用率 | 读写性能 | 最少磁盘数 |
|---|---|---|---|---|
| RAID 0 | 无容错,一块盘坏则所有数据丢失 | 100% (n×容量) | 读写均接近 n 倍(条带并行) | 2 |
| RAID 1 | 可坏 1 块盘(镜像) | 50% (n/2×容量) | 写性能与单盘相当(需双写),读性能可达 n 倍(分散读取) | 2 |
| RAID 5 | 可坏 1 块盘(奇偶校验) | (n-1)/n ≈ 67%~94% | 读接近 n 倍,写需计算奇偶校验(比 RAID 0 慢) | 3 |
| RAID 10 | 每组镜像可坏 1 块,最多坏 n/2 块(不同组) | 50% (n/2×容量) | 读写均接近 n/2 倍(条带+镜像) | 4 |
| 容错性:RAID 1/5/10 均有容错,RAID 0 无。RAID 10 可容忍多块盘故障(每镜像对一块)。 | ||||
| 磁盘利用率:RAID 0 最高;RAID 1/10 最低(50%);RAID 5 居中(n-1/n)。 | ||||
| 读写性能:RAID 0 最快;RAID 10 次之且写比 RAID 5 快;RAID 5 读好但写慢;RAID 1 写慢读快。 | ||||
| 最少盘数:RAID 0/1 需 2 盘;RAID 5 需 3 盘;RAID 10 需 4 盘。 |
-
现有一个网页服务器访问日志文件,请编写一个 sed 语句:将文件中被注释的行(以 # 开头)和空行全部过滤掉,直接在终端打印剩下的内容。并写出安全的 sed 命令(要求原地修改并生成备份 .bak 文件),将配置文件 /etc/ssh/sshd_config 中的 #Port 22 替换为 Port 2222。
过滤注释行和空行并打印剩余内容 : sed -e '/^#/d' -e '/^$/d' 日志文件名
sed -i.bak 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config -
假设 Nginx 的日志文件 /var/log/nginx/access.log 中,第一列为客户端的 IP 地址,第九列为 HTTP 状态码。请写出 awk 一行命令:
- 统计并输出每个 IP 的请求总次数,按降序排列,取前 10 名。
awk '{ip[$1]++} END {for(i in ip) print ip[i], i}' /var/log/nginx/access.log | sort -rn | head -10 - 统计并输出每个 HTTP 状态码(如 200, 404, 500 等)出现的次数。
awk '{code[$9]++} END {for(c in code) print c, code[c]}' /var/log/nginx/access.log | sort -k2 -rn
- 统计并输出每个 IP 的请求总次数,按降序排列,取前 10 名。
-
生产环境中新加入了一块物理硬盘 /dev/sdb,要求对其使用 GPT 方案,并划分一个容量为 100GB 的主分区 /dev/sdb1。请分别给出使用:
-
parted 命令行的一体化分区命令。
sudo parted /dev/sdb mklabel gpt mkpart primary 0% 100GB -
cat << EOF 配合 fdisk / gdisk 的非交互式分区方案。
sudo gdisk /dev/sdb << EOF
o 创建新的空 GPT 分区表(会清除所有分区)
Y 确认清除
n 新建分区
1 分区号为 1+100G
8300
w
Y
EOF
并写出将新建的 /dev/sdb1 格式化为 xfs 文件系统,并指定卷标(Label)为 DATA_PART 的命令。
sudo mkfs.xfs -L DATA_PART /dev/sdb1
-
-
写出将 /dev/sdb1 挂载到 /data 目录下的命令。获取 /dev/sdb1 的 UUID,并写出在 /etc/fstab 中新增一行以实现“系统开机时自动将其以 defaults 选项挂载到 /data” 的配置字段。
创建挂载点目录:sudo mkdir -p /data
执行挂载:sudo mount /dev/sdb1 /data
获取 /dev/sdb1 的 UUID:lsblk -f /dev/sdb1
配置 /etc/fstab 实现开机自动挂载:UUID= /data xfs defaults 0 0 -
现系统内存不足,需要紧急扩容交换空间。请写出以下操作命令:
- 在单盘上新建一个物理分区 /dev/sdc1,大小为 4GB。
sudo parted /dev/sdc mklabel gpt mkpart primary 0% 4GB - 将该分区格式化为交换分区类型并启用它。
格式化为 swap
sudo mkswap /dev/sdc1
立即启用
sudo swapon /dev/sdc1 - 通过配置文件 /etc/fstab 实现开机自动启用,并设置其优先级为 10。
UUID= none swap sw,pri=10 0 0
- 在单盘上新建一个物理分区 /dev/sdc1,大小为 4GB。
-
现有一个卷组 vg_data,其中已包含物理卷 /dev/sdb1。在该卷组中有一个名为 lv_store 的逻辑卷,采用 xfs 文件系统,挂载在 /store。由于空间爆满,需要从物理盘 /dev/sdc2 处对其进行扩容。请写出:
- 将 /dev/sdc2 初始化为 PV 并扩展到卷组 vg_data。
创建物理卷
sudo pvcreate /dev/sdc2
将新 PV 添加到卷组 vg_data
sudo vgextend vg_data /dev/sdc2 - 扩展逻辑卷 lv_store,将卷组剩余所有空间全部加给它。
sudo lvextend -l +100%FREE /dev/vg_data/lv_store - 在线扩容其 xfs 文件系统。
sudo xfs_growfs /store
- 将 /dev/sdc2 初始化为 PV 并扩展到卷组 vg_data。
-
写出为 /dev/vg_data/lv_store 创建一个只读快照 lv_store_snap` 的命令,快照预留大小为 500MB。在逻辑卷上进行测试后发现数据损毁,请写出卸载原逻辑卷、恢复快照并重新挂载验证的完整命令。
创建只读快照
sudo lvcreate -s -n lv_store_snap -L 500M -p r /dev/vg_data/lv_store
数据损毁后的恢复操作(卸载原卷 → 合并快照 → 重新挂载验证)
sudo umount /store
sudo lvconvert --merge /dev/vg_data/lv_store_snap
sudo mount /dev/vg_data/lv_store /store
ls -l /store -
在对新磁盘配置持久挂载时,某管理员将 /etc/fstab 中的 UUID 输错了一个字符,重启后系统直接卡在了 Emergency Mode。此时根分区变为了只读。请回答:
-
在此终端下如果直接编辑 /etc/fstab 会遇到什么报错?(提示:只读文件系统)
read-only file system -
请给出能够解除只读限制、恢复系统挂载并修复该配置文件的完整命令步骤。
mount -o remount,rw / 重新挂载
vi /etc/fstab 修改uuid
reboot重启 -
在修改 /etc/fstab 之后重启前,应运行哪条命令验证配置正确性?
mount -a 尝试挂载 /etc/fstab 中所有尚未挂载的文件系统。如果配置有语法错误、UUID 不存在或挂载点目录缺失,会输出错误信息,从而避免重启后再次进入 emergency mode。
-
-
开发部门在清理旧分区时,要求运维将一个容量为 500GB 的 LVM 逻辑卷缩减到 200GB。该卷上挂载的是 xfs 文件系统。请回答:
- 这个任务在 xfs 文件系统上可行吗?如果执行 lvreduce 会发生什么灾难?
不可行,XSF不支持缩减 ,导致数据损坏 无法恢复 - 如果文件系统是 ext4,缩减逻辑卷的正确安全步骤是怎样的?为什么缩容必须“先缩减文件系统,再缩减逻辑卷”?
sudo umount /mnt/lv_mount 卸载文件系统
sudo e2fsck -f /dev/vg_data/lv_store 检查文件系统
sudo resize2fs /dev/vg_data/lv_store 200G 缩小文件系统
sudo lvreduce -L 200G /dev/vg_data/lv_store 缩小逻辑卷
sudo mount /dev/vg_data/lv_store /mnt/lv_mount 重新挂载
df -h /mnt/lv_mount
- 这个任务在 xfs 文件系统上可行吗?如果执行 lvreduce 会发生什么灾难?
[6]
- 解释 ABI 与 API 的概念与区别。静态链接与动态链接有何异同?在排查动态链接库丢失引起的软件运行报错时,应如何使用 ldd 命令?
API (Application Programming Interface):源代码层面的接口。它定义了函数、类、常量、数据类型等,供程序员在编写代码时调用。API 关注的是如何写代码,例如 printf(const char *format, ...) 就是 C 标准库的 API。只要源代码符合 API 规范,就能编译通过。
ABI (Application Binary Interface):二进制层面的接口。它定义了编译后的目标代码如何相互交互,包括函数调用约定(参数传递顺序、栈清理方式)、系统调用号、寄存器使用规则、数据类型的大小与对齐、虚函数表布局等。ABI 决定了编译好的二进制程序能否在另一个环境下直接运行。
| 特性 | 静态链接 | 动态链接 |
|---|---|---|
| 链接时机 | 编译链接阶段,将库代码直接复制到可执行文件中 | 程序加载或运行时,由动态链接器加载共享库 |
| 可执行文件 | 独立,不依赖外部库,但体积大 | 体积小,依赖外部库(.so/.dll) |
| 内存占用 | 每个进程独立拷贝库代码,浪费内存 | 共享库在内存中只保留一份(物理内存共享) |
| 库更新 | 需要重新链接整个程序才能获得新库功能 | 替换库文件即可,无需重新链接 |
| 依赖问题 | 无运行时依赖问题 | 可能因库缺失、版本不匹配导致“找不到库”错误 |
使用 ldd 排查动态链接库丢失:ldd /path/to/program
- 简述 Rocky 环境下 yum/dnf 客户端与软件源服务端的工作机制。自建私有 YUM 仓在企业内部有何实际意义?说明 Ubuntu 下的 dpkg 和 apt 的层级关系。在卸载软件时,apt remove、apt purge 与 apt autoremove 三者之间有何区别?
客户端:yum和dnf是包管理工具负责解析RPM包依赖,从远程软件源下载包 安装升级删除软件
服务端:RPM 包文件
repodata 目录(由 createrepo 生成),包含元数据(primary.xml.gz、filelists.xml.gz、other.xml.gz 等)和 SQLite 数据库,记录了包的名称、版本、依赖关系、文件清单等。
自建私有 YUM 仓库在企业内部的实际意义:
离线隔离环境,安全,自定义软件粉发,锁定软件版本,节省带宽和加速
Ubuntu 下 dpkg 和 apt 的层级关系:
dpkg:底层包管理工具,直接操作.deb包,执行安装卸载配置等操作,但不会处理依赖关系
apt:上层包管理工具,解析依赖关系并计算出需要安装删除的包集合,调用dpkg完成实际的包安装卸载配置
层级关系:apt依赖dpkg执行底层操作,dpkg本身并不关心仓库或依赖
| 命令 | 卸载软件包 | 删除配置文件(/etc 下) | 删除依赖的孤立包 | 典型场景 |
|---|---|---|---|---|
| apt remove |
✅ | ❌(保留) | ❌ | 临时禁用软件,希望保留配置后重新安装 |
| apt purge |
✅ | ✅ | ❌ | 彻底移除软件及其配置,不留痕迹 |
| apt autoremove | ❌(本身无包名) | ❌ | ✅(移除不再需要的依赖) | 系统清理,删除那些因被其他包依赖而安装、现在无依赖的孤立包 |
apt autoremove 通常配合 remove 或 purge 之后使用,清理残留依赖。
apt purge --auto-remove
-
什么是 systemd?它相比于传统的 SysV init 机制,最显著的优势是什么?说明服务控制单元文件中,[Unit]、[Service]、[Install] 三个配置段的核心作用。
systemd :是 Linux 系统的一套初始化系统(init system)和服务管理器,作为 PID 1 运行,负责启动用户空间、管理进程、处理依赖关系、记录日志等。它目前已成为绝大多数主流发行版(RHEL/CentOS 7+、Ubuntu 16.04+、Debian 8+、Fedora、Rocky Linux 等)的默认 init 系统。
它相比于传统的 SysV init 机制
最显著优势:并行启动与依赖关系自动解析,极大地缩短了系统启动时间;同时集成进程跟踪与日志简化了运维。
[Unit]、[Service]、[Install] :
[Unit] —— 通用信息与依赖:定义单元的元数据、描述以及与其他单元的依赖/顺序关系。
[Service] —— 服务具体行为定义服务的类型、如何启动、停止、重启等。
[Install] —— 安装/启用配置定义单元如何被 启用(systemctl enable),即创建哪些软链接以在启动时激活 -
Linux 中执行 Shell 脚本有 ./script.sh、bash script.sh、source script.sh。请说明它们在“是否启动子进程”和“对脚本文件的执行权限要求”上的异同。说明 set -e、set -u、set -o pipefail 起到了什么作用?
| 执行方式 | 是否启动子进程 | 对脚本文件的执行权限要求 | 环境变量影响 | 典型场景 |
|---|---|---|---|---|
| ./script.sh | 是(启动一个子 shell 进程) | 需要 x(执行)权限 | 脚本内的变量修改不会影响当前 shell | 最常用,适用于可执行脚本 |
| bash script.sh | 是(启动一个子 shell 进程) | 不需要执行权限(只需读权限) | 脚本内的变量修改不会影响当前 shell | 脚本无可执行权限时,或指定特定 shell 解释器 |
| source script.sh(或 . script.sh) | 否(在当前 shell 进程中执行) | 不需要执行权限(只需读权限) | 脚本内的变量修改、目录切换等会影响当前 shell | 需要脚本修改当前环境(如加载配置文件、设置别名) |
| 选项 | 作用 | 示例场景 |
|---|---|---|
| set -e | 当脚本中任意一条命令执行失败(返回非零退出码)时,脚本立即退出。避免错误继续传播。 | 如 cd /nonexist && rm -rf * 中,cd 失败后不会执行 rm,但若没有 -e,脚本会继续;加上 -e 则退出。 |
| set -u | 当脚本中使用了未定义的变量时,立即报错并退出。可防止因拼写错误导致变量为空。 | 如 $UNDEF_VAR 会触发 unbound variable 错误,而不是当作空字符串。 |
| set -o pipefail | 对于管道命令 cmd1 | cmd2 |
- 什么是全局变量?简述 /etc/profile、/etc/bashrc、/.bash_profile、/.bashrc 这四个配置文件的加载顺序以及在登录与非登录场景下的差异。
全局变量(也称为环境变量)是指那些可以被当前 shell 及其所有子进程(子 shell)继承的变量。通常通过 export 命令声明,例如 export PATH=/usr/local/bin:$PATH。全局变量常用于配置程序运行环境(如 PATH、LANG、HOME 等)。
| 配置文件 | 作用范围 | 典型加载时机 |
|---|---|---|
| /etc/profile | 系统级全局 | 登录 shell 首先加载 |
| /etc/bashrc (或 /etc/bash.bashrc) | 系统级 bashrc | 非登录交互式 shell 加载 |
| ~/.bash_profile | 用户级登录配置 | 登录 shell 中,在 /etc/profile 之后加载 |
| ~/.bashrc | 用户级交互配置 | 非登录交互式 shell 加载,也常被 ~/.bash_profile 调用 |
加载顺序:
/etc/profile
用户家目录下第一个存在的文件:~/.bash_profile → ~/.bash_login → ~/.profile
通常实际使用的是 ~/.bash_profile
在 ~/.bash_profile 中,通常会显式调用 ~/.bashrc(例如包含 [ -f ~/.bashrc ] && . ~/.bashrc)
而 ~/.bashrc 又会读取 /etc/bashrc(如果存在)
因此,登录 shell 最终会执行 /etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc。
| Shell 类型 | 加载顺序 | 典型场景 |
|---|---|---|
| 登录 shell | /etc/profile → ~/.bash_profile → (通常内部调用 ~/.bashrc → /etc/bashrc) | SSH 登录,su - |
| 非登录交互式 shell | /etc/bashrc → ~/.bashrc | 手动执行 bash,新终端窗口 |
| 非交互式 shell(脚本) | 不自动加载,受 BASH_ENV 影响 | ./script.sh,bash script.sh |
-
某台机器上运行着一个未知服务,其二进制程序路径为 /usr/sbin/httpd。请写出一条命令:查询这个二进制文件是由哪个具体的包(RPM 或 DEB)安装生成的。在未联网的情况下,需要查询本地一个尚未安装的软件包 vsftpd-3.0.3-49.el9.x86_64.rpm 内包含了哪些文件和目录,请写出对应的查询命令。
查询二进制文件 /usr/sbin/httpd 所属的软件包:
rpm -qf /usr/sbin/httpd
dpkg -S /usr/sbin/httpd
查询本地未安装的 RPM 包 vsftpd-3.0.3-49.el9.x86_64.rpm 包含的文件和目录:
rpm -qpl vsftpd-3.0.3-49.el9.x86_64.rpm
-q:查询模式
-p:针对未安装的包文件(package file)
-l:列出包内所有文件及目录(list)
现需要通过源码编译安装 Nginx(以 nginx-1.24.0 为例),请写出其核心的编译部署步骤。编译安装完成在 /usr/local/nginx 目录后,如何在不使用绝对路径的情况下,让系统所有用户都可以直接运行 nginx 命令?请写出环境变量配置的命令
# 1. 安装编译依赖
sudo dnf install gcc pcre-devel zlib-devel openssl-devel make -y
# 2. 下载并解压源码包
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -xf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 3. 配置编译选项(指定安装路径)
./configure --prefix=/usr/local/nginx
# 4. 编译并安装
make -j $(nproc)
sudo make install
使系统所有用户都可以直接运行 nginx 命令:
将 /usr/local/nginx/sbin 添加到全局 PATH 环境变量中
sudo echo 'export PATH=/usr/local/nginx/sbin:$PATH' | sudo tee /etc/profile.d/nginx.sh
sudo chmod +x /etc/profile.d/nginx.sh
- 在 /usr/local/bin/backup.sh 有一个自动备份的脚本。现在要求将其封装为系统服务 backup.service,满足:
- 服务说明为 Daily Backup Service。
- 在 network.target 后启动。
- 类型为 simple。
- 异常退出 5s 内自动重启。
- 允许开机自启。
请完整写出 /etc/systemd/system/backup.service 的配置文件内容,并写出重载配置、开机自启并立刻启动该服务的命令
[Unit]
Description=Daily Backup Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/backup.sh
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
-
定义一个普通本地变量 URL="https://www.sswang.com/index.html",请写出表达式:
- 获取此变量字符串的总长度。
URL="https://www.sswang.com/index.html"
echo $ - 提取出域名部分的子串 "www.sswang.com"。
echo "$URL" | cut -d'/' -f3
并说明如何定义只读变量 PORT 且值为 8080,如果修改或删除会发生什么?
declare -r PORT=8080
只读变量的值在定义后不可更改,也不能被 unset 删除,直到当前 shell 会话结束。
- 获取此变量字符串的总长度。
-
编写一个 Shell 脚本片段,提示用户输入管理员账号及密码,要求:
- 提示信息 "Please input admin username: "。
- 接收密码时,不回显输入。
- 用户在 10 秒内未输入,则脚本自动超时退出。
![image]()
-
编写代码演示三种不同的整数加法运算方法。并在生产环境需要进行浮点数计算:计算当前磁盘利用率(已用空间 45GB 除以总空间 120GB 的百分比),并保留两位小数。请给出命令。另外,演示逻辑测试 [[]] 表达式:判断用户输入的变量 IP_ADDR 格式是否为有效的 IPv4 地址。
#!/bin/bash
a=10
b=20
# 方法1:$(( ... )) 算术扩展
sum1=$((a + b))
echo "方法1 (算术扩展): $a + $b = $sum1"
# 方法2:let 命令
let sum2=a+b
echo "方法2 (let): $a + $b = $sum2"
# 方法3:expr 命令
sum3=$(expr $a + $b)
echo "方法3 (expr): $a + $b = $sum3"
used=45
total=120
percent=$(echo "scale=2; $used * 100 / $total" | bc)
echo "磁盘利用率: $percent%"
#!/bin/bash
read -p "请输入 IP 地址: " IP_ADDR
# IPv4 正则:每个字段 0-255,点分隔,总共4段
ipv4_regex='^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
if [[ $IP_ADDR =~ $ipv4_regex ]]; then
echo "有效的 IPv4 地址"
else
echo "无效的 IPv4 地址"
fi
-
在 Shell 脚本中,位置参数 $* 与 $@ 到底有什么本质区别?请回答:
是否将多个参数视为独立的个体-
在没有被双引号括住时行为不同吗?
在没有双引号的情况下,$* 和 $@ 的行为完全相同,它们都会将每个位置参数扩展为独立的单词 -
当被双引号括住为 "$" 和 "$@" 时分别是什么逻辑
"$":将所有位置参数拼接成一个字符串,参数之间以 IFS 变量的第一个字符(默认是空格)作为分隔符。结果是一个单词(即使参数内包含空格或特殊字符,也不会被分割)。
"$@":将每个位置参数扩展为独立的带引号的单词,保留每个参数的原始内容(包括空格等),并且不进行单词分割或路径名扩展。相当于每个参数都被单独用双引号保护起来 -
在处理含有不确定字符或空格的参数传递时选用哪一个?
"$@" 能够原样保留每个参数的内容,即使参数中包含空格、换行、通配符等特殊字符,也不会被意外分割或展开。
-
-
编译安装软件时遇到依赖缺失,除了去互联网搜索,如何通过包管理器查找依赖文件所归属的软件?
- 请写出 Rocky 环境下,根据文件路径或库文件名称反向搜索对应 RPM 软件包的命令;
sudo dnf provides */文件名或库名
*/ 表示匹配任意路径,因为文件在包中的完整路径未知。
provides该命令会查询已启用的软件源中所有包的文件列表(无需本地安装) - 如果是在 Ubuntu 环境下,又该使用什么命令?
Ubuntu 默认不安装反向查询工具,需先安装 apt-file
apt-file search 文件名或部分路径
apt-file 会搜索所有已配置软件源中的包文件列表,效率很高。
使用 dpkg -S,但只能查询已安装的包
- 请写出 Rocky 环境下,根据文件路径或库文件名称反向搜索对应 RPM 软件包的命令;
--------------------------------需要修改部分----------------------------
- 知识栈覆盖极其全面:作业内容完整回答了三大板块(系统管理、磁盘分区与逻辑卷 LVM、Shell 编程)的绝大部分题目,展现出极好的学习态度与技术广度。
- 理论与细节解析深刻:不仅给出了命令,还对许多细节(如 MBR/GPT 区别、xargs 安全隐患、LVM 术语关联、bash 不同执行方式区别等)进行了深刻的原理性分析,特别是对 umask 权限位按位与/取反计算过程的解析非常严密。
- 排版规范、可读性极佳:博文逻辑清晰,结合了 markdown 语法,合理使用了代码块、对比表格,排版精美,是一份高质量的技术积累文档。
待改善的点
- 漏答部分核心操作题:第一部分第 16 题中,仅回答了第一问(为什么不能用 for 循环),漏答了第二问(使用 newusers 和 chpasswd 给出一体化高效解决方案),建议补充具体的导入脚本或命令。
- 非交互式追加命令不完整:在第一部分第 6 题中,虽然非常到位地用文字解析了
sudo cat <<EOF >> /etc/hosts.bak报错的 Shell 重定向原理,但文中未用文本写出具体的正确解决命令(如使用sudo tee -a或其他正确替代方案),请予以补齐。 - 密码后面的字符串构成需补充:在第一部分第 1 题中,虽然说明了
$6$代表 SHA-512 算法并列出了基本格式,但对于其后字符串具体由“随机盐值(salt)”与“加密后哈希密文”两部分通过$分割构成的细节说明有些略过,建议补强。




浙公网安备 33010602011771号