第4章 4-4 / システムを観察する

アーカイブとバックアップ ― tar・gzip

このページで叩くコマンドと到達点

前提:4-3が完了し、~/practice(空ディレクトリ)が存在する状態から始めます。バックアップは社会人の保険です。設定ファイルを壊した、大事なデータを誤って消した――そんなとき「昨日の状態に戻せるバックアップがある」というだけで、事故は笑い話に変わります。このページでは、複数のファイルを1つのアーカイブ※2にまとめて圧縮※3するtarコマンドを中心に、バックアップを作る・中身を確認する・元に戻すという一連の流れを体験します。~/practiceに練習用の素材を作るところから始め、ページの最後にはすべて片付けます。

このページではSET 1〜3、合計30行のコマンドを上から順に叩きます。手打ち推奨(コピーは確認用)です。似た用途のzip/unzipコマンドはまだサーバーに入っていないため、このページでは紹介にとどめます(第5章5-1でaptを学んだあと、自分でインストールできるようになります)。

SET 1 ― 素材を作り、tar czfでバックアップする

ubuntu@lightsail: ~/practice
  1. $cd ~/practice
  2. $mkdir -p work/docs work/images
  3. $echo "議事録メモです" > work/docs/memo.txt
  4. $seq 1 1000 > work/docs/numbers.txt
  5. $touch work/images/photo1.jpg work/images/photo2.jpg
  6. $ls -R work
  7. $find work -type f
  8. $du -sh work
  9. 12K work
  10. $tar czf backup.tar.gz work
  11. $ls -lh backup.tar.gz
解説 ― SET 1 で何をしたか

15行目では、バックアップ対象となる練習用の素材を用意しています。work/docsにテキスト系のファイルを、work/imagesに画像を想定した空ファイルを配置し、6行目のls -Rで階層を確認します。7行目のfind work -type fは、前ページ4-3で学んだfindを使って、これから圧縮する対象のファイルだけを再確認する一手間です。バックアップを取る前に「何を固めようとしているか」を一度見渡す習慣は、実務でも事故防止に役立ちます。8行目のdu -sh work(4-2で学んだコマンドです)で圧縮前のサイズを控えておきます。あとで圧縮の効果を数字で比較するための準備です。

9行目のtar czf backup.tar.gz workが、このページの主役tar※1コマンドです。tarは本来「複数のファイルを1本のファイル(アーカイブ)にまとめる」だけのコマンドですが、オプションを組み合わせることで圧縮まで一気に行えます。cはcreate(新しく作る)、zはgzip形式で圧縮する、fはfile(この直後に書いた名前でファイルを作る)という意味の組み合わせで、czfという並びごと「圧縮アーカイブを新規作成する」呪文として覚えてしまうのが実用的です。最後のworkは圧縮したい対象のディレクトリです。10行目のls -lh backup.tar.gzで、backup.tar.gzという1つの圧縮ファイルが出来上がっていることを確認します。

POINT

tar czfczfは「シーゼットエフ」と読み下しながら、c=作る、z=圧縮する、f=ファイル名を指定すると1文字ずつの意味をセットで覚えると、あとで出てくるtzf(中身確認)やxzf(展開)との違いも一気に理解できます。

ゆみちゃん
ゆみ

あたし、前に設定ファイルを編集ミスしてサービスが止まったことがあるんだけど、その日の朝にtarでバックアップを取ってたおかげで秒で元通りにできたんだよね! 「バックアップは社会人の保険」って、ほんとその通りだと思う。何かを壊す前提で、先に保険をかけとく癖をつけよう!

SET 2 ― tar tzf・xzfで中身を確認・展開する

ubuntu@lightsail: ~/practice
  1. $tar tzf backup.tar.gz
  2. work/
  3. work/docs/memo.txt
  4. work/docs/numbers.txt
  5. work/images/photo1.jpg
  6. $tar tvzf backup.tar.gz
  7. $mkdir restore
  8. $tar xzf backup.tar.gz -C restore
  9. $ls -R restore
  10. $cat restore/work/docs/memo.txt
  11. $diff -r work restore/work
  12. $mkdir restore2
  13. $tar xzf backup.tar.gz -C restore2 work/docs/memo.txt
  14. $ls -R restore2
解説 ― SET 2 で何をしたか

1行目のtar tzf backup.tar.gzは、アーカイブを展開せずに中身の一覧だけを確認するコマンドです。tはlist(一覧表示する)を意味し、出力例のように、圧縮する前と同じディレクトリ構造がそのまま記録されていることがわかります。展開する前に「変なファイルが紛れ込んでいないか」「本当に必要なものが入っているか」を確認できる、地味に重要な一手間です。2行目のtar tvzf backup.tar.gzは、v(verbose、詳しく)を加えることで、ファイル名だけでなく権限やサイズ・更新日時まで含めた詳細な一覧を表示するオプションです。

3行目でrestoreという空のディレクトリを新しく作り、4行目のtar xzf backup.tar.gz -C restoreで、そこへアーカイブを展開しています。xはextract(取り出す)を意味し、-C restore(大文字のC)は「展開先のディレクトリを指定する」オプションです。これを付けずに実行すると今いる場所に直接展開されてしまうため、別のディレクトリへ展開したいときは必ず-Cを使うと覚えてください。

5行目のls -R restoreで、元のworkディレクトリと同じ構造がrestore/workとして復元されていることを確認します。6行目のcat restore/work/docs/memo.txtでは、実際にファイルの中身まで無事に復元できていることを確認しています。7行目のdiff -r work restore/workは、2つのディレクトリを再帰的に差分比較※4するコマンドです。何も出力されなければ、圧縮前と展開後でまったく差分がない――つまりバックアップが正しく機能する証拠です。

