らるるのボカロ廃でもいいじゃないか日記@らるるのわがまま

「Linux」カテゴリの最近の記事

sshfsでリモートマシンのディスクを直接mount

[Linux]

'09/05/25(月曜日)13:03:35

Windowsマシンからsshでしか入れない遠隔地のLinuxへ、explorerのようなシェルで直接アクセスできるようにする方法といえば、たとえばこんな風なSSHポートフォワーディングとWindows上のループバックアダプタを使った方法が有名ですが、もっと別の方法がないかどうかということで検討。。

Linuxのマシンからであれば、sshfsというまさしくsshごしにマウントしてしまうものがあるようです。FedoraやUbuntuの場合はyumなどで一発で取ってこれるようですが、どうもCentOSの場合標準ではモジュール提供してくれていないみたいで。仕方ないので野良のrpmを使うことにする。

$ yum install yum-priorities
$ rpm -ivh http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
$ yum --enablerepo=rpmforge install dkms-fuse sshfs
$ su
# vi /etc/group
fuse:x:102:rarul
(fuseグループに利用したいユーザを追加)

CentOS5(RHEL5)のfuseのkernelモジュールが野良で配布されていたんでほとんど何もせずいけたけど、もしそうでない場合は手動でkernelモジュールコンパイルして組み込んだりする必要あり。上記でインストールOKなので、いざ使ってみる

$ sshfs -p port_num account@example.com:/home/rarul mntpoint
$ ls mntpoint
$ fusermount -u mntpoint

これで、Linuxマシンからの接続はOK。今回の目的はWindowsマシンからも直接見えるようにすることなので、このマウントしたポイントをSambaで公開してやればよい。ただこの場合、sshセッションを張ったユーザ以外からもアクセスできるようにしないといけない。

# vi /etc/fuse.conf
user_allow_other (追加)
$ sshfs -p port_num -o allow_other account@example.com:/home/rarul mntpoint

この設定で本当に誰でもアクセスできるようになっちゃうので、設定するときは要注意。ついでに、これをブロードバンドルータごしにやってる場合、ルータのDynamic NAPTのタイムアウトで切られてしまうので、sshに定期的にパケット流して切られないようにする。

# vi /etc/ssh/ssh_config
Host *
ServerAliveInterval 180 (追加、180秒、たいていのルータは5分か10分がタイムアウト時間)

sshセッションが間のルータによって強制的に切られてしまうと、sshfsプロセスやそのマウントポイントにアクセス中のプロセスが止まっちゃうので、結構焦ります。ps u でsshfsプロセスを確認しkillすればOKの模様。

上記の設定で無事に、遠隔LinuxにsshfsでつながっているLAN内のLinuxを介して、WindowsからSambaごしに直接アクセスできました。バンザイ。

・・・ということの設定に時間取られてしまった。本当にやりたかったのは、遠隔地のLinuxマシン内のスクリプトの本格的な修正が本来の目的で・・・

死ねばいいのに

[Linux] [日常]

'09/02/06(金曜日)01:49:12

大まかに以下のような関数がシグナルハンドラに登録されていた。

void sig_exit(int num, siginfo_t *info, void *hoge){
close_hoge1();
close_hoge2();
close_hoge3();
_exit(0);
}

死に間際にシグナルハンドラで往生際の悪いことをしてる影響でシステムがおかしくなってしまっていた。どうせ資源の後処理くらいしかしてないのなら、シグナル受けたら潔く死ねばいいのに。なんでたいしたことしてないのにシグナルハンドラを使いたがるんだろう。

ついでに、こんなコード書いたやつも死ねばいいのにもっと勉強してください。>安全なシグナル処理のために再入可能ファンクションを使う UNIX上でのC++ソフトウェア設計の定石 (2) signal-piping - SIGNALをpipe経由でハンドラからメインスレッドに渡す方法

「tmpfsはスワップ可能なRAMディスク」らしい

[Linux] [日常]

'09/01/26(月曜日)00:00:09

3年前のネタらしいので、知っている人にとっては今更なのかもしれませんが、、

もともとは「tmpfs は本当に容量が動的なのか (naoyaのはてなダイアリー)」で問題提起されてて、Linuxで実装されてるtmpfsについての議論がいろいろあったようです。詳細は、「tmpfs は本当に容量が動的なのか (革命の日々!)」や「続: tmpfs は本当に容量が動的なのか (革命の日々!)」に書かれてます。

で、結局のところ一言で言うと「tmpfs について (ぴょぴょぴょ?Linuxとかプログラミングの覚え書き)にあるように、

tmpfsは "swap可能なramディスク"である.

らしいです。

