Linuxのバックアップと更新|rsync・tar・自動アップデートで守る【初心者向け】

前の記事では、VPS で Python と n8n を24時間動かしました。動き始めたサーバーを長く安心して使うために欠かせないのが、バックアップと更新(アップデート)です。Lv4 の最後の記事です。

もし、半年かけて作った n8n のワークフローが、ある日全部消えてしまったら…。バックアップを「そのうち取ろう」と思ったまま一度も取っていなければ、元に戻す方法はありません。逆に、更新をこわがって何か月も放っておくと、古いソフトの弱点をねらわれるおそれがあります。

この記事では、rsync と tar でバックアップを取り、本当に戻せるかまで確かめます。そのあと、Debian の自動アップデートのしくみを、設定を変えずに見るだけで確かめます。

💡
この記事でわかること
  • バックアップの基本の考え方(3-2-1 ルールと「戻せるか」の確認)
  • rsync でフォルダを丸ごとコピーする方法と、末尾の / のちがい
  • -n(下見)と --delete の安全な使い方
  • tar で日付つきのバックアップを作り、別の場所に戻して確かめる方法
  • Debian の自動アップデート(unattended-upgrades)のしくみの確かめ方
🔰
この記事の前提
  • tar で圧縮・展開ができる
  • diff でファイルを比べたことがある
  • systemd timer と cron で定期実行ができる

まだの方は、前の記事「PCを閉じても自動化を止めない|VPSでPythonとn8nを24時間動かす入門」と、Lv4 の systemd timer の記事から読むのがおすすめです。

💡
用語メモ
  • apt:Debian・Ubuntu で、ソフトを入れる・更新する・消すための道具
  • VPS:大きな物理サーバーを区切って作った、自分専用の仮想サーバーを、月額などで借りられるサービス。root 権限で自由に設定できます
  • n8n:画面上で「ノード」というブロックをつないで、自動化の流れ(ワークフロー)を作れるツール。自分のサーバーでも動かせます
  • 圧縮:ファイルの中身を工夫して、サイズを小さくすること

用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。


結論:バックアップは「取る・戻す・自動にする」、更新は「こまめに・記録を見る」

やること 道具 ポイント
フォルダを丸ごと写す rsync -av 2回目からは変わった分だけ写すので速い
日付つきで固めて残す tar -czf 世代(何日分か)を残せる
戻せるか確かめる tar -xzf + diff -r 取っただけで終わらせない
自動にする systemd timer・cron Lv3・Lv4 で学んだ方法
更新を確かめる apt list --upgradable 何が古いかを見る
自動で安全な更新を入れる unattended-upgrades ログで何が入ったかを見る

💡
3-2-1 ルール

バックアップは「3つのコピーを、2種類の場所に、そのうち1つは別の建物(サーバーの外)に」が理想です。同じサーバーの中だけにバックアップがあると、サーバーごと消えたときに一緒に消えてしまいます。

バックアップと更新の全体像

準備:練習用のデータを作る

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
mkdir -p ~/linux-practice/backup-test/src/data
cd ~/linux-practice/backup-test
echo "顧客リスト(ダミー)" > src/data/customers.csv
echo "設定ファイル(ダミー)" > src/config.txt
echo "毎朝のメモ" > src/memo.txt
find src

🖥️
この記事の出力例について

ここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
kaito@demo:~/linux-practice$ mkdir -p ~/linux-practice/backup-test/src/data
kaito@demo:~/linux-practice$ cd ~/linux-practice/backup-test
kaito@demo:~/linux-practice/backup-test$ echo "顧客リスト(ダミー)" > src/data/customers.csv
kaito@demo:~/linux-practice/backup-test$ echo "設定ファイル(ダミー)" > src/config.txt
kaito@demo:~/linux-practice/backup-test$ echo "毎朝のメモ" > src/memo.txt
kaito@demo:~/linux-practice/backup-test$ find src
src
src/data
src/data/customers.csv
src/config.txt
src/memo.txt

rsync が入っていない場合は、入れておきます。

  • 1
  • 2
