凌晨三点被监控告警拽醒的滋味跑过 GPU 集群的人都懂。SSH 连上那台八卡机,敲下nvidia-smi回车,屏幕上冷冰冰甩出一行NVIDIA-SMI has failed because it couldnt communicate with the nvidia driver,那一瞬间脑子里只有一个念头:今晚别想睡了。nvidia-smi 报 ERR 这件事,几乎每个跟 NVIDIA 显卡打交道的人都躲不过——不管你是刚装完驱动的新手,还是在机房维护几十台训练服务器的老手,这行红字迟早会找上门。它可能是内核模块没加载、可能是驱动和内核版本打架、可能是显卡真的从 PCIe 总线上掉下去了,也可能只是一次普通重启后的“假死”。这篇东西就是把我这些年踩过的坑、排过的故障、绕过的弯路全盘摊开讲清楚:ERR 到底在说什么、怎么一层层定位到根因、不同报错形态分别怎么修、以及怎么让这行红字少出现。适合刚拿到第一块卡的算法同学,也适合半夜被叫起来救火的值班运维。1. 别慌:先弄明白 nvidia-smi 报 ERR 到底在说什么nvidia-smi从字面看是个命令行小工具,但它其实是整个 NVIDIA 软栈的“体检报告入口”。它本身不直接读显卡硬件,而是通过一层叫NVML(NVIDIA Management Library)的库,再往下通过 ioctl 系统调用,和运作在内核态的那个叫nvidia的内核模块打招呼,由内核模块去问 GPU 要数据。这条链路里任何一环断了,nvidia-smi 就会给你甩 ERR。理解这条链,是你后面所有排查的前提,不然你只能盲目重装驱动撞运气。1.1 nvidia-smi、驱动、内核模块这三者的关系很多人的误区是把“驱动”当成一个整体。实际上在 Linux 上,NVIDIA 驱动是分层的,从上到下大致是这样:用户态工具层:nvidia-smi、nvidia-settings、CUDA 运行时里调 NVML 的那部分。用户态库层:libnvidia-ml.so(NVML 本体)、libcuda.so(CUDA 驱动 API)、libnvidia-glcore.so等等。内核态模块层:nvidia.ko(核心)、nvidia-modeset.ko(显示模式设置)、nvidia-uvm.ko(统一内存)、nvidia-drm.ko(DRM 接口)。硬件层:GPU 本体,通过 PCIe 总线挂上去。你敲nvidia-smi的一瞬间,它做的是:找到libnvidia-ml.so,调用 NVML,然后通过/dev/nvidiactl、/dev/nvidia0这些设备节点,把请求交给内核模块,内核模块再去和 GPU 通信。任何一个环节的版本对不上、设备节点不存在、模块没加载,都会直接报错。提示:这也是为什么“重装驱动能解决 90% 的问题”——因为重装会把上面这几层一次性对齐。但剩下那 10% 才是真正折腾人的,比如掉卡、硬件故障、PCIe 链路异常,重装一万次也没用。所以当你看到 ERR,别急着apt purge从头再来,先照着这条链,从上往下或者从下往上捋一遍,通常几十秒就能把故障范围缩到某一层。1.2 那行 ERR 背后的几种典型形态同样是“报错”,nvidia-smi 给出的信息差别很大,而这些差别恰恰是最宝贵的线索。我按常见程度排个序:第一种,NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.这是最经典、出现频率最高的一条。它的意思很明确:用户态工具在,但和内核模块通不上话。绝大多数情况是内核模块没加载,或者加载了但版本和用户态库对不上。第二种,command nvidia-smi not found, but can be installed with...。这条最有意思,它压根不是“显卡错误”,而是系统 PATH 里找不到这个可执行文件。常见于你换了新的驱动安装方式、或者容器里没装对应包,也可能是在一个没装驱动的机器上。第三种,nvidia-smi couldnt find libnvidia-ml.so library in your system. Please make sure...。链路走到了库层断掉,说明内核模块可能是好的,但用户态 NVML 库丢了或者位置不对。第四种,Unable to determine the device handle for GPU 0000:41:00.0: Unknown Error。这类最吓人,因为它往往意味着 GPU 从总线上“掉下去”了,是硬件、供电、散热、PCIe 链路层面的问题,纯软件修复基本无解。第五种,Failed to initialize NVML: Driver/library version mismatch。版本不匹配的明确信号,通常是刚升级完驱动但没重启,内核里跑的还是老模块。把这几条和上面那条链路对应起来看,你就能建立一个直觉:报错信息本身就告诉了你“断在哪一层”。这不是玄学,是工程可推理的东西。2. 排查从哪儿下手:把故障分层定位被 ERR 挡住的时候,最忌讳的就是乱敲命令。我的习惯是先固定一套排查顺序,十秒钟拿到关键信息,再决定往哪个方向深挖。这套顺序不依赖任何图形界面,全是命令行的活儿,远程救火尤其好使。2.1 第一板斧:驱动模块到底加载了没上手第一条命令我永远敲这个:lsmod | grep nvidia正常输出应该能看到nvidia、nvidia_modeset、nvidia_uvm、nvidia_drm这几个模块,并且nvidia那个模块是被其他几个引用的(Used by那列不为 0)。如果这条命令啥都没输出,那结论直接就有了:内核模块根本没加载,nvidia-smi 当然通不上话。接下来要做的不是重装,而是先尝试手动加载:sudo modprobe nvidia sudo modprobe nvidia_uvm加载的时候,注意看有没有报错。如果modprobe直接甩出一句Module nvidia not found in directory /lib/modules/$(uname -r),那问题就非常清楚了:当前运行的内核版本对应的目录里没有编好的 nvidia 模块。这几乎是内核升级没重启或者 DKMS 没重建导致的最典型症状,后面第 3 章会专门拆它。如果lsmod能看到模块,但 nvidia-smi 还是报couldnt communicate with the driver,那就进入下一步——查版本。# 看内核模块的版本 cat /proc/driver/nvidia/version # 看用户态 NVML 库的版本(需要先找到库) nvidia-smi --query-gpudriver_version --formatcsv # 这条如果通就是好的 # 更直接的办法 dpkg -l | grep nvidia-utils # Debian/Ubuntu rpm -qa | grep nvidia # RHEL 系/proc/driver/nvidia/version这个文件能读到,说明内核模块是活的,里面有类似NVRM version: NVIDIA UNIX x86_64 Kernel Module 535.183.01 ...的信息。把这里的版本号和你用户态库的版本号对一下,对不上就是driver/library version mismatch,标准解法是重启,重启后如果还不行,那就是安装流程本身出问题了。2.2 报错信息与故障层级对照表为了让你在现场能快速对照,我把常见报错和它对应的故障层、首选处理动作整理成一张表。这张表是我自己值班时贴在便签上的那版,很好用。报错关键信息故障层级首选动作备注couldnt communicate with the NVIDIA driver内核模块未加载 / 版本不匹配lsmodmodprobe 查版本最高频,先干掉这个command nvidia-smi not found用户态工具缺失 / PATH 问题which nvidia-smi、检查安装常常不是驱动问题couldnt find libnvidia-ml.so用户态库层断裂检查库路径、重装 utils 包模块大概率是好的Driver/library version mismatch版本层不匹配重启、对齐版本升级后没重启的典型Unable to determine the device handle硬件 / PCIe / 供电层dmesg看 Xid、查掉卡软件救不了,需硬件介入Failed to initialize NVML综合,需结合上下文先看dmesg再定位信息太泛,务必看日志注意:表里的“首选动作”只是第一步,不是终点。真正的问题往往藏在第二步、第三步里,所以别一看到modprobe成功就以为万事大吉,一定要回到nvidia-smi再确认一遍。2.3 把 dmesg 和 Xid 当成线索本如果说lsmod是体检,那dmesg就是病历。NVIDIA 内核模块、PCIe 子系统、GPU 出问题时都会往内核环形缓冲区里写日志,这些日志是定位疑难杂症的命脉。# 只看和 nvidia 相关的 dmesg | grep -i nvidia | tail -50 # 只看 PCIe 和 GPU 地址相关的 dmesg | grep -iE pcie|0000:41 | tail -50 # 抓 Xid 报错,这是 NVIDIA 专属的错误码 dmesg | grep -i xid这里的Xid是 NVIDIA 驱动自己定义的一套错误码,通读它比读任何文档都管用。举几个你最可能撞上的:Xid 13/31:显存相关的页错误、非法访问,多半是程序越界或者显存出了软错误。Xid 48:双比特 ECC 错误,显存物理层面出了问题,基本要考虑换卡。Xid 79:GPU has fallen off the bus,显卡从总线上掉了,这是最经典也最头疼的一条。Xid 62/63以及和温度、功耗相关的告警:通常是散热或供电异常引发的降频、保护性下线。看到 Xid 79 的时候,先别急着判定卡坏了,它的成因很多:PCIe 金手指接触不良、散热导致过热保护、供电不稳、主板 BIOS 里 PCIe 链路设置有问题。我曾经遇到过一台机器,固定某张卡跑满负载十分钟就掉,最后发现是那块卡的散热器积灰太厚,清灰之后就好了——这种经验,文档里可不会写。3. 高频场景实操修复知道了怎么看,接下来就是怎么修。我把这些年最常遇到的五类场景挨个拆开,每一类都给出可直接复现的操作步骤和背后的逻辑。你照着做大概率能救回来,救不回来也能明确知道该找谁。3.1 内核升级导致模块失联(最常见)这是couldnt communicate with the driver的头号元凶,尤其在 Ubuntu 上自动更新内核之后。现象是:昨天还好好的,今天开机 nvidia-smi 就红了,而你什么都没改。根因是内核升级后,系统运行的是新内核,但 NVIDIA 模块是给旧内核编译的,新内核的/lib/modules/新版本/下压根没有对应模块。检测方法:uname -r # 当前运行内核 ls /lib/modules/$(uname -r)/ | grep -i nvidia # 看有没有 nvidia 相关目录 dkms status # 看 DKMS 状态如果dkms status显示某条记录是installed但内核版本对不上,或者干脆没有 nvidia 条目,那就得重建。标准操作流程:# 方式一:如果用了 DKMS,直接重装 DKMS 模块 sudo dkms autoinstall # 或者针对具体版本 sudo dkms install -m nvidia -v 535.183.01 # 方式二:重新触发 initramfs 更新,确保模块被打进启动镜像 sudo update-initramfs -u # 重建模块依赖关系 sudo depmod -a # 加载模块 sudo modprobe nvidia nvidia-smidkms autoinstall会针对当前运行的内核自动编译并安装模块,这一步是整个修复的核心。我踩过的一个坑是:只在 DKMS 里装了模块,但忘了update-initramfs,结果重启后模块在启动早期没被正确加载,又报同样的错。所以这两个动作最好成对出现。实操心得:如果机器上有多个内核版本,而显卡驱动又必须工作,最简单的保险做法是把内核锁定在一个确定能跑的版本上,禁止自动升级。这比每次升级后救火省心一百倍,后面第 5 章细说。3.2 驱动版本与内核、CUDA 版本打架单卡玩家可能感觉不深,但一旦你上 CUDA 开发,版本兼容就是绕不开的坎。Driver/library version mismatch这条报错,本质就是内核里跑着的模块版本和用户态库版本不是一个数。触发场景包括:你手动升级了驱动包但没重启;或者容器里挂了新的用户态库,但宿主机内核模块还是旧的。处理思路分两步。第一步,重启。90% 的情况重启后就对齐了,因为重启会重新加载新模块。第二步,如果重启还不行,说明安装本身有问题,需要用官方提供的nvidia-uninstall或包管理器把残留清干净再重装:# 查看当前内核模块版本 cat /proc/driver/nvidia/version # 查看已安装的驱动包版本 ubuntu-drivers devices # Ubuntu 上非常好用 apt list --installed | grep nvidia # 彻底卸载(以 runfile 安装为例) sudo /usr/bin/nvidia-uninstall sudo apt purge ^nvidia-.* # 用官方推荐方式重装 sudo ubuntu-drivers autoinstall # 或者指定版本 sudo apt install nvidia-driver-535这里有个经验数据:选驱动版本的时候,优先看CUDA 版本对应的最低驱动要求。比如你要跑 CUDA 12.2,官方要求驱动不低于 535 系列;要跑 CUDA 11.8,525 系列就够。反过来选(先随便装个驱动再迁就 CUDA)很容易踩到“驱动太老 CUDA 跑不了”或者“驱动太新和老框架不兼容”的坑。关于版本,常被问到的还有“rtx5060、5070 这类新卡要装哪个驱动”。新架构的卡往往需要比较新的驱动分支才能被正确识别,老驱动可能连nvidia-smi都认不出这张卡。如果你装了老驱动,现象常常是nvidia-smi能跑但列表里看不到卡,或者直接提示设备不兼容。这种时候别怀疑硬件,先去官网查你那张卡进入支持列表的最低驱动版本。3.3 nvidia-smi not found 与 libnvidia-ml.so 找不到这两条放在一起讲,因为它们都指向用户态,而不是内核。command nvidia-smi not found的意思很单纯:PATH 里没有它。先确认:which nvidia-smi ls -l /usr/bin/nvidia-smi # 有些发行版放在别的位置 find / -name nvidia-smi 2/dev/null如果确实没装,那就装对应的工具包。Debian/Ubuntu 上是nvidia-utils-版本或随驱动一起;RHEL/CentOS 上是nvidia-driver配套的nvidia-smi。注意一个经典误区:有人只装了 CUDA Toolkit 没装驱动,以为有 CUDA 就有 nvidia-smi,实际上 Toolkit 里的 nvidia-smi 是残缺的,真正能用的那个来自驱动包。couldnt find libnvidia-ml.so则是库路径问题。库可能装了,但没在 ld 的搜索路径里,或者装了 32 位版却没有 64 位版。排查:# 看库在哪 ldconfig -p | grep libnvidia-ml # 手动找 find / -name libnvidia-ml.so* 2/dev/null # 如果找到了但 ld 不认,加入配置 echo /usr/lib/x86_64-linux-gnu | sudo tee /etc/ld.so.conf.d/nvidia.conf sudo ldconfig这里面最容易出的问题是“装了两个来源的库,一个在/usr/lib,一个在/usr/local/cuda/lib64,路径顺序不对导致加载了错的”。容器场景里尤其常见。注意:容器里跑 nvidia-smi 报这些错,先别急着在容器里折腾,九成是宿主机驱动或者--gpus all参数没配好。容器本身不该装驱动,它应该通过nvidia-container-toolkit把宿主机的库和设备挂进来。3.4 混合显卡笔记本上的 nvidia-smi 报错笔记本用户,尤其是带 Intel 核显加 NVIDIA 独显的机型,经常会遇到 nvidia-smi 报错,或者能跑但显示“No devices were found”。这类机器的显卡是混合显卡架构:默认情况下独显可能处于省电休眠状态,由核显负责显示输出,独显只在需要时才被唤醒。如果你在笔记本上看到 nvidia-smi 报couldnt communicate with the driver,排查顺序和服务器略有不同。先确认驱动装没装、模块加没加:lsmod | grep nvidia # 如果没加载,尝试 sudo modprobe nvidia如果模块加载了但还是不行,可能是电源管理把它关了,或者 BIOS 里显卡模式设成了纯核显。这类机器上,nvidia-smi在独显被运行时挂起时表现不稳定是常有的事。我的建议是:如果你确实需要独显一直在位(比如跑本地推理),在系统里把显卡模式设为“独显直连”或“混合但强制独显常驻”,具体选项各家 BIOS 不一样,得看机器。还有个特别容易误判的场景:在虚拟机里显卡直通。虚拟机透传物理显卡之后,nvidia-smi 在宿主机里可能就看不到这张卡了(因为卡被分配给 guest 了),反之亦然。这不算错误,是分配逻辑决定的。排查这类问题,记住一句话:一张物理卡在同一时刻只能被一个“主控”使用。3.5 GPU 掉卡:unable to determine the device handle这一类是最需要冷静的。报错长这样:Unable to determine the device handle for GPU 0000:41:00.0: Unknown Error。它意味着 nvidia-smi 能跟驱动说上话,但驱动找不到那张卡了——卡从总线上消失了。先做这几件事:# 1. 看内核日志里这块卡的 PCIe 记录 dmesg | grep -iE 0000:41|pcie|link | tail -80 # 2. 确认卡还在不在总线上 lspci | grep -i nvidia # 3. 如果 lspci 都看不到卡了,那是物理层掉了 # 如果 lspci 看得到,但 nvidia-smi 看不到,那是驱动层掉了这两种情况的处理天差地别。如果lspci里能看到卡,说明硬件还在总线上,问题多在驱动或电源管理,可以尝试重新加载模块:sudo rmmod nvidia_uvm nvidia_drm nvidia_modeset nvidia sudo modprobe nvidia注意卸载模块前要确保没有进程在占用(比如正在跑的训练任务),否则 rmmod 会失败。判断有没有占用可以用lsof /dev/nvidia*。如果lspci里卡的地址都消失了,那就是硬件层面的事。常见原因按概率排:散热过热触发保护性下线、PCIe 插槽或金手指接触不良、供电不稳、主板 BIOS 的 PCIe 配置有问题(有些老 BIOS 在高负载下会掉链路)。我曾经处理过一台机器,规律性地在某张卡上出现掉卡,最后发现是那条 PCIe 转接线质量太差,换线就解决了。硬件问题没有银弹,只能一项项替换排除。实操心得:遇到掉卡,先把这块卡单独跑一下压力测试(比如gpu-burn),观察多久会掉、掉的时候温度是多少。这个数据非常关键,能帮你区分是“散热问题”还是“纯硬件故障”。如果确定是硬件,及时走保修流程,别拿生产任务去赌。4. 常见问题速查与避坑经验前面讲了原理和修法,这一章我把实际运维里最常被问到的零碎问题和我的应对经验集中放一起,方便你遇到时直接翻。这里没什么高深理论,全是“当年要是有人告诉我该多好”的东西。4.1 问题速查表现象大概率原因快速验证命令处理方向nvidia-smi 全线报错,昨天还好内核升级 / 重启后模块没加载uname -r、dkms statusdkms autoinstallmodprobe只有某一张卡看不到该卡掉总线 / 散热lspci、dmesggrep Xidnvidia-smi 显示但报 mismatch升级驱动没重启cat /proc/driver/nvidia/version重启,不行就重装容器里 nvidia-smi 报错容器运行时没配对docker run --rm --gpus all测试装 nvidia-container-toolkit新卡识别不到驱动太老查卡的官网支持列表升级到支持的驱动分支负载一高就掉卡散热 / 供电 / PCIe 链路gpu-burn 看温度硬件排查,勿硬扛报 libnvidia-ml.so 找不到库路径 / 库丢失ldconfig -pgrep nvidia表格里的“快速验证命令”是我认为性价比最高的那一两条,现场没时间深挖时,先把它们敲一遍,通常就能定方向。4.2 几个我踩过的坑和实操心得第一个坑:迷信“重装驱动解决一切”。早年我一遇到报错就重装,后来发现很多问题重装根本没用,反而因为卸载不干净引入了新问题(比如残留的旧库和新库打架)。正确姿势是先看lsmod和dmesg,定位到具体哪一层,再决定要不要重装。省下来的时间够你喝两杯咖啡。第二个坑:忘了看启动日志。有些机器的模块加载失败,错误不在交互式终端里,而在启动阶段的日志里。journalctl -b | grep -i nvidia能看到本次启动全过程里所有相关记录,包括模块加载失败的原因。我有个同事为了一个模块加载报错折腾了一整天,最后发现在启动日志里明明白白写着“模块签名验证不通过”,因为开了 Secure Boot。提到 Secure Boot 多讲一句:开启 Secure Boot 的机器,NVIDIA 内核模块如果没做签名,是加载不上的,表现就是 nvidia-smi 报 couldnt communicate。要么给模块签名,要么关掉 Secure Boot,这个坑很多人第一次遇到会懵。第三个坑:驱动版本选得太激进。总想要“最新驱动、最强性能”,但新驱动和新内核、老框架之间经常有兼容性问题。我现在的原则是:生产环境用经过验证的稳定分支,不为追新而追新;真需要新驱动支持新卡,也先在测试机上跑一周再说。第四个心得:把“能用的状态”记录下来。每台 GPU 机器在调试成功后,我都会记下当前的内核版本、驱动版本、CUDA 版本、DKMS 记录、modprobe 配置。下次出问题,拿现状和记录一对比,差异那条基本就是根因。这个方法比任何排查脚本都靠谱,因为它是你自己的基线。第五个心得:别在救火时做实验。半夜机器挂了,最忌讳的是“顺手升个级”“顺便换个配置”。恢复服务永远是第一优先级,把服务拉回来再研究根因。血泪教训,不解释。5. 让 nvidia-smi 少报错的长期维护习惯修得好不如少出事。这些年我总结下来,GPU 机器的稳定性其实很大程度上靠的是“预防”,而不是“救火”。这一章讲两个我认为投入产出比最高的习惯,一个是版本管理,一个是主动监控。5.1 版本锁定与升级顺序GPU 机器上最怕的就是版本失控。内核、驱动、CUDA、cuDNN、容器运行时,这五样东西各有一个版本,它们之间有兼容矩阵。放任自动升级,迟早会撞车。我的做法是:# Ubuntu 上禁止内核自动升级(把当前内核标记为 hold) sudo apt-mark hold linux-image-$(uname -r) linux-headers-$(uname -r) # 驱动包也做版本锁定 sudo apt-mark hold nvidia-driver-535 # 查看已锁定的包 apt-mark showhold锁定不是永远不升级,而是把升级变成“计划内”的动作:先在测试机上升,确认没问题,再在生产机上按顺序升。升级顺序建议是内核 → 驱动 → CUDA → 框架,一层对齐了再动下一层,而不是一次性全换。这个顺序背后的逻辑是依赖方向:上层依赖下层,自下而上保持一致最不容易乱。如果团队里有多台机器,做一个统一的安装脚本会省很多事。脚本里把版本号写死,谁装出来的环境都一样,避免“张三的机器能跑、李四的跑不了”这种经典扯皮。5.2 一个能提前预警的监控脚本nvidia-smi 最让人抓狂的地方是它“说挂就挂”,没有缓冲。但其实很多问题在挂之前是有征兆的:温度爬升、ECC 错误累积、Xid 告警零星出现。写个简单脚本定时采集,就能把这些征兆提前抓出来。#!/bin/bash # gpu_health.sh - 采集 GPU 健康状态并记录 LOG/var/log/gpu_health.log echo $(date) $LOG # 基础状态,失败了也别让脚本崩 if ! nvidia-smi -q $LOG 21; then echo [ERROR] nvidia-smi failed at $(date) $LOG fi # 抓 temperature 和 ECC nvidia-smi --query-gpuindex,temperature.gpu,ecc.errors.uncorrected.volatile.total \ --formatcsv $LOG 21 # 抓内核里的 Xid dmesg | grep -i xid | tail -5 $LOG配上 crontab 每五分钟跑一次:*/5 * * * * /usr/local/bin/gpu_health.sh有了这份日志,你事后排查掉卡、过热这类问题就有了时间线。更重要的是,你可以写个简单的判断:如果温度超过阈值(比如 85 度持续出现)、或者 ECC 未纠正错误在增长,就主动告警,而不是等到卡彻底掉下去才手忙脚乱。实操心得:监控脚本本身要“皮实”。我见过不少运维脚本因为 nvidia-smi 报错,自己先set -e崩了,结果什么都没记录下来,反而错过了关键信息。所以脚本里对 nvidia-smi 的调用一定要容错,失败了也要把“失败”这件事记进日志——失败本身也是数据。跑监控这件事坚持下来,你会发现 GPU 的很多故障不是“突然发生”,而是“慢慢恶化”。温度常年偏高、ECC 错误慢慢累积、某张卡频繁出现 Xid,这些都是卡在“预告”它要出问题了。提前换下来,远比在生产高峰半夜掉卡要划算。关于新卡和新特性的适配,还有一点值得提醒:像 DLSS 这类新功能,往往要求显卡架构和驱动版本同时达标,老卡老驱动是开不起来的。如果你在服务器上跑推理想要用到最新的图形特性,记得先确认卡的支持列表和驱动版本,不然就是白折腾。这类“软硬件同时适配”的活儿,提前查官方支持矩阵能省掉大量试错时间。我个人在日常维护里最深的一个体会是:GPU 报错这事,急是没用的,它是个纯粹的逻辑问题。只要你顺着从内核模块到用户态库再到硬件的这条链路,一层层往下捋,总能捋到那个断点。真正难的不是找断点,而是在压力下保持冷静,不瞎操作。把排查顺序固化下来,把能用的状态记录下来,把监控提前布上,你会发现 nvidia-smi 那行红字出现的频率,会肉眼可见地降低。就算它还是来了,你心里也门儿清该往哪敲第一行命令。