\chapter{教育情報システムの管理}

本章では，構築した教育情報システムの管理方法，利用方法について述べる．

\section{LDAPによる権限管理}
教育情報システムは，本コースの学生や教師のユーザアカウントをLDAPで管理している．
また，ユーザの権限も管理される．
VM貸出サービスやコンテナ環境はLDAPからユーザアカウントの情報を取得することで，他の利用者のリソースに対して操作を制限する．

\section{VM貸出サービスの利用}
ie-virshは旧システムより利用されている．
新システムでも利用を継続し，新たに機能の追加を行った．
\par
これまでのie-virshではVMを利用するには，手元のPCで作成したVMイメージをサーバにアップロードを行い，ie-virshでドメインの定義が必要であった．
そこで，新たにVMのテンプレートのイメージを用意し，テンプレートから差分でVMを作成できるようにした．
VMのテンプレートから新たにVMを作成するには下記のように行う．
また，--gdbオプションを付与することで，GDBによるLinux KernelのDebugを行える．
\begin{lstlisting}[caption=VMの作成]
$ ie-virsh define --template Ubuntu-20 [VM_NAME]
\end{lstlisting}

VMの作成で利用できるテンプレートは下記の操作で確認することができる．
\begin{lstlisting}[caption=テンプレート一覧の出力]
$ ie-virsh templates
\end{lstlisting}

また，作成したVMのデフォルトのリソースは旧システムから変更はなく，CPU1コア，メモリ1GB，ディスク容量10GBとなっている．
これまでは，リソースの変更は申請が必要であったが，下記の操作でVMのリソースを変更が行える．
しかし，ディスク容量の変更には申請が必要となっている．
\begin{lstlisting}[caption=リソースの変更]
$ ie-virsh edit [VM_NAME]
\end{lstlisting}

作成したVMにIPアドレスを割り当てるには，IPアドレス管理サービスにMACアドレスを登録する必要がある．
VMのMACアドレスはie-virshが作成するXMLファイルに定義されており，dumpxmlでXMLを出力し確認できる．
しかし，XMLを出力すると必要とする情報以外も多く表示されるため，下記の操作でVMのインターフェース情報を出力できるようになっている．
\begin{lstlisting}[caption=インターフェース一覧の出力]
$ ie-virsh domiflist [VM_NAME]
\end{lstlisting}

\section{コンテナ環境の利用}
新システムではコンテナエンジンであるPodmanとSingularityを導入した．
また，PodmanやSingularityを使用する上での不便な点を補うために作成したie-podmanについて説明を行う．

\subsection{ie-podman}
%Podmanは主にコンテナで実行するプロセスに特権が必要となる場合に利用する．
ie-podmanはPodmanをwrappし複数ユーザで利用することができるコンテナ管理ツールである．
Podmanはマルチユーザに対応しているため，ie-podmanを利用せずともコンテナの作成などを行える．
だが，コンテナへのIPアドレスの割り当てには，root権限が必要となるためrootlessでは実行できない．
そのため，Webなどを実行しアクセスするにはポートフォワードを設定し，SSHポートフォワードを行う必要がある．
そこで，ie-podmanではPodmanのすべての機能をwrappするのではなく，rootlessでは実行できない機能を提供する．
表\ref{tb:ie-podman}はie-podmanで利用できる機能である．

\begin{table}[htb]
  \begin{center}
  \caption{ie-podmanのコマンド}
  \begin{tabular}{c|l} \hline
    build & Containerfileの指示に従いイメージを作成する \\ \hline
    cp & コンテナにファイルを送信する \\ \hline
    exec & 起動中のコンテナでプロセスを実行する \\ \hline
    images  & コンテナイメージの一覧を表示する \\ \hline
    info & コンテナの情報を表示する \\ \hline
    logs & コンテナのlogを表示する \\ \hline
    ps  & 起動中のコンテナの一覧を表示する \\ \hline
    registry & 学科のレジストリの操作を行う \\ \hline
    rm & コンテナを削除する \\ \hline
    run & コンテナを作成する \\ \hline
    sif & イメージをsifファイルに変換する \\ \hline
    start & コンテナを起動する \\ \hline
    stop & コンテナを停止する \\ \hline
    \end{tabular}
  \label{tb:ie-podman}
  \end{center}
\end{table}

新しいコンテナの作成は，Podmanのrunと同じように実行できる．
しかし，ie-podman独自のオプションを提供する．
run時に--gpuオプションを指定することでコンテナ内にGPUを割り当てる．
また，--ipオプションを指定することで，使用されていないIPアドレスが割り振られる．
コンテナ名は指定することもできるが，ユーザ名で補完されるため，他ユーザと重複することはない．
ie-podmanを使用して，新しいコンテナの作成はソースコード\ref{pg:ie-run}のように行う．
\begin{lstlisting}[caption=コンテナの作成, label=pg:ie-run]
$ ie-podman run --ip --gpu --name [CONTAINER_NAME] [IMAGE]
\end{lstlisting}

