使っていないPCをサーバー化してみた

今回は使っていないPC=mac、サーバー=ubuntuでやってみましたが、mac以外でもubuntu以外でもほぼ作業は変わらないのでご参考に。


## 目標

- 古いmacをdockerサーバーにする
- メインで使っているPCからSSHで接続して操作する
- 設定終わったら部屋の隅で電源入れっぱなしにする
- dockerの研究用

## 環境

```
mac : macmini(2011)
USBメモリ: 64G
ubuntu: ubuntu-20.04.1-desktop-amd64.iso
```
USBメモリにubuntuのインストーラーを入れて、そこから起動してインストールする。
USBメモリは余っていた64Gのものを使用。事前にディスクユーティリティでMSDOSフォーマットした。

古いmacには以下のものを繋いだ

```
有線LAN
有線キーボード
有線マウス
モニタ
```

作業が終わったらLANケーブル以外全部外す予定。

## インストール

### USBメモリにisoを焼く

#### 1. ダウンロード

isoはミラーから落とす方が速い。色々試したが理研のサーバーが一番速かった。

[日本国内のダウンロードサイト \| Ubuntu Japanese Team](https://www.ubuntulinux.jp/products/JapaneseMirrors)

[ここ](http://ftp.riken.go.jp/Linux/ubuntu-releases/focal/)から`ubuntu-20.04.1-desktop-amd64.iso`をダウンロード。

#### 2. Etcherでisoをusbに焼く

[Ubuntu20\.04LTSのブートUSBをMacで作成する \- Qiita](https://qiita.com/seigot/items/faea0998e17c40b3a63e)
[ラズパイ の OS イメージを焼くときは Etcher が 便利 ＆ UI カッコいい \| 験なきものを思はずは](https://azriton.github.io/2017/11/12/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%AEOS%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E7%84%BC%E3%81%8F%E3%81%A8%E3%81%8D%E3%81%AFEtcher%E3%81%8C%E4%BE%BF%E5%88%A9%EF%BC%86UI%E3%82%AB%E3%83%83%E3%82%B3%E3%81%84%E3%81%84/)

### 古いmacをフォーマット

ディスクユーティリティでフォーマットする。ただしインストールの過程でフォーマットするのでこの工程いらないかも。

### USBからインストール

古いmacにUSBメモリを刺してoptionキーを押したまま起動。USBのイメージ（？）がなぜか2つ表示されるけどどちらでも良いらしい。クリックしてインストール開始。

最初の選択肢で言語を選べるので素直に日本語を選択。ユーザー名とパスワードだけ忘れないように設定。
あとは適当。できるだけ最小限で余計な物を入れないようにした。

## 初期設定(サーバーで直接操作)

（ここからは「古いmac」を「サーバー」と呼びます）
最低限必要な操作だけサーバー側で操作する。「端末」という名のターミナルを開く。

```bash
sudo apt-get install ssh
systemctl start sshd
```
これでとりあえずssh接続できる。
接続するipを調べる。

```bash
ip a
```

色々出たけど`192.168.0.24`の部分だけ控えとく。

> ちなみにtips
> 上では`apt-get install`しているけど、現在は`apt install`が推奨されているらしいです。

## 初期設定（SSHで繋いで操作）

クライアントである普段使いのPCから接続。

`ssh ユーザー名@ホスト名orIP`という形式で。

パスワードを入れたら接続できる。

```bash
ssh atu@192.168.0.24
atu@192.168.0.24's password:
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-58-generic x86_64)
```

vimを入れようとしたら失敗

```bash
sudo apt upgrade
sudo apt install vim
Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 636
```

ググって解決。

```bash
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo apt install vim
```

[apt\-getでエラーが出た場合の対処法：E: Could not get lock /var/lib/dpkg/lock \- open \(11: Resource temporarily unavailable\) \- Qiita](https://qiita.com/jizo/items/9496496a3156dd39d91a)


> vimを使ったことがない人は`vim 使い方`等でググって調べて下さい。

ここから必要な工程

- ipアドレスの固定化
- ssh鍵の作成、設置
- sshdの設定変更
  - ルートログインを不可に
  - パスワードログインを不可に
  - port変更
- sleepしないように設定変更

ここからは指定のない限りメインPC（クライアント）での作業になる。

## ipアドレスの固定化

とりあえず接続できたけど、今のままではルーターが時間制限有りでIPを割り振っている状態なので接続できなくなる可能性がある。

まず現在の状態を確認し、インターフェイス名を控えておく(下記のenp2hogeの部分)


```bash
# サーバー側
$ ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: enp2hoge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.0.24/24 brd 192.168.0.255 scope global dynamic noprefixroute enp2hoge
       valid_lft 83300sec preferred_lft 83300sec
```

`/etc/netplan/`の下に新しくyamlファイルを作成する。もともと`01-network-manager-all.yaml`というファイルがあるが、`01`の部分を大きい数字にすれば上書きされるのでこのファイルは残しておく。

```bash
sudo vim /etc/netplan/99_config.yaml
```

環境に応じて以下の様に書く。
`enp...`の部分を先程控えたインターフェイス名に書き換え、addressesを固定ipに書き換える。

```vim
network:
  version: 2
  ethernets:
    enp2hoge:
      addresses:
        - 192.168.0.222/24
      gateway4: 192.168.0.1
      nameservers:
        addresses:
          - 1.1.1.1
          - 1.0.0.1
```

注意点
- gateway4 -> もともと繋がっているルーターのアドレス
- addresses -> gateway4の範囲内で指定。この場合は192.168.0.0から192.168.0.255まで
- ↑とは言っても少ない値だったらカブってしまう可能性もあるので192.168.0.100-255くらい？
- ルーターの設定により特定のIPが(例えば100以上)使えない場合もあるので注意
- この設定では`192.168.0.222`でIPが固定される
- `192.168.0.222/24`の最後の部分`/24`がサブネットマスク
- `nameservers`はgoogleの`8.8.8.8`でもなんでもお好きなヤツを
- 保存したら設定を反映させる↓

```bash
sudo netplan apply
```

ここで固まる。ctrl+cも受け付けないのでサーバー側で直接`ip a`してみたら設定は反映されてた。
ipアドレスが変わったことで接続ができなくなって固まったということ？
このコマンドはサーバー実機で直接行う方が良さそう。

参考:

[[Ubuntu]ローカルIPアドレスを固定にする](https://jyn.jp/ubuntu-localip-static/)

[【Ubuntu】 /etc/netplan/50\-cloud\-init\.yamlを編集するの止めろ \- Qiita](https://qiita.com/yas-nyan/items/9033fb1d1037dcf9dba5)

## sshの設定

まずクライアントのmacで鍵を作成。私の`.ssh/config`は設定が多数あるので以下のような構成にしている。

```
tree
.
├── config
├── github
│   ├── github_rsa
│   └── github_rsa.pub
└── gitlab
    ├── id_rsa
    └── id_rsa.pub

```

- 各hostごとにディレクトリを切ってその中に鍵を入れているのですが、そこまでしたくない人は適当に読み替えて下さい。

`ssh.keygen`で鍵を作るのに昔はrsaを使っていたが現在は非推奨になっているらしい。ed25519がOpenSSH 7.2から使えるようになっているらしいのでバージョン確認。

```bash
# クライアント
ssh -V
OpenSSH_7.9p1, LibreSSL 2.7.3
# サーバー
ssh -V
OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f  31 Mar 2020
```

ed25519が使えるようなので作業開始。

```bash
# クライアント
cd .ssh
mkdir macmini
ssh-keygen -t ed25519 -f ~/.ssh/macmini/id_ed25519
```

次にクライアントで`.ssh/config`の編集。以下の部分を追加した。

```
host macmini
  HostName     192.168.0.222
  Port         22
  User         atu
  IdentityFile ~/.ssh/macmini/id_ed25519
```

クライアントの設定は終わったので次に鍵をサーバーに置く。
上記の例では`~/.ssh/macmini/id_ed25519.pub`が作成されている。これが公開鍵になる。
scp使うとか色々方法はあるけど今回は`id_ed25519.pub`を開いて全文コピー、サーバーでペーストした。

```bash
# サーバー
mkdir .ssh
vim ~/.ssh/authorized_keys
# vimでペーストして保存
```

一旦サーバーからexitして接続できるか確認。パスワードを聞かれることなく接続できたら成功。

```bash
ssh macmini
```

参考:

[ssh\-rsa，非推奨のお知らせ](https://orumin.blogspot.com/2020/05/ssh-rsa.html)

## sshdの設定変更

このままでは外部から侵入された時にブルートフォースされる可能性があるので設定変更。今の所公開する予定は無いけど念の為にsshd_configを書き換える。

以下は`ssh macmini`してからサーバーでの作業。

```bash
sudo vim /etc/ssh/sshd_config
```

基本的に変更する項目を探して`#`のコメントアウトを外して値を書き換えるだけ。
たとえばPortの変更は`#Port 22`の`#`を消して`22`の部分を変更する。

変更したのは以下の3つ。

```
Port 12345
PasswordAuthentication no
PermitRootLogin no
```

保存したら再起動。

```bash
sudo /etc/init.d/ssh restart
```

exitしてクライアント側の`.ssh/config`を開きPortを変更。

```
host macmini
  HostName     192.168.0.222
  Port         12345
  User         atu
  IdentityFile ~/.ssh/macmini/id_ed25519
```

再度`ssh macmini`で接続できたら成功です。



## サスペンドしない設定

サーバーがsleepしないように設定しなきゃいけないと思っていたんだけど、今の所ずっと動いてくれているので何もしてない。ノートパソコンをサーバーにする時は必要なのかも。

[Ubuntu,Debianの自動サスペンドの解除 \- Qiita](https://qiita.com/ikesama200/items/f595293de82ddc9fa3f1)

以上で作業終了。

## まとめ

これらの作業を終わらせて2日経ちました。この後にdocker入れてpythonでbot作ってscpしてdocker runして無事に動いています。

サーバーはmacとして使っている時はちょっと動かしただけで轟音がしてたのですが、現在はとても静かに動いてくれています。

vagrant等で仮想サーバー建てて動かす方法もありますが、当然スリープしたら止まります。止まらないで24時間動いてくれるサーバーがあるのはやりたいことが膨らんで楽しいです。

古いPCを眠らせている方はぜひサーバーにして遊んでみて下さい！