sudo apt install rsync
rsync --version | head -n 1

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
kaito@demo:~/linux-practice/backup-test$ sudo apt install rsync
Installing:
  rsync

Suggested packages:
  python3-braceexpand

Summary:
  Upgrading: 0, Installing: 1, Removing: 0, Not Upgrading: 0
  Download size: 502 kB
  Space needed: 978 kB / 107 GB available

Get:1 http://deb.debian.org/debian-security trixie-security/main amd64 rsync amd64 3.5.0+ds1-0+deb13u1 [502 kB]
Fetched 502 kB in 0s (20.5 MB/s)
Selecting previously unselected package rsync.
(Reading database ... 31161 files and directories currently installed.)
Preparing to unpack .../rsync_3.5.0+ds1-0+deb13u1_amd64.deb ...
Unpacking rsync (3.5.0+ds1-0+deb13u1) ...
Setting up rsync (3.5.0+ds1-0+deb13u1) ...
rsync.service is a disabled or a static unit, not starting it.
Processing triggers for man-db (2.13.1-1) ...
Scanning processes...

No services need to be restarted.

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.
kaito@demo:~/linux-practice/backup-test$ rsync --version | head -n 1
rsync  version 3.5.0  protocol version 32

検証環境(Debian 13)では、rsync は最初は入っていませんでした。入るのが1つだけだったので、[Y/n] の確認は出ずに、そのまま入りました。最後の Scanning processes... からの数行は、Lv4 の Docker 入門の記事で docker.io といっしょに入った needrestart の表示で、「再起動が必要なサービスはありません」という意味です。


STEP 1:rsync でフォルダを丸ごと写す

  • 1
  • 2
rsync -av src/ dest/
find dest

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
kaito@demo:~/linux-practice/backup-test$ rsync -av src/ dest/
sending incremental file list
created directory dest
./
config.txt
memo.txt
data/
data/customers.csv

sent 400 bytes  received 115 bytes  1,030.00 bytes/sec
total size is 81  speedup is 0.16
kaito@demo:~/linux-practice/backup-test$ find dest
dest
dest/data
dest/data/customers.csv
dest/config.txt
dest/memo.txt

created directory dest は「dest がなかったので作りました」という意味です。

  • -a:パーミッション(=ファイルごとの権限の設定)や日時も含めて、そのまま写す
  • -v:写したファイルの名前を表示する

もう一度同じコマンドを打つと、変わったものがないので、何も写されません。1つだけ書きかえてから打つと、そのファイルだけが写されます。

  • 1
  • 2
  • 3
rsync -av src/ dest/
echo "追記しました" >> src/memo.txt
rsync -av src/ dest/

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
kaito@demo:~/linux-practice/backup-test$ rsync -av src/ dest/
sending incremental file list

sent 172 bytes  received 13 bytes  370.00 bytes/sec
total size is 81  speedup is 0.44
kaito@demo:~/linux-practice/backup-test$ echo "追記しました" >> src/memo.txt
kaito@demo:~/linux-practice/backup-test$ rsync -av src/ dest/
sending incremental file list
memo.txt

sent 253 bytes  received 36 bytes  578.00 bytes/sec
total size is 100  speedup is 0.35

2回目はファイル名が1つも出ず、3回目は書きかえた memo.txt だけが写されました。

Debian 13での実行画面

末尾の / で結果が変わる
  • 1
  • 2
rsync -av src dest2/
find dest2

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
kaito@demo:~/linux-practice/backup-test$ rsync -av src dest2/
sending incremental file list
created directory dest2
src/
src/config.txt
src/memo.txt
src/data/
src/data/customers.csv

sent 426 bytes  received 113 bytes  1,078.00 bytes/sec
total size is 100  speedup is 0.19
kaito@demo:~/linux-practice/backup-test$ find dest2
dest2
dest2/src
dest2/src/data
dest2/src/data/customers.csv
dest2/src/config.txt
dest2/src/memo.txt

