zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux 学习笔记(五)文件系统

Linux笔记学习 文件系统
2023-09-27 14:29:24 时间

1 文件树的组织

下表列出了一些比较重要的标准目录。

路径名内容
/bin获得最小的系统可操作性所需要的命令
/boot内核和加载内核所需的文件
/dev终端、磁盘、Modem等的设备项
/etc关键的启动文件和配置文件
/home用户的主目录
/libC 编译器的库和部分 C 编译器
/media可移动介质上文件系统的安装点
/opt可选的应用软件包(尚未广泛使用)
/proc所有正在运行进程的映像
/root超级用户的主目录(经常就是 / )
/sbin引导、修复或者恢复系统的命令
/tmp每次重新引导就消失的临时文件
/usr存放大多数标准程序的地方,以及在线用户手册和绝大多数库文件
/usr/bin大多数标准命令和可执行文件
/usr/include编译 C 程序的头文件
/usr/lib库,供标准程序使用的支持文件
/usr/man联机用户手册
/usr/sbin系统管理命令和修复命令
/usr/share多种系统共同的东西(只读)
/usr/share/man联机用户手机
/usr/src非本地软件包的源代码
/usr/local本地软件(用户所编写或者安装的软件)
/usr/local/bin本地的可执行文件
/usr/local/etc本地系统配置文件和命令
/usr/local/lib本地的支持文件
/usr/local/sbin静态链接和本地系统维护命令
/usr/local/src本地软件包的源代码
/var系统专用数据和配置文件
/var/adm各种不同的东西:日志、系统设置记录、奇怪的管理信息
/var/log各种系统日志文件
/var/spool供打印机、邮件等使用的假脱机目录
/var/tmp更多的临时空间(在重新引导以后,文件予以保留)

根文件系统包括根目录和最小的一组文件和子目录,包含内核的那个文件位于根文件系统中的 /boot 目录下,它的名字通常以 vmlinuz 开头。存放设置文件的 /dev 目录(除了 /dev/pts 它单独安装)、存放关键系统文件的 /etc 目录、存放重要工具的 /sbin/bin 目录,有时候还有用来存入临时文件的 /tmp 目录都是根文件系统的一部分。

目录 /usr/var 也非常重要。 /usr 是存放大多数标准程序的地方,它还有其他一些内容,例如在线用户手册和绝大多数库文件。把 /usr 作为单独的文件系统并非严格要求,但出于管理上的方便,几乎总是这么设置。为了让系统能够最终启动到多用户模式,必须有 /usr/var 这两个目录。

/var 存放有假脱机目录、日志文件、记帐信息和其他各种快速增长或变化的东西以及随主机不同而有所不同的东西。由于 /var 包含有日志文件,而日志文件会随着故障出现的次数增多而增多,所以,如果可行的话,把 /var 放置在它自己的文件系统上是一个好主意。

用户的主目录 /home 应该保存在单独的文件系统上,这个单独的文件系统通常安装在根目录中。还可以用单独的文件系统存储占用空间较大的东西,例如源代码库和数据库等。

2 文件类型

Linux 定义了 7 种文件类型。即使在开发人员把精彩的新内容添加到文件树中(比如在 /proc 下列出的进程信息)的时候,仍然必须让新内容看起来像下面 7 种类型之一:

  • 普通文件
  • 目录
  • 字符设备文件
  • 块设备文件
  • 本地域套接口
  • 有名管道(FIFO)
  • 符号链接

下表是 ls 命令使用的文件类型代码

文件类型符号创建方式删除方式
普通文件-编辑器,cprm
目录dmkdirrmdir , rm -r
字符设备文件cmknodrm
块设备文件bmknodrm
本地域套接口ssocketrm
有名管道pmknodrm
符号链接lln -srm

2.1 普通文件

普通文件只是一个装字节的包而已;Linux 并没有就其内容规定任何结构。文本文件、数据文件、可执行程序和共享库都作为普通文件存储。普通文件既能顺序存取,也能随机存取。

2.2 目录

目录包含按名字对其他文件的引用。用户可以使用 mkdir 命令来创建目录,使用 rmdir 命令来删除空目录,使用 rm -r 命令来删除非空目录。

2.3 字符设备文件和块设备文件

设备文件让程序能够同系统的硬件和外围设备进程通信。在配置内核的时候,那么知道怎样同系统的每个设备进程通信的模块就被链入内核。用于某个特定设备的模块叫做设备驱动程序,它负责管理该设备的凌乱细节。

设备驱动程序提供了一个标准的通信接口,该接口看起来就好像是一个普通文件。当内核接到一个对字符或块设备文件的请求时,它就简单地把这个请求传递给适当的设备驱动程序。不过,区分设备文件和设备驱动程序是很重要的。设备文件只是用来同设备驱动程序进行通信的结合点。它们并不是设备驱动程序本身。

