QNAP NAS (でなくても構いませんが)の共有フォルダをLinuxマシンの/homeとしてマウントできるように設定することで、複数台のLinuxマシンでユーザーのホームディレクトリを一元化できるようになります。こうすると、Linuxマシンが複数あるときにデータや設定ファイルのコピーとかをしなくて済むので、使いやすくなります。ただし、/homeがNFS経由でアクセスが遅くなるので、接続は10GbEなどの高速なものを使うことを推奨します。また、複数台のLinuxマシンで同時に同一のファイルに書き込みを行うと壊れますので、そうならないように注意が必要です。ディスクアクセスの激しい処理は、/workなどにマウントしている高速なSSD領域上で行うようにします。

前提

QNAP NASとUbuntuマシンは192.168.99.0/24のネットワークに固定IPで接続されていると仮定します。QNAP NASのIPが192.168.99.1、Ubuntuマシンは192.168.99.2としておきます。

QNAP NASでの設定

QNAP NASの管理画面にログインし、「コントロールパネル→ネットワークとファイル→Win/Mac/NFS/WebDAV→NFSサービス」を開いて「NFS v2/v3サービスを有効にする」にチェックを入れて「適用」を押すと有効になります。v4サービスは無効化しておきます。

次にQNAP NASとUbuntuに共通するユーザーを作成します。ここではhogehogeとfugafugaを追加します。ただし、NFSではユーザー名とパスワードではなく、UIDとGIDでファイルの権限が管理されているので、QNAP NASとUbuntuでアクセスするユーザーのUIDとGIDは揃えておく必要があります。Ubuntuマシンが複数ある場合も同様です。

UID・GIDを指定してのユーザーアカウント作成

QNAP NASでUIDとGIDを確認、操作するには、SSH接続するしかありません。そこで、「コントロールパネル→ネットワークとファイルサービス→Telnet / SSH」を開き、「SSH接続を許可する(管理者だけがリモートログインできます)」にチェックを入れ、「アクセス許可の編集」ボタンを押して適当な管理者アカウントにチェックを入れて「適用」を押します。コントロールパネルの画面でも「適用」を押して下さい。これでSSH接続が可能になります。ただ、admin以外のアカウントではsudoができないかもしれません。QNAPはadminを無効化することを推奨しているので、無効化している場合はsudoが実行不可能になってしまいます。その場合は、一時的にadminを有効化してSSHでログインし、以下のコマンドでsudoersファイルを編集します。

vi /usr/etc/sudoers

sudoersに追加するのは以下の行になります。

%administrators ALL=(ALL) ALL

これでadministratorsグループのユーザー(QNAP NASの管理者アカウント)はsudoできるようになります。ただし、再起動の度にリセットされてしまいますので注意しましょう。

次はSSHでQNAP NASにリモートログインし、以下のコマンドでhogehogeのUID・GIDを1101、fugafugaのUID・GIDを1102に設定してユーザーを作成します。

sudo useradd --uid 1101 --user-group hogehoge
sudo passwd hogehoge
sudo useradd --uid 1102 --user-group fugafuga
sudo passwd fugafuga

QNAP NASへのユーザーの追加はこれで完了です。

共有フォルダの設定

次に共有フォルダーの設定を行います。「コントロールパネル→権限設定→共有フォルダー」を開き、/homeとしてマウントしたい共有フォルダー(ここではhomesとする)を作成または選択してプロパティの編集画面を開きます。「ファイルのロック(oplocks)」にのみチェックを入れ、他はチェックを外して「OK」ボタンを押して閉じます。

同じフォルダーの「共有フォルダーの権限の編集」を開き、「権限タイプの選択」で「ユーザーとグループの権限」を選択し、「追加」ボタンを押して下さい。開いた画面でhogehogeとfugafugaの右側の「RW」のカラムにチェックを入れて「追加」を押します。さらに「適用」を押すことで、読み書き権限をhogehogeとfugafugaに与えることができます。

