glibc 知:手册31:系统管理

1. 前言

The GNU C Library Reference Manual for version 2.35

2. 系统管理

System Management

本章描述了用于控制作为进程基础的系统(包括操作系统和硬件)以及获取有关它的信息的工具。任何人通常都可以使用信息工具,但通常只有适当的特权进程才能进行更改。

要获取有关系统内置参数的信息,例如文件名的最大长度,系统配置参数

2.1. 主机识别

Host Identification

本节说明如何识别程序正在运行的特定系统。首先,让我们回顾一下计算机系统的各种命名方式,由于互联网的发展历史,这有点复杂。

每个 Unix 系统(也称为主机)都有一个主机名,无论它是否连接到网络。在最简单的形式中,就像在计算机网络成为问题之前使用的那样,它只是一个像“鸡”这样的词。

但是任何连接到 Internet 或任何类似网络的系统都符合作为域名系统 (DNS) 一部分的更严格的命名约定。在 DNS 中,每个主机名都由两部分组成:

  1. hostname 主机名
  2. domain name 域名

您会注意到“主机名”看起来很像“主机名”,但不是一回事,人们经常错误地将整个主机名称为“域名”。

在 DNS 中,完整的主机名正确地称为 FQDN(完全限定域名),由主机名、句点和域名组成。域名本身通常有多个由句点分隔的组成部分。例如,一个系统的主机名可能是“chicken”,它的域名可能是“ai.mit.edu”,所以它的 FQDN(即它的主机名)是“chicken.ai.mit.edu”。

然而,更令人困惑的是,DNS 并不是唯一需要知道计算机的名称空间。另一个命名空间是 NIS(又名 YP)命名空间。对于 NIS 而言,还有另一个域名,称为 NIS 域名或 YP 域名。它不需要与 DNS 域名有任何关系。

更令人困惑的是,在 DNS 中,多个 FQDN 可以引用同一个系统。但是,其中总有一个是真正的主机名,它被称为规范 FQDN。

在某些情况下,主机名称为“节点名”。

有关 DNS 主机命名的详细信息,请参阅主机名

这些函数的原型出现在 unistd.h 中。

程序 hostname、hostid 和 domainname 通过调用这些函数来工作。

函数:int gethostname (char *name, size_t size)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

此函数在数组名称中返回调用它的系统的主机名。size 参数指定此数组的大小,以字节为单位。请注意,这不是 DNS 主机名。如果系统参与 DNS,这就是 FQDN(见上文)。

成功时返回值为 0,失败时返回值为 -1。在 GNU C 库中,如果 size 不够大,gethostname 会失败;然后你可以用更大的数组再试一次。为此函数定义了以下 errno 错误条件:

ENAMETOOLONG

size 参数小于主机名的大小加一。

在某些系统上,有一个表示最大可能主机名长度的符号:MAXHOSTNAMELEN。它在 sys/param.h 中定义。但是你不能指望它存在,所以处理失败并重试会更干净。

gethostname 将主机名的开头存储在 name 中,即使主机名不完全适合。出于某些目的,截断的主机名就足够了。如果是,您可以忽略错误代码。

函数:int sethostname (const char *name, size_t length)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

sethostname 函数将调用它的系统的主机名设置为name,一个长度为length的字符串。仅允许特权进程执行此操作。

通常 sethostname 在系统启动时只被调用一次。通常,调用它的程序会将它设置为它在文件 /etc/hostname 中找到的值。

确保将主机名设置为完整的主机名,而不仅仅是 DNS 主机名(见上文)。

成功时返回值为 0,失败时返回值为 -1。为此函数定义了以下 errno 错误条件:

EPERM

此进程无法设置主机名,因为它没有特权。

函数:int getdomainnname (char *name, size_t length)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

getdomainname 返回调用它的系统的 NIS(又名 YP)域名。请注意,这不是更流行的 DNS 域名。使用 gethostname 获取。

这个函数的细节类似于上面的 gethostname。

函数:int setdomainname (const char *name, size_t length)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

setdomainname 设置调用它的系统的 NIS(又名 YP)域名。请注意,这不是更流行的 DNS 域名。使用 sethostname 进行设置。

这个函数的细节类似于上面的 sethostname。

函数:long int gethostid (void)

Preliminary: | MT-Safe hostid env locale | AS-Unsafe dlopen plugin corrupt heap lock | AC-Unsafe lock corrupt mem fd | See POSIX Safety Concepts.

