2005年11月26日アーカイブ

FreeBSDのsuからWHEELSUがなくなったのは、5.0かららしい。
で、代わりにpamになったと言うのだけれど、pamでWHEELSUと同じことを実現する方法がわからない。

とりあえず、pam_unix.so の引数で、ユーザ本人のパスワードでsu できることはわかったが、これだと root 本来のパスワードでの su は出来なくなる。
なんてのを発見したので、pam_unixのマニュアルを見てみたところ、auth_as_self なんてオプションがあるらしい。
/etc/pam.d/su を見ると、中で /etc/pam.d/system をincludeしていて、結局のところauthの部分は以下のような形になっている。
auth            sufficient      pam_rootok.so           no_warn
auth            sufficient      pam_self.so             no_warn
auth            requisite       pam_group.so            no_warn group=wheel root_only fail_safe
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            required        pam_unix.so             no_warn try_first_pass nullok
最後の行が、pam_unixでの認証を行っているところで、suしたい相手のパスワードで認証されることになる。
これにそのまま auth_as_self をつけてしまうと、今度はrootのパスワードでsuできなくなるので、最後の行の前に1行追加してみる。
auth           sufficient      pam_unix.so             no_warn try_first_pass nullok auth_as_self
これで、wheelグループに所属している人だけが、自分のパスワードまたはrootのパスワードで、rootにsuできるようになった。

・・・・まてよ?pam_groupには、root_onlyと言うオプションがあるけど、pam_unixにはそんなオプションないよなあ。
% su - otheruser
Password: (otheruserではなく自分のパスワード)
やっぱり、suできちゃうじゃん!
ん~、駄目だ、これは使えない・・・。
どうやったらpamでWHEELSUと同じことができるんですかねえ・・・?
powerdのおかげで、CPUの周波数が動的に変化するようになった。
動的に変化するならば、グラフで見たいところです。
そこで、この辺を参考にグラフ化してみました。
まずは、普通に5分周期のデータソースを作って、下のようなスクリプトでグラフにしてみた。
#!/usr/bin/perl

$ret = `sysctl -n dev.cpu.0.freq`;
$ret =~ s/\n//;

print "$ret";
この方法だと、cronで5分毎に起動される cactiのpoller.phpから上記スクリプトが呼ばれて、rrdが更新されると思うんだけど、普段はだいだい75MHzで動いているはずのシステムなのに、グラフでは1GHzくらいが表示されてしまう。
poller.phpの実行でcpuが忙しくなってしまったところを計測してしまうのかな?
そこで、別のスクリプトを作って1分ごとに周波数を記録し、その平均を5分の値にすることにした。(それこそrrdtoolを使えば良いんだけど、面倒だったのでシェルスクリプトにした)
#!/bin/sh
FILE=/usr/local/share/cacti/rra/cpufreq.dat

val=`sysctl -n dev.cpu.0.freq`
echo $val >> $FILE
tail -5 $FILE > $FILE.tmp
mv $FILE.tmp $FILE
このシェルスクリプトを、cronで1分毎に実行してやる。
そして、cacti用のスクリプトは以下のようにする。
#!/usr/bin/perl
$total = 0;
$min = 2000;
$max = 0;
$count = 0;

open(FILE, "/usr/local/share/cacti/rra/cpufreq.dat");
while(<FILE>) {
  chomp;
  $total += $_;
  $count++;
  if ($max < $_) {
    $max = $_;
  }
  if ($min > $_) {
    $min = $_;
  }
}
close(FILE);

$ret = $total / $count;

print "average:$ret maximum:$max minimum:$min";
手抜きなので、データファイルに1件もデータがない場合の動作は保証しない。

そして、cactiのコンソールから以下の手順でグラフにしてみた。
  1. Data Input Methods の追加
    1. 左側のメニューから Data Input Methods を選択し、右上の「Add」を押す。
    2. Data Input Methods の name に「Unix - CPU Frequency」、Input Typeに「Script/Command」、Input Stringに先ほどのスクリプトのパス「perl /scripts/cpufreq.pl」を入力する。
    3. Createボタンを押してから、Output Fields のところに「average」、「maximum」、「minimum」の3つを追加する。
    4. Saveを押す。
  2. Data Sourcesの追加
    1. 左側のメニューから Data Sources を選択し、右上の「Add」を押す。
    2. Hostに「Localhost」を選び、Createを押す。
    3. Data Source の name に「Localhost - CPU Frequency」、Data Input Methodに「Unix - CPU Frequency」を入力する。
    4. Data Source ItemのInternal Data Source Nameに「average」、Maximum Valueに2000を入れてCreateを押す。
    5. Data Source ItemのNewボタンを押して、averageと同じようにmaximum, minimumを追加する。
      このとき、Output Fieldをそれぞれあわせる。
      ※ 何故か、minimumを指定すると正しく rra が作成されないので、この画面の*Turn Off Data Source Debug Mode.をクリックして表示される rrdtool のコマンドラインでrrd ファイルを作成した。
  3. Graphの追加
    1. 左側のメニューから Graph Management を選択し、右上の「Add」を押す。
    2. Hostに「Localhost」を選び、Createを押す。
    3. Graph ConfigurationのTitle に「Localhost - CPU Frequency」、Upper Limitに2000、Vertical LabelにMHzを入力し、Createを押す。
    4. Graph ItemsのAddを押し、以下を追加する。
      Data SourceColorGraph Item TypeConsolidation FunctionText Format
      maximumFF0000LINE2AVERAGEmaximum
      minimum00FF00LINE2AVERAGEminimum
      averageFFF200LINE2AVERAGEaverage
      average-GPRINTLASTCurrent:
      average-GPRINTAVERAGEAverage:
      maximum-GPRINTMAXMaximum:
      minimum-GPRINTMINMinimum:

こうしてできたグラフが以下のような感じ。
graph_27_1.png
2005年11月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      

このアーカイブについて

このページには、2005年11月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2005年11月23日です。

次のアーカイブは2005年12月 4日です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1