1. 项目概述:为什么需要切换Ubuntu的启动模式?

在嵌入式开发、服务器运维,甚至是日常的Linux系统调优中,我们经常会遇到一个场景:一台运行Ubuntu的设备,我们并不总是需要它启动后直接进入华丽的图形桌面。对于一台作为后台服务的服务器,图形界面(GUI)会白白消耗宝贵的内存和CPU资源;对于一个嵌入式系统开发者,在调试内核驱动或排查启动故障时,直接进入纯净的字符界面(CLI)能让我们更清晰地看到内核信息、服务启动日志,避免图形界面可能带来的干扰。我自己在部署树莓派集群、调试工控机或者搭建家庭NAS时,就无数次地需要将Ubuntu默认的图形启动改为文本模式,反之亦然。

这个操作看似简单,只是改个配置,但背后涉及Linux的初始化系统(如Upstart、systemd)、运行级别(Runlevel)或目标(Target)的概念,以及引导程序GRUB的配置。更重要的是,Ubuntu的版本迭代非常快,不同版本采用的初始化系统和配置方法截然不同。如果你在网上搜索“Ubuntu 开机进入命令行”,可能会找到一堆相互矛盾甚至已经过时的方法,照着做很可能无效,甚至导致系统无法正常启动。今天,我就结合自己十多年的踩坑经验,为你系统性地梳理从古早版本到最新版Ubuntu切换默认启动模式的正确方法,并解释清楚每一步背后的原理,让你不仅会操作,更能理解为什么这么做。

2. 核心概念解析:运行级别、目标与显示管理器

在动手修改之前,我们必须先理解几个核心概念,否则所有的操作命令都只是死记硬背,一旦环境变化就会束手无策。

2.1 运行级别(Runlevel)的演进与现状

运行级别是SysV init系统(Linux传统的初始化系统)用来定义系统不同运行状态的概念。它用数字0-6表示:

  • 0: 停机。
  • 1: 单用户模式(救援模式,仅root,用于系统修复)。
  • 2-5: 多用户模式。在传统的Debian/Ubuntu定义中, 级别3是纯文本多用户模式 级别5是图形界面多用户模式 。但请注意,Ubuntu对2-5级的定义比较灵活。
  • 6: 重启。

在Ubuntu 6.10到14.10这段时间,它使用了一套名为 Upstart 的初始化系统。Upstart兼容SysV init的脚本,因此“运行级别”的概念依然存在,但配置方式发生了变化。你提供的原始资料中,修改 /etc/init/rc-sysinit.conf /etc/init/gdm.conf 就是Upstart时代的典型操作。其核心逻辑是:系统默认运行级别由 DEFAULT_RUNLEVEL 环境变量定义(通常放在上述文件中),而图形显示管理器(如gdm)的启动条件被设定为“在运行级别2、4、5时启动”。所以,把默认级别改成3,并让gdm在3级别停止,系统就会进入文本模式。

然而,从Ubuntu 15.04开始, systemd 成为了默认的初始化系统。systemd用“目标(target)”取代了“运行级别”。虽然为了兼容,它依然提供了类似运行级别的target(例如 multi-user.target 对应级别3, graphical.target 对应级别5),但配置哲学和方式已经完全改变。现在网上很多教程失效,就是因为还在用Upstart甚至SysV init的方法去配置systemd系统。

2.2 显示管理器(Display Manager)的角色

图形界面并非凭空出现,它需要一个“守门人”程序来管理图形登录。这个程序就是显示管理器,常见的有GDM(GNOME)、LightDM(轻量级,Ubuntu默认多年)、SDDM(KDE Plasma)。 系统启动时,是先完成核心服务和网络加载,到达某个运行级别或目标后,再由显示管理器启动X Server或Wayland,并呈现登录界面。 因此,切换启动模式的核心,其实就是控制显示管理器是否随系统一起启动。

注意: 直接粗暴地删除显示管理器(如旧资料中提到的删除 /etc/init.d/gdm )是非常危险的操作,这可能导致你既无法进入图形界面,在需要时又难以恢复。正确的方法应该是“禁用”它的自动启动,而非“删除”它。