该函数返回运行程序的机器的“主机 ID”。按照惯例,这通常是该机器的主要 Internet IP 地址,转换为 long int。但是,在某些系统上,它是一个无意义但唯一的数字,对每台机器都进行了硬编码。

这没有被广泛使用。它出现在 BSD 4.2 中,但在 BSD 4.4 中被删除。POSIX 不需要它。

查询 IP 地址的正确方法是对 gethostname 的结果使用 gethostbyname。有关 IP 地址的更多信息,请参阅主机地址

函数:int sethostid(long int id)

Preliminary: | MT-Unsafe const:hostid | AS-Unsafe | AC-Unsafe corrupt fd | See POSIX Safety Concepts.

sethostid 函数将主机的“主机 ID”设置为 id。仅允许特权进程执行此操作。通常它只发生一次,在系统启动时。

建立系统主 IP 地址的正确方法是配置 IP 地址解析器以将该 IP 地址与 gethostname 返回的系统主机名相关联。例如,将系统记录放在 /etc/hosts 中。

有关主机 ID 的更多信息,请参阅上面的 gethostid。

成功时返回值为 0,失败时返回值为 -1。为此函数定义了以下 errno 错误条件:

EPERM

此进程无法设置主机名,因为它没有特权。

ENOSYS

操作系统不支持设置主机 ID。在某些系统上,主机 ID 是为每台机器硬编码的无意义但唯一的数字。

2.2. 平台类型识别

Platform Type Identification

您可以使用 uname 函数查找有关运行程序的计算机类型的一些信息。该函数和相关的数据类型在头文件 sys/utsname.h 中声明。

作为奖励,uname 还提供了一些信息来识别您的程序正在运行的特定系统。这与主机标识中描述的针对此目的的功能可以获得的信息相同。

数据类型:struct utsname

utsname 结构用于保存 uname 函数返回的信息。它有以下成员:

char sysname[]

这是正在使用的操作系统的名称。

char release[]

这是操作系统实现的当前版本级别。

char version[]

这是操作系统版本中的当前版本级别。

char machine[]

这是对正在使用的硬件类型的描述。

一些系统提供了一种机制来直接询问内核以获取此信息。在没有这种机制的系统上,GNU C 库根据在构建和安装库时指定的配置名称填写此字段。

GNU 使用由三部分组成的名称来描述系统配置;三部分分别是cpu、manufacturer和system-type,用破折号隔开。三个名称的任何可能组合都有潜在的意义,但大多数这样的组合在实践中是没有意义的,即使是有意义的组合也不一定被任何特定的 GNU 程序支持。

由于 machine 中的值应该只描述硬件,它由配置名称的前两部分组成:“cpu-manufacturer”。例如,它可能是以下之一:

“sparc-sun”、“i386-anything”、“m68k-hp”、“m68k-sony”、“m68k-sun”、“mips-dec”

char nodename[]

这是这台特定计算机的主机名。在 GNU C 库中,该值与 gethostname 返回的值相同;请参阅主机标识

gethostname 是通过调用 uname 来实现的。

char domainname[]

这是 NIS 或 YP 域名。与 getdomainname 返回的值相同;请参阅主机标识。该元件是一项相对较新的发明,使用它不像使用该结构的其余部分那样便携。

函数:int uname (struct utsname *info)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

uname 函数将有关操作系统和主机的信息填充到 info 指向的结构中。非负返回值表示数据已成功存储。

-1 作为返回值表示错误。唯一可能的错误是 EFAULT,我们通常不会提及,因为它总是有可能发生。

2.3. 控制和查询挂载

Controlling and Querying Mounts

所有文件都在文件系统中,在您可以访问任何文件之前,必须安装其文件系统。由于 Unix 的“一切都是文件”的概念,文件系统的挂载几乎是做任何事情的核心。本节说明如何找出当前挂载的文件系统以及可挂载的文件系统,以及如何更改挂载的文件系统。

经典文件系统是磁盘驱动器的内容。不过,这个概念要抽象得多,而且除了磁盘驱动器之外,还可以挂载很多东西。

一些块设备与磁盘驱动器等传统设备不对应。例如,循环设备是一种块设备,其驱动程序使用另一个文件系统中的常规文件作为其介质。因此,如果该常规文件包含文件系统的适当数据,您可以通过挂载循环设备实质上挂载常规文件。

