起動しなくなったサーバーでも、ほとんどの場合データはすべて残っています。原因は意外と小さなことが多く、/etc/fstabの誤った1行、ブートローダーを壊したカーネル更新、ディスク容量の枯渇、チェックが必要なファイルシステム、自分を締め出したファイアウォールルールなどが典型です。レスキューシステムはディスクではなくネットワークから起動するため、ディスクをマウントして問題を修正し、通常どおり起動させることも、先にデータを安全な場所へ退避することもできます。本ガイドでは、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
/dev/sdb1のようなデバイス名は起動ごとに変わる可能性があるため、blkidで確認したUUIDを使用してください。ディスクの正しいマウント方法はデータディスクのパーティション作成とマウントで解説しています。
ルートファイルシステムが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ではCurrent Task → Exit Rescue)、サーバーが自身のディスクから起動する様子をVNCコンソールで確認します。
レスキューの種類でWindowsを選択すると、Windows環境が起動します。そこからシステムドライブのファイルをコピーしたり、chkdsk C: /fやbcdboot C:\Windowsを実行してブートファイルを修復したりできます。
RAIDコントローラーにレスキューシステムにはないドライバーが必要な場合や、ディスクが故障している可能性があります。チケットを作成していただければ、エンジニアがハードウェアを確認します。
データを確保してからにしてください。再インストールはディスクを消去しますが、レスキューシステムを使えば先にコピーを取ることができます。
上記の手順で解決しない場合は、サポートチケットを作成してください。IMIDCの24時間365日対応の技術チームがサポートします。サーバーIP、コンソールに表示された起動エラーのスクリーンショット、lsblk -fの出力を添えていただくと、より迅速に原因を特定できます。