最後に810行目では、アーカイブの中から特定の1ファイルだけを取り出す使い方を確認します。tar xzfのコマンドの末尾にファイルパスを指定すると、アーカイブ全体ではなく指定したファイルだけを展開できます。出勤前に「このファイル1個だけ昨日の状態に戻したい」というピンポイントな場面で役立つ使い方です。10行目のls -R restore2で、memo.txtだけが元の階層構造(work/docs/付き)のまま取り出せていることを確認できます。

POINT

バックアップは「取った」だけでは安心できません。tar tzfで中身を確認し、実際にtar xzfで展開して元に戻せることまで一度は試す。この「復元テスト」までやって初めて、そのバックアップは信用できます。

SET 3 ― gzip・gunzipと圧縮効果の確認、片付け

ubuntu@lightsail: ~/practice
  1. $cp work/docs/numbers.txt numbers.txt
  2. $ls -lh numbers.txt
  3. $gzip numbers.txt
  4. $ls -lh numbers.txt.gz
  5. -rw-rw-r-- 1 ubuntu ubuntu 1.2K 7月 3 10:12 numbers.txt.gz
  6. $file numbers.txt.gz
  7. $gunzip numbers.txt.gz
  8. $ls numbers.txt
  9. $du -sh backup.tar.gz
  10. $cd ~
  11. $rm -r practice/work practice/restore practice/restore2 practice/numbers.txt practice/backup.tar.gz
解説 ― SET 3 で何をしたか

12行目で、数字がたくさん並んだnumbers.txtをコピーしてサイズを確認します。3行目のgzip numbers.txtは、tarとは違い単体の1ファイルだけを圧縮するコマンドです。実行すると元のnumbers.txtは消え、代わりにnumbers.txt.gzという圧縮済みファイルに置き換わります。4行目のls -lh numbers.txt.gzで、出力例のようにサイズが大きく縮んでいることを確認できます(数字の羅列は繰り返しパターンが多く、圧縮が効きやすいデータの代表例です)。5行目のfile numbers.txt.gz(第1章1-4で学んだコマンドです)を実行すると、「gzip compressed data」のようにファイルの種類がgzip圧縮データであることが確認できます。

6行目のgunzip numbers.txt.gzgzipの逆で、圧縮ファイルを元のファイルに戻すコマンドです。7行目のls numbers.txtで、.gzが外れた元のファイル名に戻っていることを確認します。tarが「複数ファイルをまとめてから圧縮する」のに対し、gzip/gunzipは「1ファイルをそのまま圧縮・展開する」道具だと整理しておきましょう。8行目のdu -sh backup.tar.gzでは、SET 1で控えた圧縮前のworkディレクトリのサイズ(約12K)と比べて、圧縮後のbackup.tar.gzがどれだけ小さくなったかを見比べています。

最後に9行目のcd ~でホームディレクトリへ戻り、10行目のrm -rでこのページで作ったすべての練習素材(workrestorerestore2numbers.txtbackup.tar.gz)をまとめて削除します。これで~/practiceは再び空の状態に戻り、次のページへ引き継ぐ準備が整いました。

ゆみちゃん
ゆみ

ちなみにWindowsでよく見るzip形式も、Linuxではzip/unzipコマンドで同じように扱えるんだけど、このサーバーにはまだ入ってないんだ。第5章でaptを覚えたらsudo apt install zip unzipで自分で追加できるようになるから、そこまで進んだらぜひ試してみてね!

POINT

実務では「tar=フォルダごとまとめて圧縮」「gzip=1ファイルだけ圧縮」という使い分けが基本です。ログファイル1本を圧縮するならgzip、プロジェクト全体をバックアップするならtar czf、と覚えておくと迷いません。

まとめ

4-4では、複数のファイルをまとめて圧縮しバックアップを作るtarコマンドと、単体ファイルを圧縮するgzipを一通り体験しました。このページで叩けるようになったコマンドを一覧にまとめます。

コマンド何をするか覚え方
tar czf <名前>.tar.gz <対象>ディレクトリをまとめて圧縮アーカイブにするc=作る z=圧縮 f=ファイル名
tar tzf <名前>.tar.gz展開せずにアーカイブの中身一覧を見るt=一覧(list)
tar xzf <名前>.tar.gz -C <先>指定した場所へアーカイブを展開するx=取り出す(extract)
gzip <ファイル>単体ファイルを圧縮し.gzに置き換える1本のファイルをぎゅっと圧縮
gunzip <ファイル>.gz.gzファイルを元のファイルに戻すgzipの逆(un)
diff -r <A> <B>2つのディレクトリの差分を比較する差(difference)を見る

次のページ「4-5. リンクとinode」では、ファイルの「実体」と「入り口」の関係――ハードリンクとシンボリックリンク――という、少し不思議で奥深い仕組みを学びます。

脚注 ─ 用語解説
  1. tar … tape archiveの略。もともと磁気テープにファイルをまとめて記録するためのコマンドだったが、現在はバックアップ作成の定番として使われる。
  2. アーカイブ … 複数のファイルやディレクトリを1本のファイルにまとめたもの。まとめる時点では圧縮されているとは限らない。
  3. 圧縮 … データの中の繰り返しパターンなどを利用して、ファイルサイズを小さくする処理。ディスク容量の節約や転送時間の短縮に役立つ。
  4. 差分比較 … 2つのファイルやディレクトリの内容を突き合わせ、違いがある箇所だけを洗い出す処理。バックアップの正しさを検証する際にも使われる。