一些文件系统不基于任何类型的设备。例如,“proc”文件系统包含文件,其数据由文件系统驱动程序在您请求时即时组成。当你写入它时,你写入的数据会导致系统发生变化。没有数据被存储。

2.3.1. 挂载信息

Mount Information

对于某些程序来说,访问有关某个文件系统是否已安装以及是否已安装、安装在何处的信息是可取的和必要的,或者只是获取所有可用文件系统的列表。GNU C 库提供了一些函数来可移植地检索这些信息。

传统的 Unix 系统有一个名为 /etc/fstab 的文件,它描述了所有可能挂载的文件系统。mount 程序使用这个文件在系统启动时挂载所有必要的文件系统。所有实际挂载的文件系统的信息通常保存在一个名为 /var/run/mtab 或 /etc/mtab 的文件中。这两个文件共享相同的语法,并且始终遵循此语法至关重要。因此,最好不要直接写入文件。本节中描述的函数可以做到这一点,它们还提供将外部文本表示转换为内部表示的功能。

请注意,fstab 和 mtab 文件按照惯例在系统上进行维护。如果系统的管理策略允许,文件可能不存在或与实际挂载或可挂载的文件不一致。但是挂载和卸载文件系统的程序通常如本文所述维护和使用这些文件。

永远不要直接使用上面给出的文件名。处理这些文件的可移植方法是使用 fstab.h 中定义的宏 _PATH_FSTAB 或 mntent.h 和 paths.h 中定义的宏 _PATH_MNTTAB 用于 fstab;和宏 _PATH_MOUNTED,也在 mntent.h 和 paths.h 中定义,用于 mtab。还定义了两个备用宏名称 FSTAB、MNTTAB 和 MOUNTED,但这些名称已被弃用,仅为了向后兼容而保留。应始终使用名称 _PATH_MNTTAB 和 _PATH_MOUNTED。

2.3.1.1. fstab 文件

The fstab file

文件条目的内部表示是 struct fstab,在 fstab.h 中定义。

数据类型:struct fstab

此结构与 getfsent、getfsspec 和 getfsfile 函数一起使用。

char *fs_spec

此元素描述安装文件系统的设备。通常这是一个特殊设备的名称,例如硬盘分区,但它也可以是一个或多或少的通用字符串。对于 NFS,它将是主机名和目录名的组合。

即使该元素未声明为 const,也不应对其进行修改。缺少 const 具有历史原因,因为此函数早于 ISO C。对于此结构的其他字符串元素也是如此。

char *fs_spec

这描述了本地系统上的安装点。即,访问此文件系统中的任何文件都会隐式或显式地将此字符串作为前缀。

char *fs_vfstype

这是文件系统的类型。根据底层内核的理解,它可以是任何字符串。

char *fs_mntops

这是一个字符串,包含通过 mount 调用传递给内核的选项。同样,这几乎可以是任何东西。可以有多个选项,以逗号分隔。每个选项由一个名称和一个可选值部分组成,由 = 字符引入。

如果必须处理此元素的值,理想情况下应使用 getsubopt 函数完成;请参阅解析子选项

const char *fs_type

这个名字选得不好。这个元素指向一个字符串(可能在 fs_mntops 字符串中),它描述了文件系统的挂载模式。fstab 定义了五个宏来描述可能的值:

FSTAB_RW

文件系统在启用读写的情况下挂载。

FSTAB_RQ

文件系统在启用读写的情况下挂载。写入权限受配额限制。

FSTAB_RO

文件系统以只读方式挂载。

FSTAB_SW

这不是一个真正的文件系统,它是一个交换设备。

FSTAB_XX

fstab 文件中的这个条目被完全忽略。

必须使用 strcmp 测试这些值是否相等,因为这些都是字符串。比较指针可能总是会失败。

int fs_freq

此元素以天为单位描述转储频率。

int fs_passno

此元素描述并行转储的通过号。它与 Unix 系统上使用的转储实用程序密切相关。

为了读取 fstab 文件的全部内容,GNU C 库包含一组以通常方式设计的三个函数。

函数:int setfsent (void)

Preliminary: | MT-Unsafe race:fsent | AS-Unsafe heap corrupt lock | AC-Unsafe corrupt lock mem fd | See POSIX Safety Concepts.

此函数确保 fstab 文件的内部读取指针位于文件开头。这是通过打开文件或重置读取指针来完成的。

