Ubuntu2x.04でNISとNFSでユーザー・ファイル管理

# はじめに
Ubuntu20.04、Ubuntu22.04の計算機群でNISでユーザー管理をして、NFSでファイルを共有する一連の計算機を連携させるために必要な手続きをまとめる。やりたいことは大体[CentOS7(研究室内新設サーバー)の設定メモ #centos7 - Qiita](https://qiita.com/Yasushi-Shinohara/items/d38e80cc95c8a29bd1b2)なんだけど、Ubuntuで組むことにしたのでまとめなおす。
いつも書きかけ

お世話になったリファレンス: [ubuntu 16.04 or raspberry pi 3 でのNISの設定 #Raspberrypi3 - Qiita](https://qiita.com/hdoi/items/2b62d394af12d97d966d)

## 

## 構築環境の構造

ドメイン名: `hoge`
| 構成マシン       |    IP (Intra)  |    役割・コメント    |
|:-----------------|:--------------:|:------------------|
| hoge000          |   192.168.x.y1  | hoge00nのNIS+NFSサーバー |
| hoge001          |   192.168.x.y2  | NIS+NFSクライアント1   |
| hoge002          |   192.168.x.y3  | NIS+NFSクライアント2   |
| ...              |   ...          | ...   |

`hoge000:/home`と`hoge000:/opt_share`がNFSのマウント元。マウント先もPATHは同じ。
サーバーとクライアントでOSのバージョンや、CPU、GPUの有無等の環境が異なるので、各計算機で`opt`にはローカライズしたアプリを入れて、本構築環境全体にわたって、共有したいものを`/opt_share`として準備して、NFSでマウントする。

# 準備
## ホスト名の恒久的変更

`hostnamectl set-hostname hoge000`でホスト名を`hoge000`に変更。`hoge001`, `hoge002`も同様に。

## NISクライアント管理用アカウントの作成(クライアント)

ユーザー名がNISのサーバーとクライアントで被っていると、(設定にもよるが)NISサーバーのユーザーにしかログインできなくなる。
一方で、管理用アカウントはNISクライアントのローカルにもあった方が良い(RedHat系と違ってrootを使わずsudoを使うので)ので、専用アカウントを作っておくと便利。

```bash
sudo adduser kanri_hoge001 #ユーザー追加
```
```bash
sudo gpasswd -a kanri_hoge001 sudo #該当ユーザーにsudo権限追加
```
管理用アカウント`kanri_hoge001`のUID, GIDがNISサーバーに用意されているものと重なるといろいろトラブるので(`kanri_hoge001`を指定したつもりが、NISサーバーの同じUIDを持っているアカウントだとみなされてしまうとか)、UID/GIDを1000大きな数字にしておく
```bash
sudo usermod -u 2000 kanri_hoge001 #最初に割り振られたUIDが1000だったと想定
sudo groupmod -g 2000 kanri_hoge001 #最初に割り振られたGIDが1000だったと想定
```

確認は`/etc/passwd`, `/etc/group`を読むか、`id`コマンドで正しく設定されているか確認。

<font color="red">この作業をし忘れてNIS/NFSのセットアップを終え、運用を始めた後に対処しようとすると、変更箇所が多岐にわたるので、できるだけ早い段階で行っておいた方がよい。</font>(たくさんあるファイルのpermissionとかを`chuser`, `chgrp`などで修正する必要があるし、複数ログインなどでロックされていてファイルの属性が変えられなかったりで、`/etc/passwd`, `/etc/group`の直書換等が発生した実例があるため。)

# NIS+NFSサーバー
NISとNFSのサーバーの設定はどちらを先にやってもよい。
## NISサーバーの設定

お世話になりまくったリファレンス: [自作クラスタ計算機:nisの基本設定 [雑多な記録]](http://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=%E8%87%AA%E4%BD%9C%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E8%A8%88%E7%AE%97%E6%A9%9F:nis%E3%81%AE%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A)

### インストール
OS: Ubuntu 20.04

`sudo apt install nis`でNISをインストール。
この際に、NISDOMAINを尋ねられるので、適当に`hoge`や`hoge.hogehoge.co.jp`等と適当なドメインを埋める。

ドメイン名は`domainname`コマンドで確認できる。

### NISサーバーの設定

```console:/etc/defaults/nis(抜粋)
# Are we a NIS server and if so what kind (values: false, slave, master)?       
NISSERVER=master

# Are we a NIS client?                                                          
NISCLIENT=false
```

### NISサーバーのアドレスを指定

```console:/etc/yp.conf(抜粋)
# ypserver ypserver.network.com          
ypserver 192.168.xxx.yyy
```

### 

```console:/etc/ypserv.securenets(抜粋)
# Always allow access for localhost
255.0.0.0       127.0.0.0

# This line gives access to everybody. PLEASE ADJUST!
#0.0.0.0                0.0.0.0
255.255.255.0          192.168.xxx.0
```

### NISを再起動

```console
sudo systemctl restart rpcbind
sudo systemctl restart nis 
```
なんでかわからないけれど、nisの方のデーモンの起動に時間がかかる。(2分くらい)

### データベースの更新

`sudo /usr/lib/yp/ypinit -m`
```console:出力
At this point, we have to construct a list of the hosts which will run NIS
servers.  hoge000 is in the list of NIS server hosts.  Please continue to add
the names for the other hosts, one per line.  When you are done with the
list, type a <control D>.
	next host to add:  hoge000
	next host to add:  (ここで、ctrl + D を入力)
The current list of NIS servers looks like this:

hoge000

Is this correct?  [y/n: y]  y
We need a few minutes to build the databases...
Building /var/yp/hoge.hogehoge.co.jp/ypservers...
Running /var/yp/Makefile...
make[1]: ディレクトリ '/var/yp/hoge.hogehoge.co.jp' に入ります
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating hosts.byname...
Updating hosts.byaddr...
Updating rpc.byname...
Updating rpc.bynumber...
Updating services.byname...
Updating services.byservicename...
Updating netid.byname...
Updating protocols.bynumber...
Updating protocols.byname...
Updating netgroup...
Updating netgroup.byhost...
Updating netgroup.byuser...
Updating shadow.byname...
make[1]: ディレクトリ '/var/yp/hoge.hogehoge.co.jp' から出ます

hoge000 has been set up as a NIS master server.

Now you can run ypinit -s hoge000 on all slave server.

```
## NFSサーバーの設定

### インストール
` sudo apt install nfs-kernel-server`でNFSサーバーをインストール。

### NFSサーバーの設定

```:/etc/exports(抜粋)
/home  192.168.x.0/255.255.255.0(rw,async)      #読み書き許可、非同期
/opt_share  192.168.x.0/255.255.255.0(rw,async) #読み書き許可、非同期
```

### 設定の反映
`sudo systemctl restart nfs-server`でサービス再起動。

`sudo exportfs`で正しく設定出来ているか確認できる。

# NIS+NFSクライアント
コメント: NISでアカウント共有はできていなくとも、ひとまずNFSは確認ができるので、まずはNFSクライアントの設定をして動作確認後、NISクライアントの動作確認をした方がスムーズだと思う。

## 管理用アカウント作成と`$HOME`の移動
Ubuntuはrootが個別にユーザーとして用意されておらず、基本sudoで管理者権限を利用する。NFSで、NISサーバーのアカウントを`/home`にマウントするとすると、クライアント側の既存ユーザーの`$HOME`用ディレクトリを移動しておいた方が良い。

### `$HOME`用ディレクトリの移動
各ユーザーの`$HOME`は`/etc/passwd`に記載がある。これをユーザーごとに変えていく。
インストール直後は`/home`にユーザーがあるはずなので、これを`/home_hoge001`みたいな名前の場所に変える。

```bash:/etc/passwd(抜粋)
kanri_hoge001:x:2000:2000:,,,:/home/kanri_hoge001:/bin/bash
```
を
```bash:/etc/passwd(抜粋)
kanri_hoge001:x:2000:2000:,,,:/home_hoge001/kanri_hoge001:/bin/bash
```
(UID/GIDはNISサーバーと被らないように1000番ずらしてある)

そのあとに、`/home`を`/home_hoge001`にリネーム:
```bash
sudo mv /home /home_hoge001
```
(フォルダ利用している状態でこれをするとデッドロックしそうなものだけれど、特に問題はない。)

この状態で一度ログアウトしてからログインして、`pwd`で場所を確認したり`echo $HOME`で場所を確認して所望の箇所になっていることを確認する。

コメント: 計算機の仕様として`/home`に専用のディスク等がマウントされている場合は、`/home_hoge001`を作った後に`sudo umount /home`して`sudo mount /home_hoge001 disk_id`でマウント先を変える。

### NISサーバーのユーザー共有用ディレクトリを作成

`sudo mkdir /home`でNISサーバーの`$HOME`ディレクトリをマウントする用のディレクトリを作成。

## NFSクライアントの設定

### インストール
`sudo apt install nfs-common`でインストール。

### 手動マウントテスト

`sudo mount -t nfs hoge000:/home /home`, `sudo mount -t nfs hoge000:/opt_share /opt_share`でマウントできていることを確認する。
例えば`df -h`で
```console:(抜粋)
hoge000:/home       1.8T   52G  1.7T   3% /home
hoge000:/opt_share  1.8T   52G  1.7T   3% /opt_share
```
のような感じでマウントされていることがわかる。

これを自動マウントするためには`/etc/fstab`に
```bash:/etc/fstab(抜粋)
hoge000:/home              /home      nfs  defaults 0 0
hoge000:/opt_share         /opt_share nfs  defaults 0 0
```
を追記する。
この状態で`sudo umount /home`でアンマウント、`sudo mount /home`マウントして正常にマウントできていれば設定は完了。次回は起動時に自動でマウントされるようになる。


## NISクライアントの設定

###  インストール
OS: Ubuntu 22.04

`sudo apt install nis`でインストール。(20.04の時と異なり、NISドメインはこの時点では聞かれなかった。

### NISサーバーのアドレスを指定

```console:/etc/yp.conf(抜粋)
# ypserver ypserver.network.com          
ypserver 192.168.xxx.yyy
```
### NISで管理する項目を設定
`passwd`, `group`, `shadow`, `hosts`をNISで管理する項目にする。コロン(:)の右の項目の第一項目に`nis`の文字を足す。

```:/etc/nsswitch.conf(抜粋)
passwd:         nis files systemd sss
group:          nis files systemd sss
shadow:         nis files sss
gshadow:        files

hosts:          nis files mdns4_minimal [NOTFOUND=return] dns
```

### domainnameの指定
インストール時に聞かれなかったドメイン名を指定。
```:/etc/defaultdomain(自身で作成)
hoge
```

以上のファイルを作って、`sudo systemctl enable --now ypbind`で反映完了。`domainname`コマンドで期待通りのドメイン名が出ることを確認。`ypwhich`でサーバーのホスト名が出ていれば問題なし。

### NISクライアント再起動

`sudo systemctl restart rpcbind ypbind`

`sudo systemctl restart rpcbind nis`

(上記 domainameの指定 をしておかないと、`ypbind`が立ち上がっていないのでこのコマンドはエラーを返す。)

### トラブルシューティング

#### `systemctl status nis`を入力すると`Unit nis.service could not be found.`という出力が返ってくる。

Ubuntu22.04では、これはnisではなくて、ypbindになっている。
つまり、Ubuntu20.04でデーモン名としてnisだったものは基本的にすべてypbindに差し替える必要がある。

この辺の事情[Ubuntu 22.04 LTS で NIS Client を設定する #Ubuntu - Qiita](https://qiita.com/Mine02C4/items/d6d5c0731734b4fd7e3c)だろうか。

#### `/etc/defaults/nis`の設定していないのに動いている...