書き方 結果
rsync -av src/ dest/ src の中身が dest に入る
rsync -av src dest2/ src というフォルダごと dest2 の中に入る

STEP 2:-n で下見してから --delete を使う

--delete をつけると、「コピー元で消したファイルは、コピー先でも消す」という意味になります。便利ですが、向きをまちがえると大事なほうを消してしまうので、必ず -n(下見)をつけて確かめてから使います。

  • 1
  • 2
  • 3
rm src/config.txt
rsync -avn --delete src/ dest/
ls dest

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
kaito@demo:~/linux-practice/backup-test$ rm src/config.txt
kaito@demo:~/linux-practice/backup-test$ rsync -avn --delete src/ dest/
sending incremental file list
deleting config.txt
./

sent 152 bytes  received 41 bytes  386.00 bytes/sec
total size is 66  speedup is 0.34 (DRY RUN)
kaito@demo:~/linux-practice/backup-test$ ls dest
config.txt  data  memo.txt

最後に (DRY RUN)(下見)と出ているので、まだ何も消えていません。ls dest にも config.txt が残っています。

下見の結果が思ったとおりなら、-n を外して本番を実行します。

  • 1
  • 2
rsync -av --delete src/ dest/
ls dest

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
kaito@demo:~/linux-practice/backup-test$ rsync -av --delete src/ dest/
sending incremental file list
deleting config.txt
./

sent 152 bytes  received 41 bytes  386.00 bytes/sec
total size is 66  speedup is 0.34
kaito@demo:~/linux-practice/backup-test$ ls dest
data  memo.txt

🚫
本物のデータで、いきなり --delete を使わない(文章だけで説明します)

rsync --delete は、コピー元とコピー先を逆に書くと、本物のデータのほうを消してしまいます。末尾の / のつけ忘れでも、思わぬ消え方をします。サーバーやホームディレクトリなど、練習用のフォルダ以外で使うときは、必ず -n で下見をして、消される名前を1つずつ確かめてから実行してください。この記事では、~/linux-practice/backup-test の中だけで試します。


STEP 3:tar で日付つきのバックアップを作り、戻して確かめる

rsync は「最新の1つ」を写すのが得意です。何日か前の状態に戻したいときのために、tar で日付つきの箱を作って残します。

  • 1
  • 2
  • 3
mkdir -p archives
tar -czf archives/backup-$(date +%Y%m%d-%H%M%S).tar.gz src
ls -lh archives

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
kaito@demo:~/linux-practice/backup-test$ mkdir -p archives
kaito@demo:~/linux-practice/backup-test$ tar -czf archives/backup-$(date +%Y%m%d-%H%M%S).tar.gz src
kaito@demo:~/linux-practice/backup-test$ ls -lh archives
total 4.0K
-rw-rw-r-- 1 kaito kaito 313 Nov  1 06:09 backup-20261101-060940.tar.gz

ファイル名の数字は、作った日時(2026年11月1日 6時09分40秒)です。

バックアップは、戻せて初めて意味があります。別の場所に展開して、元と同じかを比べます。

  • 1
  • 2
  • 3
mkdir -p restore-test
tar -xzf archives/backup-*.tar.gz -C restore-test
diff -r src restore-test/src && echo "同じです:戻せることを確認しました"

(例)

  • 1
  • 2
  • 3
  • 4
kaito@demo:~/linux-practice/backup-test$ mkdir -p restore-test
kaito@demo:~/linux-practice/backup-test$ tar -xzf archives/backup-*.tar.gz -C restore-test
kaito@demo:~/linux-practice/backup-test$ diff -r src restore-test/src && echo "同じです:戻せることを確認しました"
同じです:戻せることを確認しました

diff -r はちがいがないと何も表示しないので、&& の後ろの echo だけが表示されました。

⚠️
backup-*.tar.gz の * は、箱が1つのときだけ使える

