ICTSC2018の運営をしていました。 #ICTSC

TL;dr

・ICTSC2018の運営でした。
・ICTSCはネットワーク・サーバーのトラブルシューディングのコンテストです
・僕が作った問題解説したよ

こんにちは。最近部屋に友達が増えました。ぽちゃまです。 ICTSCのWrite upだったり感想を書いてる人がいたので私も運営目線で書いていきます。ただ、そんなに詳しく書きませんし僕が作問したやつの解説くらいしか書くことはありませんのでさらっと読んでくださいね。 その他の問題解説はICTSC公式ブログのほうに公開されると思うので公開されたらここに貼っておきますね。

ICTトラブルシューティングコンテストとは

皆さん早速ですがトラブルシューティングコンテストって知ってますか? あ。そうです。トラブルをシューティングするコンテストです。 ちゃんと書くとネットワークやサーバのトラブルシューティングをしたり運用技術をチーム単位で競うコンテストです。

去年までは年2回開催だったんですけど、今年(ICTSC2018)から年1回開催になりました。 具体的に書くと、去年までは予選->本戦で夏に1回、冬に1回で年2回開催だったのですが、今年から1次予選->2次予選->本戦で1年間通しての開催となりました。

1次予選はオンラインで実施され、シードチームの選抜を行います。 1次予選上位1チームと本戦開催都道府県以外の予選成績トップチーム1チームがシードチームとなります。 また、シードチームに選抜されると

1) 学校所在地の都道府県に関わらずトップ成績のチームは二次予選免除
2) 本選開催都道府県以外(東京都以外)からの参加チームの中でトップ成績のチームには二次予選免除に加え本選会場までの交通費の一部を支給。

の優遇措置があります。

2次予選もオンラインで実施され、上位8~9チームが本戦出場となります。 また、実行委員会推薦枠が5チームあります。 上位8~9チーム以外で以下の条件を満たしているチームから5チーム選抜されます。

ICTSC初出場校である。
高校からの出場である。
チームメンバーの50%以上がICTSC初参加である。
チームメンバーの50%以上が女性である。
チームメンバーの50%以上が新入生(※)である。
※(専門学校と大学部の1年生、及び高専の4年生以下。大学院生は対象外)

詳しいことは調べてください。

問題解説

さて、長い説明を書きましたが正直公式サイト読めば良いので無視で良いのです。 ここでは私が出した本戦問題について解説していきます。 私が出した問題分野はサーバーのローミドルです。

問題タイトル

トラブルが起こるのは筋肉が足りないから!!!

問題文

同期から次の依頼がありました。

「会社の上司から勉強用にとサーバーをいただきました! Webページを立ててみたかったのでNginxをインストールしようとしていたのですが、

sudo apt-get install nginx

をするとエラーが出てしまってインストールできないんです... どうしたら良いんですかね...?」

問題を解決して、インストールがエラーや警告なしで成功するようにしてください。

 ##問題のスタート状態

  • サーバーへのHTTP通信が失敗する

問題のゴール状態

  • Nginxがapt-getによってエラーや警告なしにインストールされている
  • サーバーへHTTP通信ができる

トラブルの概要

Nginxをインストールしようとしたがエラーが発生し、インストールが完了しない。

解説

このブログでは公式ブログよりも少し詳しく解説をしています。
まず、このトラブルを起こすには2つの条件があります。 - /var/logのdpkg.log,aptにi属性が付与された状態でsudo apt updatesudo apt upgradeをする。 - upgrade時にdpkg.logが書き込まれる古いversionであること。(=dpkg.logの更新が必要なversionであること)

以上を満たしていれば今回のトラブルは再現可能です。

今回のトラブルの原因は /var/log配下にあるファイル全てにi属性が付与されていたことにありました。 "i"属性は変更(削除、名前の変更、このファイルを指すリンクの作成、 このファイルに対するデータの書き込み)が禁止されます。  トラブルが起こる流れとして /var/log配下にあるdpkg.logをアップデートしようとするとコピーなどは成功するが、インストール後スクリプト(post_install)の実行時にdpkg.logファイルの権限変更(chmod)が失敗し、インストール失敗(再インストール)としてマークされますそして、次回インストール時にpost_installスクリプトが実行されるように予約がされます。なので、Nginx(その他のパッケージ)をインストールしようとすると再インストールがマークされたdpkgが優先的にインストールされようとしますが、同じ理由で再失敗するのでそれ以降のインストールが無視される(インストール失敗とマークされる)といった流れでした。ですので、今回は以下のコマンドでdpkg.logのi属性をはずしたらインストールは完了します。

$ cd /var/log
$ sudo chattr -i dpkg.log

しかし、今回のゴールはNginxがapt-getによってエラーや警告なしにインストールされているも含まれています。 今回warningなどが出ていた原因はaptディレクトリにもi属性が付与されていたためです。 なので、aptディレクトリもi属性をはずしたら今回のトラブルは解決です。

$ sudo chattr -i apt

もしくは

$ sudo chattr -i *

解決例

$ cd /var/log
$ sudo chattr -i dpkg.log

もしくは

$ sudo rm -rf /var/lib/dpkg/info/dpkg.postinst
$ sudo rm -rf /var/lib/dpkg/info/dpkg.postrm
$ sudo dpkg --configure dpkg

以上のようにコマンドを実行したら、Nginxのインストールに成功しますがエラーや警告が出たままです。

$ cd /var/log
$ sudo chattr -i *
$ sudo apt-get install nginx

以上のようにコマンドを実行し、Nginxのインストール時にエラーや警告がでなくなるので今回のトラブルは解決となります。

最後に

トラコン運営募集していますので気になったら聞いてくださいね。 後、トラコン運営に入るとトラコンで青春迎えられるらしいですね。 それ以外でも青春迎えたいんですが。。。 そんなことはどうでも良いのです。

トラコンに少しでも興味を持っていただけたら幸いです。 来年のトラコンICTSC2019でお待ちしています! それでは。