
在Debian服务器上执行apt install nginx屏幕突然停住跳出一行红字Media change: please insert the disc labeled Debian GNU/Linux 12.0.0 Bookworm - amd64 DVD-1 (Multi-arch) in the drive and press [Enter]第一次遇到的人通常一脸懵服务器哪来的光驱哪来的光盘其实是你的apt源配置里残留着安装系统时写的cdrom条目。系统解析源列表时发现CD-ROM是一个可用源本地包缓存里又找不到要装的包于是它就很老实地停下来问你要盘。这篇文章就把“Media change”提示的出现逻辑、三种可落地的解决办法、完整实操过程以及我在虚拟机、云模板、强离线环境里实测过的关联问题一次说清楚。不管你是刚装完Debian的新手还是维护了一堆PVE模板的老手这份处理思路都能直接用。1. Media change提示是什么apt为什么非要你“换盘”1.1 从sources.list说起apt的一切行为都看源列表apt安装包时不是直接去网上下载它先要加载一组“软件源”。这些源写在两个地方老一代的Debian用/etc/apt/sources.list单文件新一代Debian 12及以上默认用/etc/apt/sources.list.d/debian.sources采用deb822格式。两者的内容逻辑相同都是声明“我从哪里取得软件包索引”。一个常规网络源条目长这样deb http://deb.debian.org/debian bookworm main non-free-firmware它的意思是使用HTTP方式从deb.debian.org拉取bookworm发行版的main和non-free-firmware软件仓。apt执行apt update时会从这些URL下载Packages.gz索引执行apt install时会根据索引里的下载地址去拉.deb文件。问题就出在这里。如果源列表里同时存在一条deb cdrom:[Debian GNU/Linux 12.0.0 Bookworm - amd64 DVD-1]/ bookworm main这样的条目apt就会把CD-ROM当成合法源。当缓存里没有目标软件包、且需要向这个源请求数据时它就会检查光驱设备里有没有光盘。没有盘或者盘上的标签和源里写的[...]不一致系统就会抛出“Media change”提示。这个机制在Debian早期非常合理那时很多机器没有网络只能用光盘装软件。但现在绝大多数人装完系统就接上网络了源列表里这个CD-ROM条目却经常被保留下来于是就成了定时炸弹。1.2 三种常见场景安装中途、日常装包、虚拟机我在实际维护中反复遇到Media change出现的场景无非三种处理思路稍有不同。第一种是安装过程中。Debian安装向导会让用户选择软件源如果只勾选了“CD-ROM”没有勾选网络镜像那么安装程序在安装完基本系统、继续安装桌面环境或附加软件时就需要反复读取光盘。你只有一个ISO镜像系统提示换第二张盘时你根本没有安装就会卡死。第二种是系统已经装完后来执行apt install xxx。这种情况最常见。安装时用的CD-ROM条目被写进了/etc/apt/sources.list日常apt update时CD-ROM不在线也不会报错等到要安装某个不在本机缓存里的包时apt才想起来去读CD结果光驱里根本没盘。第三种是虚拟机或模拟器。QEMU/KVM虚拟机有一个虚拟光驱通常绑定着宿主机的ISO文件路径。如果这个ISO被移动了、删除了或者光驱设备被卸载guest系统里的apt同样会触发Media change。Limbo这类Android上的模拟器也一样你给Debian ARM镜像挂载的安装ISO一旦失效后续装包就会要你“换盘”。搞懂这三类场景后处理逻辑就统一了要么把CD-ROM源从源列表里清掉要么让系统有合法可读的CD-ROM介质。1.3 你真的需要这张光盘吗先想清楚一个问题这个光盘源还有没有存在价值。如果你维护的是纯离线机器物理机没有网卡只能靠光盘装软件那CD-ROM源必须保留遇到提示就把对应光盘插进去。但如果你能访问网络没有任何理由继续依赖CD-ROM。Debian官方仓库里的软件包数量超过五万个DVD光盘只是安装介质。只要网络能通官方源和权威镜像源都能提供同样的包而且更新更快。所以对绝大多数人来说正确的操作不是想办法把光盘塞进光驱而是把CD-ROM源删除换成网络源。2. 三个立即可用的处理方案注释、替换、挂ISO2.1 方案A把cdrom行注释掉90%情况直接解决最直接的做法是打开源文件找到以deb cdrom:开头的行在行首加#注释掉。先看当前源长什么样cat /etc/apt/sources.list ls /etc/apt/sources.list.d/Debian 12以前的老系统直接编辑/etc/apt/sources.listDebian 12和Debian 13的默认环境要看/etc/apt/sources.list.d/debian.sources。打开后找到CD-ROM条目注释掉# deb cdrom:[Debian GNU/Linux 12.0.0 Bookworm - amd64 DVD-1 (Multi-arch)]/ bookworm main如果你用的是deb822格式比如debian.sources文件里有一段Types: deb URIs: cdrom:[Debian GNU/Linux 12 _Bookworm_ - Official amd64 DVD Binary-1 2023]/ Suites: bookworm Components: main non-free non-free-firmware最好直接把整段删除因为deb822格式下只在Types:前加一个#是不够的后续行仍然会对apt产生作用。嫌麻烦的话把整个文件中包含cdrom:的段落手工清理掉或者把整个文件替换成只有网络源的新配置。修改完执行sudo apt update看到所有条目都是Hit、Get或Ign不再弹出任何与光盘相关的提示问题就解决了。这种方案适合所有场景我90%的修复工作都是靠它完成的。2.2 方案B添加网络源把CD源彻底遗忘只注释掉CD-ROM而不添加网络源会导致apt没有可用源后续装包反而报找不到包。所以更完整的做法是删掉CD-ROM条目同时写入一个可用的网络源。对Debian 12 bookworm最稳的配置是这个deb http://deb.debian.org/debian bookworm main non-free-firmware deb http://deb.debian.org/debian bookworm-updates main non-free-firmware deb http://security.debian.org/debian-security bookworm-security main non-free-firmware对Debian 13 trixie配置对应调整为deb http://deb.debian.org/debian trixie main non-free-firmware deb http://deb.debian.org/debian trixie-updates main non-free-firmware deb http://security.debian.org/debian-security trixie-security main non-free-firmware注意Debian 12开始官方把固件包单独放在了non-free-firmware组件里。以前那种main contrib non-free三段式写法如果不补充non-free-firmware部分网卡、显卡固件安装时会报找不到包。这是一个容易被忽略的细节。如果网络速度不理想换用国内常见镜像站也是常规操作原理一样只需要把deb.debian.org换为你选择的镜像域名其余结构不变。在Debian 12的deb822默认配置里则是一个包含Types: deb、URIs:、Suites:、Components:的块把URIs换成你的目标地址即可。添加网络源后执行两次命令确认sudo apt update sudo apt install nginx整个过程不会再要求你插入任何光盘。这也是我给所有“安装完Debian只想安心装软件”的人推荐的标准方案。2.3 方案C离线环境用ISO挂载成apt源还有一类机器必须保留光盘源没有网络或者网络环境极其受限。这种情况不需要物理换盘把ISO文件挂载成loop设备再让apt识别这个挂载点就能解决“换盘”问题。操作步骤如下sudo mkdir -p /media/cdrom sudo mount -o loop debian-12.6.0-amd64-DVD-1.iso /media/cdrom sudo apt-cdrom -m add这里-m参数的意思是“不扫描光驱直接使用当前已经挂载的目录”。执行apt-cdrom add后apt会把挂载点信息写入源列表生成类似deb cdrom:[Debian GNU/Linux 12.0.0 _Bookworm_ - Official amd64 DVD Binary-1 2023]/ /media/cdrom/的条目。之后执行apt installapt就会从这个挂载的ISO里读.deb包不再弹“Media change”。有几张DVD就挂载对应ISO按提示切换挂载即可。这个方案在家里有完整DVD映像、离线环境搭建内网仓库时特别实用。需要留意的是不要把物理光盘和挂载ISO混为一谈。如果光驱设备里没有盘你挂载的ISO在/media/cdrom必须让apt-cdrom add指向这个路径否则它还是去读/dev/sr0物理光驱。用-m参数能有效避免这个问题。3. 实操记录Debian 12从报错到正常安装nginx3.1 现场复现装包时等待“换盘”的完整状态我在一台Debian 12虚拟机里模拟完整场景。系统安装时选择了“使用CD安装包”网络源没有配置。后来想装nginx执行命令sudo apt install nginxapt会先更新一部分索引然后停留在一个看起来像卡死的状态输出Media change: please insert the disc labeled Debian GNU/Linux 12.0.0 Bookworm - amd64 DVD-1 (Multi-arch) in the drive and press [Enter]此时按回车没有用系统会在几秒后再次提示。按CtrlC可以中断安装然后回到shell。这个操作对系统没有破坏性只是终止了本次包安装流程。这个状态本身就说明问题定位方向不是包管理器坏了也不是网络不通而是它真的在等一个源。观察源列表就能确认。3.2 确认源文件位置和格式sources.list与debian.sources排查第一步查看两个位置cat /etc/apt/sources.list 2/dev/null ls -l /etc/apt/sources.list.d/ cat /etc/apt/sources.list.d/debian.sources 2/dev/null我在这台机器上看到/etc/apt/sources.list.d/debian.sources是唯一源文件内容大致是Types: deb URIs: cdrom:[Debian GNU/Linux 12 _Bookworm_ - Official amd64 DVD Binary-1 2023]/ Suites: bookworm Components: main non-free non-free-firmware这就是deb822格式下的CD源。它没有对应的网络源apt当然只能向光盘要包。整段删除不留注释是最干净的处理方式。3.3 修改源并校验配置模板与apt update输出分析修改前先备份这是好习惯sudo cp /etc/apt/sources.list.d/debian.sources /etc/apt/sources.list.d/debian.sources.bak然后用编辑器写入新的deb822格式内容Types: deb URIs: http://deb.debian.org/debian Suites: bookworm bookworm-updates Components: main non-free non-free-firmware Types: deb URIs: http://security.debian.org/debian-security Suites: bookworm-security Components: main non-free non-free-firmware保存后执行sudo apt update输出会围绕deb.debian.org和security.debian.org依次展开出现若干Get、Hit行。关键判断标准是整个过程中没有任何“Media change”字样也没有卡在等待输入的阶段。然后继续执行sudo apt install nginx这次应能看到正常的下载、解包、安装流程。想验证CD-ROM条目是否还在可以用apt-cache policy输出中不会再出现oDebian CD之类的来源。3.4 Debian 13 trixie的情况一并说明Debian 13 trixie当前以testing形态在社区广泛使用不少人在它上面装包时同样触发Media change。处理逻辑和bookworm完全一样只是网络源里的Suites要写成trixie trixie-updates安全源写成trixie-security。但有一个区别需要注意trixie的源索引签名公钥在旧的bookworm机器上可能没有。如果你的机器是从bookworm升级上来或者用旧安装镜像装完再强行改trixie源执行apt update就会看到GPG相关的NO_PUBKEY警告这个问题我放在下一章详细处理。如果只是普通安装trixie系统源文件里同样有一条cdrom删除后替换成上述trixie网络源即可。PVE 9.0默认基于Debian 13我做虚拟机模板时遇到的大部分“Media change”都来自模板里的老旧sources配置处理方法一致。4. 高频关联问题排查GPG、PVE云模板、Limbo与SSH4.1 apt update报GPG NO_PUBKEY怎么处理常见报错是这样的W: GPG error: http://mirrors.ustc.edu.cn/debian trixie InRelease: The following signatures couldnt be verified because the public key is not available: NO_PUBKEY XXXXXXXXXXXXXXXX很多人删掉CD源后兴致勃勃去apt update结果被GPG警告挡住。原因是当前系统的公钥环里没有对应发行版的签名密钥。Debian 12包装出来的系统默认只信任12的归档密钥你换到trixie源新源用新密钥签名本地不认识。处理时有两条路。第一条如果系统本身能通过官方源安装包直接重新安装归档密钥sudo apt install --reinstall debian-archive-keyring这个包会把当前Debian各发行版的归档公钥都装到系统里大部分NO_PUBKEY问题能直接解决。第二条如果密钥环已经损坏或无法通过包管理器安装手动导入gpg --keyserver keyserver.ubuntu.com --recv-keys 你的KEYID gpg --export 你的KEYID | sudo tee /etc/apt/keyrings/debian-archive-keyring.asc /dev/null然后在源文件里用signed-by指向这个密钥文件。需要注意apt-key add这个老命令在新版Debian里已经标记为废弃不建议再写入新脚本或教程。尽量采用/etc/apt/keyrings目录配合signed-by引用的方式这也是Debian官方现在推荐的路径。4.2 虚拟机与模拟器里的Media change变体虚拟机环境下最常见的Media change原因是虚拟光驱指向的ISO文件路径失效。PVE和QEMU里虚拟机的CD-ROM设备通常绑定一个宿主机路径比如/var/lib/vz/template/iso/debian-12.6.0-amd64-DVD-1.iso。如果你后来把这个ISO移动到/mnt/storage/isoguest里执行apt就会尝试读取但是失败然后提示Media change。这种场景下最省事的处理有两种一是把ISO移回原路径重新挂载后再apt二是直接清理guest里的cdrom源。对于大批量虚拟机模板我会用自动化手段统一清理避免一台一台改。Limbo这类模拟器里跑Debian ARM镜像img或qcow2也常遇到。很多教程会教你先挂载ISO安装系统安装完成后却不卸载ISO也不清理源列表。结果在模拟器里看到Media change第一反应是重新导入ISO实际上更快的做法仍是把源列表里的cdrom行删掉。模拟器里的虚拟光驱本质上和物理光驱没有区别只要源列表不认识CD-ROM它就不会去扫描光驱设备。结合PVE 9.0 Debian 13 cloud-init的自动化模板制作场景建议在cloud-init的runcmd里加一步清理runcmd: - sed -i -E s/^deb cdrom:/#deb cdrom:/ /etc/apt/sources.list 2/dev/null || true这样生成的每台虚拟机首次启动后都不会再被Media change卡住。把清理动作放到定义模板阶段而不是每台实例创建后手动操作是批量环境里的正确姿势。4.3 装完系统后FinalShell连不上WSL Debian或无目录显示这个问题和Media change没有直接关系但它是很多人装完Debian后紧接着遇到的坑在这里顺带说明。WSL里装Debian后用FinalShell连接时如果看不到目录列表通常不是FinalShell的问题而是WSL里的SSH服务不完整。WSL默认没有开启ssh.service或者只装了openssh-client没有openssh-server。解决方法sudo apt install openssh-server sudo systemctl enable ssh sudo systemctl start ssh然后检查22端口是否监听ss -tlnp | grep :22FinalShell的目录展示依赖SFTP子系统如果SSH能正常连接但目录空白看看/etc/ssh/sshd_config里Subsystem sftp这行是否被注释取消注释重启ssh即可。我在Debian 12上遇到过一次就是因为OpenSSH升级后配置里SFTP子系统丢了。整体思路很简单先把系统基础服务弄通再处理上层工具。5. 从源头避免Media change安装选择与自动化清理5.1 安装向导这一步选对后续少踩坑Debian安装过程中的“软件源”设置步骤是Media change最容易落户的地方。很多人安装时默认只勾选了CD-ROM网络镜像选项没有勾选或者当时网络不通没敢选。系统装完/etc/apt里就牢牢写着一行cdrom源。如果你现在还没开始安装建议在软件源配置那一步直接选择网络镜像deb.debian.org或你信任的镜像站并取消CD-ROM选项。这样系统装完源列表就是纯网络源不会出现后续装包要换盘的问题。如果安装介质只有一张DVD又想保留离线的包来源也可以刻意保留CD-ROM源但要把网络源一并加上。这样在线时用网络源离线时CD源能兜底。只是需要明白光驱里没有盘的时候CD源形同虚设不影响日常操作。5.2 用一条命令批量清理cdrom源如果手头有大量Debian机器需要清理逐个编辑文件效率太低。我长期用的清理脚本长这样# 清理老式sources.list sed -i -E s/^deb cdrom:/#deb cdrom:/ /etc/apt/sources.list 2/dev/null || true # 清理deb822格式的debian.sources if [ -f /etc/apt/sources.list.d/debian.sources ]; then sed -i /[Cc][Dd][Rr][Oo][Mm]/ s/^/#/ /etc/apt/sources.list.d/debian.sources fi apt-get update这里的第二个sed只对包含cdrom字样的行进行注释逐行处理deb822的块。如果一整段都是CD源通常把包含cdrom的关键行注释掉apt就无法识别这个源效果等同于删除。如果源文件里既有网络源又有CD源建议手工检查一下别把网络源行误伤。当然你也可以更粗暴一点直接删除/etc/apt/sources.list.d/debian.sources后重新写入网络源。但备份和注释永远比直接删除安全至少出问题时还能快速回滚。5.3 APT优先级让网络源永远比CD源优先有些场景确实需要保留CD源例如离线底座加网络补充的混合模式。这种混合配置最大的麻烦是apt有时会优先选择CD源。解决办法是给CD源设置一个极低的APT优先级。在Debian 12上先看CD源在apt眼中的来源识别apt-cache policy输出中如果能看到类似oDebian CD的来源标识就可以在/etc/apt/preferences.d/cdrom里写Package: * Pin: release oDebian CD Pin-Priority: -1Pin-Priority设为负数表示这个源永远不会被作为候选。这样保留CD源文件在列表里apt也会完全忽略它不会出现Media change。需要临时用CD源装某个离线包时再把优先级改回500或临时用apt install -t指定。这个方法适合对APT优先级机制熟悉的用户。普通用户不需要走到这一步注释或删除CD源已经足够。6. 一点实操体会装完系统先清cdrom折腾多了你就会发现Debian的Media change提示是个非常“实在”的系统行为它发现你配置了CD-ROM源就真的会去读光盘读不到就停下来等你。它不会自动跳过也不会因为感觉得到网络就放弃CD源。所以与其等它弹提示再处理不如装完系统第一步就把cdrom清除干净。我在维护PVE虚拟机模板和日常Debian服务器时已经把“清理cdrom源”写成了固定动作。每次构建完一个系统先跑一遍清理脚本再执行一次apt update确认没有GPG或换盘提示之后才投入使用。这个习惯帮我省下了很多次半夜被“please insert the disc”打断的烦恼。如果这篇文章能帮你把源列表收拾利索你后续装任何软件都不会再被这个提示拦路。最后再提醒一句改完源后顺手备份一下比如sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak下次出任何源相关的问题都有一条快速的回头路可走。