ところがどっこい、もしswapがないシステムだったら?ガリガリっとtmpfsにファイルを書いていって、んでメモリが足りなくなったら、ひたすらOOM-Killerが走って止まらなくなります。一度こうなってしまうと、OOM-Killerが走り続けてもはや何もできなくなります。swapがないシステムなんて知るかよーとかとか素人の私が叫んだところで、ないものはないんで、どうしようもないです。というか、RAMディスクなので、ファイルを書いてもガリガリいわんわな。SSDが広く普及したら「ガリガリって何?」とか言われるんだろうなぁ。ああ、脱線しすぎ。

tmpfsにファイルを書いた場合、まぁ当たり前っちゃー当たり前ですが、4KBのブロックサイズとしてメモリを食います。つまり、サイズ1byteのファイルを1000個作ったら、4MB食います。(正確には、おそらくファイル一覧を管理するための領域としてさらにファイルの数の平方根くらいのオーダーの追加メモリを食ってる模様。ディレクトリ1個作っても512byteくらいメモリ食ってる模様) そんな当たり前のことを考えずに動かしたシステムで「合計***byteのサイズしか書いてないのにメモリが足りなくなって・・・」とかぼーたれながら2日ほどをムダにつぶしてしまったのは、ここだけの内緒じゃなくて、私の恥としてさらし続けといてください・・・

まー、サイズ計算をアプリでするなら、上記の4KBブロックを考慮してやりゃすむんでそれだけの話です。が、本当にそうすべきなのかと。たぶん正攻法としては、tmpfsをマウントするときに上限サイズをきちっと決めて、アプリに限界を超えたサイズを書きせないようにするのが正攻法でしょうね。「mount -t tmpfs -o size=2m tmpfs /dev/shm」とか。

下回り屋さんとしては上記の対応でいいんですが、どうせ tmpfsに2MBしか回せないようじゃ今の仕様を満たすものを作るには厳しいので、やはりメモリを増やせという要求を通していた方がよかった気がします。(すでに過去形) ああ、今や値段差20セントか。どこの誰だ、160円とかいってたやつは。ここまで頭悩まして設計してまでしてけちる値段なのか本当に疑問。

tmpfsの挙動を調べるために最初に紹介した記事周辺のブログ読みあさったんですが、メモリ消費量についてはあまりわからなかったので、仕方なく linux/mm/shmem.c あたりを1時間くらい読んで、んで読んでもわかるかボケーという結論に達して、実際に実験して実測しました。私はプログラムを書くのが苦手なプログラマなので、サンプルプログラムを作るのに苦労しましたが、結局実験した方が早くてかつ確実でした。

結局何を書きたかったんだろ。とりあえず、こんなだめな後輩ですいません kosakiさん。

というようなことを、深夜2時の会社で考えてました。っと思ったら、すでに夢の中でした。

x86_64+powernow-k8 で電圧調整

[Linux] [rarul.comサーバ]

'08/07/06(日曜日)11:46:01

だいぶ前の続き。

いろいろやってみたけど、結果的に CentOS 5.2 + x86_64(BE-2400+)でpowernow-k8を使った電圧調整ができたんで、その強引なやり方を後生の自分のためにメモっときます。参考にしたところ
[winplusの日記] powernow-k8の再コンパイル(電圧変更)
[adsaria mood] CentOSのカーネル再構築
消費電力/低消費電力PC - usyWiki
アジアのペンギン: 新規カーネル起動失敗に備えたgrubの使い方

まずはデストリ(CentOS 5.2)のLinuxのソースの取り寄せ。このへんを掘って、kernel-2.6.18-92.1.6.el5.src.rpmをインスコ。/usr/src/redhat/ 以下に展開される。

次は kernel の構築準備。ここを参考に、というかかかれていることをそのまんま実行。カーネル構築前に powernow-k8で電圧変更を可能にするパッチを当てる。ただ、そのままでは当たらなかったので一部手動修正。acpi_processor_performance構造体のacpi_dataが実体からポインタに変わっただけっぽい。あと、x86_64環境だと、powernow-k8.cはpowernow-k8モジュールではなくacpi-cpufreq.koモジュールに取り込まれるらしく、その影響でカーネルモジュールへのパラメータ渡しがどうもうまく動いてくれていないっぽい、つーことでfreq_listとvcore_listを手動でソースにベタに直書きして対処。

んで kernel構築しインスコし、手動構築していたr8168.koも忘れずに追加でインスコし、grug.confのdefaultを書き換えてmbr書き換えして再起動、、の前に このへん参考にお試し起動してみながら、いざ再起動して完了っと。

やったことをずらずらっと書くとこれくらいだけど、実際の作業はかなり苦労しましたです。。