同じ画面のまま「権限タイプの選択」で「NFSホストのアクセス」を選択、「アクセス権」にチェックを入れ、「sync」と「secure」はチェックを外し(QTS 4.3.xではこれらのチェックボックスはない)、「許可するIPアドレスまたはドメイン名」には下記の1項目のみを残して削除します。

  • ホスト / IP / ネットワーク: 192.168.99.0/24
  • セキュリティ: sys または 空欄(QTS 4.3.xではこの項目はない)
  • 権限: 読み取り/書き込み
  • Squashオプション: ユーザーなしのスカッシュ(QTS 4.3.xではNO_ROOT_SQUASH)
  • 匿名GID: guest
  • 匿名UID: guest

終わったら「適用」を押して「閉じる」。これでQNAP NAS側の設定は完了です。なお、管理画面で行う操作は、SSH接続してQCLIを使うことでも可能です。qcliコマンドとqcli_*コマンド類を実行すれば使い方が表示されます。

Ubuntuマシンでの設定

ここからはUbuntu側での設定です。

UID・GIDを指定してのユーザーアカウント作成

QNAP NASと同様に以下のコマンドでユーザーを追加します。

sudo useradd --uid 1101 --user-group hogehoge
sudo passwd hogehoge
sudo useradd --uid 1102 --user-group fugafuga
sudo passwd fugafuga

なお、管理者権限を与えるユーザーには「 --groups sudo」オプションを追加してsudoできるようにしましょう。

NFSマウントの前準備とマウント

次に、以下のコマンドでNFSマウントのための機能をインストールします。

sudo apt install -y nfs-common

以下のファイルのドメイン名を編集します。

sudo ne /etc/idmapd.conf

変更点は以下の通り。

Domain = 適当なドメイン名(hogehoge.lanとかhogehoge.tohoku.ac.jpとか)

以下でNFSマウントのテスト。USERNAMEは適宜置換して下さい。

mkdir -p /home/USERNAME/hogehoge
sudo mount -t nfs 192.168.99.1:/homes /home/USERNAME/hogehoge
df
sudo umount /home/USERNAME/hogehoge

/etc/fstabによる起動時のマウント

正常にマウント・アンマウントできることを確認したら、以下のコマンドでfstabを編集します。

sudo ne /etc/fstab

fstabの追加内容は以下の通りです。

192.168.99.1:/homes /home nfs defaults 0 0

再起動する前に、/homeはすっからかんにしておきます。必要なファイルは予めバックアップしておきます。

