第 3 章 FreeBSD 基础

3.1. 概述

本章涵盖了 FreeBSD 操作系统的基本命令和功能。其中大部分内容与任何类 UNIX® 操作系统都相关。鼓励新的 FreeBSD 用户仔细阅读本章。

阅读完本章后,您将了解

  • 如何使用和配置虚拟控制台。

  • 如何在 FreeBSD 上创建和管理用户和组。

  • UNIX® 文件权限和 FreeBSD 文件标志的工作原理。

  • FreeBSD 默认的文件系统布局。

  • FreeBSD 磁盘组织结构。

  • 如何挂载和卸载文件系统。

  • 什么是进程、守护进程和信号。

  • 什么是 Shell,以及如何更改默认登录环境。

  • 如何使用基本的文本编辑器。

  • 什么是设备和设备节点。

  • 如何阅读手册页以获取更多信息。

3.2. 虚拟控制台和终端

除非 FreeBSD 已配置为在启动时自动启动图形环境,否则系统将启动到命令行登录提示符,如以下示例所示

FreeBSD/amd64 (pc3.example.org) (ttyv0)

login:

第一行包含一些关于系统的信息。amd64 表示 FreeBSD 正在 64 位 x86 系统上运行。主机名为 pc3.example.orgttyv0 表示这是“系统控制台”。第二行是登录提示符。

由于 FreeBSD 是一个多用户系统,因此它需要某种方法来区分不同的用户。这是通过要求每个用户在访问系统上的程序之前登录到系统来实现的。每个用户都有一个唯一的“用户名”和一个个人“密码”。

要登录到系统控制台,请键入在系统安装期间配置的用户名(如添加用户中所述),然后按Enter。然后输入与用户名关联的密码,并按Enter。出于安全原因,密码不会显示

输入正确的密码后,将显示当日消息 (MOTD),然后显示命令提示符。根据创建用户时选择的 Shell,此提示符将是#$% 字符。提示符表示用户现在已登录到 FreeBSD 系统控制台,并可以尝试使用可用的命令。

3.2.1. 虚拟控制台

虽然可以使用系统控制台与系统交互,但从 FreeBSD 系统键盘上的命令行工作的用户通常会登录到虚拟控制台。这是因为系统消息默认配置为显示在系统控制台上。这些消息将显示在用户正在处理的命令或文件上,从而难以集中精力于手头的工作。

默认情况下,FreeBSD 配置为提供多个虚拟控制台用于输入命令。每个虚拟控制台都有自己的登录提示符和 Shell,并且可以轻松地在虚拟控制台之间切换。这实质上提供了在图形环境中同时打开多个窗口的命令行等效项。

FreeBSD 已将Alt+F1Alt+F8 的组合保留用于在虚拟控制台之间切换。使用Alt+F1 切换到系统控制台 (ttyv0),使用Alt+F2 访问第一个虚拟控制台 (ttyv1),使用Alt+F3 访问第二个虚拟控制台 (ttyv2),依此类推。当使用 Xorg 作为图形控制台时,组合将变为Ctrl+Alt+F1 以返回到基于文本的虚拟控制台。

从一个控制台切换到另一个控制台时,FreeBSD 会管理屏幕输出。结果是产生了多个虚拟屏幕和键盘的错觉,这些屏幕和键盘可用于键入命令供 FreeBSD 运行。当用户切换到不同的虚拟控制台时,在一个虚拟控制台中启动的程序不会停止运行。

请参阅kbdcontrol(1)vidcontrol(1)atkbd(4)syscons(4)vt(4),以获取有关 FreeBSD 控制台及其键盘驱动程序的更详细的技术描述。

在 FreeBSD 中,可用虚拟控制台的数量在 /etc/ttys 的此部分配置

# name    getty                         type  status comments
#
ttyv0   "/usr/libexec/getty Pc"         xterm   on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv2   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv3   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv4   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv5   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv6   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv7   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv8   "/usr/X11R6/bin/xdm -nodaemon"  xterm   off secure