2.3 GRUB引导参数的作用

无论是旧版还是新版,我们都可以通过修改GRUB引导加载器的内核启动参数,来临时或永久地改变单次启动的行为。添加 text 参数或移除 quiet splash 参数,就是告诉内核:“这次启动不要尝试启动图形系统,并且把启动过程的信息都打印出来”。这对于调试启动故障极其有用。原始资料中“一次性进入文本模式”的方法,就是修改GRUB启动项,这是一种非常安全且有效的临时调试手段。

3. 分版本实操指南:从古早到现代的正确方法

理解了原理,我们来看具体操作。请首先使用 lsb_release -a cat /etc/os-release 命令确认你的Ubuntu版本,然后对号入座。

3.1 适用于 Ubuntu 14.10 及更早版本(Upstart 时代)

对于这些版本(如你资料中提到的9.10、11.04),方法相对统一,主要修改两个Upstart job配置文件。

第一步:修改默认运行级别 打开 /etc/init/rc-sysinit.conf 文件,找到定义 DEFAULT_RUNLEVEL 的行。通常它默认是2。

sudo vi /etc/init/rc-sysinit.conf
# 或者使用你熟悉的编辑器,如 nano

找到类似 env DEFAULT_RUNLEVEL=2 的行,将其修改为:

env DEFAULT_RUNLEVEL=3

这里将默认运行级别从2改为了3(多用户文本模式)。

第二步:控制图形显示管理器(以GDM为例) 接着,修改GDM的Upstart配置文件,让它不要在运行级别3启动。

sudo vi /etc/init/gdm.conf

在这个文件里,你需要找到控制其启动和停止的 start on stop on 条件。

  • 确保 start on 条件包含运行级别 2, 4, 5 。通常它已经是这样写的: start on runlevel [245]
  • 修改 stop on 条件,确保包含运行级别 3 。将类似 stop on runlevel [016] 的行修改为 stop on runlevel [0136]

这样配置后,系统在运行级别3时,GDM服务会被停止,从而无法启动图形界面。

第三步:重启生效 执行 sudo reboot 重启系统。启动后你将直接进入黑色的文本登录界面。如果想临时切换到图形界面,登录后输入 startx 命令即可。

实操心得: 在Upstart系统上,除了修改配置文件,还可以使用 sudo telinit 3 sudo init 3 命令在不重启的情况下,立即从图形界面切换到运行级别3(文本模式)。同理, sudo telinit 5 可以切回图形界面。这是一个非常方便的实时切换技巧。

3.2 适用于 Ubuntu 15.04 及之后版本(systemd 时代)

对于现代Ubuntu版本,我们操作的核心是systemd的“目标”和“服务”。

方法一:使用 systemctl 设置默认目标(推荐) 这是最标准、最安全的方法。systemd有一个“默认目标”的概念,类似于默认运行级别。

  1. 查看当前默认目标:
    systemctl get-default
    
    通常,安装桌面环境后,输出会是 graphical.target
  2. 设置默认进入文本模式: 我们希望系统默认启动到多用户文本模式,对应的目标是 multi-user.target
    sudo systemctl set-default multi-user.target
    
    这条命令实际上是在 /etc/systemd/system/ 下创建了一个指向 /lib/systemd/system/multi-user.target 的符号链接 default.target
  3. 重启生效: sudo reboot
  4. 恢复图形界面为默认: 如果需要改回来,只需执行:
    sudo systemctl set-default graphical.target
    

方法二:禁用图形显示管理器服务 如果你不想改变默认目标,而是想保留 graphical.target ,但阻止其核心组件——显示管理器自动启动,也可以。

  1. 确定你的显示管理器:
    cat /etc/X11/default-display-manager
    
    常见输出可能是 /usr/sbin/lightdm /usr/sbin/gdm3
  2. 禁用该服务: 假设显示管理器是lightdm:
    sudo systemctl disable lightdm.service
    
    这个命令会移除该服务在对应目标下的启动链接,使其下次启动时不会自动运行。
  3. 重启生效。
  4. 恢复: 需要时使用 sudo systemctl enable lightdm.service 重新启用。

