NASとLDAPとLTSPとSingularityで構築する管理コストゼロな計算機クラスタ

## 第1章 はじめに

### 背景と目的

計算機サーバー群の運用と管理は、多くの研究者とその研究室にとって必須の課題です。情報科学系に限らず、多種多様な研究分野において、学生や教員が運用する小規模な共用計算機ノードが存在しています。これらのノードは時間と共に陳腐化し、求められるソフトウェアも日々進化しています。これらの変化に対処するため、定期的なメンテナンスが不可欠であり、新しい計算機ノードの導入も多くの手間と時間を要します。

本章では、これらの課題に対する解決策として、NAS(Network Attached Storage)を中心に据えた統合管理システムについて概説します。このアプローチにより、アカウント、ファイル共有、さらには各計算機ノードのOSを含むソフトウェアまで、NASで一元管理することで、管理コストを大幅に削減することが可能となります。

### 本チュートリアルの対象者

本記事は、計算機サーバー群の構築および運用に関与する研究室の主任研究者、テクニシャン、研究室メンバーを対象としています。さらに、企業の小規模な計算機サーバー群を運用する担当者や、個人の計算機サーバーの管理にも適用可能です。本記事は、具体的な手順や専門的なノウハウを提供するため、IT管理者やシステムエンジニアにも有用です。

### 必要な前提知識とスキル

本記事は、Linuxやネットワークに関する基本的な知識を一定程度前提としています。それでも、専門的な知識は最小限に抑え、多くの利用者が容易に理解できるように努力しています。不明な用語や概念に遭遇した場合は、インターネットや専門文献を参照しながら進めてください。本記事が参考になったと感じた方は、コメント欄でフィードバックをお寄せいただけると幸いです。

### 使用する技術スタックの概要

本記事で採り上げる主要な技術要素には、NAS、VM、LDAP、NFS、LTSP、Singularityが含まれます。これらの技術を総合的に活用して、効率的かつ安定した計算機サーバー群の運用を実現します。各技術要素に関する詳細な説明は、次章以降で展開します。


## 第2章 基本概念の理解

### NAS（Network Attached Storage）

NASはネットワークに直接接続されるストレージシステムであり、主にファイルの保存と共有を担当します。簡単に言えば、ファイル共有に特化した計算機と見なすことができます。商用のファイルサーバーに比べて、NASは低コストで、非専門家でも容易に管理可能です。ただし、商用ファイルサーバーにはない専門的なサポートや拡張性に関する制約も存在します。本記事では、特にSynology社のNASに焦点を当て、その設定や活用方法を詳述します。

### VM（Virtual Machine）

VMは物理的な計算機をエミュレートする仮想計算機です。VMの使用によって、物理ハードウェアから独立した環境を短時間で構築可能であり、またバックアップも容易です。Synology NASにはVMの作成機能も提供されており、その活用により多くのサービスをホストできます。

### LDAP（Lightweight Directory Access Protocol）

LDAPは、ユーザー認証やディレクトリサービスを提供するプロトコルです。LDAPの導入によって、共用計算機ノード（LDAPクライアント）で一元化されたアカウントを使用してログインできます。Synology NASにはLDAPサーバー機能が備わっており、これによりNAS自体も一元管理が可能です。さらに、ユーザー管理や、追加、削除もGUIを介して容易に実施できます。

### NFS（Network File System）

NFSは、ネットワーク越しにファイルシステムを共有するプロトコルです。NFSを使用することで、各計算機ノードで同一のホームディレクトリが利用可能となります。Synology NASでは、ユーザーホーム機能とNFSを連携させ、一元的なファイル共有環境を構築できます。

### LTSP（Linux Terminal Server Project）

LTSPは、ネットワークを通じてLinux環境を各計算機ノードに提供するシステムです。これにより、各ノードでOSをインストールすることなく、PXEブートでネットワークからOSイメージを配信して起動します。各ノードは、事前に構築済みのOSイメージを使用するため、個別のソフトウェア設定やインストールは不要です。また、OSやプログラムの実行は各ノードのリソースを用いて行われ、GPUやFPGAも活用可能です。

### Singularity

Singularityは、コンテナ環境を提供するプラットフォームです。これにより、各利用者はユーザー権限で様々なコンテナ環境を実行可能です。特に、科学技術計算の用途でよく使用されます。この技術の利点として、各利用者が自分で環境を構築できるため、システム管理者の負担が軽減されます。また、コンテナは各利用者のユーザーディレクトリに保存されるため、OSイメージの肥大化を防ぐことができます。唯一のデメリットは、利用者が新しい技術に慣れるまでの学習コストが必要であることですが、これはシステム運用コストとのトレードオフと考えられます。

![DALL·E 2023-10-13 11.56.07 - Vector design of a network configuration. Starting from the left, an Internet cloud icon is linked to a router, which is then linked to a NAS system. .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68704/9bb772c4-6390-1128-78a0-1e05c4ce70c0.png)


## 第3章 ハードウェアとネットワークのセットアップ

