LPI学习之Linux 文件类型与权限模型

Linux文件类型常见的有:普通文件、目录、字符设备文件、块设备文件、符号链接文件等

 

[root@rcc-pok-idg-2305 etc]# ls -hl /etc
total 2.4M
drwxr-xr-x  4 root root  4.0K Mar 18  2009 acpi
-rw-r--r--  1 root root    44 Sep 28 16:28 adjtime

lrwxrwxrwx  1 root root    22 Feb 23 20:56 grub.conf -> ../boot/grub/grub.conf

 

  • 符号是 - ,这样的文件在Linux中就是普通文件
  • 有类似 drwxr-xr-x ,这样的文件就是目录,目录在Linux是一个比较特殊的文件。注意它的第一个字符是d。创建目录的命令可以用 mkdir 命令,或cp命令,cp可以把一个目录复制为另一个目录。删除用rm 或rmdir命令。
  • 有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件

crw------- 1 root root     1,  11 Feb 23 20:59 kmsg
srw-rw-rw- 1 root root          0 Feb 23 20:59 log
brw-r----- 1 root disk     7,   0 Feb 23 20:59 loop0

 

前面第一个字符是 c ,这表示字符设备文件

前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备

文件的属性的第一个字符是 s,表示套接口文件。

 

  • Linux系统文档资源:

从本质上说,Linux 系统中有三种文档资源:手册页、信息页和 /usr/share/doc 中的应用程序随附的文档。

手册页(manual pages,或“man pages”)是 UNIX 和 Linux 的参考文档的典型形式。

一般来说,您将在手册页中找到下面这些章节:

NAME 命令的名称和单行描述
SYNOPSIS 怎样使用命令
DESCRIPTION 命令功能的深入讨论
EXAMPLES 怎样使用命令的建议
SEE ALSO 相关主题(通常是手册页)

 

[root@rcc-pok-idg-2305 man]# ls
bg  fr            it.UTF-8  man2x  man6   mann          ru         zh_TW
cs  fr.ISO8859-1  ja        man3   man6x  nl            ru.KOI8-R
da  fr.UTF-8      ko        man3p  man7   pl            ru.UTF-8
de  hr            man0p     man3x  man7x  pl.ISO8859-2  sk
el  hu            man1      man4   man8   pl.UTF-8      sl
en  id            man1p     man4x  man8x  pt            sv
es  it            man1x     man5   man9   pt_BR         tr
fi  it.ISO8859-1  man2      man5x  man9x  ro            zh_CN
[root@rcc-pok-idg-2305 man]# pwd
/usr/share/man

 

man1    用户程序
man2    系统调用
man3    库函数
man4    特殊文件
man5    文件格式
man6    游戏
man7    其它

 

要查看用户标识,输入 whoami

 

查看属于哪一组:

[root@rcc-pok-idg-2305 ibm]# groups root bin
root : root bin daemon sys adm disk wheel
bin : bin daemon sys

 

[root@rcc-pok-idg-2305 ibm]# ls -l /etc/passwd
-rw-r--r-- 1 root root 1701 Sep 28 16:23 /etc/passwd
[root@rcc-pok-idg-2305 ibm]#
[root@rcc-pok-idg-2305 ibm]#
[root@rcc-pok-idg-2305 ibm]# chgrp wheel /etc/passwd
[root@rcc-pok-idg-2305 ibm]# ls -l /etc/passwd
-rw-r--r-- 1 root wheel 1701 Sep 28 16:23 /etc/passwd

 

为了改变文件或其它文件系统对象的所有者或组,分别使用 chownchgrp

 

linux数字模式:

模式    数字
rwx    7
rw-    6
r-x    5
r--    4
-wx    3
-w-    2
--x    1
---    0

 

[root@rcc-pok-idg-2305 ibm]# umask
0022

根据umaks创建文件时候计算的方法:

例如,对于umask值0 0 2,相应的文件和目录缺省创建权限是什么呢?

  第一步,我们首先写下具有全部权限的模式,即777 (所有用户都具有读、写和执行权限)。  

 第二步,在下面一行按照umask值写下相应的位,在本例中是0 0 2。  

 第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。   

 第四步,对于文件来说,在创建时不能具有文件权限,只要拿掉相应的执行权限比特即可。   

例子, 其中u m a s k值为0 0 2:   

1) 文件的最大权限 rwx rwx rwx (777)   

2) umask值为0 0 2 --- --- -w-   

3) 目录权限 rwx rwx r-x (775) 这就是目录创建缺省权限   

4) 文件权限 rw- rw- r-- (664) 这就是文件创建缺省权限

 

 

转载:--------------------------------------------------

一、UNIX下关于文件权限的表示方法和解析

 

SUID 是 Set User ID, SGID 是 Set Group ID的意思。

 

UNIX下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位:

 

9 8 7 6 5 4 3 2 1 0

- r w x r - x r - x

第9位表示文件类型,可以为p、d、l、s、c、b和-:

p表示命名管道文件

d表示目录文件

l表示符号连接文件

-表示普通文件

s表示socket文件

c表示字符设备文件

b表示块设备文件

 

第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:

 

r表示可读,可以读出文件的内容

w表示可写,可以修改文件的内容

x表示可执行,可运行这个程序

没有权限的位置用-表示

例子:

ls -l myfile显示为:

-rwxr-x--- 1 foo staff 7734 Apr 05 17:07 myfile

 

表示文件myfile是普通文件,文件的所有者是foo用户,而foo用户属于staff组,文件只有1个硬连接,长度是7734个字节,最后修改时间4月5日17:07。

 

所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他的用户对这个文件没有权限。

 

如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:

1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置

 

2、-rwSr--r-- 表示SUID被设置,但所有者权限中可执行位没有被设置

 

3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置

 

4、-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被社

 

其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是

 

1,表示有相应的权限:

11 10 9 8 7 6 5 4 3 2 1 0

S G T r w x r w x r w x

第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。

11 10 9 8 7 6 5 4 3 2 1 0

上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1

-rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0

 

给文件加SUID和SUID的命令如下:

chmod u+s filename 设置SUID位

chmod u-s filename 去掉SUID设置

chmod g+s filename 设置SGID位

chmod g-s filename 去掉SGID设置

另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也很简单。

 

二、SUID和SGID的详细解析

 

由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。

首先讲普通文件的SUID和SGID的作用。例子:

如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命令显示如下:

-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括 user id和group id。用户可以用id命令来查到自己的或其他用户的user id和group id。

除了一般的user id 和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源的访问权限。

一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为 200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问 的限制,其实就是kevin用户对资源访问的权限,和foo没关系。

如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。

SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

下面讨论一个例子:

UNIX系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为:cr--r----- 1 root system 2, 1 May 25 1998 kmem

但ps等程序要读这个文件,而ps的权限设置如下:

-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps

这是一个设置了SGID的程序,而ps的用户是bin,不是root,所以不能设置SUID 来访问kmem,但大家注意了,bin和root都属于system组,而且ps设置了SGID,一般用户执行ps,就会获得system组用户的权限, 而文件kmem的同组用户的权限是可读,所以一般用户执行ps就没问题了。但有些人说,为什么不把ps程序设置为root用户的程序,然后设置SUID 位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替 SUID的程序,如果可能的话。下面来说明一下SGID对目录的影响。SUID对目录没有影响。如果一个目录设置了SGID位,那么如果任何一个用户对这 个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。

 

 

目录和 sgid


如果启用了目录的“sgid”标志,在目录内创建的任何文件系统对象将继承目录的组。当您需要创建一个属于同一组的一组人使用的目录树时,这种特殊的功能很管用。只需要这样做:

# mkdir /home/groupspace
# chgrp mygroup /home/groupspace
# chmod g+s /home/groupspace