sudo rm -rf /home/*

あとは再起動して、dfなどで正常に/homeがNFSでマウントされているかを確認します。

autofsによる動的なマウント

autofsを用いてユーザーがログインしたときに動的にマウントするようにすることもできます。アクセスがないときは自動的にアンマウントされ、アクセスされるとまたマウントします。この方がサーバにかける負荷は軽くなります。まずはautofsを入れます。

sudo apt install -y autofs

/etc/auto.masterを編集します。

sudo ne /etc/auto.master

以下の行を追加します。

/-    /etc/auto.home

/etc/auto.homeを作成します。

sudo ne /etc/auto.home

内容は以下の通り。

/home    -fstype=nfs,rw    192.168.99.1:/homes

再起動する前に、/homeはすっからかんにしておきます。必要なファイルは予めバックアップしておきます。

sudo rm -rf /home/*

あとは再起動して、dfなどで正常に/homeがNFSでマウントされているかを確認します。なお、/etc/fstabでの/homeのマウントは無効化しておく必要があります。

ネットワーク接続の冗長化と負荷分散(teamingあるいはbonding)

ネットワーク接続を複数束ねることで冗長化と負荷分散が可能です。設定するには、まずHUB側がLAG (Link Aggregation Group)とLACP (Link Aggregation Control Protocol・IEEE 802.3ad)に対応しているかを確認します。対応していない場合はモードとしてbalance-albを、対応している場合は802.3adを使用することを推奨します。

Ubuntu Serverとその他のDesktop系フレーバーではネットワークの設定方法が異なります。Desktop系フレーバーではNetworkManagerが使われていますので、まずこちらの設定を説明します。下記のようにNetworkManagerのCLI設定コマンドnmcliを叩くことで設定します。

# Make bonding port
sudo nmcli connection add type bond ifname bond0 con-name CONNECTIONNAME bond.options "mode=MODE,xmit_hash_policy=layer3+4,miimon=100"
# Add network devices to bonding port
sudo nmcli connection add type ethernet ifname DEVICENAME1 master bond0
sudo nmcli connection add type ethernet ifname DEVICENAME2 master bond0

MODEにはbalance-alb802.3adを入力します。CONNECTIONNAMEは適当なわかりやすい名前を付けて下さい。DEVICENAME1とDEVICENAME2はデバイス名です。nmcli device showで一覧が出ますので、その中から選びます。上記の例では2つでbondingを設定していますが、3つ以上でbondingすることも可能です。xmit_hash_policy=layer3+4は、モードが802.3adのときだけ付けます。また、802.3adでも環境によってはうまく動作しないので、その場合はxmit_hash_policy=layer2+3に変更します。設定したら再起動して、再起動後にnmcli connection shownmcli device showip addressを実行して状態を確認します。

Ubuntu Serverで使われているNetplan.ioの場合、/etc/netplan/にあるyamlファイルを編集して設定します。デフォルトでは/etc/netplan/00-installer-config.yamlではないかと思います。編集前に、ip addressコマンドを実行して、bondingに参加させるネットワークポートのデバイス名を把握しておきます。ここではDEVICENAME1とDEVICENAME2でbond0を作成する例を示します。以下のコマンドでエディタを起動します。

sudo ne /etc/netplan/00-installer-config.yaml

/etc/netplan/00-installer-config.yamlの内容は以下の通りです。

network:
  ethernets:
    DEVICENAME1:
      dhcp4: false
      dhcp6: false
    DEVICENAME2:
      dhcp4: false
      dhcp6: false
    DEVICENAME3:
      addresses:
      - IPアドレス
      gateway4:
      - ゲートウェイIPアドレス
      nameservers:
        addresses:
        - DNSサーバIPアドレス
        search:
        - DNS検索ドメイン
  bonds:
    bond0:
      interfaces:
      - DEVICENAME1
      - DEVICENAME2
      parameters:
        mode: MODE
        transmit-hash-policy: layer3+4
        mii-monitor-interval: 100
      addresses:
      - IPアドレス
      gateway4:
      - ゲートウェイIPアドレス
      nameservers:
        addresses:
        - DNSサーバIPアドレス
        search:
        - DNS検索ドメイン
  version: 2

設定したら再起動して、再起動後にnmcli connection shownmcli device showip addressを実行して状態を確認します。

ジャンボフレームの有効化

もし機材が「ジャンボフレーム」と呼ばれる技術に対応しているなら、MTUという値を変更することでジャンボフレームを有効化することができます。これにより通信速度が向上します。NetworkManagerの設定・確認は下記のように行います。

# Change MTU value
sudo nmcli connection modify CONNECTIONNAME 802-3-ethernet.mtu 9000
sudo nmcli device modify DEVICENAME 802-3-ethernet.mtu 9000
# Check MTU value
ip a
# Test connection
ping -v -c5 -M do -s 8972 IPADDRESS

CONNECTIONNAME・DEVICENAMEはNetworkManagerでの接続名・デバイス名です。nmcli connection shownmcli device showでも表示できますし、modifyまで入力してからスペースを入れてタブキーを押せば候補として表示されるはずです。IPADDRESSはQNAP NASのIPアドレスを指定します。

NetworkManagerではなくNetplan.ioを使用している場合、/etc/netplan/にあるyamlファイルを編集して設定します。ファイル内の当該インターフェイスのaddressesと同じ階層にmtu: 9000を加えて再起動します。

この記事ではユーザー名とパスワード、UID、GIDを全て手動でQNAP NASとUbuntuマシンで統一する前提で記述しています。しかしこれは大変面倒なので、実際の運用ではLDAPサーバかドメインコントローラ(Microsoft Active Directoryのサーバ)を使って認証機能を持ったサーバを立てることをおすすめします。これらの機能はQNAP NASにありますので、どちらかを有効化して、Ubuntu側ではQNAP NASが提供する認証情報を参照してユーザー認証を行うように設定するのが良いでしょう。長くなったのでこの方法は別の記事にて解説します。