注意事项: 在systemd系统上, 绝对不要 再使用 sysv-rc-conf 或直接修改 /etc/rc*.d/ 目录下的链接来管理系统服务,这些方法对systemd管理的服务无效或可能造成混乱。始终使用 systemctl 命令。

3.3 临时/一次性进入文本模式(GRUB参数法,全版本通用)

这个方法在你需要调试、或者只是单次进入文本模式时非常有用,无需永久修改任何配置。

  1. 开机时,在GRUB菜单界面(通常需要快速按下 Shift Esc 键呼出),选择你要启动的内核项,按 e 键进入编辑模式。
  2. 在编辑界面中,找到以 linux linuxefi 开头的那一行。这行定义了内核启动参数。
  3. 在这行参数中,找到 quiet splash 这两个参数。
    • 删除 quiet splash 这会关闭安静模式和启动动画,让你看到详细的启动日志,对于排查问题至关重要。
    • 添加 text 参数: 或者,在行末( ro 之后)添加 text 参数,直接告诉内核启动到文本模式。 例如,将:
    linux /boot/vmlinuz-... root=UUID=... ro quiet splash
    
    修改为:
    linux /boot/vmlinuz-... root=UUID=... ro text
    
    或(仅看日志,仍尝试启动图形):
    linux /boot/vmlinuz-... root=UUID=... ro
    
  4. 修改完成后,按 Ctrl+X F10 使用修改后的参数启动。 这次修改仅对本次启动生效。

4. 深度配置与高级技巧

除了基本的模式切换,还有一些相关的配置可以优化你的命令行或启动体验。

4.1 配置GRUB以永久更改内核参数

如果你希望每次启动都默认看到详细日志(去掉quiet splash),或者永久添加其他内核参数,需要修改GRUB的配置文件。

  1. 编辑GRUB主配置文件:
    sudo nano /etc/default/grub
    
  2. 找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行。这个变量里的参数就是默认追加到内核启动行的参数。
    • 若要永久移除开机动画和安静模式,将其修改为:
      GRUB_CMDLINE_LINUX_DEFAULT=""
      
    • 若要永久默认启动到文本模式,可以添加 text 参数(但更推荐用 systemctl set-default 方法):
      GRUB_CMDLINE_LINUX_DEFAULT="text"
      
  3. 保存文件后, 必须 运行以下命令来更新GRUB的引导配置:
    sudo update-grub
    
    这个命令会根据 /etc/default/grub 的配置重新生成 /boot/grub/grub.cfg 文件。 忘记执行此步骤是导致修改无效的最常见原因!

4.2 在文本控制台下使用中文与Framebuffer

对于中文用户,在纯文本界面下可能需要查看中文文件名或日志。原始的 zhcon 方案已经比较老旧,在现代系统上可能工作不佳。更推荐使用 fbterm

  1. 安装fbterm:
    sudo apt install fbterm
    
  2. 授予当前用户使用framebuffer的权限:
    sudo gpasswd -a $USER video
    
    注销并重新登录(或重启)使组权限生效。
  3. 运行fbterm: 登录文本控制台后,直接输入 fbterm 即可进入一个支持中文显示和输入(需额外配置输入法)的终端。
  4. 启用Framebuffer(可选,用于更好的显示效果): 如原始资料所述,可以编辑 /etc/default/grub ,取消注释并设置 GRUB_GFXMODE ,例如:
    GRUB_GFXMODE=1024x768x32
    
    然后运行 sudo update-grub 。这可以让GRUB和后续的Linux控制台使用指定的图形分辨率,提升 fbterm 的显示体验。你可以通过 sudo vbeinfo 命令(在GRUB命令行中)查看你的固件支持的显示模式。

4.3 处理安装桌面环境后的自动切换

有时,你在一台服务器(文本模式)上安装了桌面环境包(如 ubuntu-desktop ),安装程序可能会自动将默认目标设置为 graphical.target 。如果你不希望如此,安装完成后记得立即检查并改回 multi-user.target

sudo systemctl set-default multi-user.target

这样,即使桌面环境组件已安装,系统启动时也不会加载图形界面,节省资源。

5. 常见问题与故障排查实录

