(2025-10-20, Mon)
この記事では、以下のようなところまで作業しています。
- Linux Mint 22.2 をインストール
- NASに2種類の方法で簡単バックアップ
- 復元の落とし穴(イメージバックアップ)
o linuxmint-22.2-cinnamon-64bit.iso をインストール。
o SSHでアクセスできるようにする。
o NASをマウントできるようにする。
o バックアップをできるようにする。
- ソースとしてバックアップ
- イメージとしてバックアップ
o イメージとしてバックアップする欠点は次の通り。
- 復元先のSSDにはバックアップイメージがそのまま(の位置で)復元される。
- 万一、復元先のSSDのあるセクターに欠陥があるとしたら、そこには書き込めない。
- よって、正常な復元が不可能。(要するに復元先のSSDを100%信用する場合のみ使用できる)
o ソースとしてバックアップした復元方法
- 初期インストールとまったく同様の作業を行う。
- 「復元(上書き)スクリプト」でNASにあるデーターから上書き処理をする。
- 復元プログラムは後日紹介予定。
o バックアップスクリプトを紹介。
■ 初期インストール (LinuxMint222)linuxmint-22.2-cinnamon-64bit.iso■ ssh をインストールしておく。sudo apt update sudo apt install openssh-server■ HIMAGINE (稼働マシン名です)192.168.1.128 DHCPで取得したIPアドレス■ /etc/hosts バックアップ先の NAS の IP アドレスを追加# NAS 192.168.1.40 as6704t 192.168.1.42 as6702t■ /etc/fstab NASのマウント準備# BACKUP POINT as6704t:/volume1/Public/LinuxMint222-HIMAGENE /mnt/as6704t nfs defaults 0 0■ NAS に、バックアップ用ディレクトリを用意\\192.168.1.40\Public\LinuxMint222-HIMAGINE\SOURCE ソースバックアップ先 \\192.168.1.40\Public\LinuxMint222-HIMAGINE\ARCHIVES イメージバックアップ先■ マウント機能をインストールsudo apt install -y nfs-common■ マウントポイントを作成sudo mkdir /mnt/as6704t■ バックアップ先をマウントsudo mount -a --- mount: (hint) your fstab has been modified, but systemd still uses the old version; use 'systemctl daemon-reload' to reload. --- sudo systemctl daemon-reload■ バックアップスクリプト MyBackupSOURCE_to_NAS.sh (ソースタイプ)#!/bin/bash : <<'_EOT_' MyBackupFullSOURCE_to_NAS.sh 目的: - 内蔵SSDのルートパーティション(/dev/sda2など)の全ファイルを NFSマウント先に圧縮イメージ(tar.gz)としてバックアップ - 保存先は /mnt/as6704t/SOURCE - ARCHIVES ディレクトリは除外 - 重複ファイルは自動で連番を付与 - バックアップ前にNFSサーバー疎通確認・マウント確認 - 進捗表示・所要時間・ファイルサイズ表示 注意: - ブート領域(/bootなど)は含めない _EOT_ HOSTNAME=$(cat /etc/hostname) BACKUP_DIRPOINT="/mnt/as6704t" BACKUP_DIR="/mnt/as6704t/SOURCE" DATE=$(date +'%Y%m%d') BACKUP_FILE="${BACKUP_DIR}/${HOSTNAME}-${DATE}-source.tar.gz" # バックアップ対象ディレクトリ # 除外ディレクトリを追加: /mnt を含めることでマウントされたNFSディレクトリがバックアップ対象から除外される EXCLUDES=("/boot" "/mnt" "/proc" "/sys" "/dev" "/run" "/tmp") # NFSサーバー NFS_SERVER="as6704t" # NFS疎通確認 echo "NFSサーバーへの疎通確認: $NFS_SERVER..." if ! ping -c 1 -W 2 "$NFS_SERVER" &>/dev/null; then echo "エラー: NFSサーバー $NFS_SERVER に到達できません。" exit 1 fi echo "疎通確認OK" # マウント確認 if ! mountpoint -q "$BACKUP_DIRPOINT"; then echo "エラー: バックアップ先が正しくマウントされていません: $BACKUP_DIR" exit 1 fi echo "マウント確認OK: $BACKUP_DIR" # 重複ファイル回避 counter=1 while [[ -f "$BACKUP_FILE" ]]; do BACKUP_FILE="${BACKUP_DIR}/${HOSTNAME}-${DATE}-source-${counter}.tar.gz" counter=$((counter + 1)) done # 確認フェーズ echo "バックアップを開始します。以下の内容で実行します:" echo "バックアップ先: $BACKUP_FILE" echo "除外ディレクトリ: ${EXCLUDES[*]}" read -p "続行しますか? (y/n): " confirm [[ "$confirm" != "y" ]] && { echo "バックアップ中止"; exit 1; } # 時間計測開始 start_time=$(date +%s) # tar 用 exclude 引数生成 EXCLUDE_ARGS=() for dir in "${EXCLUDES[@]}"; do EXCLUDE_ARGS+=(--exclude="$dir") done # バックアップ実行 echo "バックアップを開始します..." sudo tar "${EXCLUDE_ARGS[@]}" -czpf "$BACKUP_FILE" / --warning=no-file-changed --verbose # 時間計測終了 end_time=$(date +%s) elapsed=$(( (end_time - start_time) / 60 )) FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1) echo "バックアップ完了: $BACKUP_FILE" echo "所要時間: 約 ${elapsed} 分" echo "ファイルサイズ: ${FILE_SIZE}" --- (chmod +x MyBackupSOURCE_to_NAS.sh)■ イメージバックアップ MyBackupIMG_to_NAS.sh (復元先SSDを信用できる場合)#!/bin/bash # バックアップ先のディレクトリとファイル名 BACKUP_DIR="/mnt/as6702t/ARCHIVES" DATE=$(date +'%Y%m%d') # 日付の取得 (ゼロサプレス形式) BACKUP_FILE="${BACKUP_DIR}/PearlLinux12-N2-${DATE}-backup.img.gz" # SSDチェック lsblk -o NAME,TRAN,MOUNTPOINT # 内蔵SSDか、外付けUSBかを設定する。 SD="/dev/sda" # ファイル名がすでに存在する場合、番号を付けて新しい名前にする counter=1 while [[ -f "$BACKUP_FILE" ]]; do BACKUP_FILE="${BACKUP_DIR}/PearlLinux12-N2-${DATE}-backup-${counter}.img.gz" counter=$((counter + 1)) done # 確認フェーズ echo "バックアップを開始します。以下の内容でバックアップを実行します:" echo "バックアップ元: $SD" echo "バックアップ先: ${BACKUP_FILE}" echo read -p "続行しますか? (y/n): " confirm if [[ "$confirm" != "y" ]]; then echo "バックアップは中止されました。" exit 1 fi # 進捗表示付きでバックアップを実行 echo "バックアップを開始します..." # `dd` と `gzip` の組み合わせでバックアップを作成し、進捗を表示 sudo dd if=$SD bs=4M status=progress | gzip -q > "$BACKUP_FILE" echo "バックアップが完了しました: $BACKUP_FILE" --- (chmod +x MyBackupIMG_to_NAS.sh) --- バックアップ完了: /mnt/as6704t/SOURCE/HIMAGINE-20251020-source.tar.gz 所要時間: 約 7 分 ファイルサイズ: 2.8G■ イメージでバックアップ sudo ./MyBackupIMG_to_NAS.sh#!/bin/bash # バックアップ先のディレクトリ BACKUP_DIR="/mnt/as6704t/ARCHIVES" # 日付(例: 20251020) DATE=$(date +'%Y%m%d') # マシン名(例: PearlLinux12-N2) HOSTNAME=$(hostname) # バックアップファイル名 BACKUP_FILE="${BACKUP_DIR}/${HOSTNAME}-${DATE}-backup.img.gz" # SSDチェック lsblk -o NAME,TRAN,MOUNTPOINT # 内蔵SSDか、外付けUSBかを設定する SD="/dev/sda" # 同名ファイルが存在する場合、連番を付与 counter=1 while [[ -f "$BACKUP_FILE" ]]; do BACKUP_FILE="${BACKUP_DIR}/${HOSTNAME}-${DATE}-backup-${counter}.img.gz" counter=$((counter + 1)) done # 確認フェーズ echo "バックアップを開始します。以下の内容でバックアップを実行します:" echo "バックアップ元: $SD" echo "バックアップ先: ${BACKUP_FILE}" echo read -p "続行しますか? (y/n): " confirm if [[ "$confirm" != "y" ]]; then echo "バックアップは中止されました。" exit 1 fi # 進捗表示付きでバックアップを実行 echo "バックアップを開始します..." sudo dd if=$SD bs=4M status=progress | gzip -q > "$BACKUP_FILE" echo "バックアップが完了しました: $BACKUP_FILE"■ イメージでバックアップする前に、圧縮効果を高めるため未使用領域(/配下であってデバイスではない)をゼロで埋めておく。sudo dd if=/dev/zero of=/zerofill.tmp bs=1M status=progress || true sudo rm /zerofill.tmp -- koji@HIMAGINE:~$ sudo dd if=/dev/zero of=/zerofill.tmp bs=1M status=progress || true [sudo] koji のパスワード: 52237959168 bytes (52 GB, 49 GiB) copied, 2513 s, 20.8 MB/s dd: '/zerofill.tmp' の書き込みエラー: デバイスに空き領域がありません 49829+0 records in 49828+0 records out 52248727552 bytes (52 GB, 49 GiB) copied, 2512.92 s, 20.8 MB/s koji@HIMAGINE:~$ --- (sudo rm /zerofill.tmp)■ イメージアックアップ実例koji@HIMAGINE:~/mybin$ ./MyBackupIMG_to_NAS.sh NAME TRAN MOUNTPOIN sda sata ├─sda1 /boot/efi └─sda2 / バックアップを開始します。以下の内容でバックアップを実行します: バックアップ元: /dev/sda バックアップ先: /mnt/as6704t/ARCHIVES/HIMAGINE-20251020-backup.img.gz 続行しますか? (y/n): y バックアップを開始します... 63946358784 bytes (64 GB, 60 GiB) copied, 937 s, 68.2 MB/s 15264+1 records in 15264+1 records out 64023257088 bytes (64 GB, 60 GiB) copied, 937.767 s, 68.3 MB/s バックアップが完了しました: /mnt/as6704t/ARCHIVES/HIMAGINE-20251020-backup.img.gz