由于文件句柄在 libc 内部,因此该函数不是线程安全的。

如果操作成功,则此函数返回一个非零值,并且 getfs* 函数可用于读取文件的条目。

函数:void endfsent(void)

Preliminary: | MT-Unsafe race:fsent | AS-Unsafe heap corrupt lock | AC-Unsafe corrupt lock mem fd | See POSIX Safety Concepts.

此函数确保释放先前调用 setfsent(通过调用 getfsent 显式或隐式)获得的所有资源。

函数:struct fstab * getfsent (void)

Preliminary: | MT-Unsafe race:fsent locale | AS-Unsafe corrupt heap lock | AC-Unsafe corrupt lock mem | See POSIX Safety Concepts.

此函数返回 fstab 文件的下一个条目。如果这是自程序启动或最后一次调用 endfsent 以来对处理 fstab 的任何函数的第一次调用,则将打开文件。

该函数返回一个指向 struct fstab 类型变量的指针。此变量由所有线程共享,因此此函数不是线程安全的。如果发生错误,getfsent 返回一个 NULL 指针。

函数:struct fstab * getfsspec (const char *name)

Preliminary: | MT-Unsafe race:fsent locale | AS-Unsafe corrupt heap lock | AC-Unsafe corrupt lock mem | See POSIX Safety Concepts.

此函数返回 fstab 文件的下一个条目,该条目的字符串与 fs_spec 元素指向的名称相同。由于每个特殊设备通常只有一个条目,因此为同一个参数多次调用此函数是没有意义的。如果这是自程序启动或最后一次调用 endfsent 以来对处理 fstab 的任何函数的第一次调用,则将打开文件。

该函数返回一个指向 struct fstab 类型变量的指针。此变量由所有线程共享,因此此函数不是线程安全的。如果发生错误,getfsent 返回一个 NULL 指针。

函数:struct fstab * getfsfile (const char *name)

Preliminary: | MT-Unsafe race:fsent locale | AS-Unsafe corrupt heap lock | AC-Unsafe corrupt lock mem | See POSIX Safety Concepts.

此函数返回 fstab 文件的下一个条目,该条目的字符串等于 fs_file 元素指向的名称。由于每个挂载点通常只有一个条目,因此为同一个参数多次调用此函数是没有意义的。如果这是自程序启动或最后一次调用 endfsent 以来对处理 fstab 的任何函数的第一次调用,则将打开文件。

该函数返回一个指向 struct fstab 类型变量的指针。此变量由所有线程共享,因此此函数不是线程安全的。如果发生错误,getfsent 返回一个 NULL 指针。

2.3.1.2. mtab 文件

The mtab file

以下函数和数据结构访问 mtab 文件。

数据类型:struct mntent

此结构与 getmntent、getmntent_r、addmntent 和 hasmntopt 函数一起使用。

char *mnt_fsname

此元素包含一个指向字符串的指针,该字符串描述了挂载文件系统的特殊设备的名称。它对应于 struct fstab 中的 fs_spec 元素。

char *mnt_dir

这个元素指向一个描述文件系统挂载点的字符串。它对应于 struct fstab 中的 fs_file 元素。

char *mnt_type

mnt_type 描述文件系统类型,因此等同于 struct fstab 中的 fs_vfstype。mntent.h 为该字符串可以具有的某些值定义了一些符号名称。但是由于内核可以支持任意文件系统,因此给它们赋予符号名称没有多大意义。如果一个人知道符号名称,那么一个人也知道文件系统名称。然而,这里遵循 mntent.h 中提供的符号列表。

MNTTYPE_IGNORE

此符号扩展为“忽略”。该值有时在 fstab 文件中使用,以确保在不删除条目的情况下不使用条目。

MNTTYPE_NFS

扩展为“nfs”。使用这个宏有时可能有意义,因为它命名了默认的 NFS 实现,以防版本 2 和 3 都受支持。

MNTTYPE_SWAP

此符号扩展为“交换”。它命名了特殊的 fstab 条目,该条目命名了可能的多个交换分区之一。

char *mnt_opts

该元素包含一个字符串,描述了挂载文件系统时使用的选项。至于 struct fstab 的等效元素 fs_mntops,最好使用函数 getsubopt(参见子选项解析)来访问该字符串的各个部分。