字符设备文件让与之相关的驱动程序做它们自己的输入和输出缓冲。块设备文件由处理块数据 I/O 的驱动程序使用,并要求内核为它们提供缓冲。

设备文件用两个数字来表示其特征,这两个数字分别叫做主设备号和次设备号。主设备号告诉内核该文件访问哪个驱动程序,次设备号告诉驱动程序对哪个物理单元寻址。例如:

$ ls -l /dev/lp0
crw-rw-— 1 root lp 6, 0 2012-12-14 14:16 /dev/lp0

6, 0 – Linux 系统上的主设备号 6 表示并行端口驱动程序。第一个并行端口(/dev/lp0)的主设备号为 6,次设备号为 0。

2.4 本地域套接口

套接口(socket)就是在进程之间让它们以“clean”的方式进行通信的连接。Linux 提供了几种不同类型的套接口,其中大多数涉及使用网络。本地域套接口只能从本地主机访问,并且是通过文件系统对象而不是网络端口来使用。它们有时称为“UNIX 域套接口(Unix Domain Socket)”。

尽管套接口文件对于其他进程是可见的目录项,但是通信连接之外的进程不能够读写它们。使用本地域套接口的一些标准工具有打印系统、X Window 系统和 syslog。

2.5 有名管道

与本地域套接口类似,有名管道能让运行在同一主机上的两个进程之间进行通信。它们也称为“FIFO文件”(First In, First Out)。有名管道使用 mknod 来创建,使用 rm 命令进行删除。

2.6 符号链接

符号链接或者叫做“软”链接通过名字指向文件。符号链接使用 ln -s 来创建,使用 rm 进行删除,具体的使用方法及说明可以通过 man ln 进行查询。

3 文件属性

在传统的 UNIX 和 Linux 文件系统模型中,每个文件都有一组 9 个权限位用来控制谁能够读写和执行该文件的内容。这 9 位和另外影响到可执行程序运行的 3 个权限位一起,构成了文件的“模式”(mode)。

这 12 个模式位和 4 位的文件类型信息一起保存在一个 16 位的字中,这 4 个文件类型位在文件创建时设定并且不能修改,但是 12 个模式位可以由文件的属主或超级用户使用 chmod 命令来修改。使用 ls -l 可以查看这些位的值(对于目录来说,可以使用 ls -ld)。

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 57388 2010-08-17 14:57 /bin/gzip

第一个字段指定该文件的类型和模式。第一个字符是“-”,因此这个文件是普通文件,参见文件类型一表。

这个字段中接下来的 9 个字符就是 3 组权限位。这些组的顺序是“user-group-other”,每组中位的次序是“read-write-execute”。ls 用字母来显示它们:r 表示 read, w 表示 write, x 表示 execute。在这个例子中,属主对该文件拥有全部的访问权限,其他人只拥有读取和执行的权限。

3.1 chmod: 改变权限

chmod 命令改变文件的权限。只有文件的属主和超级用户才能够修改它的权限。

下表说明了每个三位组的 8 种可能组合,其中的 r, wx 分别代表 read, write, execute

八进制二进制权限
0000---
1001--x
2010-w-
3011-wx
4100r--
5101r-x
6110rw-
7111rwx

例如,chmod 711 myprog 赋予属主所有的权限,而只给其他人赋予执行权限。

chmod 的助记语法的全部信息可以在 chmod 的手册页中找到。其规则的一些示例如下表所示:

规则含义
+w为所有人添加写入的权限
ug=rw,o=r赋予 user 和 group 成员读取/写入的权限,赋予其他人读取的权限
a-x删除全部 3 种类别用户(user, group, other)的执行权限
ug=srx,o=设置文件的 setuid 和 setgid 位,并且只给 user 和 group 赋予读取/执行的权限
g=u让 group 的权限跟 user 一样

用户还可以通过类比一个现有的文件来指定要分配的权限模式。

$ chmod --reference=filea fileb

fileb 的权限模式和 filea 的权限模式一样。

chmod 可以使用 -R 选项递归地更新某个目录下文件的权限。使用助记语法格外有用,因为没有明确设置的任何位,其值都保持不变:

$ chmod -R g+w mydir

mydir 及其所有的内容增加了 group 的写入权限,同时又不会弄错目录以及程序的执行位。

3.2 chown: 改变归属关系和组

chown 命令改变文件和文件的属组所有权。chown 语法和 chmod 类似,只不过它的第一个参数以 user:group 的形式指定了新的属主和属组。属主和属组之一都可以为空。

类似 chmodchown 也提供了递归的 -R 标志,能够改变一个目录以及在它之下所有文件的设定。

传统的 UNIX 系统使用一个单独的 chgrp 命令去改变一个文件的属组。Linux 也一样提供了 chgrp 命令。它的用法与 chown 命令基本相同。