ここで archives/backup-*.tar.gz と書けたのは、archives の中の箱が、まだ1つだけだったからです。下の「古いバックアップの整理」で箱を増やしたあとに同じコマンドを打つと、* が全部の箱の名前に広がり(ワイルドカードの記事を参照)、tar は「2つ目からの名前を、1つ目の箱の中から探せ」という意味に受け取ります。その結果、「Not found in archive」というエラーになって失敗します。実際の表示は、このあとの「箱が増えたあとに、同じ tar を打つとどうなるか」で見てみます。

箱が増えたあとは、戻したい箱の名前を ls archives で確かめて、名前をそのまま書きましょう。いちばん新しい箱を選ぶなら、tar -xzf "$(ls -t archives/backup-*.tar.gz | head -n 1)" -C restore-test のように、ls -t の1行目だけを渡す書き方もあります。

古いバックアップの整理は、まず「表示するだけ」

箱が増えすぎたら、新しいほうから3つだけ残して、古いものを消したくなります。まず、消す候補を表示するだけにして確かめます。

  • 1
  • 2
  • 3
for i in 1 2 3 4; do sleep 1; tar -czf archives/backup-$(date +%Y%m%d-%H%M%S).tar.gz src; done
ls -t archives
ls -t archives/backup-*.tar.gz | tail -n +4

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
kaito@demo:~/linux-practice/backup-test$ for i in 1 2 3 4; do sleep 1; tar -czf archives/backup-$(date +%Y%m%d-%H%M%S).tar.gz src; done
kaito@demo:~/linux-practice/backup-test$ ls -t archives
backup-20261101-060952.tar.gz  backup-20261101-060950.tar.gz  backup-20261101-060940.tar.gz
backup-20261101-060951.tar.gz  backup-20261101-060949.tar.gz
kaito@demo:~/linux-practice/backup-test$ ls -t archives/backup-*.tar.gz | tail -n +4
archives/backup-20261101-060949.tar.gz
archives/backup-20261101-060940.tar.gz

ls -t archives は、画面の幅に合わせて、新しい順に上から下・左から右へ並べます(1列目の上が最新です)。消す候補には、いちばん古い2つ(060949 と 060940)が表示されました。

ls -t は新しい順、tail -n +4 は「4行目から後ろ」です。つまり「新しい3つ以外」が表示されます。実際に消すのは、表示された名前を見て、まちがいないと確かめてからにしましょう。

🚫
古いバックアップを自動で消す設定は、すぐに作らない(文章だけで説明します)

「表示した名前をそのまま消す」処理を cron や systemd timer で自動にすると、日付の書き方やフォルダをまちがえたときに、新しいバックアップまで消えてしまうことがあります。自動で消す仕組みを作るのは、手で何度か試して結果を確かめてからにしてください。この記事では、表示するところまでにします。

箱が増えたあとに、同じ tar を打つとどうなるか

箱が5つに増えたところで、STEP 3 の最初と同じコマンドで戻そうとすると、⚠️ の箱で書いたとおり失敗します。

  • 1
  • 2
tar -xzf archives/backup-*.tar.gz -C restore-test
echo $?

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
kaito@demo:~/linux-practice/backup-test$ tar -xzf archives/backup-*.tar.gz -C restore-test
tar: archives/backup-20261101-060949.tar.gz: Not found in archive
tar: archives/backup-20261101-060950.tar.gz: Not found in archive
tar: archives/backup-20261101-060951.tar.gz: Not found in archive
tar: archives/backup-20261101-060952.tar.gz: Not found in archive
tar: Exiting with failure status due to previous errors
kaito@demo:~/linux-practice/backup-test$ echo $?
2

* は名前の順(ここでは古い順)に広がるので、1つ目にいちばん古い箱(060940)が開かれ、残りの4つの名前を「この箱の中から取り出すファイルの名前」と受け取りました。その4つは箱の中にないので、Not found in archive(箱の中に見つからない)が4行出て、最後に tar: Exiting with failure status due to previous errors(前のエラーのため、失敗として終わります)と表示されます。echo $? は 2 で、失敗したことがわかります。

このように失敗したときは、1つ目の箱の中身も含めて、何も展開されません。「一部だけ戻った」という中途半端な状態にはならないので、書き方を直して打ち直せば大丈夫です。