mntent.h 文件定义了许多带有字符串值的宏,这些值对应于内核理解的一些选项。可能还有更多可能的选项,因此依赖这些宏没有多大意义,但为了保持一致,这里是列表:

MNTOPT_DEFAULTS

扩展为“默认值”。此选项应单独使用,因为它指示可自定义值的所有值都被选为默认值。

MNTOPT_RO

扩展为“ro”。查看 FSTAB_RO 值,这意味着文件系统以只读方式挂载。

MNTOPT_RW

扩展为“rw”。见 FSTAB_RW 值,表示文件系统挂载了读写权限。

MNTOPT_SUID

扩展为“suid”。这意味着当文件系统中的程序启动时,SUID 位(请参阅应用程序如何更改角色)受到尊重。

MNTOPT_NOSUID

扩展为“nosuid”。这与 MNTOPT_SUID 相反,文件系统中所有文件的 SUID 位都被忽略。

MNTOPT_NOAUTO

扩展为“noauto”。如果挂载程序以 -a 选项启动以挂载 fstab 文件中提到的所有文件系统,则在启动时挂载程序将忽略此条目。

至于上面介绍的 FSTAB_* 条目,使用 strcmp 检查是否相等很重要。

mnt_freq

该元素对应于 fs_freq,还指定了转储的天数。

mnt_passno

这个元素等价于 fs_passno,含义相同,除了 dump 之外的所有程序都没有兴趣。

为了访问 mtab 文件,还有一组三个函数可以访问一行中的所有条目。与处理 fstab 的函数不同,这些函数不访问固定文件,甚至还有 get 函数的线程安全变体。除此之外,GNU C 库还包含更改文件和测试特定选项的函数。

函数:FILE * setmntent (const char *file, const char *mode)

Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd lock | See POSIX Safety Concepts.

setmntent 函数准备名为 FILE 的文件,该文件必须采用 fstab 和 mtab 文件的格式,以便通过该系列的其他函数进行后续处理。mode 参数的选择方式与 fopen 的 opentype 参数的选择方式相同(请参阅打开流)。如果打开文件写入文件也允许为空。

如果文件被成功打开,setmntent 返回一个文件句柄以供将来使用。否则返回值为 NULL 并相应地设置 errno。

函数:int endmntent (FILE *stream)

Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem fd | See POSIX Safety Concepts.

此函数为流参数获取先前从 setmntent 调用返回的文件句柄。endmntent 关闭流并释放所有资源。

除非发生错误,否则返回值为 1,在这种情况下返回值为 0。

函数:struct mntent * getmntent (FILE *stream)

Preliminary: | MT-Unsafe race:mntentbuf locale | AS-Unsafe corrupt heap init | AC-Unsafe init corrupt lock mem | See POSIX Safety Concepts.

getmntent 函数将先前由成功调用 setmntent 返回的文件句柄作为参数。它返回一个指向 struct mntent 类型的静态变量的指针,该变量填充了当前读取文件中下一个条目的信息。

使用的文件格式规定使用空格或制表符分隔字段。这使得使用包含这些字符之一的名称变得更加困难(例如,使用空格的挂载点)。因此,这些字符在文件中进行编码,getmntent 函数在读回条目时负责解码。‘\040’ 用于编码空格字符,‘\011’ 用于编码制表符,‘\012’编码换行符,’\’ 编码反斜杠。

如果出现错误或到达文件末尾,则返回值为 NULL。

这个函数不是线程安全的,因为对这个函数的所有调用都返回一个指向同一个静态变量的指针。getmntent_r 应该在多个线程访问文件的情况下使用。

函数:struct mntent * getmntent_r (FILE *stream, struct mntent *result, char *buffer, int bufsize)

Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe corrupt lock mem | See POSIX Safety Concepts.

getmntent_r 函数是 getmntent 的可重入变体。它还返回文件中的下一个条目并返回一个指针。但是,存储值的实际变量不是静态的。相反,该函数将值存储在结果参数指向的变量中。附加信息(例如,结果元素指向的字符串)保存在缓冲区指向的大小为 bufsize 的缓冲区中。

转义字符(空格、制表符、反斜杠)以与 getmentent 相同的方式转换回来。

该函数在错误情况下返回一个 NULL 指针。错误可能是:

  • 读取文件时出错,
  • 到达文件末尾,
  • bufsize 太小,无法读取完整的新条目。

函数:int addmntent (FILE *stream, const struct mntent *mnt)

