マイクラサーバーを作るにあたってテスター母さんがメモったLinuxの超基礎


長いことテスターやってますが、サーバーはいまだによくわかりません。
「サーバーログを検索できる程度の知識はあったほうがいいよね」ということで、LPICレベル1のテキストを読みはじめましたが、正直　(　´_ゝ｀)ﾌｰﾝ　で通り過ぎてしまう・・・
これはやはり触ってみるのが一番なのでは？と考えていたところ、ちょうど息子から「友達とマイクラやりたい。MOD入りで」と。そうだ、マイクラサーバー作ろう。

幸いちょっと検索すればいろんな人がマイクラのマルチサーバーの作り方を解説してくれていて、書いてあることをまるパクリすれば起動するのは簡単でした。でも、「この数字は何？」とか「このコマンドは何やってるの？」とか「どうしてそれが必要なの？」とかまで解説しているのは見つけられず・・・。これじゃあ、息子から突っ込まれたら答えられない！母の威厳が！
というわけで、この記事ではマルチサーバーを動かす、というよりは、その過程で出てきた**普通は基礎すぎてスルーされる**内容を、LPICの教科書片手に調べたメモとともにまとめてみました。（知識ゼロの中学生でも理解できるように）

# 前提

- AWSアカウントを持っていること
- Mincraft Java版を持っていること

AWS(Amazon Web Services)はいわゆる「クラウド」。インターネットを介して必要なサービスを利用できるクラウドインフラサービスのこと。今回はAmazon EC2（Amazon Elastic Compute Cloud）というサービスを利用して「仮想サーバー」を作成し、そこに必要なプログラムをインストールしてマインクラフトのマルチサーバーを動かします。

<details><summary>余談：なぜEC2？</summary>

家にあるパソコンではなく、なぜわざわざクラウド上に仮想サーバーを用意することにしたのかというと、

 -  PCのスペックの問題－ゲームをするときにマルチサーバーとして自機を動かしながらクライアントとしてそこに参加するようにするには、息子のマシンはパワー不足
- EC2ならサイズ変更可能、使った分だけお金払えばいい（常時起動はしない想定。ちなみに常時起動でそこそこのスペック要求するならCONOHAとか使った方が安くなる場合も）
- 社内勉強会で使ったことあるから馴染みがある（初見じゃない、ってレベルですが）
- なにより、AWSアカウント持ってる（前にお父さんがARKサーバー立ててた・・・）
- 家のルーターのポートを開放するのがめんどくさい

 ちょうど2021/12/10に『マインクラフト』Java版にセキュリティ上の問題（Log4jの脆弱性）が判明しました。
公式サイトでは同問題への対応を盛り込んだ「1.18.1 Release Candidate 3」を配信中なので、これ以降のバージョンであれば大丈夫だと思いますが、古いバージョンやサードパーティ製のものを使う場合には注意が必要になるのかなと思います。
古いバージョンを動かしたい＆EC2で対策したい場合はALBを導入してWAFをくっつけてしまうのが手っ取り早いと思います。ちなみに、ALBは有料です。（ディメンションがややこしくて金額の見積もりが結構大変）

</details>

# バニラ編
まずは公式バニラからじゃね？ということで、マイクラ公式の2021/12/13　現在最新版である　minecraft_server.1.18.1.jar  を動かしてみます。


手順は以下です

1. EC2インスタンスを作成する

1. EC2インスタンスに接続する

1. Javaをインストールする

1. マインクラフトサーバー環境構築

1. クライアントからマイクラサーバーにログインする

1. 終了する

## 1.EC2インスタンスを作成する

AWS EC2というのは、AWSが提供している仮想サーバー構築サービスです。昔はPC本体を買ってきてそこにいろいろインストールして、ネットワークにつないで、とやることがたくさんありましたが、EC2を使えばクラウド上に簡単にサーバーが作れます。
このサーバーは物理的に一台のPCとして実態があるわけではなく、AWSクラウドのメモリ上に展開されたプログラムとデータの集合です。でも、利用者からみると一台のコンピュータが稼動しているように見え、実際のコンピュータと同じようにその上でソフトウェアを起動することができます。こうした仮想的なコンピュータとして起動したものを「仮想化インスタンス」と呼びます。EC2インスタンスはこうした仮想化インスタンスの一つです。
EC2ではいろいろなOSが使えますが、今回はLinux系のAmazon Linux2を使用します。理由は無料で楽（配布元が同じAWS）だからです。（WindowsはOSの使用料がかかります）

