IT pass HikiWiki - [Memo2008]090206『PC クラスターの作り方 (その 2)』(杉山(北大)) 補足資料 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}

[((<ITPASSセミナー>))]

= クラスタ構築メモ

== ログインノードの構築

=== インストールの準備

* 今回は USB ディスクを利用する. 128 MB 程度の低容量のもので十分

* hd-media/boot.img.gz をダウンロード
  ((<URL:http://ftp.nl.debian.org/debian/dists/testing/main/installer-amd64/current/images/hd-media/boot.img.gz>))

* iso イメージをダウンロード
  ((<URL:http://cdimage.debian.org/cdimage/lenny_di_rc1/amd64/iso-cd/debian-testing-amd64-businesscard.iso>))

* ファームウェアをダウンロード
  ((<URL:http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/lenny/current/firmware.tar.gz>))

* [Mac] USB メモリをさすと自動でマウントされるので, アンマウントする.

    $ sudo umont -vf /Volume/USBdisk

* [Mac] boot.img.gz を展開する. アクセスランプがつかなくなったら Ctrl-C.

    $ sudo zcat ~/Desktop/boot.img.gz > /dev/disk1

* [Mac] iso イメージとファームウェアをコピーする.
  USB メモリをさし直せばオートマウントされるので, ドラッグアンドドロップするだけ.

=== Debian GNU/Linux のインストール

* BIOS 画面で USB ディスクから起動するように設定する.

* Advanced options => Expert Install
  * デフォルトだと, どうもうまくインストールできなかったので....

* 言語選択
  * 日本
  * ロケール: ja_JP.UTF8

* キーボード
  * PC スタイル, 日本 (106 キーボード)

* インストーラー iso イメージの検索
  * OK するだけ

* ネットワーク
  * 適宜手動で. 今回は 133.87.45.15 を利用.

* ディスクのパーティショニング
  * /dev/sda のパーティショニング. LVM は設定しない.
    * /home のみ分割.
  * /dev/sdb のパーティショニング. LVM は設定しない.
    * パーティションテーブルタイプ: gpt
    * /work01 にマウント

* インストールするカーネル
  * linux-image-2.6-amd64

* ソフトウェアの選択
  * 標準システムのみ

* システムの時刻は UTC に合わせない.

=== パッケージの追加

* ssh サーバをインストール

    # apt-get install openssh-server

* sudo

    # apt-get install sudo
    # visudo
      sugiyama ALL=(ALL) ALL

* rsync

    # apt-get install rsync

=== カーネル再構築

* 計算ノード用のカーネルを作成する.

* パッケージのインストール. ncurces 関連は make menuconfig するために必要.

    # apt-get install kernel-package  linux-source-2.6.26 libncurses5-dev

* カーネルの展開

    # cd /usr/src/
    # tar jxvf linux-source-2.6.26.tar.bz2
    # ln -s linux-source-2.6.26 linux
    # cd linux

* Debian のでフォルトカーネルの設定ファイルをコピーしてくる.

    # cp /boot/config-2.6.26-1-amd64 .config

* make

    # make menuconfig
  
    Network support => Network Options
    [*]   IP: kernel level autoconfiguration
      [*]     IP: DHCP support      
      [*]     IP: BOOTP support    
      [*]     IP: RARP support      

    Device Drivers => Network device support => Ethernet (1000 Mbit)
    <*>   Intel(R) PRO/1000 Gigabit Ethernet support  

    File systems
    <*> Ext3 journalling file system support

    File systems => Network File Systems
    <*>   NFS file system support
    [*]   Root file system on NFS

    # make-kpkg --initrd --revision=`date '+%Y%m%d'` --append_to_version=.`hostname` kernel_image kernel_headers  

* カーネルのインストール

    # cd /usr/src/
    # dpkg -i linux-image-2.6.27.5_`date '+%Y%m%d'`_`hostname`.deb
    # dpkg -i linux-headers-2.6.27.5_`date '+%Y%m%d'`_`hostname`.deb

* 作成したカーネルで起動するか確認

    # reboot

=== ネットワークインターフェイスの設定

* eth1 に対してプライベートアドレスを割り当てる

    auto eth0 eth1
    iface eth0 inet static
          address 133.87.45.15
          netmask 255.255.255.0
          network 133.87.45.0
          broadcast 133.87.45.255
          gateway 133.87.45.1
          # dns-* options are implemented by the resolvconf package, if installed
          dns-nameservers 133.87.45.70
          dns-search ep.sci.hokudai.ac.jp
    iface eth1 inet static
          address 192.168.90.100
          netmask 255.255.255.0
          network 192.168.90.0
          broadcast 192.168.90.255

* ネットワークをリスタート

    # /etc/init.d/network restart

* 確認

    # ifconfig  


== NFS サーバの設定

* パッケージのインストール

    # apt-get install nfs-kernel-server

* 設定. /home/kodama, /usr, /work01 以下を 192.168.90.0/24 に対して公開

    # vi /etc/exports
      /home/kodama   192.168.90.0/255.255.255.0(rw,sync,no_subtree_check,no_root_squash)
      /usr     192.168.90.0/255.255.255.0(rw,sync,no_subtree_check,no_root_squash)
      /work01  192.168.90.0/255.255.255.0(rw,sync,no_subtree_check,no_root_squash)

    # /etc/init.d/nfs-kernel-server restart


== 計算ノードの構築
  
* 計算ノードの IP は, 192.168.90.0/24 を利用することにする.

=== ファイルシステムの用意

* パッケージのインストール

    # apt-get install debootstrap

* 置き場を作る. とりあえず /home/kodama としておく.

    # adduser --disabled-password kodama

* debootstrap で最小限システムを作る.
  システムは "/home/kodama/ノード番号" 以下に置く.
  以下の例は, ノード番号 1 とする.

    # debootstrap --arch=amd64 lenny 001 http://dennou-h.gfd-dennou.org/arch/cc-env/Linux/debian

* chroot して最低限の設定を行う

    # LANG=C chroot /home/kodama/001 /bin/bash

    # dpkg-reconfigure tzdata  (時刻設定)
    Asia -> Tokyo  

    # apt-get update
    # apt-get install openssh-server linux-image-2.6-amd64 sudo nfs-common
    # dpkg -i /usr/src/linux*deb

    # passwd  (root パスワード)
    # exit

* 雛形をコピーして編集する. 雛形は /home/kodama/common 以下に置かれている.

    # cd /home/kodama/common/
    # cp linux *deb ../001/usr/src/    [カーネルをコピー]

    # cp hosts ../001/etc/  
    # cat ../001/hosts
      127.0.0.1 localhost
      #133.87.45.15 asura.ep.sci.hokudai.ac.jp asura
      192.168.90.1 kodama001 kodama001
      192.168.90.2 kodama002 kodama002
      192.168.90.3 kodama003 kodama003
      .... (以下略)

    # vi ../001/etc/hostname
      kodama001

    # cp fstab ../001/etc/  
    # vi ../001/etc/fstab
      # UNCONFIGURED FSTAB FOR BASE SYSTEM
      192.168.90.100:/home/kodama/001  /      nfs    defaults        0 0
      192.168.90.100:/usr  /usr      nfs    defaults        0 0
      192.168.90.100:/work01  /work01      nfs    defaults        0 0
      proc             /proc         proc    defaults                 0    0

    # cp interfaces ../001/etc/network/
    # vi ../001/etc/network/
      auto lo
      iface lo inet loopback
      auto eth0
      iface eth0 inet static
        address 192.168.90.1
        netmask 255.255.255.0
        network 192.168.90.0
        broadcast 192.168.90.255

* マウントするためのディレクトリを用意.

    # cd /home/kodama/001
    # mkdir work01
    # mv usr usr.bk; mkdir usr   [usr は計算ノードと共有するため]

* /home/kodama/bin/addnode.sh を作った (非常にダサイので誰か直して).
  これは上記の操作を一括しておこなうものである.

=== 起動用 USB ディスクを作成する

* 必要なパッケージのインストール

    # apt-get install syslinux mtools mbr

* USB ディスクを挿す. 今回は /dev/sdg として認識.

* パーティション作成

    # /sbin/sfdisk --force /home/sdg <<EOF
      0,1014,6,*
      EOF

    # /sbin/fdisk -l /home/sdg1  [確認]

* USB ディスクを FAT16 でフォーマット

    # sbin/mkfs.msdos /dev/sdg1

* syslinux をインストール

    # syslinux /dev/sdg1

* 必要なファイルをコピー
  vmlinuz (カーネルバイナリ), syslinux.cfg (SYSLINUX 設定ファイル) が必要.
  カーネルは再構築したものを利用すること.

    # mount /dev/sdg1 /mnt/
    # cp /boot/initrd.img-2.6.26-1-amd64 /mnt/initrd.img
    # cp /boot/vmlinuz-2.6.26-1-amd64 /mnt/vmlinuz

* master boot recorder のインストール

    # install-mbr /dev/sdg

* syslinux.cfg の編集. rw をつけないと read-only でマウントされてしまうので注意

     DEFAULT vmlinuz
     APPEND root=/dev/nfs rw nfsroot=192.168.90.100:/home/kodama/01 ip=192.168.90.1:192.168.90.100::255.255.255.0:::

* 上記操作を一括して行う簡単設定スクリプトを作った.

    # ./mkusbmem.sh /dev/sdk 1 (デバイス名とノード番号を与える)

=== 参考

* ((<URL:http://blog.asial.co.jp/329>))
* ((<URL:http://www.jp.debian.org/releases/stable/amd64/ch04s03.html.ja>))
* ((<URL:http://www.linux.or.jp/JF/JFdocs/NFS-Root-Client.html>))
* ((<URL:http://www.linux.or.jp/JF/JFdocs/NFS-Root.html>))
* ((<URL:http://grape.mtk.nao.ac.jp/~makino/articles/diskless-note/doc/files/_/_diskless-note_cp.html>))


== スケジューラーの設定

=== Torque のインストール

* パッケージのインストール

    # apt-get install gcc make

* ダウンロード. 最新版の URL を確認して, それを wget する.

    $ wget ((<URL:http://www.clusterresources.com/downloads/torque/torque-2.3.6.tar.gz>))
    $ tar zxvf torque-2.3.6.tar.gz
    $ cd torque-2.3.6
    $ ./configure --with-default-server=asura --with-server-home=/home/pbs --with-rcp=scp
    # make
    # make install

=== キューの作成

* サーバを起動する. 一番最初に起動する場合は -t オプションを付けるようだ.

    # export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
    # pbs_server -t create

* qstat -a を実行してみる. まだキューを作成していないので, 何も表示されない.

    # qstat -a

* キューを作成する.
  今回は short (30 分, 優先度高) と, long (無制限, 優先度低) の 2 つを用意する.

    # qmgr -c "set server scheduling=true"
    # qmgr -c "create queue long queue_type=execution"
    # qmgr -c "create queue short queue_type=execution"
    # qmgr -c "set queue long started=true"
    # qmgr -c "set queue short started=true"
    # qmgr -c "set queue long priority=30"
    # qmgr -c "set queue short priority=50"
    # qmgr -c "set queue long enabled=true"
    # qmgr -c "set queue short enabled=true"
    # qmgr -c "set queue long resources_default.nodes=1"
    # qmgr -c "set queue short resources_default.nodes=1"
    # qmgr -c "set queue short resources_default.walltime=3600"
    # qmgr -c "set server default_queue=short"

* 確認. 以下のコマンドでキューの情報が出れば OK.

    # qstat -q

* 試しにジョブを実行する. qstat でジョブの情報が得られれば OK.
  root ではキューを投げられないので注意.

    $ echo "sleep 30" | qsub
    $ qstat

=== torque の設定

* 計算ノードの一覧を作成. ログインノードで作業.

    # vi /home/pbs/server_priv/nodes
    kodama001 np=4
    ...

* 計算ノード用の pbs_mom を作成.

    # cd torque-2.3.6
    # make packages
    # cp torque-package-mom-linux-x86_64.sh /home/kodama/01/home/pbs

    # LANG=C chroot /home/kodama/001 /bin/bash
    # cd /home/pbs
    # ./torque-package-mom-linux-x86_64.sh --install

* 確認.
  /home/pbs/server_name にログインノードのホスト名が含まれていることを確認しておく.

* /work01 を NFS しており, /work01 で計算を実行することを教え込む.

    # vi /home/pbs/mom_pri/config
      $usecp asura:/work01 /work01

=== サーバの起動

* 計算ノード
  ログインして以下のコマンドを実行.

    # export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
    # pbs_mon

* ログインノード

    # /usr/local/pbs/sbin/pbs_server
    # /usr/local/pbs/sbin/pbs_sched

=== テスト

* "/work01/ユーザ名" というディレクトリを用意し, そこでジョブを投入する.
  root 権限ではジョブを投入できないので注意.

* ここでは, /work01/sugiyama/a.out を実行するスクリプト (test.sh) を作り,
  それを qsub する.

    $ vi test.sh

      #!/bin/sh
      #PBS -N sample
      #PBS -j oe
      #PBS -M sugiyama@gfd-dennou.org
      #PBS -m e
      
      cd /work01/sugiyama
      ./a.out
      exit 0

    $ qsub test.sh
    $ qstat

* うまくいけば, 出力が sample.o** に書き出される.

=== 注意事項

* ログインノードにアカウントがあっても計算ノードにアカウントが無いと, ジョブを実行できない.
  * /etc/passwd, /etc/shadow, ホームディレクトリを用意する.
  * 自動化に関しては, 要検討.

=== 参考

* ((<URL:http://www.clusterresources.com/torquedocs21/a.ltorquequickstart.shtml>))
* ((<URL:http://debianclusters.cs.uni.edu/index.php/Resource_Manager:_Torque>))
* ((<URL:http://www.ie.u-ryukyu.ac.jp:16080/howto/index.php?Howto%2FTORQUE>))

[((<ITPASSセミナー>))]