Preliminary: | MT-Safe race:stream locale | AS-Unsafe corrupt | AC-Unsafe corrupt | See POSIX Safety Concepts.

addmntent 函数允许向先前使用 setmntent 打开的文件添加新条目。总是附加新条目。即,即使文件描述符的位置不在文件末尾,此函数也不会覆盖当前位置之后的现有条目。

这意味着要从文件中删除条目,必须创建一个新文件,同时保留要删除的条目,并在关闭文件后删除旧文件并将新文件重命名为所选名称。

此函数处理要写入文件的名称中的空格和制表符。它将它们和反斜杠字符转换为上面 getmntent 描述中描述的格式。

如果操作成功,此函数返回 0。否则返回值为 1 并且 errno 设置得当。

函数:char * hasmntopt (const struct mntent *mnt, const char *opt)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

该函数可用于检查 mnt 所指向的变量的 mnt_opts 元素所指向的字符串是否包含选项 opt。如果为真,则返回指向 mnt_opts 元素中选项开头的指针。如果不存在这样的选项,则函数返回 NULL。

此函数对于测试是否存在特定选项很有用,但是当必须处理所有选项时,最好使用 getsubopt 函数迭代字符串中的所有选项。

2.3.1.3. 其他(非 libc)挂载信息来源

Other (Non-libc) Sources of Mount Information

在具有 Linux 内核和 proc 文件系统的系统上,您可以从 proc 文件系统中的文件挂载中获取有关当前挂载的文件系统的信息。它的格式类似于 mtab 文件的格式,但代表了真正挂载的内容,而不依赖于内核外部的设施来保持 mtab 最新。

2.3.2. 挂载、卸载、重新挂载

Mount, Unmount, Remount

本节介绍挂载、卸载和重新挂载文件系统的功能。

只有超级用户可以挂载、卸载或重新挂载文件系统。

这些函数不访问 fstab 和 mtab 文件。您应该单独维护和使用它们。请参阅挂载信息

本节中的符号在 sys/mount.h 中声明。

函数:int mount (const char *special_file, const char *dir, const char *fstype, unsigned long int options, const void *data)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

mount 挂载或重新挂载文件系统。这两个操作完全不同,并且很不自然地合并到这个函数中。下面解释的 MS_REMOUNT 选项确定是挂载还是重新挂载。

对于挂载,由名为 special_file 的设备特殊文件表示的块设备上的文件系统将挂载到挂载点目录上。这意味着目录 dir(以及其中的任何文件)不再可见;取而代之的是设备上文件系统的根目录(并且仍然使用名称 dir)。

作为一个例外,如果文件系统类型(见下文)不是基于设备的类型(例如“proc”),则 mount 实例化一个文件系统并将其挂载到 dir 并忽略 special_file。

对于重新挂载,dir 指定要重新挂载的文件系统的挂载点(并保持)挂载点,并且 special_file 被忽略。重新挂载文件系统意味着在挂载文件系统时更改控制文件系统操作的选项。这并不意味着卸载和重新安装。

对于挂载,您必须使用 fstype 标识文件系统的类型。这种类型告诉内核如何访问文件系统,可以认为是文件系统驱动程序的名称。可接受的值取决于系统。在具有 Linux 内核和 proc 文件系统的系统上,可能值的列表位于 proc 文件系统中的文件文件系统中(例如,键入 cat /proc/filesystems 以查看列表)。对于 Linux 内核,可以挂载的文件系统类型及其类型名称取决于内核中配置的文件系统驱动程序或作为可加载内核模块加载的文件系统驱动程序。fstype 的一个常见值的示例是 ext2。

对于重新挂载,挂载会忽略 fstype。

options 指定在卸载或重新安装文件系统之前应用的各种选项。选项的确切含义取决于文件系统,对于某些文件系统,选项可能根本没有效果。此外,对于某些文件系统,其中一些选项(但绝不是 MS_RDONLY)可以通过 ioctl 为单个文件访问覆盖。

options 是一个位字符串,其位域使用以下掩码和掩码值宏定义:

MS_MGC_MASK

这个多位字段包含一个幻数。如果它没有值 MS_MGC_VAL,则 mount 假定所有以下位都为零,并且 data 参数是空字符串,而不管它们的实际值如何。

MS_REMOUNT

该位表示重新挂载文件系统。Off 表示挂载它。

MS_RDONLY

