Ubuntuシステムの保護にTimeshiftをセットアップ

UbuntuをBtrfsパーティションにインストールしたら、Btrfsの機能を最大限に活かせるよう、Timeshiftをインストールして最初のスナップショットを作成しましょう。

Timeshiftをインストール

sudo apt update
sudo apt install -y timeshift

インストール後、メニューから「Timeshift」を起動します。最初に設定ウィザードが表示されます。
スナップショットのタイプ「BTRFS」 を選択します。
スナップショットの場所: UbuntuをインストールしたBtrfsパーティションが自動で選択されます。
 推奨:Daily(毎日) 5回分、Boot(起動時) 3回分程度。
 Btrfsのスナップショットは容量をほとんど食わないため、多めに残しても大丈夫です。
ユーザーホームディレクトリ:
 デフォルトでは「Excluded(除外)」になっています。
 Btrfsモードでは、@home サブボリュームもスナップショットに含めるかどうか選べますが、システム復旧時に自分の作成したファイルまで過去に戻したくない場合は、除外のままでOKです。

設定が終わったら、メイン画面で 「作成 (Create)」 ボタンを押してみてください。

  • 数秒でスナップショットの作成が終わるはずです。
  • 作成されたスナップショットの「タイプ」が 「BTRFS」 になっていることを確認してください。

先ほどの設定画面で見たように、Timeshiftは自動でスナップショットを作成して世代管理できますが、自動で削除されたくないスナップショットは手動で取るようにしましょう。特に、メーカー製PCにあるような、工場出荷時に戻す、といったイメージに使える、初回のスナップショットです。
Timeshiftは、手動で作成したスナップショットは基本的に自動削除の対象外となります。
設定画面の「タグ」項目がO タグのスナップショットは自動世代管理の対象外なので、基本的には手動で削除しない限り残ることになります。ただ、念の為、別の設定名でもスナップショットを作成しておきましょう。

Timeshiftは設定名(-cオプション)ごとに世代管理が独立しているので、別の名前でスナップショットを作成しておけば自動削除の対象とはなりません。
たとえば、「factory」という別設定名でスナップショットを作成するなら次のコマンドです。

sudo timeshift --btrfs --create --comments "factory reset base" --tags O


現在のスナップショット一覧をコマンドで確認する場合は以下になります。

sudo timeshift --list

--tags OOnDemand(手動)タグで、自動削除の対象外。Timeshift の自動削除は D(Daily)・W(Weekly)・M(Monthly)・H(Hourly)タグのみに適用されます。

GRUBメニューに追加

通常、システムの復元をするには、OSを起動してからTimeshiftを操作する必要がありますが、grub-btrfsを入れると、「OSが起動しなくなった時でも、PC起動直後のGRUBメニュー(OS選択画面)から直接過去のスナップショットを選んで起動」できるようになります。

nano install-grub-btrfs.sh
# 下記スクリプトを貼り付けて保存

# 実行権限を付けて実行
chmod +x install-grub-btrfs.sh
./install-grub-btrfs.sh
#!/bin/bash
# ==============================================================================
# grub-btrfs インストールスクリプト (Ubuntu 26.04 向け)
# 修正内容:
#   1. btrfs subvolume show に sudo を追加 (権限エラー対策)
#   2. awk パターンをタブ区切りに対応 (Ubuntu 26.04 の出力形式変更対応)
#   3. grub-btrfsd を --timeshift-auto で起動するよう設定
# ==============================================================================

set -e

echo "=== [1/6] 依存パッケージのインストール ==="
sudo apt install -y git inotify-tools make

echo "=== [2/6] grub-btrfs のクローンとインストール ==="
cd /tmp
rm -rf grub-btrfs
git clone https://github.com/Antynea/grub-btrfs.git
cd grub-btrfs
sudo make install

