20 道Shell、网络与虚拟化练习题及答案
CompTIA Linux+ 认证考试练习的全部Shell、网络与虚拟化练习题,附正确答案和简短解析。
开始练习测验 →1. 某目录中有 notes.txt 和 lists.txt。管理员没有给模式加引号就执行 find . -name *.txt,结果报错 'find: paths must precede expression: lists.txt'。原因是什么?
- A.find 拒绝任何含点号的模式,必须用 -iname 代替 -name 才能完成这次匹配
- B.shell 在 find 运行前展开了 *.txt,find 收到两个文件名而不是模式✓ 答案
- C.shell 原样传递了 *.txt,而 find 会拒绝路径不以 ./ 开头的所有模式参数
- D.find 只有在显式写出 -print 时才会展开通配符,因此这个模式始终没能匹配上
路径名展开由 shell 在命令启动之前完成,未加引号的模式会被替换成匹配到的文件名,find 就把它们当成多余的路径参数。把模式写成 '*.txt' 可原样交给 find,由 find 自己去匹配。
编号 QB-S8J77E依据: find(1) manual page; POSIX Shell Command Language, pathname expansion报告此题的问题
2. 某脚本要输出一行摘要,作者分别测试了 echo "User is $USER" 和 echo 'User is $USER' 两种写法。下列说明哪一项正确?
- A.单引号会展开 $USER 但去掉两侧的空格;双引号则按字面输出该变量的名字
- B.双引号会展开 $USER 并把整段文本保持为一个参数;单引号则抑制这种展开✓ 答案
- C.两种写法都会展开 $USER,但只有单引号还会执行字符串里的命令替换
- D.两种写法都不展开 $USER,只有在美元符号前加反斜杠才会请求这种展开
双引号内 shell 仍会做参数展开、命令替换和反斜杠转义,同时避免分词和通配符展开;单引号是完全字面的,其中每个字符(包括美元符号)都原样传递。
编号 QB-8RZPEC依据: POSIX Shell Command Language, quoting with single and double quotes报告此题的问题
3. 一个夜间任务以 /usr/local/bin/report > /var/log/report.log 运行。每次运行都会覆盖上一次的输出,而错误信息仍然发到运维人员邮箱而不是该文件。哪种改法能同时解决这两个问题?
- A.>> /var/log/report.log 2>&1:追加写入,并让 fd 2 指向已重定向的 fd 1✓ 答案
- B.2>&1 >> /var/log/report.log:以追加方式写入,因为 2>&1 会对整行命令都生效
- C.> /var/log/report.log 2>/dev/null:保留先前的输出,并把错误保存进同一个文件
- D.>> /var/log/report.log 2>&-:以追加方式写入,并把错误流合并进那同一个文件里
>> 是追加,而 > 会先把文件截断为零长度;重定向按从左到右的顺序处理,所以 2>&1 必须写在 stdout 重定向之后,fd 2 才会成为指向该文件的 fd 1 的副本。写在前面时 2>&1 复制的是终端,2>&- 关闭 fd 2,2>/dev/null 则丢弃错误。
编号 QB-R87VZC依据: bash(1) REDIRECTION section; POSIX Shell Command Language, redirection order报告此题的问题
4. 管理员执行 grep ERROR app.log | wc -l,随后执行 echo $?,尽管 app.log 中没有任何一行匹配 ERROR,显示的仍是 0。为什么状态是 0?
- A.shell 把各个命令的状态做逻辑或运算,只要有一个成功管道就报告 0
- B.管道的退出状态取自最后一个命令,因此 wc 成功掩盖了 grep 的失败✓ 答案
- C.grep 只要能打开并读取该文件就返回 0,与模式最终是否匹配上完全无关
- D.shell 在每个管道之后把 $? 重置为 0,只有语法错误才会留下非零值
按定义,管道的退出状态就是其中最后一个命令的状态,而 wc 即便数到零行也算成功。要看 grep 自身的状态,可检查 bash 的 PIPESTATUS 数组,或启用 set -o pipefail 让管道报告最右侧的失败。
编号 QB-BR3QXF依据: POSIX Shell Command Language, pipelines and exit status; bash(1) PIPESTATUS报告此题的问题
5. 用户在提示符下设置 APP_CONF=/opt/app/app.conf,并确认 echo $APP_CONF 能打印该路径。但从同一个提示符启动的脚本读取 $APP_CONF 时却得到空值。原因是什么?
- A.提示符下设置的变量要等父进程执行 hash -r 刷新查找表之后才会传给子进程
- B.脚本运行在子 shell 里,除非父进程用 declare -g,否则继承变量被清空
- C.该赋值只创建了 shell 变量,而只有导出的变量才会进入子进程的环境✓ 答案
- D.子进程确实继承了该变量但取到的是空值,因为这类赋值是延迟到使用时求值的
普通赋值创建的 shell 变量只存在于当前 shell,交给子进程的环境里只包含已导出的变量。执行 export APP_CONF 把它放入环境,随后用 env 或 printenv 就能看到它。
编号 QB-U89VHG依据: POSIX Shell Command Language, variable assignment and export; environ(7)报告此题的问题
6. 管理员把一条修改 PATH 的语句追加到 ~/.bash_profile。通过 SSH 登录后新的 PATH 生效,但在已有桌面会话中新开的终端窗口仍显示旧的 PATH。为什么?
- A.PATH 不允许在任何用户级的文件中设置,因此这一条目应当放进系统级的 profile 文件
- B.终端启动的是登录 bash,它先读 ~/.profile 并在读到 ~/.bash_profile 之前停止
- C.终端启动的是交互式非登录 bash,它读取的是 ~/.bashrc 而不是 ~/.bash_profile✓ 答案
- D.终端从显示管理器继承了 PATH,而显示管理器只会读取 root 账户的那个 profile 文件
只有登录 shell(例如 SSH 会话)才会读 ~/.bash_profile 或 ~/.profile,而交互式非登录 shell 读的是 ~/.bashrc。所以常见做法是让 .bash_profile 去 source .bashrc;执行 source ~/.bashrc 也能在不新开 shell 的情况下让修改生效。
编号 QB-ARQCSE依据: bash(1) INVOCATION section, startup files for login and interactive shells报告此题的问题
7. 为统计每个登录 shell 被多少账户使用,管理员执行 cut -d: -f7 /etc/passwd | uniq -c,结果 /bin/bash 出现了多次而每次计数都很小。问题出在哪里?
- A.uniq 只合并相邻的重复行,所以该字段必须先排序再用管道交给 uniq✓ 答案
- B.uniq -c 只统计重复的行,要把只出现一次的行也计入还须加 -d
- C.uniq 比较的是整行内容,因此必须再写一次字段号 uniq -f 7
- D.uniq 需要先加 -u 才会统计重复项,否则它只是把每行原样输出
uniq 每次只处理一行,并且只把当前行与前一行比较,因此被其他值隔开的相同值永远不会被合并。先排序可以把它们聚到一起,所以惯用写法是 cut ... | sort | uniq -c。
编号 QB-T8WHCF依据: uniq(1) and sort(1) manual pages报告此题的问题
8. 某报表的各列用不同数量的空格对齐,例如 ' web01 running 3',执行 cut -d' ' -f2 只得到空行。哪种做法能取出第二列?
- A.tr ' ' ':' 再用 cut -d: -f2,因为 tr 把每段空格压成一个冒号
- B.cut -d' ' -f2- --complement,让 cut 跳过填充产生的空字段
- C.awk '{print $2}',因为 awk 默认把连续空白当作单个字段分隔符✓ 答案
- D.cut -c2,它按字符位置选取第二列,因此完全不受各字段之间空格填充的影响
cut -d 只接受单个字符作分隔符,每个空格都算一个分隔符,填充因此产生大量空字段并把字段编号错位。awk 默认的字段切分把任意一段空白视为一个分隔符,所以 $2 就是第二个可见列;而 tr 不加 -s 时只做字符替换,不会压缩连续空格。
编号 QB-DRSCAJ依据: awk(1) default field separator; cut(1) -d and -f options报告此题的问题
9. 某配置文件中有一行 'server=dev; backup=dev; cache=dev'。执行 sed 's/dev/prod/' conf.txt 之后,该行只有第一处被替换。怎样改才能让 sed 替换全部?
- A.加上 g 标志写成 sed 's/dev/prod/g',否则替换在首次匹配处停止✓ 答案
- B.加上 -n 选项,它让 sed 在第一次成功替换之后继续处理同一行余下的全部内容
- C.加上 -i 选项,它把 sed 从单次匹配模式切换为整文件模式并直接就地改写文件
- D.加上 p 标志,它会重复执行该替换,直到该行上再也找不到任何匹配为止
s 命令默认每行只替换一处,加上 g 标志后才会替换该行上所有不重叠的匹配。-n 抑制自动打印,-i 就地改写文件,p 打印受影响的行,这三者都不会改变每行替换的次数。
编号 QB-W8YHVJ依据: sed(1) manual page, the s command and its g flag报告此题的问题
10. 管理员需要在不停止服务、也不反复重新打开文件的前提下,实时查看某服务日志中新写入的内容。哪个命令能做到?
- A.cat /var/log/app.log,它一直连着该文件并持续输出新行直到被中断
- B.tail -f /var/log/app.log,它保持文件打开,每追加一行就输出该行✓ 答案
- C.head -n 20 /var/log/app.log,它在文件增长时重新读取文件开头
- D.wc -l /var/log/app.log,它在每次追加一行时报告当前累计的行数
tail -f 先输出文件末尾,然后保持文件描述符打开,写入进程一追加内容就把新行发出来,于是文件被当作流来读取。cat、head 和 wc 都读到文件结尾就退出,之后到达的内容它们看不到。
编号 QB-HS3YZJ依据: tail(1) manual page, the -f option报告此题的问题
11. 通过 SSH 启动的长时间 rsync,每当管理员的笔记本断网就被终止。哪种做法能让传输继续进行,并在稍后重新登录时再次查看?
- A.把它的输出重定向到文件,因为 SIGHUP 只会送给仍在向终端写入的那些进程
- B.用 nice -n 19 启动它,这样终端消失之后调度器仍然会保持该进程存活
- C.在第一个 SSH 会话旁边再另开一个会话,这样作业的终端就始终不会被完全关闭
- D.在 tmux 或 screen 会话中启动并分离,让它留在服务器上继续运行✓ 答案
终端复用器持有一个属于服务器自身进程树的伪终端,SSH 连接断掉后作业的控制终端依然存在,稍后可用 tmux attach 或 screen -r 重新接入。调度优先级、额外登录和输出重定向都无法解决终端丢失的问题。
编号 QB-Z9WSEJ依据: tmux(1) and screen(1) manual pages, detach and attach behavior报告此题的问题
12. 某主机能访问同子网内的其他系统,但访问不到子网之外的任何目标。ip route show 只输出一行:'10.10.0.0/24 dev ens192 proto kernel scope link src 10.10.0.25'。这段输出说明什么?
- A.该输出中只有直连路由,因此目标在 10.10.0.0/24 之外的数据包没有下一跳✓ 答案
- B.该输出中的 scope link 关键字阻止转发,该路由必须改成 scope global
- C.该输出中的 proto kernel 表示这是临时路由,ARP 表项老化后它就会被删除
- D.该输出中的 src 字段取代了子网掩码,于是主机把所有目标都当作直连来处理
内核会根据接口地址和前缀自动添加这条直连路由,它只覆盖本地子网。其他目标需要一条默认路由,例如 'default via 10.10.0.1 dev ens192';没有默认路由时协议栈对非本网段目标找不到下一跳,只能报告网络不可达。
编号 QB-JSEA7M依据: ip-route(8) manual page; default route semantics in the Linux routing table报告此题的问题
13. 管理员需要用当前的 iproute2 系列工具,确认 Linux 服务器上哪个进程正在监听 TCP 8080 端口。哪个命令能显示这一点?
- A.ethtool -S ens192,它返回按端口统计的监听计数器,其中包含绑定的进程
- B.netstat -i,它按接口列出处于监听状态的套接字以及打开它们的那些进程号
- C.ip -s link show,它报告每个接口上已打开的端口以及绑定到端口的进程
- D.ss -tulpn,它列出处于监听状态的 TCP 与 UDP 套接字及其端口和所属进程✓ 答案
ss 直接查询内核的套接字统计:-t 和 -u 选择 TCP 与 UDP,-l 只显示监听套接字,-p 给出所属进程,-n 保持端口为数字。netstat -i 打印接口计数,ip -s link 打印接口统计,ethtool -S 打印网卡驱动计数,都不会把套接字对应到进程。
编号 QB-2A95MK依据: ss(8) manual page, options -t, -u, -l, -p and -n报告此题的问题
14. 在一台 Linux 主机上,/etc/hosts 把 app01 映射到 10.0.0.5,而 DNS 区域返回的是 10.0.0.9,该主机始终连接到 10.0.0.5。哪个文件决定先查询哪一个来源?
- A./etc/hostname,它固定了解析器在所有名称服务器之前就会检查的那一个本地映射
- B./etc/resolv.conf,它的 search 行决定静态条目优先于 nameserver
- C./etc/hosts 本身,因为解析器在查看其他任何已配置的来源之前都会先读取该文件
- D./etc/nsswitch.conf,它的 hosts 行把 files 排在 dns 前面✓ 答案
名称服务开关决定由哪些数据库回答查询以及先后顺序;配置为 'hosts: files dns' 时静态文件优先,只有其中没有的名字才去查 DNS。把该行改成 'hosts: dns files' 就由区域先回答,所以顺序保存在 nsswitch.conf 而不是数据文件里。
编号 QB-KSSMCN依据: nsswitch.conf(5) manual page, the hosts database报告此题的问题
15. 在一台由 NetworkManager 管理网络接口的 RHEL 系服务器上,手工加入 /etc/resolv.conf 的 nameserver 行在重启后消失了。设置解析器的受支持做法是什么?
- A.把 nameserver 地址写进 /etc/hosts,这个文件不会被任何服务在启动时重建
- B.用 chattr +i 把该文件设为不可变,使 NetworkManager 无法改写这个条目
- C.用 nmcli 在该连接的配置文件上设置 ipv4.dns,然后把这个连接重新启用一次✓ 答案
- D.把这个地址写进 /etc/nsswitch.conf,由 NetworkManager 优先读取
NetworkManager 依据处于活动状态的连接配置文件中的 DNS 设置生成 /etc/resolv.conf,因此手工修改会在下一次激活连接时被覆盖。把服务器地址存进配置文件(nmcli connection modify ... ipv4.dns)并用 nmcli connection up 重新激活,修改才能在重启后保留。
编号 QB-3AMFSM依据: NetworkManager.conf(5) DNS handling; nmcli(1) connection modify; resolv.conf(5)报告此题的问题
16. 在一台用 Netplan 配置网络的 Ubuntu 系服务器上,管理员在故障期间用 ip addr add 10.20.0.30/24 dev ens3 恢复了服务,但下次重启后该地址消失。要让它持久生效应当怎么做?
- A.用 sudo 把 ip addr add 命令再执行一次,因为非特权的修改才只维持到下次重启之前
- B.在 ip 命令之后执行 nmcli general reload,让运行中的这个地址被写回到连接配置文件
- C.写进 /etc/sysconfig/network-scripts/ifcfg-ens3,该系统在启动时读取它
- D.把该地址写入 /etc/netplan 下的文件并执行 netplan apply,因为 ip 只改运行状态✓ 答案
ip 命令只对运行中的内核生效,不向磁盘写入任何内容,所以重启或下一次重新配置后其修改就消失。在 Netplan 系统上,持久描述是 /etc/netplan 下的 YAML,由 netplan 渲染给后端渲染器,并用 netplan apply 应用;需要自动回滚时使用 netplan try。
编号 QB-MS5YHP依据: netplan configuration and netplan apply documentation; ip-address(8) manual page报告此题的问题
17. 某团队在比较两种做法:在裸机 Linux 服务器上用 KVM 运行虚拟机,与在笔记本上用桌面虚拟化软件运行虚拟机。关于第 1 型与第 2 型虚拟机管理程序的区别,下列哪项正确?
- A.第 1 型直接运行在硬件之上,第 2 型则作为一个程序运行在宿主操作系统之上✓ 答案
- B.第 1 型只支持半虚拟化的客户机,第 2 型则对所有设备都做完整的软件模拟
- C.第 1 型一次只能运行一个客户机,第 2 型才是允许同时运行多个客户机的那种
- D.第 1 型必须依赖嵌套虚拟化,第 2 型则完全不需要 CPU 的虚拟化扩展即可运行
第 1 型(裸机)虚拟机管理程序本身就是把客户机调度到硬件上的那一层;第 2 型(宿主型)则是一个应用程序,向底层操作系统申请 CPU 时间、内存和设备访问。KVM 是让 Linux 自身成为该平台层的内核模块,通常被归为裸机型;而安装在已运行桌面系统之上的虚拟化软件属于宿主型。
编号 QB-4AYSXN依据: CompTIA Linux+ virtualization content, hypervisor types; KVM and libvirt documentation报告此题的问题
18. 在 KVM 主机上创建客户机之前,管理员要在两种磁盘镜像之间选择:一种是创建时就按完整容量分配的 raw 镜像,另一种是起始很小的 qcow2 镜像。关于镜像属性的差别,哪项说法正确?
- A.两者都按需增长,qcow2 的差别仅在于把客户机内存也存进镜像中
- B.raw 镜像按需增长,qcow2 镜像预留完整大小且之后无法调整容量
- C.两者都是预分配的,但只有 qcow2 能被没有半虚拟化驱动的客户机读取
- D.raw 镜像在创建时就按完整大小预分配,qcow2 镜像则随着写入按需增长✓ 答案
raw 是逐字节的平坦容器,空间通常在创建时就占满,没有元数据但布局可预测;qcow2 是写时复制格式,随客户机写入逐簇分配,因此起始体积可以远小于虚拟容量。qemu-img info 会同时报告虚拟大小和实际占用。
编号 QB-DSNMBE依据: qemu-img(1) manual page; QEMU documentation on the raw and qcow2 image formats报告此题的问题
19. 从基线镜像克隆出来的客户机,必须在首次启动时自动获得主机名、管理员的 SSH 公钥和一份软件包清单,并且不能使用交互式安装程序。哪种机制能做到?
- A.virt-manager,它通过 libvirt 控制台把主机名和密钥推送进运行中的客户机
- B.cloud-init,它在客户机首次启动过程中从数据源读取用户数据并加以应用✓ 答案
- C.qemu-img convert,它在转换磁盘格式的同时把这些元数据写进镜像文件
- D.virsh snapshot-revert,它在客户机每次启动时重新应用基线镜像的元数据
cloud-init 在实例首次启动的早期运行,找到种子卷、配置驱动器或元数据服务这类数据源,并应用其中读到的用户数据:主机名、用户与 SSH 密钥、软件包以及任意命令。模板在克隆前会被清理,使每个克隆都被当作新实例并重新执行该阶段。
编号 QB-V9GFRD依据: cloud-init documentation, datasources and user data applied on first boot报告此题的问题
20. KVM 主机上的一台测试客户机必须能被办公局域网上的其他机器按名称和地址访问,并且要从局域网的 DHCP 服务器获取地址。哪种虚拟网络接入方式满足这一要求?
- A.仅主机接入,它承载主机与客户机之间的流量并转发到局域网
- B.NAT 接入,它把客户机隐藏在主机地址之后,同时保持入向可达
- C.桥接接入,它把客户机的虚拟接口放到与主机网卡相同的二层网段上✓ 答案
- D.路由接入,它不需要上游网关的路由,因为它会转换客户机流量
桥接把客户机的虚拟接口接到与物理网卡相同的二层网段,客户机因此从局域网自己的 DHCP 服务器取得地址,并像其他机器一样可被入向访问。NAT 在不做端口转发时只提供出向访问,仅主机或隔离网络没有对外通路,而路由模式转发的是另一个子网且不做地址转换,需要在上游配置路由。
编号 QB-8K3GF8依据: libvirt networking documentation: bridged, NAT, isolated and routed network modes报告此题的问题
本考试的其他主题
练习题依据 CompTIA 公布的 Linux+ 考试大纲及 Linux 系统管理的通行实践编写。CompTIA 和 Linux+ 是 CompTIA 的商标,Linux 是 Linus Torvalds 的注册商标;本网站与 CompTIA 无关联,也未获其认可。真实考试除选择题外还包含实操题(performance-based questions),要求在模拟环境中实际完成任务——四选一的题型无法复现这一部分,因此本题库覆盖的是知识部分,请同时在真实系统上动手练习。CompTIA 会定期修订大纲并为每个版本编号:报考前请向 CompTIA 确认现行大纲、考试代码与报考要求。 关于 CompTIA Linux+ 认证 →