Linux 服务器

服务器无法启动?用救援模式挂载硬盘、修复 fstab 和 GRUB 并拷贝数据

10 个步骤 9 分钟阅读 31 次阅读 0
本文目录

无法启动的服务器通常数据都还在。原因往往很小:/etc/fstab 中有一行写错、内核更新弄坏了引导程序、硬盘写满、文件系统需要检查,或者防火墙规则把您锁在了外面。救援系统通过网络而非硬盘启动,因此您可以挂载硬盘、修复问题后正常启动,或者先把数据拷贝到安全的地方。本文介绍 Linux 服务器的常见修复方法。

在 IMIDC 独立服务器上,请在客户中心点击 救援模式 按钮启动救援系统,并通过 VNC 控制台 进行操作。请参阅 独立服务器管理面板使用指南。在其他服务商处,救援系统内的操作步骤是相同的。

第 1 步:找出无法启动的原因

在做任何修改之前,先打开控制台,查看屏幕上最后的提示信息:

  • "You are in emergency mode" 或 "Dependency failed for /data":通常是 fstab 条目错误或硬盘缺失。修复 fstab(第 4 步)。
  • "grub rescue>"、"no such partition" 或 "Reboot and select proper boot device":引导程序损坏。重装 GRUB(第 6 步)。
  • 更新后出现 Kernel panic:如果出现 GRUB 菜单,选择上一个内核启动;否则在救援系统中重建 initramfs(第 6 步)。
  • 系统能启动但无法连接:先通过控制台检查网络和防火墙,可能根本不需要救援模式(第 7 步)。

第 2 步:识别硬盘

在救援系统中列出硬盘和分区:

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

第 3 步:检查文件系统

请在分区 未 挂载的状态下运行文件系统检查。将设备名替换为您自己的:

# ext4
fsck -f /dev/sda2

# XFS: try a normal mount first, use xfs_repair only if mounting fails
xfs_repair /dev/mapper/vg0-root
切勿对已挂载的文件系统运行 fsck 或 xfs_repair。除非常规修复无法进行,否则不要使用 xfs_repair -L:它会丢弃日志,可能丢失最近写入的数据。如果数据很重要,请先把数据拷贝出来(第 8 步)。

第 4 步:挂载系统并修复 fstab

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 释放硬盘空间。

第 5 步:使用 chroot 进入已安装的系统

对于需要使用系统自带工具(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 密码。

第 6 步:重装 GRUB 并重建 initramfs

在 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,这样服务器从任意一块盘都能启动。

第 7 步:解除防火墙或 SSH 锁定

如果服务器能启动,但修改防火墙或 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 开放端口 重新启用防火墙并放行正确的端口。

第 8 步:把数据拷贝出来

如果修复失败或您打算重装系统,请先把重要数据拷贝到另一台服务器。在救援系统中执行:

# 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 导出。

第 9 步:退出救援模式

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 救援类型即可启动一个 Windows 环境,您可以从系统盘拷贝文件,或执行 chkdsk C: /f 和 bcdboot C:\Windows 修复启动文件。

常见问题

lsblk 看不到任何硬盘

可能是 RAID 卡需要救援系统中没有的驱动,也可能是硬盘已损坏。请提交工单,由我们的工程师检查硬件。

是否应该直接重装?

只有在数据安全之后才可以。重装会清空硬盘,而救援系统可以让您先备份一份数据。

按照以上步骤操作后仍未解决?请 提交工单,IMIDC 7×24 小时技术团队将为您处理。请附上服务器 IP、控制台中启动报错的截图以及 lsblk -f 的输出,以便我们更快定位问题。

这篇文章有帮助吗?

相关教程