|
#!/bin/bash |
|
# fix-colima.sh - Colima 強制終了後のディスクロック解除 & 再起動スクリプト |
|
# |
|
# Mac を強制終了した後、Colima が起動できなくなる問題を修正します。 |
|
# 原因: Lima VM のディスクロック (in_use_by) が残ったまま解放されない |
|
# |
|
# 使い方: |
|
# ./fix-colima.sh # 自動診断 & 修復 |
|
# ./fix-colima.sh --force # 確認なしで修復 |
|
|
|
set -euo pipefail |
|
|
|
LIMA_HOME="${HOME}/.colima/_lima" |
|
DISK_DIR="${LIMA_HOME}/_disks/colima" |
|
LOCK_DIR="${DISK_DIR}/in_use_by" |
|
|
|
RED='\033[0;31m' |
|
GREEN='\033[0;32m' |
|
YELLOW='\033[0;33m' |
|
NC='\033[0m' |
|
|
|
info() { echo -e "${GREEN}[INFO]${NC} $*"; } |
|
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } |
|
error() { echo -e "${RED}[ERROR]${NC} $*"; } |
|
|
|
# --- Step 1: 状態確認 --- |
|
echo "========================================" |
|
echo " Colima トラブルシューター" |
|
echo "========================================" |
|
echo |
|
|
|
# Colima がすでに動いているか |
|
if colima status &>/dev/null; then |
|
info "Colima は正常に動作しています。修復は不要です。" |
|
docker ps 2>/dev/null |
|
exit 0 |
|
fi |
|
|
|
warn "Colima が停止しています。原因を調査します..." |
|
echo |
|
|
|
# --- Step 2: ディスクロック確認 --- |
|
if [ -d "$LOCK_DIR" ]; then |
|
error "ディスクロックが検出されました: ${LOCK_DIR}" |
|
echo " -> 前回の強制終了でロックが解放されませんでした。" |
|
echo |
|
|
|
if [ "${1:-}" != "--force" ]; then |
|
read -p "ロックを解除して Colima を再起動しますか? [y/N] " answer |
|
if [ "$answer" != "y" ] && [ "$answer" != "Y" ]; then |
|
echo "中断しました。" |
|
exit 1 |
|
fi |
|
fi |
|
|
|
# Lima インスタンスの強制停止(念のため) |
|
info "Lima インスタンスを停止中..." |
|
LIMA_HOME="$LIMA_HOME" limactl stop colima --force 2>/dev/null || true |
|
|
|
# ロック解除 |
|
info "ディスクロックを解除中..." |
|
rm -rf "$LOCK_DIR" |
|
|
|
# 確認 |
|
if [ -d "$LOCK_DIR" ]; then |
|
error "ロック解除に失敗しました。手動で削除してください:" |
|
echo " rm -rf ${LOCK_DIR}" |
|
exit 1 |
|
fi |
|
info "ロック解除完了" |
|
echo |
|
else |
|
info "ディスクロックは検出されませんでした。" |
|
echo " 別の原因で起動できない可能性があります。" |
|
echo " 詳細ログ: ${LIMA_HOME}/colima/ha.stderr.log" |
|
echo |
|
fi |
|
|
|
# --- Step 3: ソケットファイル掃除 --- |
|
STALE_SOCK="${LIMA_HOME}/colima/ssh.sock" |
|
if [ -S "$STALE_SOCK" ]; then |
|
info "古いソケットファイルを削除: ${STALE_SOCK}" |
|
rm -f "$STALE_SOCK" |
|
fi |
|
|
|
# --- Step 4: Colima 起動 --- |
|
info "Colima を起動中..." |
|
if colima start; then |
|
echo |
|
info "Colima が正常に起動しました!" |
|
else |
|
echo |
|
error "Colima の起動に失敗しました。" |
|
echo " ログを確認してください:" |
|
echo " cat ${LIMA_HOME}/colima/ha.stderr.log" |
|
echo |
|
echo " 完全リセットする場合(データは失われます):" |
|
echo " colima delete --force && colima start" |
|
exit 1 |
|
fi |
|
|
|
# --- Step 5: Docker 確認 --- |
|
echo |
|
info "Docker の状態:" |
|
docker ps 2>/dev/null || warn "Docker にまだ接続できません。少し待ってから再試行してください。" |
|
|
|
echo |
|
echo "========================================" |
|
echo " 修復完了" |
|
echo "========================================" |