⚠️ の箱で紹介した、ls -t の1行目(いちばん新しい箱)だけを渡す書き方なら、ちゃんと戻せます。

  • 1
  • 2
  • 3
tar -xzf "$(ls -t archives/backup-*.tar.gz | head -n 1)" -C restore-test
echo $?
diff -r src restore-test/src && echo "同じです:戻せることを確認しました"

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
kaito@demo:~/linux-practice/backup-test$ tar -xzf "$(ls -t archives/backup-*.tar.gz | head -n 1)" -C restore-test
kaito@demo:~/linux-practice/backup-test$ echo $?
0
kaito@demo:~/linux-practice/backup-test$ diff -r src restore-test/src && echo "同じです:戻せることを確認しました"
同じです:戻せることを確認しました

Debian 13での実行画面

今度はエラーが出ず、echo $? は 0(成功)でした。diff -r でも、元と同じに戻せたことを確かめられます。

💡
3-2-1 の「1つはサーバーの外」を、どうやってやるか

ここまでの rsync も tar も、同じパソコンの中で写しただけです。3-2-1 ルールの「1つはサーバーの外」にするには、作った箱を、別の場所にも写します。

  • SSH で別のパソコンへ写す:rsync は、写し先に SSH(=ネットワークの向こうのコンピューターに、暗号化して安全にログインし、操作するしくみ)の相手を書けます。SSH 入門の記事で ~/.ssh/config に practice-server という名前を登録していれば、rsync -av archives/ practice-server:backups/ のように書けます。-n で下見してから使うのは、ここでも同じです。
  • VPS から自分の PC へ持ってくる:前の VPS の記事の STEP 14 のように、自分の PC から scp で持ってくる方法もあります。

そして、バックアップの箱は、ほかの人に読ませないようにしましょう。上の ls -lh では -rw-rw-r-- で、ほかのユーザーも読める形でした。サーバーで使うときは、chmod 700 archives でフォルダごと自分だけが開ける形にしておくと安心です(chmod は Lv2 の記事で説明しています)。

n8n のデータは、この記事の rsync ではなく、前の VPS の記事の方法で:前の VPS の記事の n8n のデータは、ふつうのフォルダではなく、Docker の名前つきボリューム(Docker 入門の記事の💡の箱)に入っています。その記事の STEP 14 のように、n8n を止めてから docker run … tar で箱にし、その箱を、ここで学んだ方法で日付つきで残し、サーバーの外にも写します。


STEP 4:更新(アップデート)の様子を見る

ここからは、システムの更新です。見るだけで、設定は変えません。

  • 1
  • 2
sudo apt update
apt list --upgradable

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
kaito@demo:~/linux-practice/backup-test$ sudo apt update
Get:1 http://deb.debian.org/debian trixie InRelease [140 kB]
Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB]
Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB]
Fetched 231 kB in 0s (4942 kB/s)
All packages are up to date.
kaito@demo:~/linux-practice/backup-test$ apt list --upgradable

検証のときは更新できるものがなかったので、apt list --upgradable は何も表示しませんでした。

Debian には、セキュリティの更新を自動で入れてくれる unattended-upgrades というしくみがあります。入っているか、有効になっているかを確かめます。

  • 1
  • 2
  • 3
apt policy unattended-upgrades
cat /etc/apt/apt.conf.d/20auto-upgrades
systemctl list-timers "apt-daily*" --no-pager

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
kaito@demo:~/linux-practice/backup-test$ apt policy unattended-upgrades
unattended-upgrades:
  Installed: (none)
  Candidate: 2.12
  Version table:
     2.12 500
        500 http://deb.debian.org/debian trixie/main amd64 Packages
kaito@demo:~/linux-practice/backup-test$ cat /etc/apt/apt.conf.d/20auto-upgrades
cat: /etc/apt/apt.conf.d/20auto-upgrades: No such file or directory
kaito@demo:~/linux-practice/backup-test$ systemctl list-timers "apt-daily*" --no-pager
NEXT                            LEFT LAST PASSED UNIT                    ACTIVATES
Sun 2026-11-01 06:50:17 JST 2h 57min -         - apt-daily-upgrade.timer apt-daily-upgrade.service
Sun 2026-11-01 08:15:21 JST 4h 22min -         - apt-daily.timer         apt-daily.service