<details><summary>メモ：Linuxって？</summary>

もともと、Linuxという言葉はLinuxカーネルのことを意味するそうです。カーネルはアプリケーションとハードウェアの架け橋。メモリ、CPU、入出力（キーボードやマウス、ディスプレイ、etc.）を中心としたハードウェアを抽象化して、ハードウェアとソフトウェアがやり取りできるようにしている、ハードウェアに一番近いところにあるソフトウェアです。
・カーネルだけではOSとして手軽に使うことができないので、アプリケーションなどをパッケージにしてすぐに使える状態にしたものがあります。これは「ディストリビューション」と呼ばれ、今回使用するAmazon Linux2も数あるディストリビューションの中の一つです。
・Linux系OS（ディストリビューション）は、ほとんどがオープンソースのソフトウェアで構成されており、採用したソフトウェアをインターネット上のサーバーに置いて公開(配布)しています。

</details>

#### 1.1. AWSコンソールでEC2をクリック

リージョンが日本になっているか確認します。デフォルトではたいてい北米になっています。

![101.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/154c29f2-c7ad-2d68-7c88-141ef7f2b213.jpeg)

※画像は2021/12初旬のものです。画面はちょこちょこ変わったりするので、参考程度に。

<details><summary>メモ：リージョンって？</summary>

<dt>リージョン（Region）</dt>
<dd>地理的に離れた、データセンター群
北米リージョン、東京リージョン、などがある。遠いところは通信に時間がかかるので、だいたい近いところを選ぶ。</dd>
<dt>Availability Zone（AZ）</dt>
<dd>リージョンをさらに小さく分割した区分　1つまたは複数のデータセンター群
可用性を高めるために、複数のデータセンターに情報をコピーしておく、というのが目的。AZは数年に1度起こるかどうかの地域的大災害よりももっと頻繁に起こる書き込みエラーやアプリケーション障害等への対応という意味合いが強い。今回のような1インスタンスの趣味のサーバーを作るような場合は気にしなくてもよいです。</dd>

</details>


#### 1.2. EC2インスタンスのコンソール画面で「インスタンスを起動」をクリックします

##### ステップ 1 : Amazon マシンイメージ(AMI) 
【Amazon Linux 2 AMI】 を選択します｡
cpuのタイプを先に選択するようになっていました。（先月まではなかった）
料金表を見たらt4gのほうがt3より微妙に安かったので、t4g Armを選択しました。
![102.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/f3ec8fab-04ea-081b-6a60-5cdd380d65da.jpeg)


##### ステップ 2 : インスタンスタイプの選択
【t4g.small】 を選択します｡

![103.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/298db9e9-a344-87e6-3353-864426be1644.jpeg)

<details><summary>メモ：インスタンスタイプって？</summary>

 EC2ではCPUやメモリ、ストレージのサイズを組み合わせて提供しています。この組み合わせでいろいろ用意してくれているのがインスタンスタイプ。たとえば、「t2.micro」であれば「t」がインスタンスファミリー、「micro」がインスタンスサイズです。インスタンスファミリーに関する詳細はAWSのサイトで確認できます。
インスタンスタイプによっては無料利用枠があるので、試してみるだけの場合は無料のものでやってみるのもアリです。t2とt3は世代が違う＝機材等の調達時期が違うということらしく、t3の方がより新しい　→　性能がよく、値段も安かったりもします。※2021年11月現在。最新の情報はAWSのサイトで確認してください。

 t4g.small を選択したのは、マイクラのサーバー要件から決めました。