echo "=== [3/6] btrfs subvolume show の sudo 対応 ==="
# root_uuid_subvolume の取得に sudo を追加
sudo sed -i 's|root_uuid_subvolume="\$(btrfs subvolume show / 2>/dev/null|root_uuid_subvolume="$(sudo btrfs subvolume show / 2>/dev/null|' \
    /etc/grub.d/41_snapshots-btrfs

echo "=== [4/6] awk パターンをタブ区切りに修正 ==="
# Ubuntu 26.04 では "	UUID: 			<uuid>" のようにタブ区切りになっている
# 元の awk -F':' パターンでは UUID が取得できないため修正
sudo sed -i \
    "s|awk -F':' '/^\\\\s\*UUID/ {gsub(/^\[ \\\\t\]+/, \"\", \$2); print \$2}'|awk '/^\\tUUID:/ {print \$2}'|" \
    /etc/grub.d/41_snapshots-btrfs

# sed が失敗した場合に備えて Python で直接書き換え
if ! sudo grep -q "awk '/\\\tUUID:/" /etc/grub.d/41_snapshots-btrfs; then
    echo "  -> sed による置換を確認できないため Python で修正します..."
    sudo python3 - << 'PYEOF'
import re

path = "/etc/grub.d/41_snapshots-btrfs"
with open(path, "r") as f:
    content = f.read()

# root_uuid_subvolume の行を修正
old = r'''root_uuid_subvolume="$(sudo btrfs subvolume show / 2>/dev/null | \
                       awk -F':' '/^\s*UUID/ {gsub(/^[ \t]+/, "", $2); print $2}')"'''
new = r'''root_uuid_subvolume="$(sudo btrfs subvolume show / 2>/dev/null | \
                       awk '/^\tUUID:/ {print $2}')"'''

if old in content:
    content = content.replace(old, new)
    print("  -> root_uuid_subvolume の修正完了")
else:
    # より緩いマッチで試みる
    content = re.sub(
        r"(root_uuid_subvolume=\"\$\(sudo btrfs subvolume show / 2>/dev/null \| \\\n\s+)awk.*?\)\"\)",
        r'root_uuid_subvolume="$(sudo btrfs subvolume show / 2>/dev/null | \\\n                       awk \'/^\\tUUID:/ {print $2}\')"',
        content
    )
    print("  -> root_uuid_subvolume の修正完了 (緩いマッチ)")

with open(path, "w") as f:
    f.write(content)
PYEOF
fi

echo "=== [5/6] grub-btrfsd を Timeshift 自動検出モードで設定 ==="
sudo mkdir -p /etc/systemd/system/grub-btrfsd.service.d/
sudo tee /etc/systemd/system/grub-btrfsd.service.d/override.conf > /dev/null << 'EOF'
[Service]
ExecStart=
ExecStart=/usr/bin/grub-btrfsd --syslog --timeshift-auto
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now grub-btrfsd.service

echo "=== [6/6] GRUB メニューを更新 ==="
sudo update-grub

echo ""
echo "======================================================"
echo " インストール完了!"
echo " Timeshift でスナップショットを作成後、"
echo " GRUB メニューにスナップショットが表示されます。"
echo "======================================================"

使い方

  1. スナップショットを作成する
    Timeshiftで適当なスナップショットを1つ作成(または既にあることを確認)します。
  2. PCを再起動して起動したあと再起動
    起動時に「Esc」キー(またはShiftキー)を連打して、GRUBメニューを表示させます。
  3. 「Ubuntu Snapshots」という項目を確認
    メニューの中に新しい項目が増えているはずです。そこを選択すると、Timeshiftで作成した日付ごとのスナップショットが並んでいます。
Timeshift スナップショット作成

grub-btrfsd が検知 → update-grub を自動実行 → /boot/grub/grub.cfg を更新

次回起動時のGRUBメニューに反映

といった流れになるので、スナップショットを取得したあとの再起動で反映、その次の再起動でメニューには表示されます。もし次回の再起動時に反映したいのであれば、スナップショットをとったあと、

sudo update-grub

を実行します。

タイトルとURLをコピーしました