ディレクトリ構造

大前提として学生用ストレージは一つ(/export)しかなく、どの環境にログインしても同じディレクトリツリーを参照するが、ログイン先によってマウント方法が異なる。また、一人あたりの容量は30GBに制限されている。

1
2
3
4
/export/home0/y2020/z2010999/ (<-SOLのホームディレクトリ)
|- .ced_centos/ (<-CEDのホームディレクトリ)
|- .ced_ubuntu/ (<-CED-GPUのホームディレクトリ)
|- IED_HOME/ (<-IED,IED-GPUのホームディレクトリ)

ホームディレクトリのマウント

SOLとCED

1
/export/home/home0 => /home0

全員のホームディレクトリがルートからまとめてマウントされている。

IED

1
/export/home/home0/y2020/z2010999/IED_HOME => /home0/y2020/z2010999

ログイン時にログインした人のホームディレクトリのIED_HOMEが個別にマウントされる。そのため本当のホームディレクトリ(/export/home/home0/y2020/z2010999/)は見えない。

CPUマイクロアーキテクチャ

SOL,CED,CED-GPU,IED,IED-GPUはすべてx86-64アーキテクチャだが、CPUの世代が微妙に違うので注意が必要である。各端末のCPU世代を次に示す。

端末 CPU 世代
SOL E5-2683 v4 5, Broadwell
IED i5-6500T 6, Skylake
IED-GPU E5-2630 v4 5, Broadwell
CED i7-7700 7, Kaby Lake
CED-GPU E5-2620 2, Sandy Bridge

注目すべきはCED-GPUの世代が古すぎることである。たとえばAVX2系命令はIntel第4世代Haswellから搭載されているので、CED-GPUにだけ実装されていないことになる。AVXのようなSIMD系命令は高速化に大きく寄与するのでコンパイラはコンパイラオプションが-march=nativeもしくはデフォルトである場合この命令系を積極的に利用する。そのためCED-GPU以外でコンパイルされたプログラムはCED-GPUではIllegal Instructionとなり動作しない。そこで、-march=x86-64を指定することでどこでも動作するようにする。

パッケージ管理

ユーザー権限でパッケージ管理するにはbrewgentoo prefixnixがあるが、わかりやすさとインストール時間を考慮してbrewが最適である。また、Python関連の環境管理にpyenvminicondaを利用する。

どの端末でもインストールしたプログラムを使えるようにするにあたり、30GBの制限が問題となる。各ホームディレクトリ毎にbrewをインストールしていると何重にもインストールすることになるので、重複をなくすために以下のようにシンボリックリンクを張る。なお、全ての環境から見えるディレクトリはIED_HOMEのみなのでここに実体を置く。(マウント時にシンボリックリンクは辿られない)

1
2
3
4
5
6
7
8
9
10
11
12
/export/home0/y2020/z2010999/ (本当のホームディレクトリ)
|- .linuxbrew/ -> IED_HOME/.linuxbrew/
|- .ssh/ -> IED_HOME/.ssh/
|
|- .ced_centos -> .
|- .ced_ubuntu -> .
|
\- IED_HOME/
|- .linuxbrew/
|- .ced_centos -> .
|- .ced_ubuntu -> .
\- IED_HOME -> .
  1. brewはコンパイル済みの汎用のx86-64用バイナリをダウンロードするだけの場合もあるが、ソースコードからコンパイルするものもあるので、前述のCPUマイクロアーキテクチャの問題より、CPUアーキテクチャを指定する必要がある。.bashrcexport HOMEBREW_ARCH=x86-64brewインストール前に記述し読み込ませておく。
  1. brewによってコンパイルされるelf実行可能ファイルには.interpセクションで指定される動的ライブラリローダのパスと.dynamicセクションのRPATHで指定されるライブラリ検索パスがシンボリックをたどった後にハードコーティングされている。ライブラリ検索の順序はRPATH->LD_LIBRARY_PATH->/usr/lib /libなので、brewで入れたプログラムは基本的にbrewによってRPATHで指定された$HOMEBREW_PREFIX/libにあるライブラリを参照する。それゆえどの環境からもローダのパスとRPATHが見えなければならない。IEDにいる場合にはIED_HOMEが見えなってしまうので、シンボリックリンクでIED_HOME -> .とすることで擬似的にIED_HOMEを見えるようにしているのである。
  1. pyenv~/.pyenv/shims/にシンボリックリンクをたどる前の絶対パスをハードコーティングしたラッパースクリプトを置くので、CED*でpyenv rehashするとIED*でパス解決に失敗する。2.と同様に.ced_ubuntu -> ..ced_centos -> .のシンボリックリンクを作成する。

その他

  • 公開鍵認証用に各ホームディレクトリに配置する.sshディレクトリはそれ自身と先祖ディレクトリのパーミッションが755である限りシンボリックリンクで別の場所に配置することも可能である。