2 timers listed.
Pass --all to see loaded but inactive timers, too.

検証環境では、Installed: (none) なので unattended-upgrades は入っておらず、20auto-upgrades のファイルもありませんでした。apt-daily.timer と apt-daily-upgrade.timer は apt に最初からついているタイマーですが、unattended-upgrades が入っていない今の状態では、セキュリティの更新が自動で入ることはありません。

Debian 13での実行画面

自動アップデートが動いた記録は、ここに残ります。

  • 1
  • 2
ls /var/log/unattended-upgrades/
tail -n 20 /var/log/apt/history.log

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
kaito@demo:~/linux-practice/backup-test$ ls /var/log/unattended-upgrades/
ls: cannot access '/var/log/unattended-upgrades/': No such file or directory
kaito@demo:~/linux-practice/backup-test$ tail -n 20 /var/log/apt/history.log
…(途中省略)…
Start-Date: 2026-11-01  03:42:23
Commandline: apt install ufw
Requested-By: kaito (1000)
Install: libnetfilter-conntrack3:amd64 (1.1.0-1, automatic), iptables:amd64 (1.8.11-2, automatic), ufw:amd64 (0.36.2-9), libip4tc2:amd64 (1.8.11-2, automatic), libnfnetlink0:amd64 (1.0.2-3, automatic), libip6tc2:amd64 (1.8.11-2, automatic)
End-Date: 2026-11-01  03:42:24

Start-Date: 2026-11-01  03:48:37
Commandline: apt install docker.io docker-compose
Requested-By: kaito (1000)
Install: docker-compose:amd64 (2.26.1-4), libnl-3-200:amd64 (3.7.0-2, automatic), libintl-perl:amd64 (1.35-1, automatic), containerd:amd64 (1.7.24~ds1-6+deb13u1, automatic), apparmor:amd64 (4.1.0-1, automatic), libcompel1:amd64 (4.1.1-1, automatic), docker-cli:amd64 (26.1.5+dfsg1-9+deb13u1, automatic), python3-pycriu:amd64 (4.1.1-1, automatic), gettext-base:amd64 (0.23.1-2, automatic), docker.io:amd64 (26.1.5+dfsg1-9+deb13u1), libsort-naturally-perl:amd64 (1.03-4, automatic), libnet1:amd64 (1.3+dfsg-2, automatic), libprotobuf-c1:amd64 (1.5.1-1, automatic), docker-buildx:amd64 (0.13.1+ds1-3, automatic), libmodule-find-perl:amd64 (0.17-1, automatic), libterm-readkey-perl:amd64 (2.38-2+b4, automatic), runc:amd64 (1.1.15+ds1-2+b4, automatic), libprotobuf32t64:amd64 (3.21.12-11+deb13u1, automatic), python3-protobuf:amd64 (3.21.12-11+deb13u1, automatic), criu:amd64 (4.1.1-1, automatic), needrestart:amd64 (3.11-1, automatic), tini:amd64 (0.19.0-3+b8, automatic), libintl-xs-perl:amd64 (1.35-1, automatic), libproc-processtable-perl:amd64 (0.636-1+b3, automatic)
End-Date: 2026-11-01  03:48:42

Start-Date: 2026-11-01  03:51:37
Commandline: apt install rsync
Requested-By: kaito (1000)
Install: rsync:amd64 (3.5.0+ds1-0+deb13u1)
End-Date: 2026-11-01  03:51:38

unattended-upgrades が入っていないので、記録のフォルダもありません。history.log には、このシリーズで入れた ufw(=Debian・Ubuntu で使える、ファイアウォールをかんたんに設定するための道具)・docker.io・rsync の記録が並んでいます(前のほうは省略しています)。

🚫
自動アップデートの設定変更と、自動の再起動(文章だけで説明します)