# wget http://ftp.riken.jp/Linux/centos/5.2/updates/SRPMS/kernel-2.6.18-92.1.6.el5.src.rpm
# mkdir -p /usr/src/redhat/SOURCES
# rpm -ivh kernel-2.6.18-92.1.6.el5.src.rpm
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target x86_64 kernel-2.6.spec
# cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18.x86_64/
# wget wget http://www.berniyh.net/powernow-k8-vcore_list-2.6.24-git-v3.patch
# patch -p1 < src/powernow-k8-vcore_list-2.6.24-git-v3.patch
# emacs -nw arch/i386/kernel/cpu/cpufreq/powernow-k8.c
(powernow-k8にパッチ当てる。failedしたとこの手動修正とfreq_list/vid_listの手動追加。x86_64もi386内のpowernow-k8.cが使われる)
# vi Makefile
(EXTRAVERSION をオレバージョンに改変し、既存のとごっちゃにならないようにする)
# make clean && make mrproper
# cp /boot/config-2.6.18-92.1.6.el5 .config
# make oldconfig
# make
# (20分くらいマターリして待つ)
# make modules_install
# /sbin/installkernel 2.6.18-92.1.6.el5-x1 arch/x86_64/boot/bzImage System.map
# cd ~rarul/src/r8168-8.005.00
# bash rarul.sh 2.6.18-92.1.6.el5-x1
(r8168.koインスコ用専用スクリプト。中身は前回の記事を見て。)
# /sbin/grub
grub> savedefault --default=0 --once
grub> quit
# (おもむろにgrub入れ替えるのは怖いので、、怖くない場合は↓)]
# vi /etc/grub.conf
(defaultを修正)
# /sbin/grub-install /dev/sda
# /sbin/shutdown -r now && exit
(再起動待って、dmesgを確認して以下のようなところがあればOK)
(なってなければ、uname -aで新規kernelが入っているのかどうかやdmesgに変なエラーがないのかとかを見ないといけないかと。)
powernow-k8: Requested 2300MHz with 1100mV
powernow-k8: Requested 2200MHz with 1050mV
powernow-k8: Requested 2000MHz with 1000mV
powernow-k8: Requested 1800MHz with 950mV
powernow-k8: Requested 1000MHz with 900mV
powernow-k8: 0 : fid 0xf (2300 MHz), vid 0x12
powernow-k8: 1 : fid 0xe (2200 MHz), vid 0x14
powernow-k8: 2 : fid 0xc (2000 MHz), vid 0x16
powernow-k8: 3 : fid 0xa (1800 MHz), vid 0x18
powernow-k8: 4 : fid 0x2 (1000 MHz), vid 0x1a

途中で ncurses-devel, unifdef, redhat-rpm-config, rpm-build を yumでインスコしたような気がするけど、それくらいは勝手に察知して対処してくれ>未来のオレ。あと手動で修正追加したパッチはこのへん

rarul.comへのアクセス拒否しまくり

[Linux] [rarul.comサーバ]

'08/05/17(土曜日)02:00:35

先日rarul.comの自宅鯖のハードを入れ替えましたが、このときアクセス拒否していたIPアドレスのリストをメモするのを忘れていました。おかげで、入れ替えてから数日の間にここのブログがテラスパムでした。だいたい80個くらいのスパムコメントをつけられ、またMovableTypeがスパムと判断したものを含めると、300くらいつけられてました。

さすがにやってられないので、reject_listを用意し、IPアドレスごとにTCPレベルで拒否する設定にしました。例のごとくAPNICからCH/KRのIPアドレスリストを取り寄せてこれらからは無条件で拒否にし、んで access_log をみながら mt-comment.cgi にPOSTでいきなりアクセスするのを繰り返す人を見つけてIPアドレスブロックごと拒否してます。おかげでものすごい量のIPアドレスからのアクセスを拒否することになってしまってます。

JP圏内は、Y!BBな1つをのぞいてはスパムっぽいものはなかったです。なので、たぶんたいていの人はこの日記を読めてるかと思いますが、もしrarul.comにアクセスできなかった場合は rarulあっとまーくrarul.comまでメールください。・・・アクセスできなかったらそもそもこの日記を読めずメールを送ってというメッセージすら見えないですが、私は細かいことは気にしない主義なので、問題ないです(ぇぇ

そんなわけで、相変わらずわがままなサーバですがこれからもよろしくお願いいたします。

投稿者: らるる | レスつける (2) | トラックバックしたい人 (0)
sloth > うちのWikiがスパムだらけ。最近ひどい。 ('08/05/17(土曜日)02:15:02)
rarul > 日本語含まないコメントを拒否すると、 かなり効果があったりする。 ('08/05/18(日曜日)02:24:42)