2015年9月アーカイブ

setuid()の家族のメモ

setuid(), getuid(), setgid(), getgid()
実ユーザIDと実効ユーザID (実グループIDと実効グループID)。

seteuid(), geteuid(), setegid(), getegid()
実効ユーザID、実効グループID。実行しているプロセスのことで、呼び出し元のことではないので注意。
ファイルシステムのUID,GIDのパーミッションのビットと関係が深い。よくわからない人は passwd プログラムのパーミッションを確認してみるとよい。

setpgid(), getpgid()
プロセスグループID。killのpidにマイナスの値を設定する用途に使う。セッションIDにも関係するらしいけど私がまだよく理解できてない。setpgrp(), getpgrp() はもう使わなくてよいみたい。

setsid(), getsid()
セッションID。ログインセッションの単位を管理する。Wikipedia: プロセスグループによると、CUIのころのこれらの考え方がGUI時代になってほとんど通用しなくなっているらしい、けど私がまだよく理解できていない。このへんも読んどくといいかもしれない → なぜnohupをバックグランドジョブとして起動するのが定番なのか?(擬似端末, Pseudo Terminal, SIGHUP他)

setreuid(), setregid()
実ユーザIDと実効ユーザID、実グループIDと実効グループID。rootじゃない場合は、権限の関係で実ユーザと実効ユーザIDを入れ替えることもできないのでその用途で使う・・・と思う。でも↓の保存ユーザID(保存グループID)を使えばいいような・・・

● 保存ユーザID, 保存グループID
実ユーザID(実グループID)や実効ユーザID(実効グループID)が変更された場合、つまりsetuid(),setguid(),seteuid(),setegui()に、規則に基づいて変更前のIDがこの保存ユーザID(保存グループID)にコピーされる。再びseteuid()して元の権限に戻ろうとした時などに使われる。いつコピーされていつコピーされないかとか、保存ユーザIDと一致するものにのみseteuid()できるとか、この辺の規則が非常にややこしいので注意。

一言でまとめると、rootが所有者のファイルのUID/GIDビットを立てたりrootにsetuid()したりするのは、たいていセキュリティ的にろくなことがないのでやめておこう。

/dev/sda は /dev/sdz の次どうなるのか

答え: /dev/sdaa
・・・だけじゃ味気ないのでもう少し詳細を・・・

今時のLinuxはディスクをだいたいSCSI層で操作していて、つまりSCSIのdiskのドライバで上記が決まっている。具体的にはlinux/drivers/scsi/sd.c

このドライバのsd_format_disk_name()関数で名前が決まる。kernelから空いているindex番号をida_get_new()でもらってきて、その番号に対応する名前をsd_format_disk_name()で作る。一見するとわかりにくい関数だけど、こんな感じになる。
 sda, sdb, sdc, ... sdz, sdaa, sdab, sdac, ... sdaz, sdba, sdbb, ... sdzz, sdaaa, sdaab,
つまり、a-zの26文字を利用した26進数左詰。最大値は MAX_IDR_BITK できまるらしいので、intの最大値、物理的なディスクの限界があるので実質無限ですね。

ちなみになぜこんなことを気にしたかというと、FreeBSDだとda0,da1,da2 ... とディスクそのものに番号がつき、da0p1, da0p2, .. とパーティションはこれにさらに番号がつくという構成で、Linuxでもsd(sda)やhd(hda)以外はこの考え方なのに、なぜsdやhdはこうなのかと疑問に思ったからです・・・じゃなくて、ここを名前ベースでパーティション名かディスク名かを判別できるのかどうかで悩んだからで、ここはドライバ次第なので特にルールを決めれないという結論でした。

とはいっても、今更 /dev/sda がいきなり別の名前になってもみんな困るだろうからもう決め打ちでいいよね?ん?最近はudevやdevice-mapperだって?いやいや、udevやdevice-mapperを実装しようと思ったら結局迷うわけで。

さらにちなみに、適当に書かれてしまったコードのせいで /dev/sd[a-z][0-9] にしかヒットしないとか言う話はわりとあるようです。

このアーカイブについて

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

前のアーカイブは2015年7月です。

次のアーカイブは2015年10月です。

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

月別 アーカイブ

ウェブページ

Powered by Movable Type 5.2.13