スティッキービット

スティッキービット（）は、UNIX/Linuxシステム上のファイルやディレクトリに対応して設定されるフラグである。

所有者のみが削除可能なファイルやディレクトリを作成するためにディレクトリに設定するフラグである。

もともとは高速化のためにプロセス終了後もメモリに保持するために実行ファイルに設定するものだった。

 歴史 
スティッキービットは1974年のUnix V5で導入され、純粋な実行ファイルで使われた。セットされていると、オペレーティングシステムはプロセスが終了した後もプログラムのテキストセグメント（命令の書かれている部分）をスワップ空間に保持する。これにより、同じプログラムを再度実行する際に高速化される。そのため、よく使うプログラム（エディタなど）にセットしてプロセスの立ち上げ時間を短縮していた。スティッキービットのセットされたプログラムの問題点は、実行ファイルを置換する場合に発生する（特にバッチ処理中）。正しく置換するには、まずスティッキービットを落としてから実行ファイルを実行することで、スワップ空間内のキャッシュを消去し、実行ファイルを置換してからスティッキービットを再度セットする。

現在では、このような動作をするのはHP-UX、NetBSD、UnixWare、macOSである。Solarisは2005年ごろこのような動作をやめた。BSD 4.4-Lite ではこの古い動作を保っていたが、OpenBSD (release 3.7) と FreeBSD (release 2.2.1) ではこのような動作をやめた。Linux ではこのような動作を実装したことはない。これはメモリ容量の大規模化が主な要因である（終了したプロセスのイメージは、メモリページが再利用されない限り残るので、よく使われるプログラムのイメージはスティッキービットをセットしなくとも再利用される確率が高い）。

 使用法 
スティッキービットの最も一般的な使用法は、ディレクトリに対して使う場合である。セットされるとディレクトリ配下のファイルのファイル名変更や削除はそのファイルの所有者、ディレクトリの所有者、スーパーユーザーのいずれかしかできなくなる。スティッキービットがセットされていない場合、書き込みおよび実行のファイルパーミッションを持つユーザーなら誰でも改名や削除が可能である。

一般にこれは /tmp ディレクトリに使われ、一般ユーザーが勝手にファイルを改名したり削除したりできないようにする。この機能は1986年の4.3BSDで導入され、現在ではほとんどのUNIXシステムで採用されている。

さらに、Solaris 2.5 では実行ファイル以外のファイルにスティッキービットをセットしたときの動作を定義している。そのようなファイルにアクセスしたとき、カーネルはその内容をキャッシュしない。これは一般にスワップファイルにセットされ、システムキャッシュからより重要なデータを追い出さないようにしている。ベンチマークテストでも必要に応じて使われる。

スティッキービットは automounter がファイルがマウントされていないことを示すのにも使われる。これによって ls などのプログラムがマウントされていないリモートファイルを無視することができる。

 オペレーティングシステム マニュアル抜粋（試訳） リンク Solaris 10 実行可能でない通常ファイルにスティッキービットがセットされている場合、そのファイルはスワップファイルと見なされる。この場合システムのページキャッシュはそのファイルのデータを保持するのに使われない。他のファイルにセットされている場合、結果は規定されない。 Solaris chmod(2) HP-UX ユーザーが終了させた際にそのファイルのプログラムテキスト部のスワップ空間上のイメージを破棄しない。次にユーザーがそのファイルを実行した際、ファイルシステムからではなく、スワップ空間からプログラムのテキスト部を持ってくるので、時間が短縮される。 hp-ux chmod(2) Linux Linuxカーネルは、ファイルについてのスティッキービットを無視する。 Linux chmod(2) FreeBSD FreeBSDのVMシステムは、実行ファイルのスティッキービット(ISVTX)を完全に無視する。 FreeBSD chmod(2) IRIX ELF実行ファイルのダイナミックローダーとなっているファイルにスティッキービット(I_ISVTX)がセットされている場合、その実行ファイルを exec したとき、古いプロセスのリードオンリーのアドレス空間が新しいプロセスのダイナミックローダーに提供される。これによってプログラム立ち上げ時間を劇的に改善する。他の種類のファイルにスティッキービットをセットしても何の効果も発生しない。 IRIX chmod(2)

 例 
スティッキービットはchmodコマンドでセットでき、八進数なら 1000、シンボルなら t を使ってセットする（s は setuid ビットとして使われている）。例えば、ディレクトリ /usr/local/tmp にセットする場合 chmod +t /usr/local/tmp などと入力する。あるいは、一般的な tmp のパーミッションを確実に設定したい場合は chmod 1777 /usr/local/tmp とする。

UNIXのシンボルモードによるファイルパーミッション表示では、スティッキービットは t という文字で表され、文字列の最後尾に表示される。Solaris 8 では、/tmp ディレクトリはデフォルトでスティッキービットがセットされていて、次のように表示される。

  $ ls -ld /tmp
  drwxrwxrwt   4 root     sys          485 Nov 10 06:01 /tmp

その他のユーザーの実行権がないファイルやディレクトリにスティッキービットがセットされている場合、大文字の T で表示される。

  # ls -l test
  -rw-r--r--   1 root     other          0 Nov 10 12:57 test
  # chmod +t test; ls -l test
  -rw-r--r-T   1 root     other          0 Nov 10 12:57 test

 脚注 

 関連項目 
chmod
setuid

 外部リンク 
File and Directory Permissions
CHMOD(1) JM Project

Category:UNIX