2012-02-11 (Sat)
_ ZENBOOK UX31E-RY256S
ASUSU U31シリーズ ウルトラブック 13.3型 HD液晶 U31E-RY256S シルバー
かれこれ4〜5年くらい使っているType TZのディスクが怪しくなってきたので、買い替えた。
色々迷ったけど、MS Office Home and Businessが付いて9万6千円くらいという価格に惹かれてASUSのUltrabookを購入。 11.6インチと13.3インチのモデルがあったが、解像度とバッテリ駆動時間を考えて13.3インチの方にした。
以下簡単なインプレ。
いいところ
- 薄い
- 解像度が高い(1600x900)
- SSDの容量がそこそこ(256GB)
- SATA3.0でSSDの性能がまあまあ(シーケンシャルリードは速いけど、ランダムアクセスはちょっと遅い)
- 見た目がよい(個人的には、MacBook Airの丸みを帯びたデザインよりZENBOOKみたいに直線的な方が好き。天板も意外と悪くない。)
- 付属品が充実している(VGAアダプタ・LAN→USBアダプタや本体ケースが付属)
悪いところ
- ロゴがSONYじゃなくてASUS
- メモリが4GBで増設不可
- CPUが超低電圧版Core i5
- キーボードがいまいち
- 幅がかなり広い(今使ってる一番小さい鞄にぎりぎり入ったのでセーフ)
- 付属ソフトが不安定(ETDCtrl.exeのCPU使用率が25%をキープしたりする)
- 液晶のドット抜けが1コあった(ZENBOOKはZBD保証というのがあって、輝点については30日以内なら無償で液晶交換してくれるらしい。赤い点に見えるけど送料かかるしどうしようかなあ…)
何か悪いところの方が多くなってしまったけど、実際はわりと気に入っている。
2014-02-11 (Tue)
_ ユーザIDを変更するプログラムのcoreダンプ
UnixライクなOSでは、ユーザIDを変更するプログラムでSEGVが発生した場合、ulimitなどでcoreを吐くように設定していてもcoreが吐かれないことがある。
これはセキュリティ上の理由で、例えばsetuidプログラムでは、一般ユーザに見られてはまずい情報がcoreファイルから漏洩したり、root権限のファイルを上書きしてしまうといった問題があるので、単純にroot権限でcoreファイルを作成してしまうことは好ましくない。 このため、setuidプログラムや、seteuid(2)などでユーザID/グループIDを変更するプログラムは、デフォルトではcoreを吐かないようになっている。
この動作は通常は問題ないが、デバッグの際に不便なので、Linuxなどでは設定で動作を変えられるようになっている。
グローバルな設定
Linuxの場合は、fs.suid_dumpableというカーネルパラメータでグローバルにこの挙動を変えることができ、sysctl -w fs.suid_dumpable=1
のように設定する。設定できる値は以下の三つ。
- 0
- ユーザID/グループIDを変更するプログラムはcoreを吐かない。
- 1
- すべてのプログラムがcoreを吐く。
- 2
- "0"のモードでcoreを吐かないケースでは、rootしか読めないパーミッションでcoreを吐き、既存のファイルがある場合は上書きしない。
proc(5)のマニュアルによると0がデフォルトのことだが、手元のUbuntuでは2がデフォルトになっているので、ディストリビューションによってデフォルトが異なるかもしれない。必要ならsysctl.confで設定しておくとよいだろう。
FreeBSDにもkern.sugid_coredumpというカーネルパラメータがあるが、上記の0と1のモードのみで、2のようなモードはない。
手元に環境がないが、Solarisの場合はcoreadmコマンドで設定できるようだ。
プロセス毎の設定
Linuxの場合、プロセス毎にフラグを持っていて、以下のようにprctl(2)で設定できる。*1
prctl(PR_SET_DUMPABLE, 0); /* coreダンプしないように設定 */ prctl(PR_SET_DUMPABLE, 1); /* coreダンプするように設定 */
fs.suid_dumpableが0の場合はseteuid(2)などを呼ぶとこのフラグが自動的に0にセットされるので、ユーザIDを変更した後でprctl(2)を使って値を再設定すればよい。*2
例えば、ApacheはCoreDumpDirectoryが設定されている場合はprctl(PR_SET_DUMPABLE, 1)
を実行するようになっている。
FreeBSDもP_SUGIDという同様のフラグ(ただしオンオフが逆)があるが、Linuxのようにシステムコールで設定することはできない。 ただし、実ユーザIDと実効ユーザID、実グループIDと実効グループIDがそれぞれ同じ状態でexecve(2)を呼ぶとクリアされる(これはLinuxも同様)。
FreeBSDのソースを読むと実は__setugid(2)というシステムコールが存在するが、リグシッションテスト用のシステムコールのようで、以下のように普通にビルドしたカーネルではENOSYSを返す。
int sys___setugid(struct thread *td, struct __setugid_args *uap) { #ifdef REGRESSION struct proc *p; p = td->td_proc; switch (uap->flag) { case 0: PROC_LOCK(p); p->p_flag &= ~P_SUGID; PROC_UNLOCK(p); return (0); case 1: PROC_LOCK(p); p->p_flag |= P_SUGID; PROC_UNLOCK(p); return (0); default: return (EINVAL); } #else /* !REGRESSION */ return (ENOSYS); #endif /* REGRESSION */ }
ただ、フラグの取得はissetugid(2)で行うことができ、RubyからもProcess::Sys.issetugidで取得できる。
p Process::Sys.issetugid
_ しゅどう [理屈は物欲の後をついてきます。]