无法启动的服务器通常数据都还在。原因往往很小:/etc/fstab 中有一行写错、内核更新弄坏了引导程序、硬盘写满、文件系统需要检查,或者防火墙规则把您锁在了外面。救援系统通过网络而非硬盘启动,因此您可以挂载硬盘、修复问题后正常启动,或者先把数据拷贝到安全的地方。本文介绍 Linux 服务器的常见修复方法。
在做任何修改之前,先打开控制台,查看屏幕上最后的提示信息:
在救援系统中列出硬盘和分区:
lsblk -f
fdisk -l
找到根分区(通常是最大的 ext4 或 xfs 分区),UEFI 服务器上还要找到一个较小的 vfat 分区(EFI 系统分区)。如果看到 linux_raid_member 或 LVM2_member,请先将其组装/激活:
# Software RAID (mdadm)
mdadm --assemble --scan
cat /proc/mdstat
# LVM
vgscan
vgchange -ay
lvs
请在分区 未 挂载的状态下运行文件系统检查。将设备名替换为您自己的:
# ext4
fsck -f /dev/sda2
# XFS: try a normal mount first, use xfs_repair only if mounting fails
xfs_repair /dev/mapper/vg0-root
xfs_repair -L:它会丢弃日志,可能丢失最近写入的数据。如果数据很重要,请先把数据拷贝出来(第 8 步)。mkdir -p /mnt/sys
mount /dev/sda2 /mnt/sys # your root partition or LV
ls /mnt/sys # you should see etc, home, var ...
nano /mnt/sys/etc/fstab
在已不存在的硬盘对应的行前加上 # 将其注释掉,并为可选的数据盘加上 nofail,这样硬盘缺失时就不会再阻止系统启动:
UUID=1234-abcd /data ext4 defaults,nofail 0 2
请使用 blkid 查到的 UUID,而不是 /dev/sdb1 这类设备名,因为设备名在每次启动之间可能会变化。正确挂载硬盘的方法请参阅 数据盘分区与挂载。
如果根文件系统已 100% 写满,服务会运行失败,部分系统甚至无法启动。在硬盘挂载后,找出并删除大文件,通常是旧日志或备份:
du -xh /mnt/sys --max-depth=2 2>/dev/null | sort -h | tail -20
更多清理方法请参阅 Linux 释放硬盘空间。
对于需要使用系统自带工具(GRUB、包管理器、passwd)的修复,请 chroot 进入系统:
mount /dev/sda1 /mnt/sys/boot # only if /boot is a separate partition
mount /dev/sda15 /mnt/sys/boot/efi # UEFI only: the vfat EFI partition
for d in dev proc sys run; do mount --bind /$d /mnt/sys/$d; done
chroot /mnt/sys /bin/bash
现在您就是在已安装的系统内操作了。如需重置忘记的 root 密码,直接执行 passwd root 即可;其他方法请参阅 重置 Linux root 密码。
在 chroot 环境中执行:
# Debian / Ubuntu, legacy BIOS boot
grub-install /dev/sda
update-grub
update-initramfs -u -k all
# Debian / Ubuntu, UEFI boot
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian
update-grub
# Rocky / AlmaLinux / CentOS
grub2-mkconfig -o /boot/grub2/grub.cfg
dracut -f --regenerate-all
如果使用软 RAID,请在每块成员盘上(例如 /dev/sda 和 /dev/sdb)都执行 grub-install,这样服务器从任意一块盘都能启动。
如果服务器能启动,但修改防火墙或 SSH 设置后无法连接,请在 chroot 中修复(如果系统仍能启动,也可以直接在 VNC 控制台中修复):
# Check the SSH configuration for errors
sshd -t
# Temporarily disable the firewall at next boot
systemctl disable ufw 2>/dev/null; systemctl disable firewalld 2>/dev/null
重新登录后,按照 使用 firewalld 和 ufw 开放端口 重新启用防火墙并放行正确的端口。
如果修复失败或您打算重装系统,请先把重要数据拷贝到另一台服务器。在救援系统中执行:
# Copy a directory to a backup server over SSH
rsync -aHAX --info=progress2 /mnt/sys/var/www/ user@backup-server:/backup/www/
# Stream a compressed archive without needing local space
tar -C /mnt/sys -czf - home etc var/lib/mysql | ssh user@backup-server "cat > /backup/server.tar.gz"
对于数据库,如果恢复到相同版本的数据库,直接拷贝已停止服务器上的原始数据文件是可行的。否则,请在系统修复后启动系统,再使用 mysqldump 导出。
exit # leave the chroot
for d in run sys proc dev; do umount /mnt/sys/$d; done
umount -R /mnt/sys
sync
然后退出救援模式(在 IMIDC 面板中:当前任务 → 退出救援),让服务器从自己的硬盘启动,并在 VNC 控制台中观察启动过程。
选择 Windows 救援类型即可启动一个 Windows 环境,您可以从系统盘拷贝文件,或执行 chkdsk C: /f 和 bcdboot C:\Windows 修复启动文件。
可能是 RAID 卡需要救援系统中没有的驱动,也可能是硬盘已损坏。请提交工单,由我们的工程师检查硬件。
只有在数据安全之后才可以。重装会清空硬盘,而救援系统可以让您先备份一份数据。
按照以上步骤操作后仍未解决?请 提交工单,IMIDC 7×24 小时技术团队将为您处理。请附上服务器 IP、控制台中启动报错的截图以及 lsblk -f 的输出,以便我们更快定位问题。