まだだ、まだ終わらんよ

はじめに  

作問者のabeです. この問題は昔バックアップパーティションに救われた経験から作りました.

概要  

ベテランエンジニアの虎魂くんはWEBサーバの運用を行っていました. ある日,記憶から消えかけていたような昔のプロジェクトのお客さんから電話がありました.

どうやらWEBサーバにアクセスするとエラーページが表示されるようです. 原因の理由と解決方法を回答してください.

前提条件  

  • WEBページのデータのバックアップはない.
  • WEBページの公開パスなどの変更は可能.

初期状態  

手元のPCから $ curl 192.168.11.1 をしてもエラーコードが帰ってくる.

終了状態  

  • 障害前に表示されていたページが表示されること.
  • 手元のPCから $ curl 192.168.11.1 をするとステータスコード200のレスポンスが返ってくる.

採点基準  

  • /dev/sdbのパーティションが壊れていることに気が付く 30%
  • 障害前のWEBページが確認できる 70%

答え  

まずは終了状態の確認を行います.400番台なのでエラーが発生しています.

ictsc@web:~$ curl localhost
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.18.0 (Ubuntu)</center>
</body>
</html>

一応Nginxが起動しているか確認します.起動しています.

ictsc@web:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-03-07 13:31:36 JST; 27min ago
       Docs: man:nginx(8)
   Main PID: 585 (nginx)
      Tasks: 2 (limit: 1168)
     Memory: 11.5M
     CGroup: /system.slice/nginx.service
             ├─585 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─586 nginx: worker process

Warning: some journal files were not opened due to insufficient permissions.

/var/log/nginx/error.logを確認すると以下のエラーが出力されています.

2021/03/07 13:55:27 [error] 586#586: *1 directory index of "/mnt/data/" is forbidden, client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost"

ls /mnt/data/で確認するとディレクトリが空なのがわかります. ここでパスを見てみるとmntである事がわかります. mntディレクトリはファイルシステムをマウントする用途に使われるので/etc/fstabを確認します.

以下のようなマウントポイントが設定されてました.

/dev/sdb1 /mnt/data ext4 defaults 0 0

対象のデバイスを確認します.

sudo gdisk /dev/sdb 

するとエラーメッセージが出力されます.抜粋した以下を確認するとメインのパーティションテーブルが壊れている事がわかります. しかし,バックアップは生きているようなので復旧していきます.

Main header: ERROR
Backup header: OK
Main partition table: ERROR
Backup partition table: OK

復旧するので1番を選択

Found invalid MBR and corrupt GPT. What do you want to do? (Using the
GPT MAY permit recovery of GPT data.)
 1 - Use current GPT
 2 - Create blank GPT

Your answer: 1

リカバリモードに入り,バックアップから復元し書き込みます.

Command (? for help): r

Recovery/transformation command (? for help): c
Warning! This will probably do weird things if you've converted an MBR to
GPT form and haven't yet saved the GPT! Proceed? (Y/N): y

Recovery/transformation command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

マウントしてみます.

sudo mount -a

確認すると正常に復旧できた事がわかります.

ictsc@web:~$ cat /mnt/data/index.html 
<!DOCTYPE html>
<html lang="ja">
        <head>
                <meta charset="utf-8" />
                <link rel="stylesheet"  href="style.css">
                <title>タイトル</title>
                <script
                          src="https://code.jquery.com/jquery-3.3.1.min.js"
                            integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
                              crossorigin="anonymous"></script>
        </head>
        <body>
                <main>
                        <p>ICTSC WEB!!!</p>
                </main>
        <script>
                $(function(){
                });
        </script>
        </body>
</html>

おわりに  

この問題は物理ディスクを2つ使うため,自分たちで仮想基盤を運用する本戦で出そうと思ってました. 150点問題としては多くのチームに解いていただけたので嬉しかったです.

gdiskではなくtestdiskを用いて回答していたチームもいました. どちらを使用しても終了条件を満たせるので満点にしています.

来年から社会人なので,最後の作問でしたが楽しかったです.