现在,mygroup 组中的所有用户都可以在 /home/groupspace 内创建文件或目录,同样,他们也将自动地分配到 mygroup 的组所有权。根据用户的 umask 设置,新文件系统对象对于 mygroup 组的其他成员来说,可以或不可以是可读、可写或可执行的。

 

ext2 文件系统:

ext2 文件系统多年来已经成为标准的 Linux 文件系统。对于大多数应用程序,它通常都有很好的性能,但它没有任何日志记录能力。这使得它不适合非常大的文件系统,因为执行 fscks 要花太多的时间。另外,由于每个 ext2 文件系统只能拥有固定数目的索引节点(inode),所以 ext2 有些内置的限制。可以这么说,通常认为 ext2 是一个非常健壮和有效的非日志记录文件系统。

  • 内核:2.0+
  • 日志记录:无
  • mkfs 命令:mke2fs
  • mkfs 示例:mke2fs /dev/hdc7
  • 相关命令:debugfs、tune2fs 和 chattr
  • 与性能相关的挂装选项:noatime 和 nodiratime

ext3 文件系统使用与 ext2 相同的磁盘格式,但增加了日志记录能力。事实上,在所有的 Linux 文件系统中,ext3 具有最广泛的日志记录支持,它不仅支持元数据日志记录,还支持有序日志记录(缺省)和完全的“元数据+数据”日志记录。这些“特殊”日志记录方式有助于确 保数据完整性,而不象其它日志记录实现仅仅缩短 fsck 的运行时间。出于这个原因,如果数据完整性是绝对最重要的,那么 ext3 是可用的最佳文件系统。然而,这些数据完整性功能确实会在某种程度上影响性能。另外,因为 ext3 使用与 ext2 相同的磁盘格式,所以和它的非日志记录表亲(ext2)一样,它也受到同样的可伸缩性限制。如果您在寻找一个出色的、通用的同时又非常健壮的日志记录文件 系统,那么 ext3 是很好的选择。

  • 内核:2.4.16+
  • 日志记录:元数据、有序数据写入和完全的“元数据+数据”
  • mkfs 命令:mke2fs -j
  • mkfs 示例:mke2fs -j /dev/hdc7
  • 相关命令:debugfs、tune2fs 和 chattr
  • 与性能相关的挂装选项:noatime 和 nodiratime
  • 其它挂装选项:
    • data=writeback(禁用日志记录)
    • data=ordered(缺省值,将元数据日志记录和数据与元数据一起写到磁盘)
    • data=journal(用于数据 元数据完整性的完全数据日志记录。写操作性能降低一半。)
    ReiserFS文件系统:

ReiserFS 是一个相对较新的文件系统,它的设计目标是提供非常好的小文件性能、非常好的通用性能以及是非常可伸缩的。ReiserFS 使用元数据日志以避免长时间的 fsck,但日志实现可能使最近修改的数据在系统锁定时被毁坏。通常情况下,ReiserFS 有非常好的性能,但在装入特定种类的文件系统时可能出现某种性能反常的情况。另外,ReiserFS 的 fsck 工具还不成熟,因此从毁坏的文件系统恢复数据可能会有困难。这些问题中的很多是由于 ReiserFS 相对较新、仍在发展过程中。许多人因 ReiserFS 的速度和可伸缩性而喜爱它。

  • 内核:2.4.0+(推荐 2.4.16+)
  • 日志记录:元数据
  • mkfs 命令:mkreiserfs
  • mkfs 示例:mkreiserfs /dev/hdc7
  • 与性能相关的挂装选项:noatime、nodiratime 和 notail

JFS文件系统:

JFS 是一个由 IBM 移植到 Linux 的高性能日志记录文件系统。JFS 由 IBM 企业服务器使用,并且是为高性能应用程序而设计的


 

你可能感兴趣的:(LPI学习之Linux 文件类型与权限模型)