3.3 umask: 分配默认的权限

用户可以使用内建的 shell 命令 umask 来影响分配给新创建文件的默认权限。umask 用一个三位数字的八进制值形式来指定,这个值代表要“剥夺”的权限。当创建文件时,它的权限就设置为创建程序请求的任何权限去掉 umask 禁止的权限。

umask 的三位数字所对应的权限如下表所示:

八进制二进制权限
0000rwx
1001rw-
2010r-x
3011r--
4100-wx
5101-w-
6110--x
7111---

例如,umask 027 允许属主具有所有权限,但禁止属组的定稿权限,并且不允许其他任何用户有任何权限。默认的 umask 值是 022,在 /etc/profile 中设置。在给新用户提供的 .profile 样本文件中,也可以提供一个合适的默认值。

4 安装和卸载文件系统

现代 Linux 支持不只一种基于磁盘的文件系统。现在最好的一类文件系统包括:作为大多数 Linux 发行版本默认文件系统的 ext4fs/ext3fs,还有 ReiserFS、IBM 的 JFS 和 SGI 的 XFS。ext2fs 虽然比较老了,但所有的发行版本都支持它,将来很长一段时间也仍然会保持对它的支持。在 Linux 系统上也实现了许多外来的文件系统,比如在微软 Windows 上使用的文件系统 FAT、FAT32 和 NTFS,CD-ROM 上使用的 ISO-9660 文件系统以及 DVD-ROM 上使用的 UDF(Universal Disk Format)文件系统。Linux 支持的文件系统数量超过了任何一种别的 UNIX 变体。它提供的丰富选择赋予了用户更多的灵活性,而且更易于和别的系统共享文件。具体所支持的文件系统种类可通过 man mount 命令进行查询。

在 Linux 系统上通过 mount 命令将文件系统挂载到文件树上,umount 命令用来卸载文件系统。mount 把现有文件树中的一个目录映射为新加入的文件系统的根,这个目录叫做挂载点(mount point),默认使用方法为:

$ sudo mount /dev/hda4 /userdir

将把存储在磁盘分区上由 /dev/hda4 表示的文件系统安装到路径 /userdir 下。随后可以使用 ls /userdir 命令来查看这个文件系统的内容。以下是几种挂载不同文件系统的示例:

4.1 挂载 CD-ROM ISO9660 文件系统:

$ sudo mount -t iso9660 -o ro,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000, \
iocharset=utf8,mode=0400,dmode=0500 /dev/cdrom /mnt/cdrom

/dev/cdrom 挂载到 /mnt/cdrom 目录下,-t 选项指定文件系统类型 iso9660,并且设置成只读模式(ro),屏蔽掉 setuidsetgid 位(nosuid),对文件系统上的字符设备文件或块设备文件不解释(nodev),归属于 uid=1000 的用户,gid=1000 的属组,使用 utf-8 字符编码来查看(iocharset=utf8),文件模式设为属主对其具有读取权限,其他人没有任何权限(mode=0400),目录设为属主对其具有读取和执行权限,其他人没有任何权限(dmode=0500)。

如果你手头上拥有一份 CD-ROM 的光盘镜像文件(一般以 .iso 结尾),可以将其当成 LOOP 设备加载到文件树下面来进行查看或操作。只需在上例中加入 loop 选项即可。

$ sudo mount -t iso9660 -o loop,ro,nosuid,nodev,uhelper=udisks,uid=1000, \
gid=1000,iocharset=utf8,mode=0400,dmode=0500 ~/file.iso /mnt/cdimage

这样就可以对用户目录下的光盘镜像文件 file.iso 进行查看了。

4.2 挂载 DVD-ROM UDF 文件系统:

方法与挂载 iso9660 文件系统类似,只需将 -t iso9660 修改成 -t udf 即可。

4.3 挂载 vfat 文件系统:

$ sudo mount -t vfat -o rw,nosuid,nodev,uhelper=udisks,uid=1000, \
gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush /dev/sdb4 /mnt/fatfs

4.4 挂载 ntfs 文件系统

非常有意思的一点就是在我所测试的 Ubuntu 10.10 和 Fedora 17 的发行版本上,已经专门提供了 ntfsmount 工具来处理 ntfs 文件系统的挂载问题。如果你的发行版上也提供了该工具的话,可以直接使用以下命令挂载 ntfs 文件系统:

$ sudo ntfsmount -o rw,nosuid,nodev /dev/sda5 /mnt/ntfs

4.5 挂载 ext4/ext3/ext2 文件系统

直接挂载

$ sudo mount -t <ext4|ext3|ext2> -o rw,nosuid,nodev,uhelper=udisks \
/dev/sdb2 /mnt/point

关于更详细的挂载说明请参考 mount 的在线帮助手册。