参考サイト：[Minecraft Wiki サーバー要件](https://minecraft.fandom.com/ja/wiki/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC/%E8%A6%81%E4%BB%B6)
今回、友達と楽しむ程度なのでプレイヤーは多くても5～6人程度、バニラなので最低限でよい、とするとCPUはintel Core2程度で、RAMは2GB、ディスクは200MBあればよいことになります。なので、メモリ=2GiB を基準に選択し一番安いt4g.small（vCPU=2）を選びました。実際にこれで足りるのかは動かしてみてからですね。ちなみに、t4gとt3の違いはCPUでt4gはArmベース、t3はIntelベースです。まあ、そんなに処理速度要らないだろう・・・。バニラだし。

</details>

##### ステップ 3 : インスタンスの詳細の設定
デフォルト（8GB）のまま
![104.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/06555ec6-303b-8596-ab79-c920d35b0b7d.jpeg)

##### ステップ 4 : ストレージの追加
デフォルトのまま
※ディスクはOS用以外にはマイクラ用に200MBあればよい。
![105.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/f7cc9b42-e527-0f8f-d4ac-c84519166f1b.jpeg)

##### ステップ 5 : タグの追加
キーに「Name」を指定して値を設定すると、作成したリソースに名前を付けることができます。作成したインスタンスはインスタンスIDで区別できますが、意味のない数字＆文字列なので、直感的にわかりやすい名前を付けておくことをお勧めします。
※タグをつけることにより、「このタグのついているリソースの一覧を検索する」といったこともできるようになります。
とりあえず、以下の値を入れました。
キー＝Name
値＝Mincraft_vanilla
![106.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/e6037f3b-46d4-33d7-c101-ebe9ea955b62.jpeg)

##### ステップ 6 : セキュリティグループの設定
新しいセキュリティグループを作成します。
作成中のインスタンスはこのセキュリティグループに属することになります。

セキュリティグループ名と説明に適当に名前を入れ、インスタンスに出入りする通信を制御するルールを設定します。

- SSHのデフォルトポートは22なので、22番には自分のIPアドレスを設定します。
- マインクラフトのデフォルトポートは25565番なので、IP制限はせずに、すべて通れるようにしておきます。


|タイプ|ポート番号|ソース|
|---|---|---|
|SSH|22|自分のIPアドレス|
|カスタムTCP|25565|0.0.0.0/0|

※自分のIPアドレスは、「ソース」のプルダウンで「マイIP」を選択すると自動で表示してくれます。
※IPアドレスの制限をしたくない場合は「0.0.0.0/0」と入力します。


![107.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/0a7323fd-cdd5-c104-44cd-008e9d81fe4c.jpeg)


:::note
インスタンスを作成してできたLinuxサーバーに、JavaやマイクラサーバーをインストールするのにはSSHを使用します。なので、自分はSSH接続ができるようにしておく必要があります。でも他人にSSH接続を使われると困るので、SSH用のポート22番には自分のIPから来た通信だけを通すように設定します。
:::

:::note
対して、ゲームに参加する友達はマイクラに到達できないといけないので、マイクラに通信するポート25565番はどんなIPでも接続できるようにします。
:::



<details><summary>メモ：SSHって？</summary>

 SSH（Secure Shell）とは、ネットワーク上に存在するサーバなどの機器にアクセスして、遠隔操作を行うときに使えるプロトコル（規格・ルール）の一種です。UNIXコマンドを用いてPCから直接クラウド上のサーバ操作を行うことができます。

</details>

<details><summary>メモ：ポートって？</summary>


| ポート番号    | 説明        |
|:-------------|:------------|
| 0～1023      | ウェルノウンポート：メジャーなサービスやプロトコル用に予約されているポート|
| 1024～49151  | 登録済みポート：特定のアプリケーションで使われているポート|
| 49152～65535 | ユーザーが自由に扱えるポート|

 ウェルノウンポートはIANA（Internet Assigned Number Authority）が管理しています。
登録済みポートもIANAが管理していますが、IANAに登録されていない番号もあります。

 IPアドレスが番地（マンション）、ポートが各部屋、と考えるとわかりやすいです。外から来た人（通信）はマンションの入り口で部屋番号の呼び鈴を押します。呼び鈴を押された部屋の住人（アプリケーション等）はインターホンに出て応対します。
つまり、22番に来たものはSSHが対応する、25565番に入ってきたものはマイクラが対応する、と通信を分けることによってサーバー上の複数のサービスが混乱なく動きます。

 使わないポートは閉じておくのが基本です。というのは「ポートスキャン」と呼ばれる攻撃手法があるからです。ポートスキャンは、呼び鈴を押しまくって、住人がいるかどうか、どんな人がでてくるのか調査する、という感じです。ポートの開閉状況やサービス、バージョンなどがわかれば、それを足掛かりに情報を取得したり攻撃したりできてしまう場合があります。使うポートのみ開けるのが基本です。

</details>

##### ステップ 7 : インスタンス作成の確認
この画面で、これから作成するインスタンスの設定内容が確認できます。
「起動」をクリックします
![108.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/c1410418-eab6-b1d7-7bbc-cd2929ac2713.jpeg)


##### 「既存のキーペアを選択するか､新しいキーペアを作成します｡」ダイアログ
以下の手順で新しいキーペアを作成してキーペアをダウンロードします。

1. 「新しいキーペアの作成」を選択
1. このインスタンスのキーであることがわかるように「キーペア名」に名前を入力します「Mincraft_vanilla_key」
1. 「キーペアのダウンロード」をクリックしてキーペアを保存します
1. 「インスタンスの作成」をクリック

![109.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/f4be387c-9db3-6a33-742e-4cdd0859fe63.jpeg)



##### 起動中のインスタンスの確認
『ステータスチェック:2/2 のチェックに合格しました』 と表示されたら出来上がり。
起動したサーバーのIPアドレスは「パブリックIPv4アドレス」と書かれているものになります。

![110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/07febf0b-20a9-c38e-a1f0-faaad9a9871a.jpeg)


### 2.EC2インスタンスに接続する

さて、AWSクラウド上に「Mincraft_vanilla」というインスタンスを作成しました。このインスタンスではAmazon Linux2というOSが起動している状態になっています。
このLinuxサーバーに接続して、Javaとマインクラフトサーバーをインストールしなければならないのですが、それにはまず、サーバーに入らなくてはなりません。
サーバーに入るにはSSHクライアントを使います。自分のPCにSSHクライアントがインストールされていない場合には、インストールします。今回は定番ツール、[TeraTerm](https://ja.osdn.net/projects/ttssh2/) を使用しました。

TeraTermを起動すると接続先を入力する画面が表示されます。
ホストにサーバーのIPアドレスを入力し、OKをクリックします。

![111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/456db226-48d1-8b31-6d5e-35524736b24c.jpeg)

SSH認証画面が表示されたら

- ユーザー名にEC2のデフォルトユーザー名である「ec2-user」
- 認証方式は「鍵を使う」を選択して秘密鍵にインスタンス起動時に作成してダウンロードしておいたキーペアの
Mincraft_vanilla_key.pemファイルを指定します。

![112.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/0b8c49c4-397a-394b-2670-40021a43c493.jpeg)

OKをクリックすると下のような画面になり、EC2インスタンスに接続されました。

![n01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/d7eda9c0-3fa8-1477-2683-3fe933c1b972.jpeg)

### 3.Javaをインストールする

Minecraftはもともとjavaで開発されていて、PC＋Java環境で動くJava版と各種プラットフォームで動く統合版があります。今回はJava版（minecraft_server.1.17.1.jar）なので Corretto 17　をインストールします。
※minecraft_server.1.17.1.jarに対応するjavaのversionは16以上

<details><summary>メモ：Javaって？</summary>

 javaはプログラミング言語であり、javaで書かれたプログラムを実行するソフトウェアプラットフォームでもあります。
Javaの版権は現在オラクル社にありますが、Java実行環境とJava開発環境はオープンソース化されていて、Javaテクノロジーの標準化はJavaコミュニティプロセス (JCP) が管理しています。
JavaのパッケージにはJDKとJREの2種類があります。
 ・JDK(Java Development Kit) Javaのプログラムを作る際に必要・便利なものの詰め合わせ。JREを含む。
 ・JRE(Java Runtime Environment) Javaのプログラムを動かすときに必要なものの詰め合わせ。
※バニラのMinecraftではJREで良いようですが、プラグイン等でJDKが必要になることもあるらしいです。

</details>

<details><summary>メモ：インストールするということ</summary>

 ある特定の機能を持ったプログラムを他のプログラムから呼び出して利用できるように部品化し、そうした部品を複数集めて一つのファイルに収納したものをライブラリと呼びます。ソフトウェアはこうしたライブラリや実行プログラム、設定ファイルなどからできていて、これらを1つのファイルにまとめたものをパッケージと呼びます。

 Linux系OSにソフトをインストールする場合、こうしたパッケージをインストールすることになるのですが、汎用性の高い機能をもつライブラリやプログラムはオープンソースが多く、様々なソフトで共通に使われていたりすることが多々あります。

 たとえば、あるパッケージAに含まれるファイルAをパッケージBが使う、という場合、パッケージBはパッケージAがインストールされていないと動かないことになります（パッケージの依存関係）。また、パッケージAではファイルZのバージョン1を使うけれどパッケージBではファイルZのバージョン2を使う、といった場合、ファイルZは名前がおなじなので2種類インストールすることができません（パッケージの競合）。パッケージ管理システムではこうした依存関係や競合を監視して、インストールやアンインストールの際に警告を発してくれます。

 Amazon Linux2のようなRed Hat系のOSは、パッケージ管理システムとしてRPM「Red Hat Package Manager」→「RPM Package Manager」を採用しています。
RPMはrpm 形式のパッケージがインストールされると、その情報を「/usr/lib/rpm」に格納します。このデータのまとまりを「RPM データベース」といいます。この情報を使って、RPMはパッケージをインストール・アンインストール・アップデートする際に依存関係のあるファイルについて警告を発してくれます。

 yumはRPMパッケージを統合管理するものと考えればよいです。
yumがRPMと違うところは、依存関係の解決を（ある程度）自動でやってくれるというところ。というのは、yumは「リポジトリ」にパッケージの配布元情報を持っており、足りないファイルがあればその情報に基づいてダウンロードしてきてくれたりします。

 Amazon Linux2にはyumもはじめらか含まれているので、rpmパッケージをインストールする際にはyumコマンドを使用できます。パッケージの入手先は```/etc/yum.repos.d```ディレクトリ以下にあるリポジトリ情報の設定ファイルにあります。

 ところで、上のAmazon Linux2の最初の画面に「セキュリティに必要なパッケージがあるからアップデートしろ」という旨のメッセージが出ています。 ```yum update``` を実行すると、インストールされている全パッケージが最新版にアップデートされるので、実行しておきましょう。

</details>

yumコマンドを使って、Javaをインストールします。
Java16をインストールすればいいので Amazon Corretto 16 をインストールしようと思ったら、もう17が出てました。今回は Amazon Corretto 17 を使ってみます。

```
# Amazon Corretto 17 をインストール
sudo yum -y install java-17-amazon-corretto-devel

# インストールされているか確認
sudo java -version
```

最後に```Complete!```と表示されて、インストール完了です。
インストール出来たらjavaのバージョンを確認してみましょう。

<details><summary>メモ：このコマンドでやっていること</summary>

・`yum -y install` はyumのインストールコマンドで、オプション`-y`がついています。これがあるとインストール時の問い合わせすべてにYesと答えます。java-17-amazon-corretto-develはJDK17です。

 ![092.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/be5aa31e-60b3-dd8f-a4fc-bc56ace74ceb.png)
 （中略）
 
 ![093.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/95020181-0ff0-f124-b599-fb721a7d7787.png)

・ ```java -version``` はjavaのバージョンを確認するコマンドです。javaがインストールされていればバージョンを返しますが、インストールされていないと```command not found```（コマンドが見つかりません）と返してきます。
 ![097.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/bdc64d6f-d971-33f1-7e08-0891949aad43.png)

 ※ちなみに、各コマンドの頭につけている```sudo```はsudoコマンドと呼ばれるもので、```sudo コマンド```と指定することで、「スーパーユーザー（rootユーザー）」の権限が必要なコマンドをsudoコマンド経由で実行させることができます。

</details>

<details><summary>メモ：correttoのインストールが失敗したら</summary>


 correttoをインストールしようと、Amazon Linux2のドキュメントを見たら、```sudo yum -y install java-17-amazon-corretto-devel```を実行しろ、としか書いてないのですが、これをいきなり実行したら失敗することがありました。

 AMIのバージョンによるのか、時期的なもの（corretto17がリリースされたばかりだった）かわかりませんが、yum パッケージマネージャーで Corretto RPM リポジトリ (Amazon Linux AMI など) を使用するには、Corretto パブリックキーをインポートし、リポジトリをシステムリストに追加する、という作業が必要な場合があるようです。

 ![n061.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/d69229eb-2100-3108-fe56-cfbaf9d1964f.jpeg)

 上はインストールできなかった時のキャプチャ。yumは「リポジトリ」にパッケージの配布元情報を持っている必要があるのですが、```No package java-17-amazon-corretto-devel available.``` ...ないって怒られてますね。
そこでCorretto パブリックキーをrpmコマンドでインポートして、リポジトリファイルをcurlコマンドで持ってきます。

```
# Corretto パブリックキーをインポート
sudo rpm --import https://yum.corretto.aws/corretto.key
```
 ・ ```rpm --import``` はrpmコマンドで、ここではパッケージの署名確認等に使用する公開鍵のインポートをしています。

```
# リポジトリをシステムリストに追加
sudo curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
```
 
・```curl -L -o``` はcurlコマンドで、これはさまざまなプロトコルに対応したデータを転送するためのコマンドです。
curlコマンドは通常では実行結果として取得するHTMLは標準出力（コンソール画面）に表示しますが、```-o```オプションを使って```-o [ファイル名]　[ファイル取得元アドレス]``` のようにすると、取得結果をファイルに保存します。
```-L``` は取得元がHttpステータス300番台で別のURLへの転送（リダイレクト）する場合に、リダイレクト先まで行くようにします。（このオプションがついてないと、自動でリダイレクトしない）

 ![n62.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/6cd19029-3c2c-e600-527f-2ac41bb5945e.jpeg)

 リポジトリを見ると、```corretto.repo```が追加されているのがわかります。この後のインストールは成功しました。
 （log4j騒ぎの後で作り直したときはリポジトリ追加しなくてもインストールできたので、今後は必要なくなるのかも？）

</details>

### 4. マインクラフトサーバー環境構築

いよいよ、マインクラフトサーバーを作ります。

#### 4.1 準備

##### マインクラフトサーバー用作業ディレクトリを作成する

デフォルトユーザーのディレクトリ（ /usr/ec2-user) の下に　minecraft　というディレクトリを作成します。

```
#ディレクトリの作成
mkdir ~/minecraft

#作成したディレクトリに移動する
cd minecraft

#カレントディレクトリ（今いる場所）を確認する
pwd
```

![098.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/cdf8bbcf-06ad-5e65-5ef3-d518a66eb80c.png)


<details><summary>メモ：ここまでに出てきたLinuxコマンド</summary>

|コマンド|説明|使用例|
|------|---|---|
|cd|ディレクトリ移動|cd 移動先|
|ls|ディレクトリの内容をリスト表示|現在いるディレクトリの内容を表示<br> ls 内容を表示したいディレクトリ|
|mkdir|ディレクトリを作成する|mkdir ディレクトリ名|
|pwd|現在いる位置を表示する|-|
|rm|ファイルやディレクトリを削除する|rm ファイル名またはディレクトリ名|
|mv|ファイルを移動する|mv 移動元 移動先|

※ディレクトリの指定の仕方等がわからない場合は、「Linux　パス」とかで検索してみよう！

</details>


##### マインクラフトサーバーjarファイルをダウンロードしてくる

公式のバニラサーバーは以下のページに置いてあります。
https://www.minecraft.net/ja-jp/download/server
このページに　minecraft_server.1.18.1.jar のリンクがあるので、リンク先URLを確認してcurlコマンドでとってきてもいいですが、せっかくTeraTermをインストールしたのでTeraTermのSCPを使ってみます。

公式のサーバーダウンロードページにあるリンクをクリックすると自分のPC（ローカル）にダウンロードが始まります。```server.jar```というファイルがダウンロードされたと思います。
同じページに書いてある起動コマンドに合わせて、ファイル名をserver.jarからminecraft_server.1.18.1.jarに変更しておきます。
※起動コマンドのファイル名を変えてもよいのですが、ファイル名にバージョンを入れておいた方が後でわからなくならなくていいかな？と思って変えてみました。

TeraTermを起動して```ファイル > SSH SCP...```を選択します

![n02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/feb3d6b5-6160-8b31-b22a-7110569ae4b0.jpeg)

![n03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/bbff052b-9140-acc1-38b3-a3b197a99a9e.jpeg)

ウィンドウが開いたら上半分に送信するファイルと送信先を入力して「send」ボタンを押すとサーバーにファイルがコピーされます。

|項目|入力内容|
|---|---|
|From|ダウンロードした　minecraft_server.1.18.1.jar　ファイルのパス
|To|/home/ec2-user/minecraft|

コンソールに戻ってコピーされていることを確認します。
![T03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/b87b52e8-cc15-ad14-3c5a-b63712676492.png)


<details><summary>メモ：コマンドでやりたい人</summary>

 コマンドでやりたい場合は、リポジトリをシステムリストに追加したのと同様にcurlコマンドでよいかと思います。

```
#ファイルをダウンロードする
sudo curl -L -o /usr/ec2-user/minecraft （server.jarのURL）
```

</details>

#### 4.2 起動する

##### 初回起動

ダウンロードサイトでは、実行用のコマンドとして以下のように書かれています。

```
java -Xmx1024M -Xms1024M -jar minecraft_server.1.18.1.jar nogui
```

javaの引数部分　``` -Xmx1024M -Xms1024M ``` これは使用するメモリの最大値と最小値をMBで指定しています。
今回は　t4g.small　でメモリが2Gしかないので、とりあえずこのままでいきます。（後々、メモリ使用量を見てチューニング…）

![n04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/aee18aed-e9f4-e297-fad9-6f56793eccdd.jpeg)
（中略）
![n05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/095a6594-8081-567a-e9a7-81d19bcc2248.jpeg)

初回起動ではサーバーは起動しません。EULA（利用規約）に同意してください、という旨のINFOが表示されて停止します。


##### 利用規約に同意する

初回起動でマインクラフトサーバーのパッケージが解凍されて、複数のファイルが出現しています。

![T07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/3297c805-28eb-e14c-55b1-c9786c875f32.png)

その中に eula.txt というファイルがあるので、ファイルを開いて　```eula=false``` と書かれている部分を　```eula=true``` と書き換えます。

単なるテキストファイルの中身を書き換えるだけなのですが、Linuxではviエディタという、一般人にはちょっとなじみのないエディタを使うので注意が必要です。

<details><summary>メモ：viエディタで編集</summary>


 「vi」では基本的に全ての操作をキーボードのみで行います。

 (1) 「vi [編集したいファイル名]」と入力して、編集したいファイルを開く
 
```
vi eula.txt
```

 ![n09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/aa984a7a-b6be-5ca4-78c0-01874f46c610.jpeg)

 ファイルを開いた直後は入力ができない「コマンドモード」になっています。

 (2) 「i」と入力して「インサートモード」に変更する

 ![n10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/5ac5ca3f-c4fb-5771-0543-a25bffae3464.jpeg)

 左下に「インサートモード」を示す「INSERT」という文字が表示されていればインサートモードです。

 (3) eula=false　を　eula=true　に書き換える（BackSpaceキーは使えるけど、Deleteキーは使えないので注意）


 (4) ESCキーを押してインサートモードを終了する

 (5) コマンドモードに戻って、保存して終了するコマンド「:wq」を入力してEnterを押します。

 ![n11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/54dde6f9-9634-6599-1f7d-a5a4c3bc6a83.jpeg)

 画像では「:wq」と入力していますが、「:w」で保存、「:q」で終了のように別々に入力してもOKです。

 viの詳しい使い方は、「vi 使い方 linux」で検索してみてください。

</details>

##### もう一度起動する

```
java -Xmx1024M -Xms1024M -jar minecraft_server.1.18.1.jar nogui
```

利用規約に同意してから上のコマンドを実行すると、今度はサーバーが起動してワールドの生成が始まります。
コンソールには起動時のログが次々と表示されていきます。
最後に　```Server thread/INFO:Done``` のような文字列が表示されたら完了です。

![n12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/b59e6937-f574-ea1f-cf11-d3e099985c55.jpeg)

これでEC2にマイクラサーバーが立ち上がりました！

### 5. クライアントからマイクラサーバーにログインする

自分のPCから入ってみます。

マインクラフトランチャーの最初の画面で「マルチプレイ」を選択して「マルチプレイで遊ぶ」画面を表示します。
![181.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/a4ab90c4-2540-1013-bc45-da700f17df2a.jpeg)

「サーバーを追加」でサーバー情報を追加してから接続してもよいですが、今回EC2は使用時にのみ起動する想定＆IPを固定していないので、起動ごとにIPが変わってしまいます。なので、ダイレクト接続でつないでみます。

![182.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/e2fed4c5-78ee-7bf7-cda4-f04446cd38d8.jpeg)

サーバーアドレスにIPアドレスを入力してサーバーに接続します。
一緒に遊ぶ友達に、IPアドレスを連絡して接続してもらいます。

### 6.終了する

- マインクラフトを停止する
サーバのコンソールから```stop```と入力します。
後述のゲームクライアントからの```/stop```（要権限）でもOKです。
 
- EC2インスタンスを停止する
EC2コンソールから「インスタンスを停止」します。停止しても作ったサーバーやデータは残っているので、次回開始時に続けて遊べます。「インスタンスを終了」すると、EC2インスタンスが削除されるのでせっかく設定したサーバーも消えてしまいます。お金の節約のために「遊ばない時はサーバーを止めたい！」という方は、停止を選択してください。
![n14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316788/e37b1040-e631-fdf6-2b53-b5f4582e3691.jpeg)

- 作成済みのEC2インスタンスを開始する
EC2コンソールから設定済みのインスタンスを選択し「インスタンスを開始」すると、EC2インスタンスが起動します。インスタンスが起動したら、SSHでログインして再度マイクラサーバーを起動してください。

### おまけ　マイクラのコマンド


#### OP権限を設定する

マイクラのゲームクライアントから「minecraft_server」を停止させることもできます。
ゲーム画面のコマンド入力を表示して「/stop」と入力すればよいのですが、これはオペレータ権限（OP権限）をもったアカウントでなければ実行できません。
アカウントにオペレータ権限を付与するにはサーバのコンソールから「op コマンド」を実行します。
すでにオペレータ権限を持っているアカウントであればゲームクライアントからでもOP権限を与えることができますが、最初の一人（自分）にはコンソールから付与するのが簡単でよいです。（もう一つ、サーバーのops.jsonファイルを書き換えることでも付与可能なのですが、これはちょっと面倒なので割愛）

:::note warn
op権限はサーバーの停止のほかいろいろ強力なことができるので、信頼できる人にしか付与してはいけない
:::

|内容|コマンド|
|:---|:---|
|OP権限を付与する|op アカウント名|
|OP権限を取り消しする|deop アカウント名|


#### ホワイトリストを有効にする
ホワイトリストを有効にして、ホワイトリストに載っているアカウントしか接続できないようにすることができます。サーバー荒らし対策としては一番楽で確実だと思うので、うちわで楽しむならやっておいた方がよいです。

ホワイトリストコマンドも、サーバのコンソールからとクライアントのゲーム画面からのどちらからでも実行できます。

|内容|コマンド|
|:---|:---|
|ホワイトリストを有効にする|whitelist on|
|ホワイトリストを無効にする|whitelist off|
|登録済みアカウントのリスト表示|whitelist list|
|ホワイトリストにアカウントを追加|whitelist add アカウント名|
|ホワイトリストからアカウントを削除|whitelist remove アカウント名|