此位 on 指定在挂载时不允许写入文件系统。这不能被 ioctl 覆盖。几乎所有文件系统都提供此选项。

MS_NOSUID

此位 on 指定文件系统中文件的 Setuid 和 Setgid 权限在挂载时应被忽略。

MS_NOEXEC

此位 on 指定在挂载文件系统时不应执行文件系统中的任何文件。

MS_NODEV

此位 on 指定在挂载文件系统时不应访问文件系统中的任何设备特殊文件。

MS_SYNCHRONOUS

此位指定在挂载时对文件系统的所有写入都应是同步的;即,数据应在每次写入完成之前同步,而不是保存在缓冲区缓存中。

MS_MANDLOCK

此位 on 指定在挂载文件系统时应允许对文件进行强制锁定。

MS_NOATIME

此位 on 指定在文件系统挂载时访问文件时不应更新文件的访问时间。

MS_NODIRATIME

此位 on 指定在挂载文件系统时访问目录时不应更新目录的访问时间。

上述掩码未覆盖的任何位都应被取消;否则,结果是不确定的。

数据的含义取决于文件系统类型,完全由内核中的文件系统驱动程序控制。

例子:

#include <sys/mount.h>

mount("/dev/hdb", "/cdrom", "iso9660", MS_MGC_VAL | MS_RDONLY | MS_NOSUID, "");

mount("/dev/hda2", "/mnt", "", MS_MGC_VAL | MS_REMOUNT, "");

mount 的适当参数通常记录在 fstab 表中。请参阅挂载信息

如果挂载或重新挂载成功,则返回值为零。否则,它是 -1 并且 errno 被适当地设置。errno 的值取决于文件系统,但这里是一个通用列表:

EPERM

该进程不是超级用户。

ENODEV

内核不知道文件系统类型 fstype。

ENOTBLK

文件 dev 不是块设备特殊文件。

EBUSY

  • 设备已安装。
  • 挂载点正忙。(例如,它是某个进程的工作目录或已经安装了文件系统)。
  • 请求以只读方式重新挂载,但有文件打开以供写入。

EINVAL

  • 已尝试重新挂载,但在指定的挂载点上没有挂载文件系统。
  • 假定的文件系统具有无效的超级块。

EACCES

  • 文件系统本质上是只读的(可能是由于设备上的开关),并且进程试图以读/写方式挂载它(通过设置 MS_RDONLY 位关闭)。
  • 由于文件权限,special_file 或 dir 不可访问。
  • special_file 不可访问,因为它位于使用 MS_NODEV 选项挂载的文件系统中。

EM_FILE

虚拟设备表已满。如果要挂载的文件系统不是使用设备的文件系统,则 mount 需要创建一个虚拟设备(也称为“未命名”设备)。

函数:int umount2 (const char *file, int flags)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

umount2 卸载文件系统。

您可以通过包含文件系统的设备特殊文件或安装点来识别要卸载的文件系统。效果是一样的。指定为字符串文件。

flags 包含由以下掩码宏标识的一位字段:

MNT_FORCE

这个位意味着即使文件系统很忙也强制卸载,方法是先让它不忙。如果该位关闭且文件系统正忙,则 umount2 将失败并显示 errno = EBUSY。根据文件系统,这可能会覆盖所有、部分或无繁忙条件。

标志中的所有其他位应设置为零;否则,结果是未定义的。

例子:

#include <sys/mount.h>

umount2("/mnt", MNT_FORCE);

umount2("/dev/hdd1", 0);

卸载文件系统后,作为挂载点的目录以及其中的任何文件都是可见的。

作为卸载的一部分,umount2 同步文件系统。

如果卸载成功,则返回值为零。否则,它是 -1 并相应地设置 errno:

EPERM

该进程不是超级用户。

EBUSY

文件系统无法卸载,因为它很忙。例如。它包含一个目录,该目录是某个进程的工作目录或某个进程已打开的文件。在某些情况下,对于某些文件系统,您可以使用 MNT_FORCE 选项避免此故障。

EINVAL

file 有效地引用一个文件,但该文件既不是挂载点,也不是当前挂载文件系统的设备特殊文件。

此功能并非在所有系统上都可用。

函数:int umount (const char *file)

Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.

umount 与 umount2 执行相同的操作,但将标志设置为零。它比 umount2 更广泛可用,但由于它缺乏强制卸载文件系统的可能性,因此当 umount2 也可用时不推荐使用。

3. 参考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值