Ubuntu 优化启动时间优化
优化 Ubuntu 20.04 的启动时间可以从多个方面入手,以下是详细的步骤和建议:
一、分析启动耗时
首先检查系统启动各阶段的耗时:
systemd-analyze time # 查看整体启动时间
systemd-analyze blame # 列出各服务/进程的启动耗时
systemd-analyze critical-chain # 查看关键路径的启动链
二、禁用不必要的服务
禁用启动时不需要的系统服务:
sudo systemctl disable <service-name> # 禁用服务(如蓝牙、打印机等)
sudo systemctl mask <service-name> # 彻底屏蔽服务(谨慎使用)
常见可禁用的服务:
bluetooth.service
(蓝牙)cups.service
(打印机)ModemManager.service
(调制解调器)networkd-dispatcher.service
(若使用NetworkManager)accounts-daemon.service
(用户账户管理)
三、优化文件系统检查(fsck)
-
减少文件系统检查频率:
- 编辑
/etc/fstab
,将最后一列的数值改为0
(表示不检查):sudo nano /etc/fstab # 示例:将最后数字从 1 或 2 改为 0 UUID=xxxx / ext4 defaults,noatime,discard 0 0
- 使用
noatime
或relatime
挂载选项减少磁盘写入。
- 编辑
-
禁用启动时的文件系统等待:
sudo systemctl disable systemd-fsck-root.service
四、调整内核参数
-
编辑 GRUB 配置:
sudo nano /etc/default/grub # 修改以下参数: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" # 添加或修改为(例如): GRUB_CMDLINE_LINUX_DEFAULT="quiet splash noresume fsck.mode=skip"
fsck.mode=skip
:跳过文件系统检查(谨慎使用)。noresume
:如果未使用休眠功能。
-
更新 GRUB:
sudo update-grub
五、优化 SSD 性能(如使用 SSD)
- 启用 TRIM:
sudo systemctl enable fstrim.timer
- 确认是否已启用
discard
选项(在/etc/fstab
中添加discard
)。
六、清理启动项
- 管理用户级启动程序:
gnome-session-properties # 图形界面管理启动项
- 清理旧内核:
sudo apt autoremove --purge # 删除旧内核和依赖
七、排查硬件问题
- 检查硬盘健康状况:
sudo smartctl -a /dev/sda
- 检查日志中的硬件错误:
journalctl -b -p 3 # 查看本次启动的错误日志
八、使用轻量化组件
- 替换图形界面为轻量级桌面(如 Xfce 或 LXQt)。
- 使用更快的显示管理器(如
lightdm
替代gdm3
):sudo apt install lightdm sudo dpkg-reconfigure lightdm
九、其他优化
- 减少 GRUB 等待时间:
sudo nano /etc/default/grub GRUB_TIMEOUT=2 # 将默认超时时间改为2秒 sudo update-grub
- 预加载内核模块:
- 将常用模块添加到
/etc/modules-load.d/modules.conf
。
- 将常用模块添加到
十、验证优化结果
重启后再次运行:
systemd-analyze time
systemd-analyze blame
通过以上步骤,大部分情况下可以显著缩短启动时间。如果问题依旧存在,可能需要进一步排查特定服务或硬件兼容性问题。
我的结果:
- 最开始的时候:
> systemd-analyze time
Startup finished in 22.227s (firmware) + 9.423s (loader) + 36.324s (kernel) + 1min 51.738s (userspace) = 2min 59.713s
graphical.target reached after 1min 51.722s in userspace
> systemd-analyze blame
20.870s plymouth-quit-wait.service >
4.621s NetworkManager-wait-online.service >
3.019s dev-sda2.device >
1.329s fwupd.service >
459ms docker.service >
391ms snapd.service >
387ms man-db.service >
305ms blueman-mechanism.service >
299ms systemd-logind.service >
278ms dev-loop0.device >
267ms logrotate.service >
264ms upower.service >
255ms snap-core22-1722.mount >
241ms snap-core20-2496.mount >
239ms dev-loop2.device >
235ms snap-gnome\x2d3\x2d28\x2d1804-198.mount >
234ms containerd.service >
232ms snap-gnome\x2d3\x2d38\x2d2004-143.mount >
232ms snap-gnome\x2d42\x2d2204-176.mount >
229ms snap-gnome\x2d42\x2d2204-202.mount >
227ms snap-gtk\x2dcommon\x2dthemes-1535.mount >
226ms dev-loop11.device >
> systemd-analyze critical-chain
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.
graphical.target @1min 51.722s
└─multi-user.target @1min 51.722s
└─kerneloops.service @1min 35.442s +13ms
└─nss-lookup.target @1min 35.440s
└─todeskd.service @1min 35.439s
└─network-online.target @1min 35.436s
└─NetworkManager-wait-online.service @1min 30.814s +4.621s
└─NetworkManager.service @1min 30.736s +71ms
└─dbus.service @1min 30.733s
└─basic.target @1min 30.712s
└─sockets.target @1min 30.712s
└─uuidd.socket @1min 30.710s
└─sysinit.target @1min 30.699s
└─systemd-timesyncd.service @3.507s +97ms
└─systemd-tmpfiles-setup.service @3.486s +16ms
└─systemd-journal-flush.service @562ms +106ms
└─systemd-journald.service @458ms +103ms
└─systemd-journald.socket @451ms
└─system.slice @445ms
└─-.slice @445ms
- 优化了一下启动项的图像加载,禁用了plymouth图像加载
5263 sudo systemctl mask plymouth-quit-wait.service
5264 sudo apt remove plymouth
5265 sudo nano /etc/default/grub
5266 sudo update-grub
> systemd-analyze time
Startup finished in 20.682s (firmware) + 5.135s (loader) + 4.417s (kernel) + 1min 37.067s (userspace) = 2min 7.302s
graphical.target reached after 1min 37.059s in userspace
> systemd-analyze blame
4.897s NetworkManager-wait-online.service >
1.456s fwupd.service >
1.328s docker.service >
711ms dev-sda2.device >
681ms snapd.seeded.service >
620ms man-db.service >
594ms snapd.service >
504ms networkd-dispatcher.service >
419ms blueman-mechanism.service >
322ms dev-loop0.device >
298ms dev-loop1.device >
298ms apport-autoreport.service >
293ms containerd.service >
292ms dev-loop2.device >
287ms upower.service >
279ms logrotate.service >
270ms systemd-logind.service >
269ms dev-loop4.device >
256ms dev-loop8.device >
252ms dev-loop10.device >
249ms dev-loop5.device >
247ms dev-loop6.device >
242ms accounts-daemon.service >
241ms dev-loop3.device >
236ms snap-core18-2846.mount >
232ms fstrim.service >
221ms udisks2.service >
218ms snap-gnome\x2d42\x2d2204-176.mount >
217ms snap-gnome\x2d42\x2d2204-202.mount >
213ms dev-loop9.device >
213ms dev-loop11.device >
208ms snap-snap\x2dstore-1113.mount >
205ms snap-snapd-23545.mount >
204ms dev-loop17.device >
204ms dev-loop18.device >
204ms snap-snapd-23771.mount >
197ms dev-loop16.device >
197ms dev-loop7.device >
188ms dev-loop15.device >
186ms systemd-resolved.service >
185ms smartmontools.service >
182ms snap-core20-2496.mount >
180ms snap-core22-1722.mount >
179ms snap-core22-1748.mount >
175ms snap-gnome\x2d3\x2d38\x2d2004-119.mount >
172ms dev-loop13.device >
172ms snap-snap\x2dstore-1216.mount >
168ms systemd-timesyncd.service >
165ms snap-notion\x2dsnap\x2dreborn-49.mount >
164ms dev-loop14.device >
161ms dev-loop12.device >
150ms lm-sensors.service >
146ms apparmor.service >
136ms systemd-udev-trigger.service >
136ms gpu-manager.service >
135ms ModemManager.service >
134ms snap-core18-2855.mount >
120ms avahi-daemon.service >
116ms bluetooth.service >
116ms systemd-journal-flush.service >
114ms snap-gtk\x2dcommon\x2dthemes-1535.mount >
111ms NetworkManager.service >
110ms snap-notion\x2dsnap\x2dreborn-50.mount >
109ms systemd-journald.service >
103ms polkit.service >
> systemd-analyze critical-chain
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.
graphical.target @1min 37.059s
└─multi-user.target @1min 37.059s
└─docker.service @1min 35.730s +1.328s
└─nss-lookup.target @1min 35.729s
└─todeskd.service @1min 35.729s
└─network-online.target @1min 35.726s
└─NetworkManager-wait-online.service @1min 30.829s +4.897s
└─NetworkManager.service @1min 30.714s +111ms
└─dbus.service @1min 30.708s
└─basic.target @1min 30.688s
└─sockets.target @1min 30.688s
└─snapd.socket @1min 30.686s +1ms
└─sysinit.target @1min 30.671s
└─systemd-timesyncd.service @1.249s +168ms
└─systemd-tmpfiles-setup.service @1.207s +37ms
└─systemd-journal-flush.service @584ms +116ms
└─systemd-journald.service @473ms +109ms
└─systemd-journald.socket @466ms
└─system.slice @461ms
└─-.slice @461ms