#!/usr/bin/env bash set -euo pipefail # 1. カレントディレクトリを /root に設定 cd /root # 2. root権限チェック if [ "$(id -u)" -ne 0 ]; then echo "[ERROR] このスクリプトは root 権限で実行する必要があります。(sudo -i で実行してください)" >&2 exit 1 fi echo "=== パーティションマージ処理を開始します (p68 + p69) ===" # 3. 必要なツールの確認・インストール if ! command -v growpart &> /dev/null; then echo "[INFO] cloud-guest-utils (growpart) をインストールしています..." apt-get update -y && apt-get install -y cloud-guest-utils fi for cmd in rsync parted resize2fs findmnt fuser; do if ! command -v "$cmd" &> /dev/null; then echo "[ERROR] 必要なコマンド '$cmd' が見つかりません。" >&2 exit 1 fi done BACKUP_DIR="/root/home_arduino_backup" # 4. /home/arduino データの退避 if findmnt -M "/home/arduino" > /dev/null 2>&1; then echo "[INFO] データを $BACKUP_DIR にバックアップ中..." mkdir -p "$BACKUP_DIR" rsync -aHAX --info=progress2 /home/arduino/ "$BACKUP_DIR/" # 5. /etc/fstab のバックアップと自動マウント無効化 echo "[INFO] /etc/fstab を更新中..." cp /etc/fstab "/etc/fstab.bak.$(date +%Y%m%d%H%M%S)" sed -i '\|/home/arduino|s/^/# /' /etc/fstab sed -i '\|mmcblk0p69|s/^/# /' /etc/fstab # 6. プロセス停止とアンマウント echo "[INFO] /home/arduino をアンマウント中..." if id "arduino" &>/dev/null; then loginctl terminate-user arduino 2>/dev/null || true fi fuser -km /home/arduino 2>/dev/null || true sleep 1 umount -l /home/arduino || true fi # 7. パーティション 69 (p69) の削除 echo "[INFO] パーティション 69 を削除中..." parted -s /dev/mmcblk0 rm 69 # 8. パーティション 68 (p68) のオンライン拡張 (growpartで警告プロンプトを回避) echo "[INFO] パーティション 68 を空き領域の末尾まで拡張中..." growpart /dev/mmcblk0 68 # 9. ルートファイルシステム (ext4) の拡張 echo "[INFO] ルートファイルシステムを拡張中 (resize2fs)..." resize2fs /dev/mmcblk0p68 # 10. データの書き戻しと権限復元 echo "[INFO] データを新しいルートディレクトリ (/home/arduino) へ書き戻し中..." mkdir -p /home/arduino rsync -aHAX "$BACKUP_DIR/" /home/arduino/ rm -rf "$BACKUP_DIR" if id "arduino" &>/dev/null; then chown -R arduino:arduino /home/arduino fi echo "=== すべての処理が完了しました ===" echo "拡張後のディスク容量:" df -h /