粘性位是一种权限位,它被设置在文件或目录上,只允许文件/目录的所有者或root用户删除或重命名该文件。其他用户没有权限删除由其他用户创建的文件。
有时候你需要一个Linux目录,可以供Linux系统的所有用户用来创建文件。用户可以根据自己的方便性在这个目录中创建、删除或重命名文件。
那么,如果一个用户在这个目录中意外或故意删除(或重命名)其他用户创建的文件会怎样呢?
为了避免这种问题,使用了粘性位的概念。因为/tmp目录就是用于此目的。所以为了避免上述情况,/tmp目录使用了粘性位。
例如:
mkdir demo
chmod 777 demo
我还在这个文件夹中创建了两个具有不同用户权限的文件,权限设置为777。
ls -ld demo
drwxrwxrwx 2 guru guru 4096 Mar 11 18:17 demo
ls -l demo
-rwxrwxrwx 1 abhi abhi 0 Mar 11 17:11 file1
-rwxrwxrwx 1 anshu anshu 0 Mar 11 18:15 file2
现在在这个上面打开粘性位。
chmod +t demo/
ls -ld demo
drwxrwxrwt 2 guru guru 4096 Mar 11 18:17 demo
现在如果一个用户(abhi)想要重命名第二个用户(anshu),会发生什么?
mv /home/guru/demo/file2 /home/guru/demo/file3
mv: cannot move '/home/guru/demo/file2' to '/home/guru/demo/file3': Operation not permitted
粘性位的起源
在Linux上,粘性位只在目录上具有上述用途。从历史上看,在普通文件上它被用于完全不同的目的,这也是它名称的由来。
当一个程序被执行时,用户在实际开始使用之前需要将程序加载到内存中,这需要一定的时间。如果一个程序,比如编辑器,经常被用户使用,那么启动时间的延迟就成为了一个负担。
为了改善这种时间延迟,引入了粘性位。操作系统会检查可执行文件的粘性位是否打开,如果打开,则将可执行文件的文本段保留在交换空间中。这样,当再次运行该程序时,可以轻松地将可执行文件加载回RAM中,从而最小化时间延迟。
像Linux这样的现代系统会自动管理其可执行文件和其他文件的缓存,因此不需要粘性位来实现这个功能。
来源:“Linux Sticky Bit Concept Explained with Examples” at The Geek Stuff