Linux 伺服器

伺服器無法啟動?用救援模式掛載硬碟、修復 fstab 和 GRUB 並複製資料

10 個步驟 9 分鐘閱讀 37 次閱讀 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 的輸出,以便我們更快定位問題。

這篇文章有幫助嗎?

相關教程