Tips・アーカイブ
02: ネットワークを利用しないRocks7(PCクラスター用CentOS7.4)のインストール
PCクラスター用OSであるRocks7のインストールは、DVDメディアを利用するRocks6や5と異なり、基本的にはネットワーク経由でインストールを進めなければならない仕様になっている。Rocks7のインストール中では複数のrollファイルという総計20GB程度のisoイメージファイルをネットワーク越しに引っ張ってくるのだが、前の職場ではとくに問題なくインストールでき、PCクラスターを運用していた。しかし、こちらに来てあらためてRocks7のインストールを行おうとしたところ、インストール設定時のrolls selectionのところでrollsファイルのリストが得られず、インストールが進められなくなってしまった。 CentOS7.4ではproxyの設定を行えば外部HTTPを表示できたので、rollsファイルのリストが得られない原因は、大学がproxyサーバーを利用していることであると考えられた。Rocks7のインストール設定時にhttp_proxyの設定ができればよいと考えられたが、Rocks7ではその設定が行えず、RedHat Anacondaインストーラのコマンドプロンプト上で export http_proxy=xxx.xxx.xxx.xxx のような設定をしてみたりだとか、ネットで調べていろいろと手を尽くしてみたのだが、どうしてもネットワーク経由ではrollsファイルのリストが得られず、Rocks7のインストールは頓挫していた。
しばらくして、下記のような、ネットワークを使用せずUSBドライブを利用してRocks7をインストールする方法の記述を発見した。
[Rocks-Discuss] Install Rocks 7 rolls without using a network roll server
イントロの和訳〜
ネットを利用せずにrollサーバーにアクセスできない場合でも、Rocks7 のインストールが可能かどうかという質問がありました。ここでは、Anaconda Python2 に組み込まれている SimpleHTTPServer を利用して、完全にローカルなインストールを行うために、 USB ドライブ上にrollリポジトリを設定する方法をご紹介します。 この手順は、USB 2 ドライブや USB 3 ドライブよりもはるかに高速な、2番目の内部ハードドライブを使用することにも簡単に適用できます。この手順は、どの Linux システムでも動作するはずです。 macOS はブータブル ISO イメージの取り扱いが難しく、標準の rollcopy.sh スクリプトを使用したkernel rollのインストールには使用できません。 もし興味があれば、mac-rollcopy.sh を提供することもできます。
〜和訳ここまで
そこで、その記載方法に従って、
1)USBドライブを利用する方法
2)PCの2番目のHDD(元々Gaussian用のスクラッチディスク)を利用する方法
によりRocks7のインストールを試みた。
結論からいうと、
1)の方法ではどうしてもうまくいかず、
2)の方法では一発でうまくいった。
下記はそのアーカイブである。
ステップ1は、USBドライブにrollsリポジトリを作成する手順であり、 ステップ2は、Rocks7のインストーラーで利用できるようにするための手順である。
Rocks7のインストールにあたり、前もって
https://github.com/rocksclusters/roll-server
からrollcopy.sh というシェルスクリプトと、index.cgi というPythonスクリプトをダウンロードし、(FAT32フォーマットの)USBドライブに保存しておく。
1)USBドライブを利用する方法
ステップ1. USBドライブにRocks7インストーラ用のリポジトリを作成する。
1-1
適当なLinuxマシンを用意するか、Rocks7をインストールしたいPCにCentOS7などをインストールしておく。
$ pwd
/home/ishikawa/desktop
ここにUSBドライブからrollcopy.shとindex.cgiをコピーする。
1-2
次に、desktop上で
$ mkdir rocks7
http://central-7-0-x86-64.rocksclusters.org/isos/
からすべてのisoファイルをダウンロードしrocks7に保存しておく。
1-3
別の32GB USBドライブを用意し、フォーマットを行う。
Linux で USB ドライブのフォーマット コマンドライン
を参考にし、ext4のLinuxファイルフォーマットを下記のように行う。
lsblk コマンドを実行して、フォーマットする USB ドライブ上のパーティションの名前とマウントポイントを識別する。
$ lsblk -fp
USB ドライブがマウントされている場合は、一旦マウントを解除する。
$ sudo umount /media/user/usb0
USB ドライブを目的の形式にフォーマットし、ラベルを作成する。
$ sudo mkfs.ext4 /dev/sdb1 -L "USB Drive"
1-4
ここから全て管理者権限で行う。
$ su
スクリプトを実行可能にし、作業ディレクトリをBINDIRとして設定する。
# pwd
/home/ishikawa/desktop
# chmod +x rollcopy.sh index.cgi
# BINDIR=`pwd`
1-5
既存のディスクドライブの名前を表示する。
# ls /dev/sd?
/dev/sda /dev/sdb
USBドライブを挿入し、USBドライブを含むディスクドライブの名前を表示する。
# ls /dev/sd?
/dev/sda /dev/sdb /dev/sdc
USBドライブとパーティション(ここでは/dev/sdc1)の名前を表示する。
# ls /dev/sdd*
/dev/sdd /dev/sdc1
1-6
USBドライブを/mnt/usbにマウントする。USBドライブにパーティションがない場合は、/dev/sdc1の代わりに/dev/sdcをマウントする。
# mkdir -p /mnt/usb
# mount /dev/sdc1 /mnt/usb
1-7
Rocks7のISOイメージファイルが保存されているディレクトリrocks7に移動する。
# cd rocks7
次のコマンドラインにより、rocks7にある全てのrpmファイルをUSBドライブのrollリポジトリに展開する。
# for ISO in *.iso ; do "${BINDIR}/rollcopy.sh" ${ISO} /mnt/usb ; done
1-8
index.cgi pythonスクリプトを使用して、各ディレクトリに HTMLインデックスファイルを作成する。
# cd /mnt/usb/install
# find rolls -type f -name index.html -delete
# find rolls -type d -exec sh -c "cd {} ; "${BINDIR}/index.cgi" >index.cgi ; mv index.{cgi,html}" ';'
USBドライブをアンマウントする。
# umount /mnt/usb
これでRocks7のインストール用USBドライブの作成が完了である。
2. USBドライブのrocks7リポジトリをRocks7インストーラーが利用できるようにする。
2-1
http://central-7-0-x86-64.rocksclusters.org/isos/
から
kernel-7.0-0.x86_64.disk1.iso
をコピーしたDVDあるいはUSBドライブからインストーラーを起動し、
http://central-7-0-x86-64.rocksclusters.org/roll-documentation/base/7.0/install-frontend-7.html
を参照しながら作業を進めていく。
ROCKS ROLLS Selectionのところで、CTRL-ALT-F2 を入力してRocks7 のインストール画面から抜け出し、Red Hat Anaconda インストーラのコマンドプロンプトに入る。
2-2
既存のディスクドライブの名前を表示する。
# ls /dev/sd?
/dev/sda /dev/sdb /dev/sdc
Rocks 7.4 リポジトリの入った USB ドライブを挿入し、USBドライブを含むディスクドライブの名前を表示する。
# ls /dev/sd?
/dev/sda /dev/sdb /dev/sdc /dev/sdd
USBドライブとパーティション(ここでは/dev/sdd1)の名前を表示する。
# ls /dev/sdd*
/dev/sdd /dev/sdd1
2-3
USBドライブを/mnt/usbにマウントする。USBドライブにパーティションがない場合は、/dev/sdd1の代わりに/dev/sddをマウントする。
# mkdir -p /mnt/usb
# mount -r /dev/sdd1 /mnt/usb
2-4
USBドライブのトップレベルディレクトリに変更する。
# cd /mnt/usb
2-5
Python2組み込みのSimpleHTTPServerを実行する。
# python -m SimpleHTTPServer &
サーバーが起動すると
Serving HTTP on 0.0.0.0 port 8000 ...
と出力される。
2-6
CTRL-ALT-F6を入力するとRocks7のインストール画面に戻る。
2-7
Network Rollのウィンドウに
http://localhost:8000/install/rolls
と入力し、エンターキーを押すとインストールすべきrollsのリストが表示されるので、すべてにチェックを入れ、Add Selected Rollsをクリックする。
あとは手順書に従って進め、最後にBegin installationをクリックしてインストールを開始させるのだが、そのあとすぐにUnknown errorが表示され、インストールを進められなかった。
いろいろと手を尽くしたのだが、どうしてもUSBドライブを利用する方法ではうまくいかなかった。
2)PCの2番目のHDDを利用する方法
次に、PCに内蔵している2番目の6TB HDDを利用してインストールを試みた。
このHDDは、partedコマンドを利用してext4形式でフォーマットを済ませてあり、Gaussianのスクラッチディスクとして利用していたもので、/dev/sdb2に対応していた。Rocks7をインストールしたいPCにはCentOS7.4(GNOMEデスクトップ版)がインストールしてあり、デスクトップ上に
rollcopy.sh
index.cgi
を保存しておく。
$ pwd
/home/ishikawa/desktop
$ mkdir rocks7
Rocks7のISOイメージファイルをrocks7ディレクトリに保存する。
$ su
# BINDIR=`pwd`
# chmod +x rollcopy.sh index.cgi
/dev/sdb2を/mnt/hddにマウントする。
# mkdir -p /mnt/hdd
# mount /dev/sdb2 /mnt/hdd
# pwd
/home/ishikawa/desktop
# cd rocks7
次のコマンドラインにより、rocks7にある全てのrpmファイルを2番目のHDDドライブのrollリポジトリに展開する。
# for ISO in *.iso ; do "${BINDIR}/rollcopy.sh" ${ISO} /mnt/hdd ; done
index.cgi pythonスクリプトを使用して、各ディレクトリに HTMLインデックスファイルを作成する。
# cd /mnt/hdd/install
# find rolls -type f -name index.html -delete
# find rolls -type d -exec sh -c "cd {} ; "${BINDIR}/index.cgi" >index.cgi ; mv index.{cgi,html}" ';'
/mnt/hddにおいて、SimpleHTTPServerを実行してみる。
# pwd
/mnt/hdd
# python -m SimpleHTTPServer &
サーバーが起動すると
Serving HTTP on 0.0.0.0 port 8000 ...
と出力される。
Firefoxを起動し、アドレスバーにhttp://localhost:8000/install/rollsを入力すると、rollsの各ディレクトリが表示された。
うまくrollsファイルを引っ張ってこれそうなことがわかったので、
Rocks7のkernelイメージファイルをDVDあるいはUSBドライブから起動し、Rocks7のインストールの設定を始める。
Rolls selectionのところで、
CTRL-ALT-F2
によりCUIに移り、
# lsblk
で2番目のHDD(/dev/sdc)を確認し、
# mkdir -p /mnt/usb
# mount -r /dev/sdc /mnt/usb
# cd /mnt/usb
# python -m SimpleHTTPServer &
Serving HTTP on 0.0.0.0 port 8000 ...
CTRL-ALT-F6
で GUIに戻り、Network Rollのウィンドウに
http://localhost:8000/install/rolls
と入力し、エンターキーを押すとインストールすべきrollsのリストが表示された。
このHDDからrollsリストを読み込ませる方法により、Begin installationをクリック後にerrorが表示されることなく、30分程度(はやっ)で無事にインストールが完了した。
上記以外の方法として、VirtualBoxを利用するやり方もあるようだ。この方法だと、親ノードのOSとしてWindowsも利用でき、親ノードのOS上でproxyの設定ができるので、ネットワーク経由でのrollsファイルのインストールは問題を生じないと考えられる。
Virtual HPC cluster Setup with ROCKS 7.0(pdf)
Rocks Cluster VM Box | #1 Pembuatan Master Node(YouTube)
下記のリンクのVirtualBoxを利用する方法ではネットワークは必要ないようだ。
RocksCuster Local Installation Server
追記1:
Rocks7のインストールはその後、様々な理由により、何度も繰り返すことになった。インストールはBegin installationをクリック後に始まるが、しばらくすると、Error: NoneType object has no attribute 'update' というエラー表示とともにインストールがストップするケースがたまにあった。この理由は、下記の記述によると、問題を引き起こすSGE (Sun Grid Engine) rollファイルによるものであるらしいが、よくわからない。というのも、SGE rollファイルを含めていてもうまくインストールを進めた人がいるからだ。
[Rocks-Discuss] Re: Error: NoneType object has no attribute update
いずれにせよ、仮想マシンやジョブスケジューラーを使用する予定はないので、インストールするrollファイルは最小限(base, CentOS, core, ganglia, hpc, kernel, perl, python, Updates)に留めることにした。そのほうがインストール時間も短くて済むし、エラーストップを生じにくいようだ。
追記2:
ストレージには2TBのSSDを使用したが、インストール設定時のpartitioningのところで、Automaticの場合、/のDesired Capacityが50GBであった。しかし、gccの新しいバージョンやNVIDIAのcuda toolkit等をインストールする際にけっこう容量を食うことがわかったので、Rocks7の再インストールの際にルートディレクトリ/のDesired Capacityを99.07GBとした。その結果、/homeの容量は1,800GBとなった。残りはswap領域である。
01: (再掲)BINANAを用いてreceptor–ligand間の水素結合をカウントする
構造基盤ヴァーチャルスクリーニング(SBVS)からヒット化合物を効率よく見出すためには、receptor–ligand間の水素結合(HB)の総数(nHB)が重要な記述子の一つであると考えた。数個〜数十個程度の化合物を扱う一般的な分子ドッキングではUCSF CHIMERA等のGUIを用いて目視でHBをカウントすればよいのだが、膨大な数のリガンドを扱うSBVSの場合、HBを目視でカウントしていくことは現実的ではない。そこでSBVSの実行時に、結合エネルギーと併せてnHBをテキストファイルに出力させておけば解析がラクである。その目的のために、Durrantらによって開発されたBINANAという分子ドッキング後の相互作用解析のためのPythonプログラムを利用してreceptor–ligand間のHBをカウントさせ、grepコマンドとawkを用い、コマンドライン処理を行うことでHBの総数をnHBとして出力させてみる。
BINANAは、AutoDockやAutoDock Vinaといったpdbqtファイル形式に基づいた分子ドッキングのためのプログラムであり、静電相互作用なども解析するため原子タイプ(t)ごとの電荷情報(q)を必要とする。よって電荷情報を含まないpdbファイル形式のままでは扱えないので、BINANAをpdbファイル形式で記述されたX線結晶構造等のreceptor–ligand間の相互作用解析に用いる場合、MGLToolsやOpenBabelを利用してpdbファイル形式からpdbqtファイル形式に変換しておく必要がある。
今回はテストとしてMac OS Xのターミナル上で行う。
BINANAはPython2.x系では走らず3.x系を用いる必要があるため、テストではPython3.8.2を使用した。
ココからbinana-1.3.zipをダウンロードし解凍後、ディレクトリごと/Users/ishikawaにおいた。
$ alias binana="python /Users/ishikawa/binana-1.3/binana.py"
次にテストファイル(receptor.pdbqtとligand.pdbqt)を含んでいる/binana-1.3/exampleにて、次のコマンドラインによりBINANAを実行した。
$ binana -receptor ./receptor.pdbqt -ligand ./ligand.pdbqt > output.txt
output.txtには、まずbinanaの利用法や定義、パラメーターが記述されており、次に解析に使用されたデータとそれらの解析結果が並んでいた。
注目すべき"Hydrogen bonds"の項では、
1)donor原子がLIGANDあるいはRECEPTORのどちらの原子であるか
2)donor原子がLIGAND内の原子の場合、receptor原子はSIDECHAINあるいはBACKBONEのどちらに属しているか、あるいはdonor原子がRECEPTOR内の原子の場合、donor原子はSIDECHAINあるいはBACKBONEのどちらに属しているか
3)それらはどの2次構造(ALPHA, BETA, OTHER)の一部なのか
といった属性に応じてHBがカウントされていた。そこでgrep コマンドとawkを組み合わせた次のコマンドラインにより、ファイル出力されている output.txt からHBの総和をnHB.txtに出力させた。
$ grep -e LIGAND -e RECEPTOR output.txt | awk '{a += $7;print a}' | tail -n 1 > nHB.txt
$ more nHB.txt
$ 9
このように、テストサンプルではreceptor-ligand間のHBの総数が9個であることが示された。
UCSF CHIMERAを用いてreceptor.pdbqtとligand.pdbqtを開き、HBを目視でカウントしたところ9個あり、BINANAとコマンドライン処理によりカウントしたものと同数であった。
なお、リガンドの分子内にHBが1個あったが、これはreceptor-ligand間のHBではないため、BINANAではカウントされていないようだ。
HBの距離のカットオフを変更したい場合、次のようにしてできるようだ(デフォルトは4.0 Å)。
$ binana -receptor ./receptor.pdbqt -ligand ./ligand.pdbqt -hydrogen_bond_dist_cutoff 3.0 > output.txt