要禁用虚拟控制台,请在表示该虚拟控制台的行首放置注释符号 (#)。例如,要将可用虚拟控制台的数量从八个减少到四个,请在表示虚拟控制台 ttyv5ttyv8 的最后四行前面放置一个 #不要注释掉系统控制台 ttyv0 的行。请注意,如果已安装 Xorg 并按照X 窗口系统 中所述进行配置,则最后一个虚拟控制台 (ttyv8) 用于访问图形环境。

有关此文件中每一列的详细说明以及虚拟控制台的可用选项,请参阅ttys(5)

3.2.2. 单用户模式

FreeBSD 引导菜单提供了一个标记为“引导单用户”的选项。如果选择了此选项,系统将引导到一种称为“单用户模式”的特殊模式。此模式通常用于修复无法引导的系统或在不知道 root 密码时重置 root 密码。在单用户模式下,网络和其他虚拟控制台不可用。但是,可以完全访问系统的 root 权限,并且默认情况下不需要 root 密码。出于这些原因,需要物理访问键盘才能引导到此模式,并且在保护 FreeBSD 系统时需要考虑确定谁可以物理访问键盘。

控制单用户模式的设置位于 /etc/ttys 的此部分

# name  getty                           type  status  comments
#
# If console is marked "insecure", then init will ask for the root password
# when going to single-user mode.
console none                            unknown  off  secure

默认情况下,状态设置为 secure。这假设谁可以物理访问键盘并不重要,或者它受物理安全策略控制。如果此设置更改为 insecure,则假设环境本身不安全,因为任何人都可以访问键盘。当此行更改为 insecure 时,FreeBSD 将在用户选择引导到单用户模式时提示输入 root 密码。

更改此设置到 insecure 时请小心!如果忘记了 root 密码,仍然可以引导到单用户模式,但对于不熟悉 FreeBSD 引导过程的人来说可能会很困难。

3.2.3. 更改控制台视频模式

FreeBSD 控制台默认视频模式可以调整为 1024x768、1280x1024 或图形芯片和显示器支持的任何其他尺寸。要使用不同的视频模式,请加载 VESA 模块

# kldload vesa

要确定硬件支持哪些视频模式,请使用vidcontrol(1)。要获取支持的视频模式列表,请执行以下操作

# vidcontrol -i mode

此命令的输出列出了硬件支持的视频模式。要选择新的视频模式,请使用vidcontrol(1) 作为 root 用户指定模式

# vidcontrol MODE_279

如果新的视频模式可以接受,则可以通过将其添加到 /etc/rc.conf 中永久设置为启动时加载

allscreens_flags="MODE_279"

3.3. 用户和基本帐户管理

FreeBSD 允许多个用户同时使用计算机。虽然一次只有一个用户可以坐在屏幕前使用键盘,但任意数量的用户都可以通过网络登录到系统。要使用系统,每个用户都应该拥有自己的用户帐户。

本章介绍

  • FreeBSD 系统上不同类型的用户帐户。

  • 如何添加、删除和修改用户帐户。

  • 如何设置限制以控制用户和组允许访问的资源。

  • 如何创建组并将用户添加为组成员。

3.3.1. 帐户类型

由于所有对 FreeBSD 系统的访问都是通过帐户实现的,并且所有进程都由用户运行,因此用户和帐户管理非常重要。

帐户主要有三种类型:系统帐户、用户帐户和超级用户帐户。

3.3.1.1. 系统帐户

系统帐户用于运行服务,例如 DNS、邮件和 Web 服务器。这样做的原因是安全;如果所有服务都以超级用户身份运行,则它们可以不受限制地运行。

系统帐户的示例包括 daemonoperatorbindnewswww

nobody 是通用的非特权系统帐户。但是,使用 nobody 的服务越多,该用户将关联的文件和进程就越多,因此该用户的权限就越高。

3.3.1.2. 用户帐户

用户帐户分配给真实的人,并用于登录和使用系统。每个访问系统的人都应该拥有唯一的用户帐户。这允许管理员找出谁在做什么,并防止用户覆盖其他用户的设置。

每个用户都可以通过配置其默认 Shell、编辑器、键绑定和语言设置来设置自己的环境以适应其对系统的使用。

FreeBSD 系统上的每个用户帐户都与其关联某些信息

用户名

login:提示符处输入用户名。每个用户都必须拥有唯一的用户名。创建有效用户名的规则有很多,在passwd(5)中有详细说明。建议使用仅包含八个或更少小写字符的用户名,以保持与应用程序的向后兼容性。

密码

每个帐户都关联着一个密码。

用户 ID (UID)

用户 ID (UID) 是一个数字,用于在 FreeBSD 系统中唯一标识用户。允许指定用户名的命令会先将其转换为 UID。建议使用小于 65535 的 UID,因为较高的值可能会导致某些软件的兼容性问题。

组 ID (GID)

组 ID (GID) 是一个数字,用于唯一标识用户所属的主组。组是一种机制,用于根据用户的 GID 而不是其 UID 来控制对资源的访问。这可以显著减少某些配置文件的大小,并允许用户成为多个组的成员。建议使用 65535 或更低的 GID,因为较高的 GID 可能会破坏某些软件。

登录类别

登录类别是对组机制的扩展,在为不同的用户定制系统时提供了额外的灵活性。在配置登录类别中进一步讨论了登录类别。

密码更改时间

默认情况下,密码不会过期。但是,可以按用户基础启用密码过期,强制某些或所有用户在经过一段时间后更改其密码。

帐户过期时间

默认情况下,FreeBSD 不会使帐户过期。在创建需要有限生命周期的帐户时(例如学校的学生帐户),请使用pw(8)指定帐户过期日期。过期时间过后,该帐户将无法用于登录系统,但帐户的目录和文件将保留。

用户的全名

用户名唯一地标识 FreeBSD 中的帐户,但不一定反映用户的真实姓名。类似于注释,此信息可以包含空格、大写字符,并且可以超过 8 个字符。

主目录

主目录是系统上目录的完整路径。这是用户登录时的起始目录。一个常见的约定是将所有用户主目录放在/home/username/usr/home/username下。每个用户将其个人文件和子目录存储在自己的主目录中。

用户 shell

shell 为用户提供了与系统交互的默认环境。有许多不同类型的 shell,经验丰富的用户会有自己的偏好,这些偏好可以反映在他们的帐户设置中。

3.3.1.3. 超级用户帐户

超级用户帐户,通常称为root,用于管理系统,对权限没有任何限制。因此,它不应用于日常任务,例如发送和接收邮件、对系统进行一般探索或编程。

超级用户与其他用户帐户不同,可以不受限制地操作,滥用超级用户帐户可能会导致灾难性后果。用户帐户无法错误地破坏操作系统,因此建议以用户帐户身份登录,并且仅在命令需要额外权限时才成为超级用户。

始终仔细检查以超级用户身份发出的任何命令,因为多余的空格或缺失的字符可能意味着无法挽回的数据丢失。

有几种方法可以获得超级用户权限。虽然可以以root身份登录,但强烈建议不要这样做。

相反,使用su(1)成为超级用户。如果在运行此命令时指定了-,则用户还将继承 root 用户的环境。运行此命令的用户必须位于wheel组中,否则命令将失败。用户还必须知道root用户帐户的密码。

在此示例中,用户仅在需要以超级用户权限运行make install时才成为超级用户。命令完成后,用户键入exit退出超级用户帐户并返回到其用户帐户的权限。

示例 1. 以超级用户身份安装程序
% configure
% make
% su -
Password:
# make install
# exit
%

内置的su(1)框架适用于仅有一个系统管理员的单一系统或小型网络。另一种方法是安装security/sudo软件包或端口。此软件提供活动日志记录,并允许管理员配置哪些用户可以以超级用户身份运行哪些命令。

3.3.2. 管理帐户

FreeBSD 提供了各种不同的命令来管理用户帐户。最常见的命令在管理用户帐户的实用程序中进行了总结,然后是一些使用示例。有关更多详细信息和使用示例,请参阅每个实用程序的手册页。

表 1. 管理用户帐户的实用程序

命令

摘要

adduser(8)

添加新用户的推荐命令行应用程序。

rmuser(8)

删除用户的推荐命令行应用程序。

chpass(1)

用于更改用户数据库信息的灵活工具。

passwd(1)

用于更改用户密码的命令行工具。

pw(8)

一个功能强大且灵活的工具,用于修改用户帐户的所有方面。

bsdconfig(8)

一个具有帐户管理支持的系统配置实用程序。

3.3.2.1. 添加用户

添加新用户的推荐程序是adduser(8)。添加新用户时,此程序会自动更新/etc/passwd/etc/group。它还会为新用户创建一个主目录,从/usr/share/skel复制默认配置文件,并可以选择向新用户发送欢迎消息。此实用程序必须以超级用户身份运行。

adduser(8)实用程序是交互式的,并逐步引导创建新用户帐户的过程。如在 FreeBSD 上添加用户中所示,输入所需的信息或按Return接受方括号中显示的默认值。在此示例中,用户已被邀请加入wheel组,允许他们使用su(1)成为超级用户。完成后,实用程序会提示创建另一个用户或退出。

示例 2. 在 FreeBSD 上添加用户
# adduser

输出应类似于以下内容

Username: jru
Full name: J. Random User
Uid (Leave empty for default):
Login group [jru]:
Login group is jru. Invite jru into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: zsh
Home directory [/home/jru]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : jru
Password   : ****
Full Name  : J. Random User
Uid        : 1001
Class      :
Groups     : jru wheel
Home       : /home/jru
Shell      : /usr/local/bin/zsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (jru) to the user database.
Add another user? (yes/no): no
Goodbye!

由于键入密码时不会回显,因此在创建用户帐户时请注意不要输入错误的密码。

3.3.2.2. 删除用户

要完全从系统中删除用户,请以超级用户身份运行rmuser(8)。此命令执行以下步骤

  1. 删除用户crontab(1)条目(如果存在)。

  2. 删除属于用户的任何at(1)作业。

  3. 向用户拥有的所有进程发送 SIGKILL 信号。

  4. 从系统的本地密码文件中删除用户。

  5. 删除用户的主目录(如果它由用户拥有),包括处理指向实际主目录路径中的符号链接。

  6. /var/mail删除属于用户的传入邮件文件。

  7. /tmp/var/tmp/var/tmp/vi.recover删除用户拥有的所有文件。

  8. 从其所属的所有组中删除用户名在/etc/group中。(如果组变为空并且组名与用户名相同,则删除该组;这补充了adduser(8)的每个用户唯一组。)

  9. 删除用户拥有的所有消息队列、共享内存段和信号量。

rmuser(8)不能用于删除超级用户帐户,因为这几乎总是大规模破坏的迹象。

默认情况下,使用交互模式,如下例所示。

示例 3. rmuser 交互式帐户删除
# rmuser jru

输出应类似于以下内容

Matching password entry:
jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
Is this the entry you wish to remove? y
Remove user's home directory (/home/jru)? y
Removing user (jru): mailspool home passwd.

3.3.2.3. 更改用户信息

任何用户都可以使用chpass(1)更改其默认 shell 和与其用户帐户关联的个人信息。超级用户可以使用此实用程序更改任何用户的其他帐户信息。

在不带任何选项(除了可选的用户名)的情况下传递时,chpass(1)会显示一个包含用户信息的编辑器。当用户退出编辑器时,用户数据库将使用新信息进行更新。

除非以超级用户身份运行实用程序,否则此实用程序将在退出编辑器时提示输入用户的密码。

以超级用户身份使用chpass中,超级用户已键入chpass jru,现在正在查看可以为该用户更改的字段。如果jru运行此命令,则只会显示最后六个字段并可供编辑。这在以普通用户身份使用chpass中显示。

示例 4. 以超级用户身份使用chpass
# chpass

输出应类似于以下内容

# Changing user database information for jru.
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:
示例 5. 以普通用户身份使用chpass

#Changing user database information for jru.
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

命令 chfn(1)chsh(1)chpass(1) 的链接,ypchpass(1)ypchfn(1)ypchsh(1) 也是。由于 NIS 支持是自动的,因此在命令前指定 yp 没有必要。如何配置 NIS 在 网络服务器 中有介绍。

3.3.2.4. 更改用户密码

任何用户都可以使用 passwd(1) 轻松更改其密码。为了防止意外或未经授权的更改,此命令会在设置新密码之前提示用户输入其原始密码。

示例 6. 更改您的密码
% passwd

输出应类似于以下内容

Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done

超级用户可以通过在运行 passwd(1) 时指定用户名来更改任何用户的密码。当此实用程序以超级用户身份运行时,它不会提示用户输入当前密码。这允许在用户无法记住原始密码时更改密码。

示例 7. 以超级用户身份更改其他用户的密码
# passwd jru

输出应类似于以下内容

Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done

chpass(1) 一样,yppasswd(1)passwd(1) 的链接,因此 NIS 可以与任一命令一起使用。

3.3.2.5. 创建、删除、修改和显示系统用户和组

pw(8) 实用程序可以创建、删除、修改和显示用户和组。它充当系统用户和组文件的界面。 pw(8) 有一套非常强大的命令行选项,使其适合在 shell 脚本中使用,但新用户可能会发现它比本节介绍的其他命令更复杂。

3.3.3. 管理组

组是用户列表。组由其组名和 GID 标识。在 FreeBSD 中,内核使用进程的 UID 及其所属的组列表来确定允许进程执行的操作。大多数情况下,用户或进程的 GID 通常表示列表中的第一个组。

组名到 GID 的映射列在 /etc/group 中。这是一个纯文本文件,包含四个冒号分隔的字段。第一个字段是组名,第二个是加密的密码,第三个是 GID,第四个是逗号分隔的成员列表。有关语法的完整描述,请参阅 group(5)

超级用户可以使用文本编辑器修改 /etc/group,尽管建议使用 vigr(8) 编辑组文件,因为它可以捕获一些常见的错误。或者,可以使用 pw(8) 添加和编辑组。例如,要添加一个名为 teamtwo 的组,然后确认它是否存在

使用 operator 组时必须小心,因为可能会授予意外的类似超级用户的访问权限,包括但不限于关机、重启以及访问组中 /dev 中的所有项目。

示例 8. 使用 pw(8) 添加组
# pw groupadd teamtwo
# pw groupshow teamtwo

输出应类似于以下内容

teamtwo:*:1100:

在此示例中,1100teamtwo 的 GID。目前,teamtwo 没有成员。此命令将添加 jru 作为 teamtwo 的成员。

示例 9. 使用 pw(8) 将用户帐户添加到新组
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo

输出应类似于以下内容

teamtwo:*:1100:jru

-M 的参数是要添加到新(空)组或替换现有组成员的逗号分隔的用户列表。对于用户而言,此组成员资格不同于(并且除了)密码文件中列出的用户的基组。这意味着当使用 pw(8)groupshow 查询信息时,用户不会显示为成员,但当通过 id(1) 或类似工具查询信息时,用户将显示为成员。当 pw(8) 用于将用户添加到组时,它只会操作 /etc/group 并且不会尝试从 /etc/passwd 读取其他数据。

示例 10. 使用 pw(8) 将新成员添加到组
# pw groupmod teamtwo -m db
# pw groupshow teamtwo

输出应类似于以下内容

teamtwo:*:1100:jru,db

在此示例中,-m 的参数是要添加到组的逗号分隔的用户列表。与上一个示例不同,这些用户会附加到组中,并且不会替换组中现有的用户。

示例 11. 使用 id(1) 确定组成员资格
% id jru

输出应类似于以下内容

uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

在此示例中,jrujruteamtwo 组的成员。

有关此命令和 /etc/group 格式的更多信息,请参阅 pw(8)group(5)

3.4. 权限

在 FreeBSD 中,每个文件和目录都有一组关联的权限,并且可以使用多个实用程序来查看和修改这些权限。了解权限的工作原理对于确保用户能够访问其所需的文件以及无法错误地访问操作系统使用或其他用户拥有的文件非常必要。

本节讨论 FreeBSD 中使用的传统 UNIX® 权限。有关更细粒度的文件系统访问控制,请参阅 访问控制列表

在 UNIX® 中,基本权限使用三种类型的访问权限分配:读取、写入和执行。这些访问类型用于确定对文件的拥有者、组和其他人(所有其他人)的文件访问权限。读取、写入和执行权限可以用字母 rwx 表示。它们也可以表示为二进制数,因为每个权限都处于打开或关闭状态 (0)。当表示为数字时,顺序始终为读取为 rwx,其中 r 的打开值为 4w 的打开值为 2x 的打开值为 1

表 4.1 总结了可能的数字和字母可能性。在读取“目录列表”列时,使用 - 表示设置为关闭的权限。

表 2. UNIX® 权限
权限目录列表

0

无读取、无写入、无执行

---

1

无读取、无写入、执行

--x

2

无读取、写入、无执行

-w-

3

无读取、写入、执行

-wx

4

读取、无写入、无执行

r--

5

读取、无写入、执行

r-x

6

读取、写入、无执行

rw-

7

读取、写入、执行

rwx

使用 ls(1)-l 参数查看包含有关文件拥有者、组和所有其他人的文件权限信息的一列的长目录列表。例如,在任意目录中 ls -l 可能会显示

% ls -l

输出应类似于以下内容

total 530
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
-rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt

专注于 myfile 的行,第一个(最左侧)字符指示此文件是普通文件、目录、特殊字符设备、套接字还是任何其他特殊伪文件设备。在此示例中,- 表示普通文件。接下来的三个字符(在此示例中为 rw-)给出文件拥有者的权限。接下来的三个字符 r-- 给出文件所属组的权限。最后三个字符 r-- 给出世界其他人的权限。破折号表示权限已关闭。在此示例中,权限设置为允许拥有者读取和写入文件,组可以读取文件,世界其他人只能读取文件。根据上表,此文件的权限将为 644,其中每个数字表示文件权限的三个部分。

系统如何控制设备上的权限?FreeBSD 将大多数硬件设备视为程序可以打开、读取和写入数据的文件。这些特殊的设备文件存储在 /dev/ 中。

目录也作为文件处理。它们具有读取、写入和执行权限。目录的可执行位与文件的含义略有不同。当目录被标记为可执行时,表示可以使用 cd(1) 更改到该目录。这也意味着可以访问该目录中的文件,但须受文件本身的权限限制。

为了执行目录列表,必须在目录上设置读取权限。为了删除知道名称的文件,必须对包含该文件的目录具有写入和执行权限。

还有更多权限位,但它们主要用于特殊情况,例如 setuid 二进制文件和粘滞目录。有关文件权限及其设置方法的更多信息,请参阅 chmod(1)

3.4.1. 符号权限

符号权限使用字符而不是八进制值来为文件或目录分配权限。符号权限使用 (who) (action) (permissions) 的语法,其中可以使用以下值

选项字母表示

(who)

u

用户

(who)

g

组所有者

(who)

o

其他

(who)

a

所有(“世界”)

(action)

+

添加权限

(action)

-

删除权限

(action)

=

显式设置权限

(permissions)

r

读取

(permissions)

w

写入

(permissions)

x

执行

(permissions)

t

粘滞位

(permissions)

s

设置 UID 或 GID

这些值与 chmod(1) 一起使用,但使用字母而不是数字。例如,以下命令将阻止与 FILE 关联的组的成员和所有其他用户访问 FILE

% chmod go= FILE

当必须对文件进行多组更改时,可以提供逗号分隔的列表。例如,以下命令删除 FILE 上的组和“世界”写入权限,并为所有人添加执行权限

% chmod go-w,a+x FILE

3.4.2. FreeBSD 文件标志

除了文件权限外,FreeBSD 还支持使用“文件标志”。这些标志增加了对文件的安全性和控制级别,但不包括目录。使用文件标志,即使是 root 也可能无法删除或更改文件。

文件标志使用 chflags(1) 修改。例如,要为文件 file1 启用系统不可删除标志,请发出以下命令

# chflags sunlink file1

要禁用系统不可删除标志,请在 sunlink 前面加上“no”

# chflags nosunlink file1

要查看文件的标志,请使用 ls(1)-lo

# ls -lo file1
-rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

一些文件标志只能由root用户添加或删除。在其他情况下,文件所有者可以设置其文件标志。有关更多信息,请参阅chflags(1)chflags(2)

3.4.3. setuid、setgid 和粘滞位权限

除了前面讨论的权限之外,还有三个其他特定设置,所有管理员都应该了解。它们是setuidsetgidsticky权限。

这些设置对于某些UNIX®操作非常重要,因为它们提供了通常不会授予普通用户的功能。要理解它们,必须注意真实用户ID和有效用户ID之间的区别。

真实用户ID是拥有或启动进程的UID。有效UID是进程运行时的用户ID。例如,当用户更改密码时,passwd(1) 使用真实用户ID运行。但是,为了更新密码数据库,该命令以root用户的有效ID运行。这允许用户更改密码,而不会看到“权限被拒绝”错误。

可以通过为用户添加s权限来象征性地添加setuid权限,如下例所示

# chmod u+s suidexample.sh

也可以通过在权限集中添加数字4来设置setuid权限,如下例所示

# chmod 4755 suidexample.sh

suidexample.sh上的权限现在如下所示

-rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

请注意,现在s是为文件所有者指定的权限集的一部分,取代了可执行位。这允许需要提升权限的实用程序,例如passwd(1)

nosuid mount(8) 选项会导致此类二进制文件静默失败,而不会提醒用户。该选项并非完全可靠,因为nosuid包装器可能会绕过它。

要实时查看此内容,请打开两个终端。在一个终端中,以普通用户身份键入passwd。在等待新密码时,检查进程表并查看passwd(1)的用户信息。

在终端A中

Changing local password for trhodes
Old Password:

在终端B中

# ps aux | grep passwd
trhodes  5232  0.0  0.2  3420  1608   0  R+    2:10AM   0:00.00 grep passwd
root     5211  0.0  0.2  3620  1724   2  I+    2:09AM   0:00.01 passwd

尽管passwd(1)是以普通用户身份运行的,但它使用的是root的有效UID。

setgid权限执行与setuid权限相同的功能;除了它会更改组设置。当应用程序或实用程序使用此设置执行时,它将根据拥有该文件组的权限授予权限,而不是启动该进程的用户。

要象征性地为文件设置setgid权限,请使用chmod(1)为组添加s权限。

# chmod g+s sgidexample.sh

或者,为chmod(1)提供一个前导2。

# chmod 2755 sgidexample.sh

在以下列表中,请注意s现在位于为组权限设置指定的字段中。

-rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

在这些示例中,即使相关 shell 脚本是可执行文件,它也不会以不同的EUID或有效用户ID运行。这是因为 shell 脚本可能无法访问setuid(2)系统调用。

setuidsetgid权限位可能会降低系统安全性,因为它们允许提升权限。第三种特殊权限,即粘滞位,可以增强系统的安全性。

当在目录上设置粘滞位时,它只允许文件所有者删除文件。这对于防止不拥有文件的用户在公共目录(如/tmp)中删除文件很有用。要使用此权限,请将t模式添加到文件。

# chmod +t /tmp

或者,在权限集前添加1。

# chmod 1777 /tmp

粘滞位权限将在权限集的末尾显示为t

# ls -al / | grep tmp
drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp

3.5. 目录结构

FreeBSD目录层次结构对于全面了解系统至关重要。最重要的目录是根目录或“/”。此目录是在启动时挂载的第一个目录,它包含准备操作系统进行多用户操作所需的基系统。根目录还包含在转换为多用户操作期间挂载的其他文件系统的挂载点。

挂载点是可以在其中将其他文件系统嫁接到父文件系统(通常是根文件系统)上的目录。这在磁盘组织中进一步描述。标准挂载点包括/usr//var//tmp//mnt//cdrom/。这些目录通常引用/etc/fstab中的条目。此文件是各种文件系统和挂载点的表格,由系统读取。/etc/fstab中的大多数文件系统在启动时会自动从脚本rc(8)挂载,除非其条目包含noauto。详细信息可以在fstab文件中找到。

有关文件系统层次结构的完整描述,请参阅hier(7)。下表简要概述了最常见的目录。

目录

描述

/

文件系统的根目录。

/bin/

对单用户和多用户环境都至关重要的用户实用程序。

/boot/

操作系统引导期间使用的程序和配置文件。

/boot/defaults/

默认引导配置文件。有关详细信息,请参阅loader.conf(5)

/dev/

devfs(5)管理的设备特殊文件。

/etc/

系统配置文件和脚本。

/etc/defaults/

默认系统配置文件。有关详细信息,请参阅rc(8)

/etc/periodic/

通过cron(8)每天、每周和每月运行的脚本。有关详细信息,请参阅periodic(8)

/lib/

/bin/sbin中的二进制文件所需的关键系统库。

/libexec/

关键系统文件。

/media/

包含用作可移动介质(如CD、USB驱动器和软盘)挂载点的子目录。

/mnt/

系统管理员通常用作临时挂载点的空目录。

/net/

自动挂载的NFS共享;请参阅auto_master(5)

/proc/

进程文件系统。有关详细信息,请参阅procfs(5)mount_procfs(8)

/rescue/

rescue(8)中所述,用于紧急恢复的静态链接程序。

/root/

root帐户的主目录。

/sbin/

对单用户和多用户环境都至关重要的系统程序和管理实用程序。

/tmp/

通常不会保留在系统重新引导之间的临时文件。基于内存的文件系统通常挂载在/tmp上。这可以使用rc.conf(5)的tmpmfs相关变量或/etc/fstab中的条目来自动执行;有关详细信息,请参阅mdmfs(8)

/usr/

大多数用户实用程序和应用程序。

/usr/bin/

常用实用程序、编程工具和应用程序。

/usr/include/

标准C包含文件。

/usr/lib/

存档库。

/usr/libdata/

各种实用程序数据文件。

/usr/libexec/

由其他程序执行的系统守护程序和系统实用程序。

/usr/local/

本地可执行文件和库。也用作FreeBSD ports框架的默认目标。在/usr/local中,应使用hier(7)/usr概述的通用布局。例外情况是man目录,它位于/usr/local下而不是/usr/local/share下,并且ports文档位于share/doc/port中。

/usr/ports/

FreeBSD Ports Collection(可选)。

/usr/sbin/

由用户执行的系统守护程序和系统实用程序。

/usr/share/

与架构无关的文件。

/usr/src/

BSD和/或本地源文件。

/var/

多用途日志、临时、瞬态和后台打印文件。

/var/log/

各种系统日志文件。

/var/tmp/

通常保留在系统重新引导之间的临时文件。

3.6. 磁盘组织

FreeBSD用于查找文件的最小组织单位是文件名。文件名区分大小写,这意味着readme.txtREADME.TXT是两个单独的文件。FreeBSD不使用文件的扩展名来确定文件是程序、文档还是其他某种形式的数据。

文件存储在目录中。一个目录可能不包含任何文件,也可能包含数百个文件。目录还可以包含其他目录,允许在一个目录中组织另一个目录的层次结构以组织数据。

通过给出文件或目录名,后跟正斜杠“/”,再后跟任何其他必要的目录名来引用文件和目录。例如,如果目录foo包含一个包含文件readme.txt的目录bar,则文件的完整名称或路径foo/bar/readme.txt。请注意,这与使用“\”分隔文件和目录名的Windows®不同。FreeBSD不使用驱动器号或路径中的其他驱动器名称。例如,在FreeBSD上不会键入c:\foo\bar\readme.txt

3.6.1. 文件系统

目录和文件存储在文件系统中。每个文件系统在最顶层都包含一个目录,称为该文件系统的根目录。此根目录可以包含其他目录。一个文件系统被指定为根文件系统或“/”。所有其他文件系统都挂载在根文件系统下。无论FreeBSD系统上有多少个磁盘,每个目录看起来都像是同一个磁盘的一部分。

考虑三个文件系统,称为ABC。每个文件系统都有一个根目录,其中包含两个其他目录,称为A1A2(以及类似的B1B2C1C2)。

A称为根文件系统。如果使用ls(1)查看此目录的内容,它将显示两个子目录,A1A2。目录树如下所示

Directory tree with the root directory and two subdirectories

文件系统必须挂载到另一个文件系统中的目录上。将文件系统B挂载到目录A1上时,B的根目录将替换A1,并且B中的目录将相应显示。

Directory tree with the root directory and two subdirectories

B1B2目录中的任何文件都可以通过路径/A1/B1/A1/B2访问。/A1中的任何文件都已暂时隐藏。如果BA卸载,它们将重新出现。

如果B已挂载到A2上,则图将如下所示

Directory tree with the root directory and two subdirectories

路径将分别为/A2/B1/A2/B2

文件系统可以相互挂载。继续最后一个示例,文件系统C可以挂载到文件系统B中的B1目录上,从而导致以下排列

A complex directory tree. With different subdirectories hanging from root.

或者C可以直接挂载到A文件系统上,位于A1目录下。

A complex directory tree. With different subdirectories hanging from root.

完全可以只使用一个大型根文件系统,而不需要创建任何其他文件系统。这种方法有一些缺点,也有一些优点。

使用多个文件系统的优势
  • 不同的文件系统可以有不同的挂载选项。例如,根文件系统可以以只读方式挂载,从而防止用户意外删除或编辑关键文件。将用户可写文件系统(例如/home)与其他文件系统分离,可以使它们以nosuid方式挂载。此选项可防止存储在文件系统上的可执行文件的suid/guid位生效,从而可能提高安全性。

  • FreeBSD会根据文件系统的使用方式自动优化文件在文件系统上的布局。因此,包含许多频繁写入的小文件的 文件系统与包含较少的大文件的 文件系统相比,其优化方式会有所不同。如果只有一个大型文件系统,这种优化就会失效。

  • FreeBSD的文件系统在断电时具有鲁棒性。但是,在关键时刻断电仍然可能损坏文件系统的结构。通过将数据分散到多个文件系统中,系统更有可能启动,从而更容易根据需要从备份中恢复。

使用单个文件系统的优势
  • 文件系统的大小是固定的。如果在安装FreeBSD时创建文件系统并为其指定特定大小,以后可能会发现需要增大分区大小。如果不进行备份、重新创建具有新大小的文件系统,然后恢复备份数据,则很难实现这一点。

    FreeBSD提供了growfs(8)命令,可以动态增加文件系统的大小,从而消除了此限制。文件系统只能扩展到其所在分区的可用空间。如果分区之后有空间,可以使用gpart(8)扩展分区。如果分区是虚拟磁盘上的最后一个分区,并且磁盘已扩展,则可以扩展分区。

3.6.2. 磁盘分区

文件系统包含在分区中。可以使用多种分区方案将磁盘划分为分区;请参阅手动分区。较新的方案是GPT;较旧的基于BIOS的计算机使用MBR。GPT支持将磁盘划分为具有大小、偏移量和类型的分区。它支持大量分区和分区类型,并在其可用时推荐使用。GPT分区使用磁盘名称加上后缀,其中后缀为第一个分区为p1,第二个分区为p2,依此类推。但是,MBR仅支持少量分区。MBR分区在FreeBSD中称为切片。切片可用于不同的操作系统。FreeBSD切片使用BSD标签细分为分区(请参阅bsdlabel(8))。

切片编号跟随设备名称,以s为前缀,从1开始。因此,“da0s1”是第一个SCSI驱动器上的第一个切片。一个磁盘上只能有四个物理切片,但在适当类型的物理切片内可以有逻辑切片。这些扩展切片从5开始编号,因此“ada0s5”是第一个SATA磁盘上的第一个扩展切片。这些设备由期望占用切片的文件系统使用。

每个GPT或BSD分区只能包含一个文件系统,这意味着文件系统通常由其在文件系统层次结构中的典型挂载点或其包含的分区的名称来描述。

FreeBSD还使用磁盘空间作为交换空间来提供虚拟内存。这允许您的计算机的行为好像拥有比实际更多的内存。当FreeBSD内存不足时,它会将一些当前未使用的 数据移动到交换空间,并在需要时将其移回(移出其他数据)。这称为分页

一些BSD分区与之关联有一定的约定。

分区

约定

a

通常包含根文件系统。

b

通常包含交换空间。

c

通常与封闭切片的大小相同。这允许需要在整个切片上工作的实用程序(例如坏块扫描程序)在c分区上工作。通常不会在此分区上创建文件系统。

d

分区d曾经具有与之关联的特殊含义,但现在已不存在,d可以像任何普通分区一样工作。

切片和“危险专用”物理驱动器包含BSD分区,这些分区用从ah的字母表示。此字母附加到设备名称,因此“da0a”是第一个da驱动器上的a分区,它是“危险专用”的。“ada1s3e”是第二个SATA磁盘驱动器的第三个切片中的第五个分区。

最后,识别系统上的每个磁盘。磁盘名称以指示磁盘类型的代码开头,然后是一个数字,指示它是哪个磁盘。与分区和切片不同,磁盘编号从0开始。常见代码列在磁盘设备名称中。

当引用切片中的分区时,请包括磁盘名称、s、切片编号,然后是分区字母。示例显示在示例磁盘中。GPT分区包括磁盘名称、p,然后是分区编号。

磁盘的概念模型显示了使用MBR切片的磁盘布局的概念模型。

安装FreeBSD时,如果使用MBR,则配置磁盘切片,并在要用于FreeBSD的切片中创建分区。如果使用GPT,则为每个文件系统配置分区。在任何一种情况下,请在每个分区中创建文件系统或交换空间,并确定每个文件系统将在哪里挂载。有关操作分区的 信息,请参阅gpart(8)

表3. 磁盘设备名称
驱动器类型驱动器设备名称

SATA和IDE硬盘驱动器

ada

SCSI硬盘驱动器和USB存储设备

da

NVMe存储

nvdnda

SATA和IDE CD-ROM驱动器

cd

SCSI CD-ROM驱动器

cd

软盘驱动器

fd

SCSI磁带驱动器

sa

RAID驱动器

例如,Adaptec® AdvancedRAID为aacd,Mylex®为mlxdmlyd,AMI MegaRAID®为amrd,Compaq Smart RAID为idad,3ware® RAID为twed

表4. 示例磁盘、切片和分区名称
名称含义

ada0s1a

第一个SATA磁盘(ada0)的第一个切片(s1)上的第一个分区(a)。

da1s2e

第二个SCSI磁盘(da1)的第二个切片(s2)上的第五个分区(e)。

示例12. 磁盘的概念模型

此图显示了FreeBSD对连接到系统的第一个SATA磁盘的视图。假设磁盘大小为250 GB,并包含一个80 GB的切片和一个170 GB的切片(MS-DOS®分区)。第一个切片包含Windows® NTFS文件系统C:,第二个切片包含FreeBSD安装。此示例FreeBSD安装有四个数据分区和一个交换分区。

这四个分区分别保存一个文件系统。分区a用于根文件系统,d用于/var/e用于/tmp/f用于/usr/。分区字母c指的是整个切片,因此不用于普通分区。

Layout of a shared drive between Windows and FreeBSD

3.7. 挂载和卸载文件系统

文件系统最好将其视为一棵树,其根位于//dev/usr以及根目录中的其他目录是分支,这些分支可能拥有自己的分支,例如/usr/local,依此类推。

将某些目录放在单独的文件系统中有很多原因。/var包含目录log/spool/以及各种类型的临时文件,因此可能会填满。填满根文件系统不是一个好主意,因此将/var/分离通常是有利的。

将某些目录树放在其他文件系统中的另一个常见原因是,如果它们要放在单独的物理磁盘上,或者是要放在单独的虚拟磁盘上,例如“网络文件系统(NFS)”中描述的网络文件系统挂载或CDROM驱动器。

3.7.1. fstab文件

在引导过程中(FreeBSD引导过程),/etc/fstab中列出的文件系统会自动挂载,但包含noauto的条目除外。此文件包含以下格式的条目

device       /mount-point fstype     options      dumpfreq     passno
设备

磁盘设备名称中所述的现有设备名称。

挂载点

要挂载文件系统的现有目录。

文件系统类型

要传递给mount(8)的文件系统类型。默认的FreeBSD文件系统是ufs

选项

读写文件系统为rw,只读文件系统为ro,后跟可能需要的任何其他选项。一个常见的选项是noauto,用于在引导序列期间通常不挂载的文件系统。其他选项列在mount(8)中。

转储频率

dump(8)用于确定哪些文件系统需要转储。如果此字段不存在,则假定值为零。

阶段号

确定重新引导后fsck(8)检查UFS文件系统的顺序。应跳过的文件系统应将其passno设置为零。根文件系统需要在其他所有文件系统之前检查,并且应将其passno设置为1。其他文件系统应设置为大于1的值。如果多个文件系统具有相同的passno,则fsck(8)将在可能的情况下尝试并行检查文件系统。

有关/etc/fstab的格式及其选项的更多信息,请参阅fstab(5)

3.7.2. 使用mount(8)

使用mount(8)挂载文件系统。最基本的语法如下

# mount device mountpoint

还可以通过仅提供挂载点来挂载/etc/fstab中列出的文件系统。

此命令提供了许多选项,这些选项在mount(8)中进行了描述。最常用的选项包括

挂载选项
-a

挂载/etc/fstab中列出的所有文件系统,但标记为“noauto”、被-t标志排除或已挂载的文件系统除外。

-d

执行除实际挂载系统调用之外的所有操作。此选项与-v标志一起使用非常有用,可以确定mount(8)实际上正在尝试执行的操作。

-f

强制挂载未清理的文件系统(危险),或在将文件系统的挂载状态从读写降级到只读时撤销写访问权限。

-r

以只读方式挂载文件系统。这与使用-o ro相同。

-t fstype

挂载指定的文件系统类型,或者如果包含-a,则仅挂载给定类型的文件系统。“ufs”是默认的文件系统类型。

-u

更新文件系统上的挂载选项。

-v

详细输出。

-w

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

以下选项可以作为逗号分隔列表传递给-o

nosuid

不要解释文件系统上的setuid或setgid标志。这也是一个有用的安全选项。

3.7.3. 使用umount(8)

要卸载文件系统,请使用umount(8)。此命令接受一个参数,可以是挂载点、设备名称、-a-A

所有形式都接受-f强制卸载,以及-v详细输出。请注意,-f通常不是一个好主意,因为它可能会导致计算机崩溃或损坏文件系统上的数据。

要卸载所有已挂载的文件系统,或仅卸载-t后面列出的文件系统类型,请使用-a-A。请注意,-A不会尝试卸载根文件系统。

3.8. 进程和守护进程

FreeBSD是一个多任务操作系统。任何时间运行的每个程序都称为进程。每个运行的命令至少启动一个新进程,并且FreeBSD运行许多系统进程。

每个进程都由一个称为进程ID (PID)的数字唯一标识。与文件类似,每个进程都有一个所有者和组,并且所有者和组权限用于确定进程可以打开哪些文件和设备。大多数进程也都有一个启动它们的父进程。例如,shell是一个进程,在shell中启动的任何命令都是一个进程,它以shell作为其父进程。例外情况是一个名为init(8)的特殊进程,它始终是引导时启动的第一个进程,并且始终具有PID 1

某些程序并非设计为在用户持续输入的情况下运行,并在第一时间断开与终端的连接。例如,Web服务器响应Web请求,而不是用户输入。邮件服务器是此类应用程序的另一个示例。这些类型的程序称为守护进程。术语守护进程源自希腊神话,代表一个既非善也非恶的实体,并且隐形地执行有用的任务。这就是BSD吉祥物是穿着运动鞋和干草叉的快乐守护进程的原因。

有一种约定,即为通常作为守护进程运行的程序命名,并在其后加上“d”。例如,BIND是Berkeley Internet Name Domain,但实际执行的程序是named。Apache Web服务器程序是httpd,行打印机后台打印守护进程是lpd。这只是一个命名约定。例如,Sendmail应用程序的主要邮件守护进程是sendmail,而不是maild

3.8.1. 查看进程

要查看系统上运行的进程,请使用ps(1)top(1)。要显示当前运行进程的静态列表、它们的PID、它们使用了多少内存以及启动它们的命令,请使用ps(1)。要显示所有正在运行的进程并在每隔几秒钟更新一次显示,以便交互式地查看计算机正在做什么,请使用top(1)

默认情况下,ps(1)仅显示由用户运行和拥有的命令。例如

% ps

输出应类似于以下内容

 PID TT  STAT    TIME COMMAND
8203  0  Ss   0:00.59 /bin/csh
8895  0  R+   0:00.00 ps

ps(1)的输出组织成多个列。PID列显示进程ID。PID从1开始分配,到99999结束,然后环绕回到开头。但是,如果PID已在使用中,则不会重新分配。TT列显示程序运行的tty,STAT显示程序的状态。TIME是程序在CPU上运行的时间量。这通常不是程序启动以来的经过时间,因为大多数程序在需要在CPU上花费时间之前会花费大量时间等待事情发生。最后,COMMAND是用于启动程序的命令。

可以使用许多不同的选项来更改显示的信息。其中一组最有用的选项是auxww,其中a显示所有用户的所有正在运行的进程的信息,u显示进程所有者的用户名和内存使用情况,x显示守护进程的信息,ww导致ps(1)显示每个进程的完整命令行,而不是在它变得太长而无法适应屏幕时截断它。

top(1)的输出类似

% top

输出应类似于以下内容

last pid:  9609;  load averages:  0.56,  0.45,  0.36              up 0+00:20:03  10:21:46
107 processes: 2 running, 104 sleeping, 1 zombie
CPU:  6.2% user,  0.1% nice,  8.2% system,  0.4% interrupt, 85.1% idle
Mem: 541M Active, 450M Inact, 1333M Wired, 4064K Cache, 1498M Free
ARC: 992M Total, 377M MFU, 589M MRU, 250K Anon, 5280K Header, 21M Other
Swap: 2048M Total, 2048M Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
  557 root          1 -21  r31   136M 42296K select  0   2:20  9.96% Xorg
 8198 dru           2  52    0   449M 82736K select  3   0:08  5.96% kdeinit4
 8311 dru          27  30    0  1150M   187M uwait   1   1:37  0.98% firefox
  431 root          1  20    0 14268K  1728K select  0   0:06  0.98% moused
 9551 dru           1  21    0 16600K  2660K CPU3    3   0:01  0.98% top
 2357 dru           4  37    0   718M   141M select  0   0:21  0.00% kdeinit4
 8705 dru           4  35    0   480M    98M select  2   0:20  0.00% kdeinit4
 8076 dru           6  20    0   552M   113M uwait   0   0:12  0.00% soffice.bin
 2623 root          1  30   10 12088K  1636K select  3   0:09  0.00% powerd
 2338 dru           1  20    0   440M 84532K select  1   0:06  0.00% kwin
 1427 dru           5  22    0   605M 86412K select  1   0:05  0.00% kdeinit4

输出分为两部分。标题(前五到六行)显示最后一个运行进程的PID、系统负载平均值(它是系统繁忙程度的衡量标准)、系统正常运行时间(自上次重新引导以来的时间)和当前时间。标题中的其他数字与正在运行的进程数量、已使用的内存和交换空间量以及系统在不同CPU状态下花费的时间量有关。如果已加载ZFS文件系统模块,则ARC行指示从内存缓存而不是从磁盘读取了多少数据。

标题下方是一系列列,包含与ps(1)输出类似的信息,例如PID、用户名、CPU时间量以及启动进程的命令。默认情况下,top(1)还会显示进程占用的内存空间量。这分为两列:一列表示总大小,另一列表示驻留大小。总大小是应用程序需要的内存量,而驻留大小是它现在实际使用的内存量。

top(1)每两秒自动更新一次显示。可以使用-s指定不同的间隔。

3.8.2. 终止进程

与任何正在运行的进程或守护进程通信的一种方法是使用kill(1)发送信号。有许多不同的信号;一些具有特定的含义,而另一些则在应用程序的文档中进行了描述。用户只能向其拥有的进程发送信号,并且向其他人的进程发送信号会导致权限被拒绝错误。例外情况是root用户,他们可以向任何人的进程发送信号。

操作系统也可以向进程发送信号。如果应用程序编写不当并尝试访问它不应该访问的内存,则FreeBSD将向进程发送“段错误”信号 (SIGSEGV)。如果应用程序已编写为使用alarm(3)系统调用在一段时间后收到警报,则将向其发送“Alarm”信号 (SIGALRM)。

可以使用两个信号来停止进程:SIGTERMSIGKILLSIGTERM是终止进程的礼貌方式,因为进程可以读取信号,关闭可能已打开的任何日志文件,并在关闭之前尝试完成其正在执行的操作。在某些情况下,如果进程处于某些无法中断的任务的中间,则它可能会忽略SIGTERM

进程无法忽略SIGKILL。向进程发送SIGKILL通常会立即停止该进程。[1]

其他常用信号有SIGHUPSIGUSR1SIGUSR2。由于这些是通用信号,因此不同的应用程序将做出不同的响应。

例如,在更改Web服务器的配置文件后,需要告诉Web服务器重新读取其配置。重新启动httpd会导致Web服务器短暂中断。相反,向守护进程发送SIGHUP信号。请注意,不同的守护进程将具有不同的行为,因此请参考守护进程的文档以确定SIGHUP是否会达到预期的效果。

终止系统上的随机进程不是一个好主意。特别是init(8),PID 1,是特殊的。运行/bin/kill -s KILL 1是一种快速且不推荐的关闭系统的方法。在按下Return之前始终仔细检查kill(1)的参数。

3.9. Shell

Shell提供了一个命令行界面来与操作系统交互。Shell从输入通道接收命令并执行它们。许多Shell提供了内置函数来帮助完成日常任务,例如文件管理、文件通配符、命令行编辑、命令宏和环境变量。FreeBSD附带了几个Shell,包括Bourne Shell (sh(1))和扩展的C Shell (tcsh(1))。其他Shell可从FreeBSD Ports Collection获得,例如zshbash

使用的Shell实际上是一个品味问题。C程序员可能会觉得像tcsh(1)这样的C风格的Shell更舒适。Linux®用户可能更喜欢bash。每个Shell都有其独特的属性,这些属性可能与用户的首选工作环境不兼容,这就是为什么可以选择使用哪个Shell的原因。

一个常见的Shell功能是文件名补全。在用户键入命令或文件名的前几个字母并按下Tab后,Shell会完成命令或文件名的其余部分。考虑两个名为foobarfootball的文件。要删除foobar,用户可以键入rm foo并按下Tab来完成文件名。

但是Shell仅显示rm foo。它无法完成文件名,因为foobarfootball都以foo开头。如果有多个名称匹配,则某些Shell会发出蜂鸣声或显示所有选择。然后用户必须键入更多字符来识别所需的文件名。键入t并再次按下Tab足以让Shell确定所需的文件名并填写其余部分。

Shell的另一个功能是使用环境变量。环境变量是存储在Shell环境中的变量/键对。此环境可以被Shell调用的任何程序读取,因此包含许多程序配置。常用环境变量提供了一个常用环境变量及其含义的列表。请注意,环境变量的名称始终为大写。

表 5. 常用环境变量

变量

描述

USER

当前登录用户的名称。

PATH

用于搜索二进制文件的目录列表,以冒号分隔。

DISPLAY

如果可用,则连接到的 Xorg 显示器的网络名称。

SHELL

当前 Shell。

TERM

用户终端类型的名称。用于确定终端的功能。

TERMCAP

终端转义码的数据库条目,用于执行各种终端功能。

OSTYPE

操作系统类型。

MACHTYPE

系统的 CPU 架构。

EDITOR

用户首选的文本编辑器。

PAGER

用户首选的逐页查看文本的实用程序。

MANPATH

用于搜索手册页的目录列表,以冒号分隔。

设置环境变量的方法因 Shell 而异。在 tcsh(1)csh(1) 中,使用 setenv 设置环境变量。在 sh(1)bash 中,使用 export 设置当前环境变量。此示例将 tcsh(1) Shell 的默认 EDITOR 设置为 /usr/local/bin/emacs

% setenv EDITOR /usr/local/bin/emacs

bash 的等效命令为

% export EDITOR="/usr/local/bin/emacs"

要展开环境变量以查看其当前设置,请在命令行上在其名称前键入 $ 字符。例如,echo $TERM 显示当前 $TERM 设置。

Shell 将特殊字符(称为元字符)视为数据的特殊表示。最常见的元字符是 *,它表示文件名中的任意数量的字符。元字符可用于执行文件名通配。例如,echo * 等效于 ls,因为 Shell 获取与 * 匹配的所有文件,并由 echo 在命令行上列出它们。

要防止 Shell 解释特殊字符,请使用反斜杠 (\) 对其进行转义。例如,echo $TERM 打印终端设置,而 echo \$TERM 逐字打印字符串 $TERM

3.9.1. 更改 Shell

永久更改默认 Shell 的最简单方法是使用 chsh。运行此命令将打开在 EDITOR 环境变量中配置的编辑器,默认情况下设置为 vi(1)。将 Shell: 行更改为新 Shell 的完整路径。

或者,使用 chsh -s,它将在不打开编辑器的情况下设置指定的 Shell。例如,要将 Shell 更改为 bash

% chsh -s /usr/local/bin/bash

在提示符处输入您的密码,然后按 Return 更改您的 Shell。注销并重新登录以开始使用新的 Shell。

新的 Shell 必须存在于 /etc/shells 中。如果 Shell 是按照 安装应用程序:软件包和端口 中所述从 FreeBSD Ports 集合安装的,则应自动将其添加到此文件中。如果缺少,请使用此命令添加它,将路径替换为 Shell 的路径

# echo /usr/local/bin/bash >> /etc/shells

然后,重新运行 chsh(1)

3.9.2. 高级 Shell 技术

UNIX® Shell 不仅仅是一个命令解释器,它还是一个强大的工具,允许用户执行命令、重定向其输出、重定向其输入并将命令链接在一起以改进最终命令输出。当此功能与内置命令混合使用时,用户将获得一个可以最大化效率的环境。

Shell 重定向是将命令的输出或输入发送到另一个命令或文件中的操作。例如,要将 ls(1) 命令的输出捕获到文件中,请重定向输出

% ls > directory_listing.txt

目录内容现在将列在 directory_listing.txt 中。某些命令可用于读取输入,例如 sort(1)。要对该列表进行排序,请重定向输入

% sort < directory_listing.txt

输入将被排序并显示在屏幕上。要将该输入重定向到另一个文件,可以混合方向重定向 sort(1) 的输出

% sort < directory_listing.txt > sorted.txt

在所有以前的示例中,命令都使用文件描述符执行重定向。每个 UNIX® 系统都具有文件描述符,包括标准输入 (stdin)、标准输出 (stdout) 和标准错误 (stderr)。每个都具有其用途,输入可以是键盘或鼠标,提供输入的东西。输出可以是屏幕或打印机中的纸张。错误将是用于诊断或错误消息的任何内容。所有三个都被视为基于 I/O 的文件描述符,有时也被视为流。

通过使用这些描述符,Shell 允许输出和输入在各种命令之间传递,并重定向到文件或来自文件。另一种重定向方法是管道运算符。

UNIX® 管道运算符 "|" 允许一个命令的输出直接传递或定向到另一个程序。基本上,管道允许将命令的标准输出作为标准输入传递到另一个命令,例如

% cat directory_listing.txt | sort | less

在该示例中,directory_listing.txt 的内容将被排序,并将输出传递到 less(1)。这允许用户以自己的速度滚动浏览输出,并防止其从屏幕上滚动。

3.10. 文本编辑器

大多数 FreeBSD 配置都是通过编辑文本文件完成的,因此熟悉文本编辑器是一个好主意。FreeBSD 将一些编辑器作为基本系统的一部分提供,并且 Ports 集合中还有更多编辑器可用。

一个简单的学习编辑器是 ee(1),它代表简单编辑器。要启动此编辑器,请键入 ee filename,其中 filename 是要编辑的文件的名称。进入编辑器后,所有用于操作编辑器功能的命令都列在显示屏顶部。插入符号 (^) 代表 Ctrl,因此 ^e 展开为 Ctrl+e。要退出 ee(1),请按 Esc,然后从主菜单中选择“退出编辑器”选项。如果文件已修改,编辑器将提示保存任何更改。

FreeBSD 还附带了更强大的文本编辑器,例如 vi(1),作为基本系统的一部分。其他编辑器,如 editors/emacseditors/vim,是 FreeBSD Ports 集合的一部分。这些编辑器提供了更多功能,但学习起来也更复杂。从长远来看,学习更强大的编辑器(如 vim 或 Emacs)可以节省更多时间。

许多修改文件或需要键入输入的应用程序将自动打开文本编辑器。要更改默认编辑器,请设置 EDITOR 环境变量,如 Shell 中所述。

3.11. 设备和设备节点

设备是一个主要用于系统中硬件相关活动的术语,包括磁盘、打印机、显卡和键盘。FreeBSD 启动时,大多数引导消息都指的是检测到的设备。引导消息的副本保存到 /var/run/dmesg.boot 中。

每个设备都有一个设备名称和编号。例如,ada0 是第一个 SATA 硬盘,而 kbd0 代表键盘。

FreeBSD 中的大多数设备必须通过称为设备节点的特殊文件进行访问,这些文件位于 /dev 中。

3.12. 手册页

有关 FreeBSD 的最全面的文档以手册页的形式提供。系统上的几乎每个程序都附带一个简短的参考手册,解释基本操作和可用参数。可以使用 man 查看这些手册

% man command

其中 command 是要了解的命令的名称。例如,要了解有关 ls(1) 的更多信息,请键入

% man ls

手册页分为几个部分,分别代表主题类型。在 FreeBSD 中,以下部分可用

  1. 用户命令。

  2. 系统调用和错误编号。

  3. C 库中的函数。

  4. 设备驱动程序。

  5. 文件格式。

  6. 游戏和其他娱乐。

  7. 其他信息。

  8. 系统维护和操作命令。

  9. 系统内核接口。

在某些情况下,同一主题可能出现在联机手册的多个部分中。例如,有一个 chmod 用户命令和一个 chmod() 系统调用。要告诉 man(1) 显示哪个部分,请指定部分编号

% man 1 chmod

这将显示用户命令 chmod(1) 的手册页。对联机手册特定部分的引用传统上放在书面文档中的括号中,因此 chmod(1) 指的是用户命令,而 chmod(2) 指的是系统调用。

如果不知道手册页的名称,请使用 man -k 搜索手册页描述中的关键字

% man -k mail

此命令显示其描述中包含关键字“mail”的命令列表。这等效于使用 apropos(1)

要读取 /usr/sbin 中所有命令的描述,请键入

% cd /usr/sbin
% man -f * | more

% cd /usr/sbin
% whatis * |more

3.12.1. GNU Info 文件

FreeBSD 包含自由软件基金会 (FSF) 生成的一些应用程序和实用程序。除了手册页之外,这些程序可能还包含称为 info 文件的超文本文档。可以使用 info(1) 或(如果安装了 editors/emacs)emacs 的 info 模式查看这些文件。

要使用 info(1),请键入

% info

要获取简要介绍,请键入 h。要获取快速命令参考,请键入 ?


1。有一些任务无法中断。例如,如果进程尝试从网络上另一台计算机上的文件读取,而另一台计算机不可用,则该进程被称为不可中断。最终,进程将超时,通常在两分钟后。一旦发生此超时,进程将被终止。

上次修改时间:2024 年 9 月 23 日,作者:Fernando Apesteguía