無法啟動的伺服器通常資料都還在。原因往往很小:/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 的輸出,以便我們更快定位問題。