LFCS 模拟考 A
目标
在与真实 LFCS 考试相同的条件下,于 120 分钟内完成 18 道题。合格线为 67%, 采用部分计分制,因此通过 18 题中的 13 题即可合格。
真实考试环境
- **没有浏览器,也没有互联网。**可查看的只有终端中的
man页面、--help、info,以及/usr/share/doc/下的发行版文档。 - 不得阻断 8080、4505、4506 tcp 端口;如果终止
certerminal进程, 考试会话会立即结束。 - 合格线为 67%,采用部分计分制。最常见的失败原因是把全部时间耗在一道题上。 卡住时请先跳过,稍后再回来处理。
如何完成本模拟考试
- **请先不看提示,独立完成全部题目。**浏览完 18 题后, 只打开当时卡住题目的提示。
- **不要进行网页搜索。**只使用
man和--help完成题目。这是本考试最重要的训练; 真实考场中没有搜索框。 - 忘记命令名称时,使用
man -k <키워드>或apropos <키워드>搜索。 例如man -k acl、man -k quota、man -k "file system"。 如果现在不练习,考试时就会第一次使用它们。 - 需要章节编号时,像
man 5 fstab这样使用。配置文件位于第 5 节, 管理员命令位于第 8 节。
本环境与真实考试的差异
实验 Pod 几乎没有内核权限,而且 systemd 不作为 PID 1 运行,因此
mount、systemctl、iptables 在这里无法工作。题目已改写为可在此环境中验证
同一领域知识的形式。真实考试中这三者均可用,因此可把这里创建的 fstab 条目和 Unit 文件
理解为在考场中还要继续执行 mount -a 与 systemctl enable --now。
步骤
- 在
/root/exam/find/src/中创建data-01.txt到data-05.txt五个文件。data-01–data-03每个至少 200000 字节;data-04–data-05每个至少 1 字节且小于 4096 字节。 在同一目录创建指向data-01.txt的硬链接data-01.hard。然后把src直接目录下 大于 100 KiB 的普通文件名称写入/root/exam/find/big.txt,把硬链接数至少为 2 的文件名称 写入/root/exam/find/links.txt。两个文件都只写名称,每行一个,并按LC_ALL=C sort排序。 - 从
/etc/services中筛选协议为tcp、端口号在 1024 到 2000 之间的条目, 写入/root/exam/text/tcp-high.txt。每行以一个空格分隔写成<포트> <서비스 이름>, 服务名称使用原行的第一个字段。按端口升序排序,完全相同的行只保留一份。 - 在
/root/exam/arch/src/中创建log-01.txt到log-05.txt五个文件,每个至少 20000 字节, 另建一个扩展名为.tmp的文件。在/root/exam/arch/中创建包含src目录的 gzip tar 归档/root/exam/arch/backup.tar.gz,但排除.tmp文件。将归档成员列表按LC_ALL=C sort顺序写入/root/exam/arch/members.txt。 - 创建 GID 4200 的组
ops和 GID 4201 的组audit。创建 UID 4300 的用户deploy, 主组为ops、附加组为audit、登录 Shell 为/bin/bash、主目录为/home/deploy。 实际创建主目录,权限设为750,所有者设为deploy:ops。为deploy设置密码策略: 最短修改间隔 7 天、最长有效期 60 天、到期警告 14 天,账号到期日为 2027-06-30。 - 创建 UID 4301 的用户
intern。登录 Shell 为/usr/sbin/nologin,实际创建主目录, 并加入附加组ops。先为intern设置一次密码,再锁定账号。最后把/etc/login.defs的默认值改为PASS_MAX_DAYS 90、PASS_MIN_DAYS 7、PASS_WARN_AGE 14、UMASK 027。 - 创建目录
/srv/data和/srv/scratch,在/etc/fstab中添加两项。 第一项设备为UUID=2f9c1a70-0007-4e00-9a00-000000000007,挂载点/srv/data,类型ext4, 选项defaults,nofail,dump0,pass2。第二项设备为tmpfs,挂载点/srv/scratch, 类型tmpfs,选项rw,nosuid,nodev,noexec,size=256m,dump0,pass0。 此 Pod 中不能执行mount,只需写入条目。 - 精确创建 134217728 字节的
/root/exam/storage/data.img,并在文件上创建 ext4 文件系统。 卷标签为EXAMDATA,保留块比例为 1%。把文件系统 UUID 逐行写入/root/exam/storage/data.uuid。 - 创建表观大小为 536870912 字节的稀疏文件
/root/exam/storage/sparse.img(实际占用应接近 0)。 创建实际分配 4 MiB 的/root/exam/storage/dense.img。然后在/root/exam/storage/usage.txt中写入以下三行,值均为 KiB 整数。sparse_apparent_kib=<sparse.img 의 겉보기 크기>sparse_actual_kib=<sparse.img 이 실제로 차지하는 크기>dense_actual_kib=<dense.img 이 실제로 차지하는 크기> - 创建共享目录
/srv/team,所有者设为root:ops,权限设为2770。 通过 ACL 赋予deployrwx、internr-x;设置默认 ACL,使其下新文件的所属组拥有rwx, 其他用户没有任何权限。默认 ACL 的所有者条目为rwx。 - 在
/etc/hosts中把10.60.0.11注册为web1.lab.internal和短名称web1, 把10.60.0.12注册为db1.lab.internal和短名称db1。在/etc/nsswitch.conf的hosts:行中确保files位于dns之前。四个名称都必须能被getent hosts解析。 - 创建
/etc/ssh/sshd_config.d/90-exam.conf,写入以下七项:PermitRootLogin no、PasswordAuthentication no、MaxAuthTries 3、ClientAliveInterval 300、ClientAliveCountMax 2、AllowTcpForwarding no、X11Forwarding no。 配置必须语法正确,且 sshd 解析后的最终值与此一致,无需重启守护进程。 - 在后台启动一个监听
127.0.0.1TCP9101端口的进程,并保持存活到考试结束。 找到持有该套接字的进程,在/root/exam/net/listener.txt中写三行:port=9101、pid=<그 프로세스의 PID>、comm=<그 프로세스의 이름>。 - 查询此 Pod 的当前网络状态,在
/root/exam/net/facts.txt中写四行:iface=<기본 경로가 나가는 인터페이스 이름>、ipv4=<그 인터페이스의 IPv4 주소를 프리픽스까지 포함해>、mtu=<그 인터페이스의 MTU>、gateway=<기본 경로의 게이트웨이 주소>。 - 创建
/usr/local/bin/labhub-batch.sh并赋予执行权限,编写/etc/systemd/system/labhub-batch.serviceUnit 文件。[Unit]必须包含 Description,Wants与After都为network-online.target。[Service]的 Type 为oneshot, ExecStart 为/usr/local/bin/labhub-batch.sh,WorkingDirectory 为/srv/data。[Install]的 WantedBy 为multi-user.target。此 Pod 中 systemd 不作为 PID 1,systemctl enable无法工作,因此请手动创建它原本会生成的符号链接/etc/systemd/system/multi-user.target.wants/labhub-batch.service。 - 创建
/usr/local/bin/labhub-report.sh和/usr/local/bin/labhub-weekly.sh,权限均为755。 创建/etc/cron.d/labhub-report,注册每 15 分钟以root权限执行/usr/local/bin/labhub-report.sh;该文件权限为644,所有者为root:root。 另外在 root crontab 中注册每周日 02:30 执行/usr/local/bin/labhub-weekly.sh。 - 创建
/var/log/labhub-app.log并编写/etc/logrotate.d/labhub-app,每天轮转日志并保留 14 份。 启用compress、delaycompress、missingok、notifempty,轮转后通过create 0640 root adm创建新文件。 - 创建
/usr/local/bin/exam-worker.sh并赋予权限755。第一行必须以 shebang 开头, 内容只需持续运行而不退出。以 nice 值 15 在后台运行,并把 PID 单独一行写入/run/exam-worker.pid。评分时进程必须仍然存活。 - 安装软件包
figlet和pv(环境无互联网,已注册/opt/localrepo离线仓库)。 将两个已安装软件包的名称和版本逐行写入/root/exam/ops/pkg.txt, 每行采用<패키지 이름> <버전>格式。最后只锁定pv,使其不参与自动升级。
参考
- 开始前请计时。界面限制时间为 120 分钟。
- 如果
man -k找不到任何内容,说明没有索引;apropos使用同一索引。 此时查看<명령> --help和/usr/share/doc/<패키지>/。 /etc/hosts在 Pod 中通过 bind mount 挂载,因此sed -i这类创建新文件再替换的方式会因Device or resource busy失败。请使用追加重定向或tee -a。真实服务器的容器内也会如此。- 此 Pod 无法执行
mount、umount、systemctl、iptables。题目没有要求执行这些命令; 如果尝试后失败,说明误读了题意。 - 还有一个常见错误:凡是要求把值写入文件的题目,评分器都会重新计算并核对。 如果后来修改了前面创建的对象,也要重新生成报告文件。
用 find 选择符合大小与链接条件的文件
-size +100k 的单位是 KiB,-links +1 选择硬链接数至少为 2 的文件。只输出名称时使用 -printf 的 %f,并用 LC_ALL=C sort 固定排序。硬链接使用 ln,符号链接使用 ln -s。
从 /etc/services 筛选符合条件的条目
每行第二个字段的格式为 포트/프로토콜。使用 awk 的 split() 按斜杠拆分,再比较数值。端口升序和去重可通过一次 sort -n -u 完成。
创建排除特定扩展名的 tar 归档
tar 的 c 表示创建,z 表示 gzip,f 表示文件名。使用 --exclude 排除,并用引号包裹模式,避免 Shell 提前展开。通过 tar -tzf 再次提取成员列表。
创建组与用户并设置密码到期策略
组合使用 groupadd -g 与 useradd 的 -u -g -G -s -m -d。密码策略使用 chage,账号到期日使用 chage -E。请查看 man 8 useradd 与 man 1 chage。主目录由 useradd 创建后,可能还需单独调整权限和所有者。
创建禁止登录账号与默认密码策略
把 Shell 设为 /usr/sbin/nologin 可阻止登录。可用 usermod -L 或 passwd -l 锁定;如果锁定完全没有密码的账号,只会留下锁定标记而没有哈希。请先用 chpasswd 设置密码再锁定。默认值位于 /etc/login.defs。
编写两个 fstab 条目
man 5 fstab 说明了六个字段:设备、挂载点、类型、选项、dump、pass。应预先创建挂载点目录。只验证语法可使用 findmnt --verify --tab-file /etc/fstab。
在文件上创建 ext4 并读取超级块
用 truncate -s 创建精确大小的空文件。mkfs.ext4 可在普通文件上创建文件系统,但需要 -F。标签使用 -L,保留块比例使用 -m。创建后用 tune2fs -l 或 dumpe2fs -h 读取值。
报告稀疏文件与实际占用大小
truncate 只创建空洞形成稀疏文件,fallocate 会实际分配块。表观大小使用 du --apparent-size,实际占用使用普通 du,KiB 单位使用 -k。比较 stat 的 %s 和 %b 也能看到差异。
创建 setgid 共享目录与默认 ACL
chmod 2770 的前导 2 表示 setgid。ACL 使用 setfacl -m,让新文件继承的默认 ACL 使用 -d -m。通过 getfacl 查看当前条目。man 1 setfacl 的示例部分简短而实用。
设置静态名称解析与解析顺序
一行写一个地址和多个名称时,后面的名称会成为别名。用 getent hosts <이름> 验证。解析顺序由 /etc/nsswitch.conf 的 hosts: 行决定,说明见 man 5 nsswitch.conf。
配置 SSH 服务器并确认最终值
主配置会在顶部 include sshd_config.d/*.conf;sshd 遇到重复关键字时采用先读取的值。语法检查使用 sshd -t,最终解析值使用 sshd -T。全部关键字见 man 5 sshd_config。
找出开放端口的进程
同时查看监听中的 TCP 套接字及其所属进程使用 ss -ltnp。按端口过滤可写成 ss -ltnp 'sport = :9101'。进程名称也位于 /proc/<PID>/comm。启动时要确保关闭 Shell 后仍能存活。
读取并记录当前接口与路由
默认路由使用 ip route show default 查看,地址使用 ip -o -4 addr show dev <이름>。-o 使输出为单行,便于提取字段。MTU 可从 ip link 查看,也可直接读取 /sys/class/net/<이름>/mtu。
编写 systemd Unit 文件与启用链接
Unit 文件是由 [Unit]、[Service]、[Install] 三段组成的 ini 格式。语法检查使用 systemd-analyze verify <경로>。systemctl enable 实际只是在 [Install] 的 WantedBy 指向的目标 .wants 目录中创建符号链接。请查看 man 5 systemd.service。
配置 cron.d 条目与 root crontab
/etc/cron.d 的行多一个用户字段,共六个字段;用户 crontab 没有该字段。每 15 分钟写作 */15,周日是星期字段的 0。使用 crontab -l -u root 确认注册。请查看 man 5 crontab。
编写日志轮转配置
配置块格式为 경로 { 지시어들 }。若只想查看解析结果而不实际轮转,使用 logrotate -d <설정파일>。拼错的指令会在输出中显示 error:。全部指令见 man 8 logrotate。
启动低优先级后台任务并写入 PID 文件
使用 nice -n 15 <명령> 以较低优先级启动。要在关闭 Shell 后继续存活,使用 nohup ... &。刚启动进程的 PID 位于 Shell 变量 $!。当前 nice 值可用 ps -o pid,ni,comm -p <PID> 查看。脚本第一行的 shebang 可写成 #!/bin/bash。
安装软件包并锁定升级
本环境没有互联网,/opt/localrepo 已注册为仓库,因此可直接运行 apt-get install。只提取已安装软件包的版本时,使用 dpkg-query -W -f 的格式字符串。排除升级使用 apt-mark hold,确认使用 apt-mark showhold。