カーネルの設定をnfs4のサーバーが使えるように変えた。
追記: /etc/exportsではなく/etc/fstab。(もしくは手動の場合 mount -t nfs4 ...)
/etc/exportsのfsid=0はmountする際に便利になるnfs4の機能。
http://www.turbolinux.com/products/server/11s/user_guide/nfspseudofs.html
参考URL。
http://www.gentoo.gr.jp/jpmain/tips.xml
http://murasakimania.dip.jp/wordpress/?p=76
http://linuxjf.sourceforge.jp/
http://linuxjf.sourceforge.jp/JFdocs/JFhtml.tar.bz2
http://forums.gentoo.org/viewtopic.php?t=77748
http://www.turbolinux.com/support/document/knowledge/632.html
http://oshiete.goo.ne.jp/qa/4954031.html
http://linux.kororo.jp/cont/server/nfs.php
http://www.asahi-net.or.jp/~aa4t-nngk/nfsv4.html
http://www.turbolinux.com/products/server/11s/user_guide/nfspseudofs.html
下記は詳細です。
原因はnfs3でマウントしているがrpc.lockdが無い。
nfs4ではrpc.lockdは必要なくなったらしくnfs-utils-1.2.3-r1には無い。
nfs-utils-1.0系にはあるようだがパッケージのバージョンにはない。1.1.4-r1が一番古い。
nfsサーバー側でmake oldconfigで設定を更新していたせいでnfs4のサーバーの機能が無効だった。
マウントの設定もnfs4になるようになっていなかった。
対応としてはnfs4にした。
nfsサーバー側のカーネルの設定にnfs4のサーバーを入れた。マウントの設定を変更した。
結果としてnfs経由でemerge xxxでソフトの再インストールに成功した。そのソフトも動作した。
テストはwget,phpとphpの関連パッケージで行った。apacheの再起動後でもphpは使えた。
nfs3のままマウント時に-o nolockの追加で問題ないかもしれない。カーネルのコンパイルでは大丈夫だった。
(/usr/src/linux/でmake vmlinuxなどを行う。出来上がったバイナリで起動できた。)
(成功するのはnfsサーバーがpentium4でnfsクライアントがphenomで同じx86系のため。)
作業の例。
nfsサーバー側がnfs3サーバー対応のカーネルで、nfsクライアント側はnfs3,nfs4クライアント機能対応のカーネルで、それぞれにツールをインストールしnfs3でマウント後にflockできないのでrpc.lockdを起動しようとしたところ、マニュアルは存在するがコマンドはないという状況になり、ツールがnfs4向けと判断したのでnfs4サーバーの機能をnfsサーバー側に追加しflockを含めた動作テストまで行う。
nfsサーバーにnfsのツールをインストールする。
$ sudo emerge --oneshot -avt nfs-utils
nfsサーバー設定。(nfs4になっていない)
$ rcsdiff -r1.1 exports,v /etc/exports =================================================================== RCS file: exports,v retrieving revision 1.1 diff -r1.1 /etc/exports 1a2,3 > > / 192.168.0.100/255.255.255.255(rw,sync,no_root_squash)
nfsサーバーを起動する。
$ sudo /etc/init.d/nfs start $ sudo rc-update add nfs default
nfsクライアントにnfsのツールをインストールする。
$ sudo emerge --oneshot -avt nfs-utils $ sudo /etc/init.d/rpc.statd start など
nfsサーバーにchrootする。
$ sudo mount -t nfs 192.168.0.200:/ /mnt/cogentoo-1/ $ cd /mnt/cogentoo-1/ $ sudo chroot . /bin/bash $ ll /proc/ 合計 0 $ source /etc/profile $ export PS1="(chroot.nfs.cogentoo-1) $PS1"
/procをmountするため終了する。
$ emerge --oneshot -avt wget !!! It seems that /proc is not mounted. You have been warned. emergelog(): [Errno 9] Bad file descriptor emergelog(): [Errno 9] Bad file descriptor These are the packages that would be merged, in reverse order: ... ^C <= 止めた。 $ exit
/procをmountする。
$ sudo mount -t proc none proc/
再度chrootする。
$ sudo chroot . /bin/bash $ source /etc/profile $ export PS1="(chroot.nfs.cogentoo-1) $PS1"
chroot後のnfsクライアント側で実行するとflockできないという警告が出る。
nfsサーバー側でエラーが出ている。
$ emerge --oneshot -avt wget
nfsサーバー側の/vat/log/message
May 15 18:56:52 cogentoo-1 rpc.statd[483]: STAT_FAIL to cogentoo-1 for SM_MON of 192.168.0.100 May 15 18:56:52 cogentoo-1 kernel: lockd: cannot monitor amdgentoo ...
lock関連のデーモンを起動できない。
rpc.lockdが無い。
$ man lockd $ sudo find / -name rpc.lockd $
1.0系にあり。
$ e-file rpc.lockd [I] net-fs/nfs-utils Available Versions: 1.0.12-r2 1.0.12-r0 1.0.10-r0 1.0.7-r2 1.0.7-r1 1.0.6-r6 1.0.12-r3 Last Installed Ver: 1.2.3-r1(2011年05月15日 17時22分26秒) Homepage: http://linux-nfs.org/ Description: NFS client and server daemons Matched Files: /sbin/rpc.lockd; ...
1.1から先しか無い。
$ eix ^nfs-utils$ [I] net-fs/nfs-utils Available versions: 1.1.4-r1 ~1.1.5 ~1.1.6-r1 ~1.2.0 ~1.2.1 ~1.2.2-r2!t ~1.2.3!t 1.2.3-r1!t {caps elibc_glibc ipv6 kerberos +nfsv3 +nfsv4 nonfsv4 tcpd} Installed versions: 1.2.3-r1!t(17時22分22秒 2011年05月15日)(elibc_glibc nfsv3 nfsv4 tcpd -caps -ipv6 -kerberos) Homepage: http://linux-nfs.org/ Description: NFS client and server daemons
gentooの場合、設定の変更で古いパッケージの情報も取得できるらしいが、やめておく。
nfsクライアント側のカーネル設定。
$ grep -i nfs /etc/kernels/kernel-config-x86_64-2.6.36-hardened-r9 CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y # CONFIG_NFS_V4_1 is not set CONFIG_ROOT_NFS=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y # CONFIG_NFSD is not set CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y
nfsサーバー側のカーネル設定。
$ grep -i nfs /usr/src/linux/.config CONFIG_NFS_FS=m CONFIG_NFS_V3=y CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=y CONFIG_NFS_V4_1=y CONFIG_NFSD=m CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y # CONFIG_NFSD_V4 is not set CONFIG_NFS_ACL_SUPPORT=m CONFIG_NFS_COMMON=y # CONFIG_NCPFS_NFS_NS is not set
colinuxの方のカーネルを再作成する。
flockのエラーが出る。
$ sudo mount -t nfs 192.168.0.200:/ /mnt/cogentoo-1/ $ nfsstat -m /mnt/cogentoo-1 from 192.168.0.200:/ Flags: rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.200,mountvers=3,mountport=37363,mountproto=udp,addr=192.168.0.200
-o nolock追加。
$ sudo mount -t nfs -o nolock 192.168.0.200:/ /mnt/cogentoo-1/ $ nfsstat -m /mnt/cogentoo-1 from 192.168.0.200:/ Flags: rw,relatime,vers=3,rsize=8192,wsize=8192,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.200,mountvers=3,mountport=52092,mountproto=udp,addr=192.168.0.200
flockテスト。
$ date >> test.txt $ php -r '$fp=fopen("test.txt","r+");$res=flock($fp, LOCK_EX); var_dump($res); print fread($fp, 4096);'
テスト。v3でnolockでカーネルコンパイル。ARCH必須。CFLAGSは関係ある?他はない。
CROSS_COMPILEはi686-pc-linux-gccでコンパイルする場合。nfsでアクセスしているので、そのファイルは無い。
export CHOST="i686-pc-linux-gnu" export CFLAGS="-march=prescott --param l1-cache-size=16 --param l1-cache-line-size=64 -mtune=prescott -fomit-frame-pointer -Os" export CXXFLAGS="${CFLAGS}" export ARCH=i386 #export CROSS_COMPILE="i686-pc-linux-" cp -i /usr/src/colinux/coLinux-0.7.9-src/coLinux-0.7.9/conf/linux-2.6.33.7-config .config # make menuconfig # cpuの所をpentimu4に変えた。元のサーバーで実行する。 make vmlinux && make modules && make modules_install
古いのをmake oldconfigしていたのでv4が無かっただけで2.6.33のデフォルトでは設定済みだった。
特にエラーがなく立ち上がったのでflockなくてもカーネルのコンパイルはnfs上でいけるっぽい。
$ uname -a Linux cogentoo-1 2.6.33.7-co-0.7.9 #1 PREEMPT Sun May 15 23:14:41 JST 2011 i686 Intel(R) Pentium(R) 4 CPU 3.00GHz GenuineIntel GNU/Linux
コンパイル中に秒数が0.7秒ずれている、とか出ていたがそれはntpサーバーのズレが大きいだけなので、大丈夫っぽい。
ntpの大本が10分に1回一気に時計合わせする、ざっくりとしたルーターの機能なのでそれに合わせると結構ずれるからだと思う。
その後クライアント側で -t nfs はOK -t nfs4 はエラー。
$ sudo mount -t nfs4 192.168.0.200:/ /mnt/cogentoo-1/ mount.nfs4: mounting 192.168.0.200:/ failed, reason given by server: No such file or directory ### サーバーを修正した。 $ sudo mount -t nfs4 192.168.0.200:/ /mnt/cogentoo-1/ $
サーバー側の修正。危険な設定に変更する。asyncは問題ありかもしれない。
$ rcsdiff exports,v /etc/exports =================================================================== RCS file: exports,v retrieving revision 1.2 diff -r1.2 /etc/exports 3c3 < / 192.168.0.100/255.255.255.255(rw,sync,no_root_squash) --- > / 192.168.0.100/255.255.255.255(rw,async,no_root_squash,fsid=0,no_subtree_check)
クライアントのマウント状態。
$ nfsstat -m /mnt/cogentoo-1 from 192.168.0.200:/ Flags: rw,relatime,vers=4,rsize=8192,wsize=8192,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.100,minorversion=0,addr=192.168.0.200
chroot後に実行する。flock成功。
# cd # pwd /root # date > date.txt (chroot.nfs.cogentoo-1) amdgentoo ~ # php -r '$fp=fopen("date.txt","r+");$res=flock($fp, LOCK_EX); var_dump($res); print fread($fp, 4096);' bool(true) 2011年 5月 16日 月曜日 00:51:36 JST
成功。/tmpがtmpfs=>マウント前の/tmpになっている。そのままにする。
# ll -A /tmp/ 合計 8 drwxrwxrwt 2 root root 4096 1月 29 2010 .ICE-unix/ drwxrwxrwt 2 root root 4096 1月 29 2010 .X11-unix/
これが別のディレクトリの場合/etc/exportsに追加+fsid=0=>nohideなどにするらしい。
サーバー側。
$ sudo tail -f /var/log/messages
クライアント側。
# emerge --oneshot -avt wget These are the packages that would be merged, in reverse order: Calculating dependencies... done! [ebuild R ] net-misc/wget-1.12-r3 USE="nls ssl -debug -idn -ipv6 -ntlm -static" 0 kB Total: 1 package (1 reinstall), Size of downloads: 0 kB Would you like to merge these packages? [Yes/No] no Quitting.
サーバー側にnfs関連のエラーが出ない。
nfs4のflock成功。
エラーの場合、下記のようなものが出る。
May 15 17:33:03 cogentoo-1 rpc.statd[483]: STAT_FAIL to cogentoo-1 for SM_MON of 192.168.0.100 May 15 17:33:03 cogentoo-1 kernel: lockd: cannot monitor amdgentoo
コンパイル前。
$ wget www.example.com ... $ ll 合計 4 -rw-r--r-- 1 usui usui 2945 2011-02-10 02:13:15 index.html $ ll `which wget` -rwxr-xr-x 1 root root 259356 2011-03-30 13:42:05 /usr/bin/wget*
クライアント側でコンパイルする。成功。
# emerge --oneshot -avt wget ... yes ... >>> Original instance of package unmerged safely. * Messages for package net-misc/wget-1.12-r3: * The /etc/wget/wgetrc file has been relocated to /etc/wgetrc >>> Auto-cleaning packages... >>> No outdated packages were found on your system. * Regenerating GNU info directory index... * Processed 106 info files.
コンパイル後。成功。
$ wget www.example.com ... $ ll 合計 8 -rw-r--r-- 1 usui usui 2945 2011-02-10 02:13:15 index.html -rw-r--r-- 1 usui usui 2945 2011-02-10 02:13:15 index.html.1 usui@cogentoo-1 /tmp/wget $ ll `which wget` -rwxr-xr-x 1 root root 259356 2011-05-16 01:00:52 /usr/bin/wget*
結果として、distccで任せられるサーバーが1台の場合はnfsでまるごとマウントは効果的。
コンパイル時のchecking ... のあたりのdistccを使わない部分も扱えるので有利?
代わりにディスク性能+ネットワーク性能がボトルネックになる?
コンパイル時にcolinuxのmemをある程度上げないと、ものすごく遅いというのを回避できるかもしれない。
gccのコンパイルの場合300以上にしとかないとswapしすぎて遅い、など。
distccはもともと単体でも早いやつを更に早くする、のが得意。
元が遅いとdistccに処理を渡せる部分以外がすごく長い場合、体感できない、かもしれない。
cpuとコンパイルするソフトの種類によっては実際にcpuごとの独自の命令を要求するらしいので失敗するらしい。
インストール中に出来上がったバイナリで、なにかする、など。
それは元のほうでコンパイルするなどの対応。
なにかエラーが出ている。問題ない?
>>>> Emerging (1 of 1) net-misc/wget-1.12-r3 > openpty failed: 'out of pty devices' > * wget-1.12.tar.bz2 RMD160 SHA1 SHA256 size ;-) ... [ ok ]
クライアント側の利用メモリ結構増えたように思う。キャッシュ?
テスト。
distccで実行。nfsを止めていない。他のサービスも止めていない。
$ time sudo emerge --oneshot -vt wget ... * Regenerating GNU info directory index... * Processed 106 info files. real 5m53.493s user 1m39.190s sys 2m44.820s
使っている。
$ sudo DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1|grep 192.168.0.100 642 Preprocess c-ctype.c 192.168.0.100[0] 650 Preprocess xmalloc.c 192.168.0.100[1] 645 Preprocess xalloc-die.c 192.168.0.100[2] 647 Preprocess getpass.c 192.168.0.100[3] 647 Preprocess getpass.c 192.168.0.100[3] ... 796 Compile url.c 192.168.0.100[1] 802 Preprocess utils.c 192.168.0.100[2] 753 Preprocess init.c 192.168.0.100[3] 804 Preprocess exits.c 192.168.0.100[0] 802 Compile utils.c 192.168.0.100[2]
実行後のメモリ。
$ free total used free shared buffers cached Mem: 60584 37476 23108 0 9744 10872 -/+ buffers/cache: 16860 43724 Swap: 1048568 31704 1016864
nfsの場合。早くなった。cpuの能力が問題ない場合ディスクがネットワーク経由なので逆転するはず。
# time emerge --oneshot -vt wget ... * Regenerating GNU info directory index... * Processed 106 info files. real 3m0.287s user 0m29.970s sys 0m7.570s
distccは動かない。なにかを判定しているとか?
$ sudo DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1|grep -v ^$ ^C $
メモリはたぶん/procをマウントしているせいでクライアント側になっている。
# free total used free shared buffers cached Mem: 8065896 7880360 185536 0 1072260 456600 -/+ buffers/cache: 6351500 1714396 Swap: 15631164 0 15631164
別にディスクの性能がいいわけではないので、場合にもよるだろうが早くなりそう。
distccの場合より問題が発生する事が多そう。
distccが関われない部分でcpuがボトルネックの場合には効果あり。
ホストのcpuが低性能で、distccのサーバーが1台の場合は、distccより確実に早くなる。
設定なしでdistcc自体が動いていないがこれは正常か?この場合、動いても意味はないが。
本当に成功かどうかは emerge -e world などをやってみないとわからない。
なにか問題がでるとおもう。
kvmなどで同じ設定にしたゲストOS上でbinpkg的なことをやってそれを入れたほうが良いかもしれない。
クライアント側。
nfs4の場合で手動の場合、rpcbind, rpc.idmapdだけでいいかもしれない。
init xxxで影響が出るかもしれないので全部登録した方がいい?
$ rc-update show | grep -iP "nfs|rpc" rpc.statd | default # rpc.lockd関連?必要なし?nfsmountで必要? rpcbind | default # rpc関連全般で必要? rpc.pipefs | default # rpc.idmapdで必要? nfsmount | default # /etc/fstab関連。 rpc.idmapd | default # ファイルのユーザー、グループ。
サーバー側。
$ rc-update show | grep -iP "nfs|rpc" nfs | default
0 件のコメント:
コメントを投稿