本物の VPS で自動アップデートを有効にするときは、sudo apt install unattended-upgrades のあと、sudo dpkg-reconfigure -plow unattended-upgrades で「はい」を選びます。設定ファイルには「更新のあと自動で再起動する」設定(Automatic-Reboot)もありますが、有効にすると、n8n などの処理の途中でサーバーが再起動されることがあります。この記事では設定を変えません。sudo apt full-upgrade -y を cron で毎日動かすような「なんでも自動で入れる」設定も、思わぬ不具合の元になるので避けましょう。

🤖 詰まったらAIに聞こう:バックアップの計画を立てたい

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
Linuxの初心者です。VPSで動かしているもののバックアップの計画を立てたいです。
何を・どこに・どのくらいの間隔で・何世代残すとよいか、
rsyncとtarを使った具体的な手順と、戻せるかの確かめ方を教えてください。

【守りたいもの】例:n8nのデータフォルダ、Pythonのスクリプトとcsv
【データの量】例:du -sh の結果で約500MB
【バックアップを置ける場所】例:自分のPC、別のVPS、クラウドストレージ
【使っている定期実行】例:systemd timer / cron

🔒
AIに貼る前に:秘密情報やパスワードは貼らない

バックアップ先のサーバーの IP アドレス、ユーザー名、パスワード、クラウドストレージのアクセスキーは貼らないでください。フォルダの名前に、お客さまの名前や会社名が入っている場合も、ダミーに置き換えましょう。バックアップのファイルそのものは、個人情報のかたまりです。AI やチャットに添付しないでください。


後片づけ

  • 1
  • 2
  • 3
cd ~/linux-practice
rm -r backup-test
ls

(例)

  • 1
  • 2
  • 3
  • 4
kaito@demo:~/linux-practice/backup-test$ cd ~/linux-practice
kaito@demo:~/linux-practice$ rm -r backup-test
kaito@demo:~/linux-practice$ ls
archive-test  chmod-test  edit-test  find-test  grep-test  link-test  perm-test  redirect-test

rsync は、このあとも使うので残しておいてかまいません。


よくある質問

Q. cp -r でも写せるのに、なぜ rsync を使うのですか?

cp -r は、毎回すべてのファイルを写します。rsync は2回目から、変わったファイルだけを写すので、データが多いときに速く終わります。-n で何が写るかを先に見られるのと、SSH の相手にもそのまま写せるのも、バックアップに向いている理由です。

Q. unattended-upgrades を入れたら、どこを見れば動いたとわかりますか?

この記事の STEP 4 で見た、/var/log/unattended-upgrades/ のフォルダと /var/log/apt/history.log です。入れたあとに、systemctl list-timers で apt-daily-upgrade.timer の次の予定を見て、その時刻を過ぎてからログを確かめます。表示される内容や時刻は、環境により異なります。

Q. apt upgrade のあとに、紫や青の画面で「再起動するサービス」を聞かれました。

needrestart の画面です。更新したライブラリを使っているサービスを、再起動するかどうかを聞いています。何を選べばいいかわからないときは、表示されたサービス名をメモして、そのまま OK で進めてかまいません(多くの場合、選ばれているサービスが再起動されます)。表示のされ方は、環境により異なります。


まとめ

  • バックアップは「3-2-1」。同じサーバーの中だけに置かない
  • rsync -av src/ dest/ で丸ごと写す。末尾の / で「中身だけ」か「フォルダごと」かが変わる
  • --delete は、必ず -n で下見してから
  • tar -czf で日付つきの世代を残し、tar -xzf + diff -r で戻せるか確かめる
  • 古いバックアップの整理は、まず表示するだけ
  • 更新は apt list --upgradable で確かめ、unattended-upgrades のタイマーとログで動いているかを見る

これで Lv4 はおしまいです。次の Lv5 では、サーバーで起きる「困った」を自分で調べる力をつけます。最初は、「容量がいっぱい」「動作が重い」ときの調べ方です。


次に読む記事


関連する記事