Debian/类Unix文件系统

来自站长百科
跳转至: 导航、​ 搜索

Debian | Debian安装 | Debian使用 | Debian系统升级 | Debian常见问题

GNU/Linux 和其他的类 Unix 操作系统里面文件都被放在目录。所有的文件和目录都被排列在一棵很大的树里面, 即文件层次树,他的根是/。

这些文件和目录可以跨多个设备。mount(8)命令可以把一些设备挂载到文件系统树里面来。反之mount(8)可以把设备卸载。

Unix 文件基础[ ]

这里是一些最基础的:

  • 文件名是区分大小写的,MYFILE 和文件 MyFile 是不同的文件。
  • 跟目录指的是/不要把这个”root”和root用户相混淆了。
  • 任何目录都有一个可以由任意字母或者符号组成的名字,但是/是例外.根目录是一个例外:它的名字是 / (读做”slash"或者根目录)它不能被重命名。
  • 任何一个目录都是有下面几种形式给出的,完全限制的文件名,绝对文件名,或者路径,给出所有需要经过的目录序列。这三种形式是等价的。所有的绝对文件名都以/目录开始,在目录和目录或者目录和文件之间用/隔开。最开始的/是一个目录的名字,但是后面的仅仅是文件名的分隔符。

接下来具体解析一下:

/usr/share/keytables/us.map.gz

这就是一个完整限制的文件名;有些人把它叫做路径。然而人们经常单独把 us.map.gz 作为文件名。

根目录有很多分支,比如 /etc/和/usr/。这些子目录 又分出很多子目录来,比如 /etc/init.d/ 和 /usr/local/。 所有的加起来被称作目录树。

您可以想像,一个绝对文件名就是从树的根基(/)到一个分支的末端(文件)的路由。您也会听到别人把目录树叫做家庭树:这样子目录就有 双亲,路径就显示了所有文件完整的血缘关系。

除此之外,还有相对路径,它从其它的地方开始而不是根目录。您可能还记得 ../指的是上一级目录。

没有哪一个目录是和物理设备紧密关联的,比如您的磁盘。这个和 DOS,CP/M,Windows 系统不一样的,它们所有的路径都是以一个设备名开始的,比如 C:\。

关于文件层次的详细信息以及最好的操作练习可以在这里找到 Filesystem Hierarchy Standard。作为一个初学者,需要记住下面的事实:

  • /

简单的一个/表示根目录。

  • /etc/

这个是大多数系统配置文件存放的地方。

  • /var/log/

这个是系统日志存放的地方。

  • /home/

这个目录是存放所有非特权用户的主目录的。

Debian 中的文件系统概念[ ]

按照 Unix 的传统, Debian 为存放物理数据的磁盘或者其它存储设备,还有这些硬件设备之间的交互提供文件系统,比如控制台屏幕和远程串行终端就用联合的方式表示。

每个在 Debian 系统上的文件,目录,命名管道,或者物理设备都有一个数据结构被称作 inode,它被用来描述设备用用的属性,比如设备所有者,所属于的组, 上次访问时间等等。

这些表现出来的统一的物理入口是非常强大的,因为它们使得可以使用同样的命令和同样的操作来访问完全不同的设备。

您所有的文件都可以在一个次方上面,----或者您有 20 个磁盘,有些是在网络上其它的计算机上面, 在 GNU/Linux 系统中每个文件和目录都与其拥有者(主人)和拥有组相关联。所有的文件信息都保存在一个称为 inode 的数据结构中。

文件和目录的访问权限[ ]

文件和目录的访问权限对如下3类用户进行了分别定义:

  • 文件拥有者(u),
  • 文件拥有者所在用户组中的其它成员(g)
  • 所有其它用户(o)。

每个文件均拥有下列三种权限:

  • read (r): 查看文件内容
  • write (w): 修改文件
  • execute (x): 如同命令一样执行文件

每个目录均拥有下列三种权限:

  • read (r): 列出目录内容
  • write (w): 在目录中增删文件
  • execute (x): 访问目录中的文件

在此,对目录的 execute 权限,不仅意味着允许查看目录下文件的内容,还允许查看文件的其它信息如文件大小、修改时间。

文件类型(第1个字符)

-: 普通文件

d: 目录

l: 符号链接

c: 字符型设备节点

b: 块设备节点

p: 命名管道

s: 套接字

文件访问权限(接下来的 9 个字符,每3个一组依次代表 user、group 和 other)。

文件的硬链接

文件拥有 user 的用户名

文件所属 group 的用户组名

文件的字符数大小 (bytes)

文件的时间和日期 (mtime)

文件的名称

在 root 账号下可使用 chown 改变文件的拥有者。要改变文件的所属组,可以文件拥有者或 root 的身份运行 chgrp。要改变目录的访问权限,可以文件拥有者或 root 的身份运行 chmod。

     # chown newowner foo
     # chgrp newgroup foo
     # chmod  [ugoa][+-=][rwx][,...] foo

例如,可以 root 帐号下创建一个目录树,并使其拥有者为 foo,所属组为 bar:

     # cd /some/location/
     # chown -R foo:bar .
     # chmod -R ug+rwX,o=rX .

下面是3个更特殊的权限:

set user ID (s 或 S 代替 user's x),

set group ID (s 或 S 代替 group's x),

sticky bit (t 或 T 代替 other's x).

在此,如果隐藏在特殊权限后面的执行权限标位没有设置,则 ls -l 的输出中,这些标识位将使用大写字母。

为可执行文件设置 set user ID 位将允许用户以该文件拥有者的 ID 来执行该文件(例如以 root 身份)。同样,为可执行文件设置 set group ID 将允许用户以该文件所属组的ID来执行该文件(例如以 root 身份)。因为这些设置将引起安全风险,所以使用这些特性时要格外小心。

为目录设置 set group ID,则该目录会使用 BSD-like 文件创建方案,即目录中所有新创建的文件均属于该目录所属的 group。

为目录设置 sticky bit 可防止非文件拥有者移动目录中的文件。为确保全局可写目录如 /tmp 或组可写目录中的文件内容不被修改,不仅要关闭文件的写权限,还应设置目录的 sticky bit,否则,任何对该目录有写权限的用户均可以将该文件移动到别处,然后在原地创建一个同名文件。

这儿有一些有关文件权限的有趣例子。

     $ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/pppd
     crw-rw----    1 root     dip      108,   0 Jan 18 13:32 /dev/ppp
     -rw-r--r--    1 root     root         1051 Jan 26 08:29 /etc/passwd
     -rw-r-----    1 root     shadow        746 Jan 26 08:29 /etc/shadow
     -rwsr-xr--    1 root     dip        234504 Nov 24 03:58 /usr/sbin/pppd
     $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
     drwxrwxrwt    4 root     root         4096 Feb  9 16:35 /tmp
     drwxrwsr-x   10 root     staff        4096 Jan 18 13:31 /usr/local
     drwxrwsr-x    3 root     src          4096 Jan 19 08:36 /usr/src
     drwxrwsr-x    2 root     mail         4096 Feb  2 22:19 /var/mail
     drwxrwxrwt    3 root     root         4096 Jan 25 02:48 /var/tmp

在 chmod(1) 命令里,有一种替代的数字模式来描述文件权限。这种数字模式使用 3 到 4 个八进制数字(以 8 为基)。 每个数字相应如下:

第一个可选数字: set user ID (=4)、 set group ID (=2) 和 sticky bit (=1)之和

第二个数字: user 的 read (=4)、write (=2) 和 execute (=1) 权限之和

第三个数字: 同上,用于 group

第四个数字: 同上,用于 other

这听起来复杂,但实际上相当简单。 从 ls -l 命令的输出中,看第(2-10)列,把它们作为二进制(以2为基)文件权限(“-”表示“0”,“rwx” 表示“1”)的表示方式来读, 这种数字模式值将使你理解八进制(以 8 为基)的文件权限表示。例如,尝试:

     $ touch foo bar
     $ chmod u=rw,go=r foo
     $ chmod 644 bar
     $ ls -l foo bar
     -rw-r--r--    1 penguin  penguin  0 Nov  3 23:30  foo
     -rw-r--r--    1 penguin  penguin  0 Nov  3 23:30  bar

默认的文件权限掩码使用 shell 内建命令 umask 设置。 参见 builtins(7)。

时间戳[ ]

GNU/Linux 的文件有3种类型的时间戳:

  • mtime: 修改时间 (ls -l),
  • ctime: 状态改变时间 (ls -lc),
  • atime: 最近访问时间 (ls -lu).

注意 ctime 并非文件创建时间。

覆盖一个文件会改变所有三类时间 mtime、ctime 和 atime 所有三类时间。

改变文件的访问权限或拥有者会改变文件的 ctime 和 atime。

读文件会改变文件的 atime。

注意,在Debian系统中,即便是简单的读文件通常会引起文件的写操作,从而更新 inode 上的 atime 信息。使用 noatime 选项来挂载文件系统,可使用系统忽略该操作,从而加速文件的访问和读取。

使用 touch(1) 命令来改变存在文件的时间戳。

链接[ ]

2种方法将文件 foo 关联到不同的文件名 bar。

  • hardlink(硬链接)相当于现存文件的另一个名字。(ln foo bar),
  • symbolic link(符号链接),或者“symlink”,是通过名字指向另外一个文件的特殊文件。(ln -s foo bar)。

下面的例子显示了链接数的改变和使用 rm 命令时产生的微妙差异。

     $ echo "Original Content" > foo
     $ ls -l foo
     -rw-r--r--    1 osamu    osamu           4 Feb  9 22:26 foo
     $ ln foo bar     # 硬链接 
     $ ln -s foo baz  # 符号链接
     $ ls -l foo bar baz
     -rw-r--r--    2 osamu    osamu           4 Feb  9 22:26 bar
     lrwxrwxrwx    1 osamu    osamu           3 Feb  9 22:28 baz -> foo
     -rw-r--r--    2 osamu    osamu           4 Feb  9 22:26 foo
     $ rm foo
     $ echo "New Content" > foo
     $ cat bar
     Original Content
     $ cat baz
     New Content

上例中符号链接均拥有名义上的文件访问权限“rwxrwxrwx”,它们的有效访问权限均由它们所指向的文件来定义。

命名管道(FIFOs)[ ]

命名管道是一个行为象一个管道的文件。把某些东西放入命名管道文件,它从另外的一端出来。因此,它被称为 FIFO,或 First-In-First-Out:首先放入管道的东西将首先从另外一端出来。

如果写东西到一个命名管道,在写的东西在管道被读出之前,写的进程不会中止。如果从一个命名管道读,读的进程在中止之前,一直处于等待状态,直到有东西可以读为止。命名管道的大小始终为零 --- 它不储存数据,象shell一样,它仅仅连接两个进程。然而, 这个管道有一个名字,两个进程没有必要在同一个命令行运行,或者由同一个用户运行。

做下面的操作来尝试:

     $ cd; mkfifo mypipe
     $ echo "hello" >mypipe & # 放入后台
     [1] 5952
     $ ls -l mypipe
     prw-r--r--    1 penguin penguin  0 2003-11-06 23:18 mypipe
     $ cat mypipe
     hello
     [1]+  Done                    echo hello >mypipe
     $ ls mypipe
     prw-r--r--    1 penguin penguin  0 2003-11-06 23:20 mypipe
     $ rm mypipe

套接字[ ]

套接字类似于命名管道(FIFO),它允许进程交换信息。 对于套接字,那些进程不必要在同时运行,也没有必要是同一个祖先进程的子进程。 它是进程间通讯的端点。信息交换可以通过网络发生在不同的主机之间。

设备文件[ ]

设备文件是系统上物理的或者虚拟的设备,比如说硬盘显卡显示器或者键盘。 一个虚拟设备的例子是控制台,由 /dev/console 表示。

有两种类型的设备:

  • 字符设备:一次能够访问一个字符,那就是说,从设备读或者写的最小的数据单元是一个字符(byte)。
  • 块设备:一定是访问一个叫块的大单元,它含有许多字符。 硬盘是一个块设备。

设备文件可以被读写,尽管设备文件包含二进制数据,而这些二进制数据对人类来说是费解的乱码。 向设备文件直接写数据,有时侯对解决硬件连接故障有用。 比如说,将一个文本文件导出到打印机设备 /dev/lp0, 或者发送调制解调器命令到一个适当的串口 /dev/ttyS0。 但是,除非是慎重的操作,它有可能造成一个大的破坏。

/dev/null[ ]

/dev/null 是一个特殊的设备文件,它忽略写给它的任何东西。 如果不需要某些东西,把它扔到 /dev/null。 它本质上是一个无底洞。 如果从 /dev/null 读东西,将会立即得到文件结束符(EOF)。

/dev/zero 是类似的,只是从它读的话,将会得到 \0 字符(不与数字零的 ASCII 码相同)。

设备号[ ]

按例子执行 ls,将显示设备号。

     $ ls -l /dev/hda /dev/ttyS0 /dev/zero
     brw-rw----    1 root     disk       3,   0 Mar 14  2002 /dev/hda
     crw-rw----    1 root     dialout    4,  64 Nov 15 09:51 /dev/ttyS0
     crw-rw-rw-    1 root     root       1,   5 Aug 31 03:03 /dev/zero

在这里:

  • /dev/hda 主设备号为 3,次设备号为 0。 属于 disk 组的用户有读写访问权。
  • /dev/ttyS0 主设备号为 4,次设备号为 64。 属于 dialout 组的用户有读写访问权。
  • /dev/zero 主设备号为 1,次设备号为 5。 所有人都有读写访问权。

/dev 下的文件系统通过设备文件系统自动生成, 设备文件系统与 /proc 文件系统类似。

/proc 文件系统[ ]

/proc 文件系统是一个伪文件系统,它包含系统信息和正在运行的进程信息。

当注意到一个特殊的文件 /proc/kcore 时,人们经常恐慌,因为它通常很巨大。 该文件(或多或少)是计算机内存的一个拷贝。 它被用来调试内核, 实际上它并不存在,所以不必担心它的大小。

Debian使用手册导航

Debian安装

安装Debian GNU/Linux前准备 | 获取系统安装介质 | 使用Debian安装程序 | 启动进入新 Debian 系统 | 内核及其它信息 | 为Debian准备分区 | 安装指南 | 在Debian上安装Apache+Mysql+PHP

Debian使用

Debian 文件 | Debian基本操作 | Midnight Commander (MC) | 类Unix工作环境 | 类Unix文本处理 | 类Unix文件系统 | Debian生存命令 | Debian进阶 | Debian其他特性 | Debian下的Linux内核 | 启动系统 | Debian/活动记录及拷贝、创建子目录 | 差量备份、数据同步与系统冻结恢复 |常用命令与典型错误| 系统初始化 | 访问限制(Restricting access) | 刻录机 | 本地化

Debian升级

Debian系统升级 | 发行版升级到stable、testing或unstable

Debian技术支持

Debian技术支持

Debian常见问题

定义与概述 | 兼容性问题 | Debian 的软件系统 | Debian 的 FTP | Debian 的包管理系统 |Debian 的包管理工具 |更新系统 | Debian 与内核 | 定制 Debian GNU/Linux 的安装 |获取 Debian GNU/Linux 的支持 | 为 Debian 项目捐赠 | 作为商品销售Debian以及对其的展望

参考来源[ ]

http://www.debian.org/doc/manuals/debian-reference/ch-tutorial.zh-cn.html#s-text-process