在实际操作中,你可能会遇到以下问题。这里记录了我遇到过的典型情况及其解决方法。

5.1 修改后重启,系统黑屏或卡住

这是最令人紧张的情况。可能的原因和解决步骤:

  1. 显示管理器配置冲突: 尤其是在混合使用新旧方法时(比如在systemd系统上错误修改了runlevel)。 解决方案: 尝试在GRUB启动时按 e 编辑参数,在 linux 行末尾添加 systemd.unit=multi-user.target (对于systemd系统)或 single (进入单用户救援模式)。启动后,检查并撤销错误的配置。

    • 对于systemd系统: sudo systemctl set-default multi-user.target (如果之前设错了)。
    • 检查是否有残留的Upstart或SysV配置在干扰。
  2. 显卡驱动问题: 有时,强制文本模式可能会触发某些专有显卡驱动的兼容性问题。 解决方案: 同样通过GRUB编辑启动参数,添加 nomodeset 参数,这会禁用内核模式设置,使用最基本的显示驱动,通常能让你进入系统。进入系统后,再排查显卡驱动问题。

5.2 忘记了密码,无法登录文本控制台

如果你设置了自动登录图形界面,但忘记了密码,切换到文本模式是重置密码的途径。但如果你在文本控制台也登录不了:

  1. 重启电脑,在GRUB菜单选择“Advanced options for Ubuntu”。
  2. 选择一个带 (recovery mode) 的内核版本启动。
  3. 在恢复模式菜单中,选择 root (进入root shell)。
  4. 此时文件系统通常是以只读方式挂载的,需要重新挂载为可写:
    mount -o remount,rw /
    
  5. 使用 passwd <用户名> 命令修改指定用户的密码。
  6. 执行 sync reboot 重启。

5.3 如何判断当前系统使用的是Upstart还是systemd?

这是一个基础但关键的问题,用一条命令就能判断:

ps -p 1 -o comm=

或者

stat /proc/1/exe

如果输出是 systemd ,那么你的系统就是systemd初始化系统。如果输出是 init (并且可能是Upstart的符号链接),那么就是Upstart或更早的SysV init。在Ubuntu 14.10及之前,通常是Upstart;15.04及之后,一定是systemd。

5.4 切换模式后,网络管理器(NetworkManager)不工作了?

在纯文本模式下,图形化的NetworkManager小程序(nm-applet)当然不会运行,但这不代表网络没起来。NetworkManager服务本身可能仍在运行。

  1. 使用 systemctl status NetworkManager 检查服务状态。
  2. 在文本模式下,你可以使用 nmtui 命令启动一个基于文本用户界面(TUI)的NetworkManager工具来管理连接,非常方便。
  3. 如果你使用更简单的 systemd-networkd ,则使用 networkctl 命令来查看和管理。

5.5 从文本模式,如何快速启动一个图形界面程序?

有时在服务器上,我们可能需要临时运行一个带图形界面的配置工具(如 raspi-config 或某些设备的烧录工具)。这需要X Server。

  1. 首先,确保你已通过 ssh -X ssh -Y 从一台有图形环境的电脑连接到了这台服务器。 -X -Y 参数启用了X11转发。
  2. 在服务器的ssh会话中,直接运行图形程序命令即可。例如 firefox 。图形界面会显示在你本地电脑上。
  3. 如果程序抱怨 DISPLAY 变量未设置,通常SSH连接会自动设置好。你也可以手动导出: export DISPLAY=localhost:10.0 (具体值请查看 echo $DISPLAY 的输出)。

这个操作的核心在于理解不同Ubuntu版本底层初始化系统的根本性差异。对于Upstart,我们操作的是运行级别和job配置文件;对于systemd,我们操作的是目标和服务单元。永远优先使用当前系统原生初始化系统提供的管理工具(如 systemctl ),避免使用过时或跨体系的方法。GRUB参数修改是进行一次性调试的利器。最后,在文本模式下, fbterm nmtui ssh -X 这些工具能极大提升你的工作效率。掌握这些,你就能游刃有余地掌控Ubuntu的启动面貌,让它更好地为你的开发、运维或学习服务。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