新システムにインストールされているPodmanはrootlessでコンテナイメージの作成は低速である．
これは，開発段階ということが考えられる．
ie-podmanはrootのPodmanを利用しSSD上に作成されるため，Podmanと比較し高速である．
イメージ名はコンテナ名と同じくユーザ名で補完されることで，他ユーザと重複することはない．
ie-podmanを使用して，新しいイメージの作成はソースコード\ref{pg:ie-build}のように行う．
\begin{lstlisting}[caption=イメージのビルド, label=pg:ie-build]
$ ie-podman build --tag [IMAGE_NAME] [CONTEXT]
\end{lstlisting}

また，作成したコンテナイメージはソースコード\ref{pg:ie-image}の操作で一覧を表示することができる．
一覧で表示されるイメージはie-podmanで作成したイメージのみである．
\begin{lstlisting}[caption=イメージ一覧の出力, label=pg:ie-image]
$ ie-podman images
\end{lstlisting}

SingularityはDockerで作成したイメージをsifファイルに変換し，Singualrityで利用できる．
sifファイルへの変換はdockerデーモンへリクエストを行う必要があるが，Podmanはデーモンレスで動作する．
そのため，Podmanで作成したイメージをSingularityに変換するには一手間掛かる．
SingularityはDefinitionfileを作成し，ビルドすることで，sifファイルを作成できる．
だが，イメージのビルド中にエラーが発生すると，一からビルドを再開する必要がある．
DockerやPodmanはイメージのビルド時にレイヤーごとにキャッシュされるため，Containerfileに追加や編集を行っても前回のキャッシュが使用されることで，高速にビルドが行われる．
そこで，ie-podmanで作成したイメージをsifファイルへ変換する機能を作成した．
ie-podmanでイメージを作成し，ソースコード\ref{pg:ie-sif}の操作を行うことでsifファイルへ変換が行える．
\begin{lstlisting}[caption=イメージのsif変換, label=pg:ie-sif]
$ ie-podman sif [IMAGE_NAME]
\end{lstlisting}

新システムではコンテナベースでシステムを構築するため，コンテナレジストリを導入した．
レジストリの利用は学内ネットワークから可能であり，pushやpullが可能である．
ie-podmanからだけでなく，Podmanや手元のPCのDockerからも利用できる．
レジストリへの登録には，登録するイメージにtagを付けpushする必要がある．
ie-podmanでは本コースのレジストリを利用しやすくするため，簡単に操作できる機能を作成した．
ie-podmanではソースコード\ref{pg:ie-push}の操作で本コースで利用するレジストリへ登録できる．
\begin{lstlisting}[caption=レジストリへの登録, label=pg:ie-push]
$ ie-podman registry push [IMAGE_NAME]
\end{lstlisting}

また，レジストリに登録されているイメージ一覧を表示することも可能である．
ソースコード\ref{pg:ie-search}の操作でイメージ一覧を表示を行う．
イメージ名を指定することで，イメージのtag一覧の表示も可能である．
\begin{lstlisting}[caption=レジストリの検索, label=pg:ie-search]
$ ie-podman registry search
$ ie-podman registry search [IMAGE_NAME]
\end{lstlisting}

\subsection{GPUを利用した演習}
新システムでは，汎用サーバに搭載されるGPUをコンテナから利用できる．
コンテナからGPUの利用は，PodmanとSingularityの両方から可能である．
だが，プログラムの実行にはSlurmにJobとして投下する必要がある．
そのため，イメージを単一ファイルベースとして扱え，ユーザのホームディレクトリがコンテナにマウントされるSingularityを主に利用する．
%プログラムを実行する環境のみをsifファイルとして構築し，実行するプログラム，データをホームディレクトリで管理することが可能である．
Singularityのコンテナの実行は，ソースコード\ref{pg:sing-run}の操作で行える．
また，実行時に--nvオプションを指定することで，コンテナからGPUを利用することが可能になる．
\begin{lstlisting}[caption=Singularityの実行, label=pg:sing-run]
$ singularity run --nv [SIF_NAME]
\end{lstlisting}

実行にはrun，exec，shellのサブコマンドがあり，runではsifファイルを作成する際に指定が可能なrunscriptが実行される．
指定されない場合はshellが起動する．また，execではイメージ内にインストールされている任意のコマンドを実行することが可能である．
これらのサブコマンドを利用し，SlurmにJobを投下する際のbatchファイルを作成する．
batchファイルはソースコード\ref{pg:batch}の2$\sim$8行目ように，Jobに必要なリソースを定義する．
リソースの定義後に，実行したい処理を記述する．
\lstinputlisting[language=Bash, numbers=left, breaklines=true, basicstyle=\ttfamily\footnotesize, frame=single, caption=batchファイル, label=pg:batch]{file/batch.bash}

batchファイルを作成後，ソースコード\ref{pg:sbatch}の操作でJobを投下することが可能である．
\begin{lstlisting}[caption=Jobの投下, label=pg:sbatch]
$ sbatch [BATCH_FILENAME]
\end{lstlisting}

また，Jobの各種情報は，ソースコード\ref{pg:squeue}の操作で表示することが可能である．
\begin{lstlisting}[caption=Job情報の出力, label=pg:squeue]
$ squeue
\end{lstlisting}

投下したJobを停止するには，ソースコード\ref{pg:scansel}の操作で行うことができる．
SlurmはユーザごとにJobが管理されるため，他ユーザのJobを停止するこはできない．
\begin{lstlisting}[caption=Jobの停止, label=pg:scansel]
$ scansel [JOB_ID]
\end{lstlisting}