これらのハードウェアとネットワークのセットアップを整備することで、次章からのNASの環境設定がスムーズに進行します。適切なハードウェアとネットワーク構成は、システムの安定した運用に寄与します。したがって、慎重な選定が求められます。

### 最小要件と推奨要件

本システムの構築には、複数のハードウェア要件が存在します。以下で最小要件と推奨要件を説明します。ユーザーは、自身のニーズや予算に応じて、これらの要件を参考に適切なハードウェアを選定することができます。

- **メインのNAS**: Synology NAS、4ベイ以上のモデルを推奨します。特に推奨されるモデルは [**DS1821+**](https://www.synology.com/ja-jp/products/DS1821+) です。HDDは2冗長+ホットスワップを推奨します。ホットスワップは、ストレージに故障があった場合に自動でHDDを交換する機能です。これにより、HDDが故障した場合でもデータの安全性を確保しつつ、迅速に交換作業が可能です。
- **バックアップ用NAS（オプション）**: データの安全性を高めるため、バックアップ用のNASも考慮することを推奨します。特に [**DS1522+**](https://www.synology.com/ja-jp/products/DS1522+) 以上のモデルが推奨されます。HDDは1冗長で十分と考えられますが、安全性が必要な場合は2冗長+ホットスワップを選定してください。
- **NAS用のHDD**: 必要容量の約3倍を目安に選定します。Synology互換のHDDを推奨します。例えば、全体で共有ファイルに40TBが必要な場合、主用途に2冗長で10TB＊6本と、ホットスワップ用に1本、バックアップ用に1冗長で10TB＊5本を用意します。合計では120TB（10TB＊12本）が必要となります。さらに、交換用の予備も用意することが重要です。
- **NAS用のSSD（オプション）**: ストレージのキャッシュとして、性能向上を目的とします。特に、メインNASに対しては1TB以上のM.2 SSDを2本用意することを推奨します。余裕があれば、バックアップ用NASにも2本用意してください。Synology互換のSSDを選定することが推奨されます。
- **計算機ノード**: システムを確認するためには、計算機ノードを1台以上用意することが必要です。最低要件は特にありませんが、推奨はメモリ16GB以上、SSD 1TB以上です。ストレージは必須ではありませんが、SSDをファイル共有のキャッシュとして利用することも可能です。本ガイドでは、テスト用にNvidia GPUを含むノードでの確認も行います。
- **無停電電源装置（UPS）（オプション）**: 急な停電や雷などからシステムを守るため、Synology互換のUPSの利用も考慮することが推奨されます。

### ネットワーク構成

ネットワークには、特定の要件が存在します。すべてのマシンは1Gbps以上のネットワークに接続されている必要があります。また、すべてのマシンは同一のLANに所属する必要があります。DHCPは、ルーターから提供されることが望ましいですが、Synology NASからも提供可能です。(なお、本記事にDHCPの説明はありません)

## 第4章 NASのセットアップと構成

### NASのハードウェアのセットアップ

メインのNASは**LABHUB**と呼ぶことにします。セットアップは、物理的な接続から始めます。本節では **Synology DS1821+** を例に挙げますが、他のモデルでも基本的な手順は同様です。

1. **SSDの挿入（オプション）**: キャッシュ用のSSDを2本セットします。
2. **HDDの挿入**: 適切な数のHDDを挿入します。
3. **LANケーブルの接続**: 1GbE以上のLANに接続します。
4. **電源の接続**: UPSまたは電源コンセントに電源ケーブルを接続します。
5. **電源のオン**: 電源スイッチをオンにします。

### NASへのアクセスとDSMのインストール

1. **NASにアクセスする**: 同一のLANに接続されたPCから[Synology Web Assistant](http://find.synology.com)を開き、NASにアクセスします。見つからない場合は、[Synology Assistant](https://www.synology.com/ja-jp/support/download/DS218j?version=7.2#utilities)をダウンロードしてください。
2. **DSMのインストール**: 画面の指示に従ってDiskStation Manager（DSM）をインストールします。インストールが完了すると、NASは自動的に再起動し、ピーという音が鳴ります。

### NASの初期設定

再起動が完了したら、以下の初期設定をWEBブラウザを使用して行います。使用するバージョンによっては、手順が若干異なる可能性があります。

1. **初期アカウントの設定**: デバイス名や管理者アカウントを設定します。この記事では以下のように設定しますが、環境に合わせて適宜書き換えて下さい。
   - デバイス名: "LABHUB"
   - 管理者アカウント: "sabakan"
   - パスワード: 適切なものに設定します。
   - **Web Assistantで表示してください**にチェックを入れる
2. **更新設定**: DSMとパッケージの更新を**重要なDSMとパッケージの更新のみを自動的にインストールする**に設定します。
3. **Synologyアカウントにログイン**: Synologyアカウントにログインするか、新規アカウントを作成します。このアカウントは、外部ネットワークからのNASへのアクセスや、異常アラートの通知に使用されます。アカウントの作成をおすすめします。
4. **QuickConnectIDの設定**: 外部ネットワークからのアクセス用にURLを設定します。ここでは"labhub1234"とします。
5. **その他の便利なツール**: この段階での設定は特に必須ではありません。全項目を有効にしておくことをお勧めします。特に、**Active Insights**は便利です。**送信**ボタンをクリックして完了です。

### ストレージプールの設定

1. **再ログイン**: ページがリロードされたら、先程設定したアカウントでログインします。おすすめのアプリのインストールや2FA（二要素認証）はスキップします。
2. **ストレージプールの設定**: ストレージプールとボリュームの作成を行います。**今すぐ作成**ボタンをクリックし、**起動**ボタンをクリックします。
3. **ストレージプールのプロパティを設定**: `SHA-2`を選択し、**次へ**ボタンをクリックします。
4. **ドライブの選択**: ホットスワップ用に1台のHDDを残し、その他の全てのHDDを選択します。**次へ**ボタンをクリックし、**続行**ボタンをクリックします。
5. **ボリューム容量の割り当て**: `最大容量`を選択し、**次へ**ボタンをクリックします。
6. **ファイルシステムの選択**: `Btrfs`を選択し、**次へ**ボタンをクリックします。
7. **暗号化の設定**: **ボリュームを暗号化しない**を選び、**次へ**ボタンをクリックします。
8. **設定の確認**: **適用**ボタンをクリックし、**OK**ボタンをクリックします。
9. **ホットスペアの設定（オプション）**: **ストレージマネージャ** > **Hot Spare**をクリックし、ホットスペアを設定します。
10. **SSDキャッシュの設定（オプション）**: ストレージマネージャ > 作成▼ > SSDキャッシュの作成、を選択し、読み書きキャッシュをRAID 1で設定します。**全てのmetadataをSSDキャッシュにピン留めする**にチェックを入れます。

### NASのその他の設定

1. **固定IPの設定**: コントロールパネル > ネットワーク > ネットワークインターフェイス > 該当LANを選択して編集 > IPv4 > 手動で設定する ここからLANの環境に合わせて固定IPを設定します。
2. **UPSの設定（オプション）**: コントロールパネル > ハードウェアと電源 > UPSを開いて、UPSの設定を行います。具体的な設定方法は使用するUPSによって異なりますので、マニュアルを参照してください。

以上で、LABHUBの基本的なセットアップと初期設定が完了です。次章では、これらのNASを活用したユーザー管理やデータ共有の設定を行います。

## 第5章 バックアップの構成（オプション）

バックアップはデータ保全の観点から非常に重要です。ここでは、オプションとしてバックアップ用のNAS（以後、"BACKUP"と呼びます）を設定し、メインのNAS（"LABHUB"）からの自動バックアップを構成します。

### BACKUPのハードウェアセットアップと初期設定

まず、BACKUPを物理的にセットアップし、DSMをインストールします。第4章でLABHUBのセットアップを行ったのと同様の手順を踏みますが、ストレージの構成はSHR-1でも構いません。また、同じUPSを使用する場合、ネットワークUPS機能を利用する設定が必要です。

### バックアップ用フォルダの作成

次に、バックアップ用のフォルダをBACKUP上に作成します。

1. **コントロールパネル** > **共有フォルダ**を開きます。
2. **作成** > **共有フォルダの作成**を選択します。
3. 名前を"BACKUP"、場所を"ボリューム1"として、**次へ**をクリックします。
4. 追加的なセキュリティ設定はデフォルトのままで、**次へ**をクリックします。
5. チェックサムを有効化とファイル圧縮を有効に設定し、**次へ**をクリックします。
6. 設定の確認画面で**次へ** > **適用**をクリックします。
7. **コントロールパネル**を閉じます。

### Hyper Backup Vaultのインストール

BACKUP上でバックアップデータを受け取るため、**Hyper Backup Vault**をインストールします。

- **メインメニュー** > **パッケージセンター** > **Hyper Backup Vault**を選択し、**インストール**をクリックします。
- インストールが完了したら、BACKUPのページは閉じて構いません。

### Hyper Backupのインストールと設定

LABHUBに戻り、**Hyper Backup**をインストールし、バックアップの設定を行います。

1. **メインメニュー** > **パッケージセンター** > **Hyper Backup**を選択し、**インストール**をクリックします。
2. **Hyper Backup**を開きます。
3. バックアップタイプを"全システム"を選択し、**次へ**をクリックします。
4. バックアップ先として"リモートNASデバイス"を選択し、**次へ**をクリックします。
5. バックアップ先の設定で、BACKUPのIPアドレスを入力し、**ログイン**をクリックしてログインします。その後、共有フォルダを"BACKUP"、ディレクトリを"LABHUB_1"と設定し、**次へ**をクリックします。
6. バックアップの設定はデフォルトのままで**次へ**をクリックします。
7. ローテーション設定もデフォルトのままで**次へ**をクリックします。
8. **完了**をクリックします。
   
注意: システムが再起動を要求する場合もありますが、ストレージプールの設定直後はバックグラウンドタスクが実行中の可能性があるため、全ての設定が終わり、都合が良いタイミングでNASを再起動し、バックアップを有効にしましょう。

これで、毎日午前3時にLABHUBの全ての差分がBACKUPに自動でバックアップされる設定が完了しました。BACKUPに関する説明はこの章で終了します。以後の記事の説明は全てLABHUBに対する説明であることに注意して下さい。

## 第6章 LDAPサーバーの構築と設定

### LDAPサーバーのインストール

1. パッケージセンター > LDAP Server > インストールを選択し、LDAPサーバーを**LABHUB**にインストールします。
2. インストールが完了したら、**開く**をクリックします。
3. **LDAPサーバーを有効にする**にチェックを入れ、FQDN（Fully Qualified Domain Name）には、所持しているドメイン（例: `mylab.myuniv.ac.jp`）を入力します。LDAPのための一意なパスワードも作成し、**適用**をクリックします。注意: ここで表示されるBase DNとBind DNは後で参照するので、メモしておいてください。
4. **ユーザーの管理** > **詳細** > 「管理者がパスワードをリセットした後で、ユーザーのパスワード変更を強制します」をONにします。

### 最初のユーザーの作成

1. **ユーザーの管理** > **ユーザー** > **作成**をクリックします。
2. 名前にはログインに使用するユーザー名（小文字推奨）を、初期パスワードには適切なパスワードを入力します。
3. **グループの結合**: デフォルトのまま**次へ**をクリックします。
4. **その他の属性**: 空欄のまま**次へ**をクリックします。
5. **完了**をクリックします。

### LDAPサーバーとNASの接続

1. **コントロールパネル** > **ドメイン/LDAP** > **参加**を選択します。
2. サーバータイプを`LDAP`にし、サーバーアドレスに`localhost`を入力し、**次へ**をクリックします。
3. Bind DNには先ほどメモしたものを使用し、パスワードを入力します。Base DNも先ほどメモしたものを使用し、**次へ**をクリックします。
4. **LDAPディレクトリを確認して参加する**を選択し、全てがOKになったら**OK**を押します。
5. **LDAPユーザー**に移動し、ここに先ほど追加したユーザーが表示されるか確認します。
6. **ユーザーホーム**をクリックし、「LDAPユーザーに向けたHOMEサービスを有効にする」をクリックして**OK**を押します。

### テストと確認

1. 一度"LABHUB"からログアウトします
2. 先ほど作成したユーザーでログインを試みます
3. File Stationを開いてhomeというフォルダが表示されていることを確認します。(このフォルダがユーザーが自由に使える共有フォルダになっています。)
4. ログインができた場合、LDAPの構築は成功です。これで、LDAPサーバーの基本的な構築と設定が完了しました。
4. TIPS: LDAPにグループを`sudo`という名前で作っておくと、そこに追加されたユーザーはsudo権限が使えるようになるので便利です。


## 第7章 NFSのセットアップとユーザーデータの管理

### NFSサービスの有効化

1. "LABHUB"に管理者アカウントでログインします。
2. **コントロールパネル** > **ファイルサービス** > **NFS**を選択します。
3. **NFSサービスを有効**に設定をONにし、**最大NFSプロトコル**で`NFSv4.1`を選択します。
4. **適用**をクリックして設定を保存します。

### 共有フォルダ「homes」の設定

1. **コントロールパネル** > **共有フォルダ** > `homes`を選択し、**編集**をクリックします。
2. 「**マイネットワークでこの共有フォルダを非表示にする**」をONに設定します。
3. 「**無許可のユーザーにサブフォルダとファイルを見せない**」をONに設定します。
4. **詳細**タブに移動しますが、**ファイル圧縮**はパフォーマンス低下を懸念してONにはしません。

### NFS権限の設定

1. **NFS権限**タブに移動し、**作成**をクリックします。
2. **ホスト名またはIP**にローカルネットワークを指定します（例: `192.168.100.0/24`）。
3. 必要な権限を設定し、**保存**をクリックします。

これでNFSの設定が有効になり、指定されたネットワークからNFS共有にアクセスできるようになります。また、SMBも有効になっているため、WindowsやMacからも各ユーザーがログインして各自のファイルにアクセスできるようになっています。

## 第8章 LTSPの導入

### 事前準備
1. [Get Ubuntu Server](https://ubuntu.com/download/server)からUbuntu Server 22.04のISOをダウンロードします。
2. 管理者として"LABHUB"にログインし、ダウンロードしたISOを自分の`home`ディレクトリ以下に保存しておきます。

### VMインスタンスの設定
1. **パッケージセンター** > **Virtual Machine Manager** > **インストール**を選択します。
2. インストールが完了したら、**Virtual Machine Manager**を開きます。
3. 初回起動ウィザードが表示されるので、指示に従って設定を進めます。
4. **仮想マシン** > **作成** > **"Linux"** > **次へ**を選択します。
5. "一般仕様を構成"で以下を設定し、**次へ**をクリックします。
   - 名前: `LTSP`
   - CPU: 最大の大きさに設定
   - ビデオカード: `vga`を選択
6. ストレージは`100GB`に設定し、**次へ**をクリックします。
7. ネットワーク設定はデフォルトのまま**次へ**をクリックします。
8. "その他の設定"で、以下のように設定し、**次へ**をクリックします。
   - ブートアップ用のISOファイルに先ほど保存したISOを選択
   - 自動スタートを「はい」に設定
9. 電源管理設定はデフォルトのまま**次へ**をクリックします。
10. **構築後に仮想マシンの電源を入れる**にチェックを入れて、**完了**をクリックします。

### Ubuntu 22.04のインストール

1. 作成した仮想マシン`LTSP`を選択し、**接続**をクリックします。
2. Ubuntuのインストールウィザードに従ってインストールを進めます。
   - 言語選択: English
   - キーボードコンフィグ: 適宜設定
   - インストールタイプ: Ubuntu Server
   - ネットワーク設定: 必要に応じて固定IPを設定
   - プロキシ設定: 空欄のまま
   - アーカイブミラー設定: デフォルトのまま
   - ストレージ設定: デフォルトのまま
   - プロファイル設定: 管理者アカウント名、サーバー名、ユーザー名、パスワードを設定
   - OpenSSHのインストール: チェックを入れる
   - Featured Server Snaps: 何もチェックを入れずに進む
3. インストールが完了するのを待ちます。


### Ubuntuの初期設定
1. 管理者アカウントでVMにログインします。
2. 必要なパッケージをインストールします。適宜修正して下さい。ここでは極力重たいツールや外部レポジトリの必要なパッケージは入れないようにします。
   ```bash
   sudo apt upgrade
   sudo apt install avahi-daemon zsh python3-pip vim emacs
   sudo apt install cmake ffmpeg firefox gdb iftop pssh 
   sudo apt install unzip wakeonlan x11-apps zip
   ```
3. タイムゾーンを設定します。
   ```bash
   sudo timedatectl set-timezone Asia/Tokyo
   ```
4. 不要なアップデート通知を無効にします(この設定は個人的な好みです)
   ```bash
   sudo chmod -x /etc/update-motd.d/*
   ```

### LDAPでの認証を設定
1. 必要なパッケージをインストールします。
   ```bash
   sudo apt install sssd
   ```
2. `/etc/sssd/sssd.conf`を作成し、以下の内容を記述します。
   ```ini
   [domain/default]
   id_provider = ldap
   auth_provider = ldap
   chpass_provider = ldap
   ldap_uri = ldaps://192.168.100.200/  # 各自の固定IPにする
   ldap_search_base = dc=mylab,dc=myuniv,dc=ac,dc=jp  # 適宜変更
   ldap_default_bind_dn = uid=root,cn=users,dc=mylab,dc=myuniv,dc=ac,dc=jp  # 適宜変更
   ldap_default_authtok = PASSWORD  # 設定したパスワード
   ldap_id_use_start_tls = false
   ldap_tls_reqcert = never
   access_provider = ldap
   ldap_access_filter = (shadowExpire=-1)
   override_shell = /bin/bash  # ほかのシェルが良い場合は変更
   [sssd]
   services = nss, pam
   domains = default
   ```
   そして、
   ```bash
   sudo chmod 0600 /etc/sssd/sssd.conf
   sudo systemctl restart sssd
   ```
3. LDAPでホームを自動マウントする設定を行います。
   ```bash
   sudo apt install autofs
   ```
   `/etc/auto.master`に以下を追加します。
   ```plaintext
    /home program:/etc/auto.home
   ```
   `/etc/auto.home`を作成し、以下の内容を記述します。(@から始まるドメインの部分を適宜書き換えて下さい。
   ```bash
   #!/bin/bash
   USER=$1
   ID=$(id -u $USER)
   echo "-fstype=nfs -o=defaults,fsc labhub.local:/volume1/homes/@LH-MYLAB.MYUNIV.AC.JP/61/$USER-$ID"
   exit 0
   ```
   そして、実行権限を付与して、AutoFSをリロードします。
   ```bash
   sudo chmod +x /etc/auto.home
   sudo systemctl reload autofs
   ```
4. これで、LDAPの連携とホームディレクトリの同期設定が終わりました。一度ログアウトして、各ユーザーがVMにログインでき、ホームディレクトリが存在し、NASと同期しているかを確認します。ファイルを書き込んでNASと同期が取れているかも確認しましょう。

### LTSPの導入
1. LTSPのリポジトリを追加し、必要なパッケージをインストールします。
   ```bash
   sudo add-apt-repository ppa:ltsp
   sudo apt install ltsp ltsp-binaries dnsmasq nfs-kernel-server openssh-server squashfs-tools ethtool net-tools epoptes
   ```
2. `/etc/ltsp/ltsp.conf`を作成し、以下の内容を記述します。client001の部分には適当な名前を設定し、各計算機ノードのMACアドレスを記述します。
   ```ini
   [clients]
   # SSHを有効にする設定
   KEEP_SYSTEM_SERVICES="ssh"
   POST_INIT_CONFIG_SSH="dpkg-reconfigure openssh-server"
   # バックグラウンドタスクを有効にする設定
   POST_INIT_EDIT_SYSTEMD="perl -p -i -e 's/KillUserProcesses=yes/KillUserProcesses=no/g' /etc/systemd/logind.conf"

   [client001 | c1:23:aa:31:14:gk]
   HOSTNAME=“client001”

   [client002 | c1:23:aa:31:14:gk | c1:23:aa:31:14:ab]
   HOSTNAME="client002"
   # 固定IPを設定する場合は
   KERNEL_PARAMETERS="ip=192.168.100.002:\${srv}:\${gateway}:\${netmask}"
   ```
3. パーミッションを660にします。
3. SSH鍵が毎回更新されないように、以下のようにLTSPの設定ファイルを編集します。これらの手順はLTSPをアップデートするたびにコメントアウトが必要かもしれません。
   まず、`/usr/share/ltsp/server/image/image.excludes`を編集します。以下の行をコメントアウトします。
   ```plaintext
   # etc/ssh/ssh_host_* 
   ```
   そして、`/usr/share/ltsp/server/image/55-cleanup.sh`を編集します。以下の行をコメントアウトします。   
   ```plaintext
   # re ssh_host_keys 
   ```
4. LTSPの設定を更新して、イメージファイルを作成します。
   ```bash
   sudo ltsp dnsmasq
   sudo ltsp ipxe
   sudo ltsp nfs
   sudo ltsp image /
   sudo ltsp initrd
   ```
5. 注意: このIssue (https://github.com/ltsp/ltsp/issues/43) の問題に当たった。起動に問題がある人は参考になるかも。

### クライアントの起動の確認
1. クライアントマシンをPXEブートできるようにBIOSまたはUEFI設定を変更します。具体的な手順はマザーボードのマニュアルを参照してください。一般的には、PCを起動時に特定のキー（例: F2, F12, DELなど）を押し、BIOS/UEFIメニューに入り、ブートオプションでネットワークブート（PXEブート）を最優先に設定します。
2. クライアントマシンを再起動します。自動でLTSPサーバーからOSイメージがネットワーク経由でロードされ、Ubnutu Serverが起動します。
3. クライアントが正常に起動したら、LDAP認証でログインできるかを確認します。

これで、LTSPの基本的なセットアップが完了し、クライアントマシンがLTSPサーバーからOSをネットワークブートして起動し、LDAP認証でログインできる状態になっているはずです。もし問題がある場合は、各ステップを確認し、設定が正しく行われているかを再チェックしてください。その他の設定は[LTSPの公式サイト](https://ltsp.org)に詳しく説明されています。

## 第9章 LTSPクライアント環境の強化（オプション）

### FSCacheの設定

FSCacheはLinuxのカーネル機能で、ネットワークファイルシステムのパフォーマンスを向上させるためのローカルキャッシュ機能です。この機能をLTSP環境に適用することで、計算機ノードのレスポンスを向上させることが可能です。もっと知りたい人は[この記事](https://www.space-i.com/post-blog/cachefilesd-nfs-performance/)が詳しいです。

1. FSCacheをインストールします。
   ```bash
   sudo apt install cachefilesd
   ```
2. 計算機ノードで有効にするために、`/etc/ltsp.conf`の`[client]`セクションに以下の設定を追加します。
    ```
    # FSCACHEを有効にする設定
    FSTAB_FSCACHE="LABEL=FSCACHE /var/cache/fscache auto defaults,nofail"
    POST_INIT_FSCACHE="echo RUN=yes >> /etc/default/cachefilesd"
    ```
3. **SSDの初期化**: 各計算機ノードのSSDを初期化してキャッシュの準備が必要です。計算機ノードにログインしてSSDを`LABEL=FSCACHE`で初期化します。以下はその一例です。注意：SSDが初期化されます。
   ```sh
   sudo parted /dev/nvme0n1 -s mklabel gpt
   sudo parted /dev/nvme0n1 -s mkpart primary ext4 1 100%
   sudo mkfs.ext4 -F -L FSCACHE /dev/nvme0n1p1
   ```

### 自動アップデートの有効化

- 重要なセキュリティパッチがLTSP環境でも自動でアップデートされるようにします。
- システムの自動アップデートは`unattended-upgrades`パッケージがこの機能を提供します。
- デフォルト設定ではLTSPでこれが無効にされています。`/etc/ltsp.conf`の`[client]`セクションに以下を追加します。
   ```
   # SSHと自動アップデートを有効にする設定
   KEEP_SYSTEM_SERVICES="ssh unattended-upgrades"
   ```

### Nvidiaドライバーをインストールする

- GPUで計算を行うにはnvidia-driverが必要になります。
- LTSPクライアントで使用するためには、適切なドライバーのインストールが必要です。
- 各環境に適切なドライバをインストールして下さい。以下はその一例です。
   ```bash
   sudo apt install nvidia-driver-535
   ```
- LTSPホストを修正した時は、毎回以下のコマンドでLTSPイメージを更新する必要があります。
   ```bash
   sudo ltsp image
   sudo ltsp initrd
   ```
- その後に、各ノードを再起動すると、更新内容が反映されます。


## 第10章 Singularityを用いたコンテナ化とアプリケーションのデプロイ

Singularityは、科学計算や高性能計算(HPC)のために設計されたコンテナプラットフォームです。Singularityを使用すると、アプリケーションとその依存関係を単一のイメージファイルにパッケージ化し、異なるコンピューティング環境で一貫した実行を可能にします。

### Singularityのインストール

1. パッケージをダウンロードします。
   ```bash
   sudo wget https://github.com/sylabs/singularity/releases/download/v4.0.0/singularity-ce_4.0.0-jammy_amd64.deb
   ```
   2. 次にインストールを実行します。
   ```
   sudo apt install ./singularity-ce_4.0.0-jammy_amd64.deb
   sudo rm singularity-ce_4.0.0-jammy_amd64.deb
   ```

### Fakerootの設定

Singularityのビルドは`--fakeroot`オプションを使用することでユーザー権限でもビルドを行うことができますが、各ユーザーのUIDを`/etc/subuid`と`/etc/subgid`に記述する必要があります。この手間を削減するために、以下のようにスクリプトとPAMの設定を用いて、自動で更新されるようにします。

1. まず以下のファイルを`/etc/ldap/pam_add_subid.sh`に保存します。
   ```bash
   #!/bin/bash
   USERNAME=$PAM_USER
   OFFSET=1000000
   RANGE_SIZE=65536
   MYUID=$(id -u $USERNAME)
   NEWID=$((100000000 + (($MYUID - $OFFSET) * 100000)))
   grep -q "^$USERNAME:" /etc/subuid || echo "$USERNAME:$NEWID:$RANGE_SIZE" >> /etc/subuid
   grep -q "^$USERNAME:" /etc/subgid || echo "$USERNAME:$NEWID:$RANGE_SIZE" >> /etc/subgid
   ```
2. 権限を追加します。 `sudo chmod +x /etc/ldap/pam_add_subid.sh`
3. PAMに設定を加えます。以下のとおりです。/etc/pam.d/common-session に以下を1行追加
   ```bash
   session optional pam_exec.so session optional pam_exec.so /etc/ldap/pam_add_subid.sh
   ```
4. これでSingularityの設定は完了です。LTSPのイメージをビルドして(`ltsp image && ltsp initrd`)、各計算ノードを再起動して下さい。


### Singularityの使用例: Intel コンパイラ

Singularityを用いてIntelコンパイラをコンテナ化し、簡単にデプロイ可能な環境を作成します。

1. **defファイルの作り方**
   - Intel oneAPIベースキットのイメージを使用します。
   - 実行コマンドとして`icx`を指定します。(iccコマンドは2023年から廃止されたようです)
   ```bash
   Bootstrap: docker
   From: intel/oneapi
   
   %runscript
       exec icc "$@"
   ```
2. **ビルドの方法**: 以下のコマンドでSingularityイメージをビルドします。
   ```shell
   singularity build --fakeroot intel-oneapi.sif intel-oneapi.def
   ```
3. **実行例**: Singularityコマンドを使用してコンパイラを実行します。
   ```bash
   singularity exec intel-oneapi.sif icc example.c -o example
   ```
4. **コンテナイメージを直接実行する実行例**（非推奨）
   - ビルド後のバイナリを`icc`に名前を変更し、パスを通します。例：`~/.local/bin`
   - 注意: この方法では`icc`しか使えません。oneAPIには複数のコマンドが含まれています。複数のコマンドをローカルのように使用するには、シェルスクリプトを作成します。
   ```bash
   export PATH="$HOME/.local/bin:$PATH"
   mv intel-oneapi.sif $HOME/.local/bin/icx
   icx example.c -o example
   ```

### Singularityの使用例: PyTorchを使ったGPU利用

PyTorchを用いてGPUを活用するコンテナ環境を構築します。

1. **defファイルの例**: PyTorchの公式Dockerイメージをベースにします。
   ```bash
   Bootstrap: docker
   From: pytorch/pytorch

   %post
       pip install torchvision numpy

   %runscript
       exec python "$@"
   ```
2. **ビルドの方法**
   - 以下のコマンドでSingularityイメージをビルドします。
   ```shell
   singularity build --fakeroot pytorch.sif pytorch.def
   ```
   
3. **GPUを使う場合のsingularityコマンドの実行例**
   - `--nv`オプションを使用してNVIDIA GPUを利用します。
   ```shell
   singularity exec --nv pytorch.sif python your_script.py
   ```
   
4. **torch.cudaが利用可能か確認する**
   - Pythonスクリプト内で以下のコードを使用してGPUが利用可能か確認します。
   ```python
   import torch
   print(torch.cuda.is_available())
   ```
これにより、Singularityを用いて異なるアプリケーション環境を効率的にデプロイし、実行する基本的な手順を理解できました。これをベースに、さまざまなアプリケーションやライブラリをコンテナ化し、計算環境を柔軟に構築していくことが可能です。

## 第11章 サーバーとクライアントの保守管理

保守管理はシステムの安定運用を保つために不可欠です。この章では、利用者の管理、新しい計算機ノードの追加、そして定期的なメンテナンスとアップデートのスケジューリングについて詳しく説明します。

### 利用者の管理方法

1. **LDAPでアカウントを追加する**
   - **メインメニュー** > **LDAP Server** > **ユーザーの管理**を開きます。
   - **作成**をクリックし、新しいユーザーの詳細情報（ユーザー名、パスワード）を入力します。
   - 必要な情報を全て入力したら、**OK**をクリックしてアカウントを作成します。

2. **利用者にWebからNASにアクセスしてもらってhomeディレクトリを確認する**
   - 利用者には、Webブラウザを使用してNASにアクセスしてもらいます。
   - 注意：NASから一度homeを開かないとhomeディレクトリが作られません。

### 利用者の削除方法

利用者のアカウントを削除する場合、データは削除されず、アカウントは一時的に無効化されます。

1. **メインメニュー** > **LDAP Server** > **ユーザーの管理**からアクセスします。
2. 削除したいユーザーを右クリックし、**編集**を選択します。
3. **このアカウントを無効化**を選択し、**OK**をクリックします。
4. これでNASにもSSHにもアクセスできなくなります。

### 新しい計算機ノードの追加

新しい計算機ノードを追加する際の基本的な手順は以下の通りです。

1. **ハードウェアのセットアップ**: 新しい計算機ノードのハードウェアをセットアップし、ネットワークに接続します。
2. **マザーボードの設定**: 第8章を参考に、PXEブートを有効にして起動します。
2. **SSDキャッシュの設定（オプション）**: 第9章を参考に、SSDを初期化します。その後再起動します。
4. **ノードのテスト**: 新しい計算機ノードが正しく動作し、NASと通信できるかをテストします。

### 定期的なメンテナンスとアップデートのスケジューリング

- **アップデートのスケジューリング**: セキュリティパッチの適用は自動で行われるようになっており、アップデートは最小限で良いように構成されています。もし全体に何かの変更を行いたい場合は、LTSPホストの更新を行った後に、LTSPのイメージを作り直して、全てのノードを再起動しましょう。
- **ハードウェアのチェック**: 各ハードウェアの状態を定期的にチェックし、故障や性能低下の兆候がないか確認します。特にNASのストレージのヘルス状況にエラーが発生してないか確認しましょう。
- **バックアップの確認**: データのバックアップが正しく行われているかを確認し、必要に応じてバックアップの設定を調整します。これも定期的に確認しましょう。



## 第12章 まとめと今後の展望

### まとめ

本記事では、単一のSynology NASにVM、LDAP、NFS、LTSP、及びSingularityを組み合わせ、計算機サーバー環境の利便性を向上させました。得られた環境では、すべての環境が同一のOS、ソフトウェアスタック、アカウント、データを保持するため、プログラムのポータビリティが高まり、並列実験を行う際に環境起因のバグに悩まされることが少なくなりました。新規利用者の追加はわずか1分、計算機の追加も5分で完了し、メンテナンスコストは極小となっています。利用者には僅かな学習コストが発生しますが、管理コストの大幅な削減が可能となり、全体としてのトレードオフが向上しています。本記事の多くの部分、そしてタイトルも、ChatGPTを用いて生成されたものです。そのため、タイトルが少々奇抜かもしれませんが、お許しを。質問や感想コメントもお待ちしております。チャンネル登録と高評価もどうぞ宜しくお願いします！次回もお楽しみに。

### 今後の展望

様々な管理を更にNASに集約するアプローチとして、以下の拡張が考えられます。

- **NASでメールを管理する**: Synology NASはメールサーバー機能を提供しており、LDAPと連携し、メールアドレスの一元管理が可能です。
- **NASでホームページサーバーを運用する:** VMを用いてWebサーバーを構築する方法もありますが、Web Station機能を利用することで、WordPressなどを用いて簡単にホームページを構築することができます。
- **外部ネットからのアクセス**: 外部から各計算機ノードへのアクセスを可能にするため、VMで踏み台サーバーを設置し、ルーターでポート転送を行う方法が考えられます。この際、セキュリティは極めて重要であり、一般権限のユーザーでも侵入を許してしまうと、研究室のLANへのアクセスが自由になってしまう可能性があるため、注意が必要です。
- **バックアップ**: どの拡張もバックアップを欠かさず実施し、万が一の際に迅速な復旧が可能な環境を整備しましょう。
- **パフォーマンスのモニタリング**: システムのパフォーマンスをモニタリングし、必要に応じてリソースの調整や設定の最適化を行います。さまざまな無料の可視化ツールがあるので、導入すると良いでしょう。