第三章 FreeBSD基础3.1. 简介3.2. 虚拟控制台和终端3.2.1. 虚拟控制台3.2.2. 单用户模式3.2.3. 更改控制台视频模式3.3. 用户和基本帐户管理3.3.1. 帐户类型3.3.1.1. 系统帐户3.3.1.2. 用户帐户3.3.1.3. 超级用户帐户3.3.2. 管理账户3.3.2.1. 添加一个用户3.3.2.2. 删除一个用户3.3.2.3. 修改用户信息3.3.2.4 修改用户密码3.3.2.5. 创建、删除、修改和显示系统用户和组3.3.3. 管理组3.4. 权限3.4.1. 符号权限3.4.2. FreeBSD文件标志3.4.3. setuid 、 setgid 和 sticky 权限3.5. 目录结构3.6. 磁盘组织3.6.1. 文件系统3.6.2. 磁盘分区3.7. 挂载和卸载文件系统3.7.1. fstab 文件3.7.2. 使用 mount(8) 3.7.3. 使用 umount(8) 3.8. 进程和守护进程3.8.1. 查看进程3.8.1.1 ps(1)3.8.1.2 top(1)3.8.2. 杀掉进程3.9. Shells3.9.1. 更换Shell3.9.2. 高级的shell技术3.10. 文本编辑器3.11. 设备和设备节点3.12. 手册页3.12.1. GNU信息文件
本章介绍FreeBSD操作系统的基本命令和功能。这些材料中的大部分与任何类UNIX®操作系统都有关。鼓励FreeBSD新用户仔细阅读本章。
阅读本章以了解:
除非FreeBSD已配置为在启动过程中自动启动图形环境,否则系统将引导到命令行登录提示符,如本例所示:
xxxxxxxxxxFreeBSD/amd64 (pc3.example.org) (ttyv0)login:第一行包含有关系统的一些信息。 amd64 表示FreeBSD正在64位x86系统上运行。主机名为 pc3.example.org , ttyv0 表示这是“系统控制台”。第二行是登录提示。
由于FreeBSD是一个多用户系统,它需要一些方法来区分不同的用户。这是通过要求每个用户在访问系统上的程序之前登录系统来实现的。每个用户都有一个唯一的 user 和一个个人 password 。
要登录系统控制台,请键入在系统安装期间配置的用户名,如【2.8.6. 添加用户】中所述,然后按 Enter 键。然后输入与用户名关联的密码,然后按 Enter 键。出于安全原因,密码不会被回显。
输入正确的密码后,将显示当天的消息(message of the day,MOTD),然后是命令提示符。根据创建用户时选择的shell,此提示将是 # 、 $ 或 % 字符。提示表示用户现在已登录FreeBSD系统控制台,并准备尝试可用的命令。
虽然系统控制台可用于与系统交互,但从FreeBSD系统键盘上的命令行工作的用户通常会登录到虚拟控制台。这是因为系统消息默认配置为显示在系统控制台上。这些消息将出现在用户正在处理的命令或文件上,使其难以专注于手头的工作。
默认情况下,FreeBSD配置为提供多个虚拟控制台用于输入命令。每个虚拟控制台都有自己的登录提示符和shell,很容易在虚拟控制台之间切换。这基本上提供了命令行,相当于在图形环境中同时打开多个窗口。
FreeBSD保留了 Alt+F1 到 Alt+F8 的组合键,用于在虚拟控制台之间切换。使用 Alt+F1 切换到系统控制台( ttyv0 ),Alt+F2 访问第一个虚拟控制台( ttyf1 ),Alt+F3 访问第二个虚拟控制台,以此类推。当使用Xorg作为图形控制台时,组合变为 Ctrl+Alt+F1 以返回基于文本的虚拟控制台。
当从一个控制台切换到下一个控制台时,FreeBSD会管理屏幕输出。结果是一种错觉,即有多个虚拟屏幕和键盘可用于键入FreeBSD运行的命令。当用户切换到不同的虚拟控制台时,在一个虚拟控制台中启动的程序不会停止运行。
有关FreeBSD控制台及其键盘驱动程序的更多技术说明,请参阅 kbdcontrol(1) 、 vidcontrol(1) , atkbd(4) 、 syscons(4) 和 vt(4) 。
在FreeBSD中,可用虚拟控制台的数量在 /etc/ttys 的这一节中配置:
xxxxxxxxxxttyv0 "/usr/libexec/getty Pc" xterm on securettyv1 "/usr/libexec/getty Pc" xterm on securettyv2 "/usr/libexec/getty Pc" xterm on securettyv3 "/usr/libexec/getty Pc" xterm on securettyv4 "/usr/libexec/getty Pc" xterm on securettyv5 "/usr/libexec/getty Pc" xterm on securettyv6 "/usr/libexec/getty Pc" xterm on securettyv7 "/usr/libexec/getty Pc" xterm on securettyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure要禁用虚拟控制台,请在表示该虚拟控制台的行的开头放置注释符号(#)。例如,要将可用虚拟控制台的数量从八个减少到四个,请在表示虚拟控制台 ttyv5 到 ttyv8 的最后四行前面加一个 # 。不要注释掉系统控制台 ttyv0 的行。请注意,如果Xorg已按照X Window系统中的描述安装和配置,则最后一个虚拟控制台( ttyv8 )用于访问图形环境。
有关此文件中每一列的详细说明以及虚拟控制台的可用选项,请参阅 ttys(5) 。
FreeBSD引导菜单提供了一个标记为【Boot Single User】的选项。如果选择此选项,系统将启动到称为【单用户模式】的特殊模式。此模式通常用于修复无法启动的系统,或在未知的情况下重置 root 密码。在单用户模式下,网络和其他虚拟控制台不可用。但是,系统的完全 root 访问权限是可用的,默认情况下,不需要 root 密码。出于这些原因,需要物理访问键盘才能启动到这种模式,在保护FreeBSD系统时,需要考虑确定谁可以物理访问键盘。
控制单用户模式的设置可以在 /etc/ttys 的这一节中找到:
xxxxxxxxxxconsole none unknown off secure默认情况下,状态设置为 secure 。这假设谁可以物理访问键盘并不重要,或者键盘由物理安全策略控制。如果将此设置更改为 insecure ,则假设环境本身是不安全的,因为任何人都可以访问键盘。当此行更改为 insecure ,当用户选择启动到单用户模式时,FreeBSD将提示输入 root 密码。
xxxxxxxxxx将此设置更改为 insecure 时请小心!如果忘记了root密码,仍然可以启动到单用户模式,但对于不熟悉FreeBSD启动过程的人来说可能很困难。FreeBSD控制台默认视频模式可以调整为1024x768、1280x1024或图形芯片和显示器支持的任何其他大小。要使用其他视频模式,请加载 VESA 模块:
xxxxxxxxxx# kldload vesa要确定硬件支持哪些视频模式,请使用 vidcontrol(1) 。要获取支持的视频模式列表,请执行以下操作:
xxxxxxxxxx# vidcontrol -i mode此命令的输出列出了硬件支持的视频模式。要选择新的视频模式,请使用 vidcontrol(1) 作为根用户指定模式:
xxxxxxxxxx# vidcontrol MODE_279如果新的视频模式是可接受的,可以在启动时通过将其添加到 /etc/rc.conf 来永久设置:
xxxxxxxxxxallscreens_flags="MODE_279"FreeBSD允许多个用户同时使用计算机。虽然一次只能有一个用户坐在屏幕前使用键盘,但任何数量的用户都可以通过网络登录系统。要使用该系统,每个用户都应该有自己的用户帐户。
本章介绍:
由于所有对FreeBSD系统的访问都是通过帐户实现的,所有进程都是由用户运行的,因此用户和帐户管理非常重要。
帐户主要有三种类型:系统帐户、用户帐户和超级用户帐户。
系统帐户用于运行DNS、邮件和web服务器等服务。原因是安全;如果所有服务都以超级用户身份运行,它们可以不受限制地运行。
系统帐户的示例包括 daemon 、 operator 、 bind 、 news 和 www 。
nobody 是通用的无特权系统帐户。然而,使用 nobody 的服务越多,该用户关联的文件和进程就越多,因此用户的特权就越高。
用户帐户被分配给真实的人,用于登录和使用系统。每个访问系统的人都应该有一个唯一的用户帐户。这允许管理员找出谁在做什么,并防止用户破坏其他用户的设置。
每个用户都可以通过配置默认的shell、编辑器、键绑定和语言设置来设置自己的环境,以适应他们对系统的使用。
FreeBSD系统上的每个用户帐户都有与之相关的某些信息:
User name
在 login: 提示符处键入用户名。每个用户都必须有一个唯一的用户名。 passwd(5) 中记录了创建有效用户名的许多规则。建议使用由八个或更少小写字符组成的用户名,以保持与应用程序的向后兼容性。
Password
每个帐户都有一个关联的密码。
User ID(UID)
用户ID(UID)是一个数字,用于在FreeBSD系统中唯一标识用户。允许指定用户名的命令将首先将其转换为UID。建议使用小于65535的UID,因为更高的值可能会导致与某些软件的兼容性问题。
Group ID(GID)
组ID(GID)是一个数字,用于唯一标识用户所属的主组。组是一种根据用户的GID而不是UID控制对资源访问的机制。这可以显著减小某些配置文件的大小,并允许用户成为多个组的成员。建议使用65535或更低的GID,因为更高的GID可能会损坏某些软件。
Login class
登录类是组机制的扩展,在为不同用户定制系统时提供了额外的灵活性。登录类将在【16.14.2. 配置登录类】中进一步讨论。
Password change time
默认情况下,密码不会过期。但是,可以在每个用户的基础上启用密码过期,迫使部分或所有用户在经过一定时间后更改密码。
Account expiration time
默认情况下,FreeBSD不会使帐户过期。创建需要有限生命周期的帐户时,例如学校中的学生帐户,请使用 pw(8) 指定帐户到期日期。过期时间过后,帐户将无法用于登录系统,但帐户的目录和文件将保留。
User’s full name
用户名在FreeBSD中唯一标识帐户,但不一定反映用户的真实姓名。与注释类似,此信息可以包含空格、大写字符,长度可以超过8个字符。
Home directory
主目录是系统上某个目录的完整路径。这是用户登录时的起始目录。一个常见的惯例是将所有用户主目录放在 /home/username 或 /usr/home/username 下。每个用户将其个人文件和子目录存储在自己的主目录中。
User shell
shell提供了用户与系统交互的默认环境。有许多不同类型的shell,经验丰富的用户会有自己的偏好,这可以反映在他们的帐户设置中。
超级用户帐户(通常称为 root )用于管理系统,对权限没有限制。因此,它不应该用于发送和接收邮件、系统的一般探索或编程等日常任务。
与其他用户帐户不同,超级用户可以无限制地操作,滥用超级用户帐户可能会导致巨大的灾难。用户帐户无法错误地破坏操作系统,因此建议以用户帐户登录,只有在命令需要额外权限时才成为超级用户。
始终对以超级用户身份发出的任何命令进行双重和三重检查,因为额外的空格或丢失的字符可能意味着无法修复的数据丢失。
有几种方法可以获得超级用户权限。虽然可以以 root 身份登录,但强烈建议不要这样做。
相反,使用 su(1) 成为超级用户。如果在运行此命令时指定了 - ,则用户还将继承 root 用户的环境。运行此命令的用户必须在 wheel 组中,否则命令将失败。用户还必须知道 root 用户帐户的密码。
在这个例子中,用户只有成为超级用户才能运行 make install ,因为这一步需要超级用户权限。命令完成后,用户键入 exit 离开超级用户帐户并返回其用户帐户的权限。
示例2. 以超级用户身份安装程序
xxxxxxxxxx% configure% make% su -Password:# make install# exit%内置的 su(1) 框架适用于单个系统或只有一个系统管理员的小型网络。另一种方法是安装 security/sudo 包或port。该软件提供活动日志记录,并允许管理员配置哪些用户可以作为超级用户运行哪些命令。
FreeBSD提供了各种不同的命令来管理用户帐户。最常见的命令在【表2. 管理用户帐户的实用程序】中进行了总结,然后是一些使用示例。有关更多详细信息和使用示例,请参阅每个实用程序的手册页。
表2. 管理用户帐户的实用程序
| 命令 | 总结 |
|---|---|
| adduser(8) | 推荐用于添加新用户的命令行应用程序。 |
| rmuser(8) | 建议用于删除用户的命令行应用程序。 |
| chpass(1) | 用于更改用户数据库信息的灵活工具。 |
| passwd(1) | 更改用户密码的命令行工具。 |
| pw(8) | 一个强大而灵活的工具,用于修改用户帐户的各个方面。 |
| bsdconfig(8) | 具有帐户管理支持的系统配置实用程序。 |
推荐的添加新用户的程序是 adduser(8) 。当添加新用户时,此程序会自动更新 /etc/passwd 和 /etc/group 。它还为新用户创建了一个主目录,从 /usr/share/skel 复制默认配置文件,并可以选择向新用户发送欢迎消息。此实用程序必须以超级用户身份运行。
adduser(8) 实用程序是交互式的,它将逐步完成创建新用户帐户的步骤。如在【FreeBSD上添加用户】所示,输入所需信息或按 Return 键接受方括号中显示的默认值。在这个例子中,用户被邀请到 wheel 组中,允许他们使用 su(1) 成为超级用户。完成后,该实用程序将提示创建另一个用户或退出。
示例3. 在FreeBSD上添加用户
xxxxxxxxxx# adduser输出应类似于以下内容:
xxxxxxxxxxUsername: jruFull name: J. Random UserUid (Leave empty for default):Login group [jru]:Login group is jru. Invite jru into other groups? []: wheelLogin class [default]:Shell (sh csh tcsh zsh nologin) [sh]: zshHome 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 : jruPassword : ****Full Name : J. Random UserUid : 1001Class :Groups : jru wheelHome : /home/jruShell : /usr/local/bin/zshLocked : noOK? (yes/no): yesadduser: INFO: Successfully added (jru) to the user database.Add another user? (yes/no): noGoodbye!xxxxxxxxxx由于键入密码时不会回显,因此在创建用户帐户时请注意不要键入错误的密码。要从系统中完全删除用户,请以超级用户身份运行 rmuser(8) 。此命令执行以下步骤:
删除用户的 crontab(1) 条目(如果存在)。
删除属于用户的所有 at(1) 作业。
向用户拥有的所有进程发送 SIGKILL 信号。
从系统的本地密码文件中删除用户。
删除用户的主目录(如果它归用户所有),包括处理指向实际主目录的路径中的符号链接。
从 /var/mail 中删除属于用户的传入邮件文件。
从 /tmp 、 /var/tmp 和 /var/tmp/vi.recover 中删除用户拥有的所有文件。
从 /etc/group 中它所属的所有组中删除用户名。
如果一个组变为空,并且组名与用户名相同,则该组将被删除;这补充了 adduser(8) 的每个用户的唯一组。
删除用户拥有的所有消息队列(message queues)、共享内存段(shared memory segments)和信号量(semaphores)。
rmuser(8) 不能用于删除超级用户帐户,因为这几乎总是大规模破坏的迹象。
默认情况下,使用交互模式,如下例所示。
示例4. rmuser 交互式帐户删除
xxxxxxxxxx# rmuser jru输出应类似于以下内容:
xxxxxxxxxxMatching password entry:jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zshIs this the entry you wish to remove? yRemove user's home directory (/home/jru)? yRemoving user (jru): mailspool home passwd.任何用户都可以使用 chpass(1) 更改其默认shell和与其用户帐户关联的个人信息。超级用户可以使用此实用程序更改任何用户的其他帐户信息。
当没有传递任何选项时,除了可选的用户名外, chpass(1) 还会显示一个包含用户信息的编辑器。当用户退出编辑器时,用户数据库将使用新信息进行更新。
xxxxxxxxxx此实用程序将在退出编辑器时提示输入用户密码,除非该实用程序以超级用户身份运行。在【作为超级用户使用chpass】中,超级用户键入了 chpass jru ,现在正在查看此用户可以更改的字段。如果 jru 运行此命令,则只会显示最后六个字段并可供编辑。这在使用 chpass 作为常规用户中显示。
示例5. 作为超级用户使用 chpass
xxxxxxxxxx# chpass jru输出应类似于以下内容:
xxxxxxxxxx# Changing user database information for jru.Login: jruPassword: *Uid [#]: 1001Gid [# or name]: 1001Change [month day year]:Expire [month day year]:Class:Home directory: /home/jruShell: /usr/local/bin/zshFull Name: J. Random UserOffice Location:Office Phone:Home Phone:Other information:示例6。以常规用户使用 chpass
xxxxxxxxxx#Changing user database information for jru.Shell: /usr/local/bin/zshFull Name: J. Random UserOffice Location:Office Phone:Home Phone:Other information:xxxxxxxxxx命令chfn(1)和chsh(1)是指向chpass(2)的链接,ypchpass(1),ypchfn(1)和ypchsh(1)也是如此。由于NIS支持是自动的,因此不需要在命令前指定yp。网络服务器中介绍了如何配置NIS。任何用户都可以使用 passwd(1) 轻松更改密码。为防止意外或未经授权的更改,此命令将在设置新密码之前提示输入用户的原始密码:
示例7. 更改密码
xxxxxxxxxx% passwd输出应类似于以下内容:
xxxxxxxxxxChanging local password for jru.Old password:New password:Retype new password:passwd: updating the database...passwd: done超级用户可以在运行 passwd(1) 时通过指定用户名来更改任何用户的密码。当此实用程序以超级用户身份运行时,它不会提示输入用户的当前密码。这允许在用户无法记住原始密码时更改密码。
示例8. 超级用户修改其他用户的密码
xxxxxxxxxx# passwd jru输出应类似于以下内容:
xxxxxxxxxxChanging local password for jru.New password:Retype new password:passwd: updating the database...passwd: done与 chpass(1) 一样,yppasswd(1) 是指向 passwd(2) 的链接,因此NIS可以使用这两个命令中的任何一个。
pw(8) 实用程序可以创建、删除、修改和显示用户和组。它作为系统用户和组文件的前端。pw(8) 有一组非常强大的命令行选项,使其适合在shell脚本中使用,但新用户可能会发现它比本节中介绍的其他命令更复杂。
组是用户列表。组由其组名和GID标识。在FreeBSD中,内核使用进程的UID和它所属的组列表来确定允许该进程做什么。大多数时候,用户或进程的GID通常意味着列表中的第一个组。
组名到GID的映射(mapping)列在 /etc/group 中。这是一个带有四个冒号分隔字段的纯文本文件。第一个字段是组名,第二个是加密密码,第三个是GID,第四个是逗号分隔的成员列表。有关语法的完整描述,请参阅 group(5) 。
超级用户可以使用文本编辑器修改 /etc/group ,但最好使用 vigr(8) 编辑组文件,因为它可以捕获一些常见错误。或者, pw(8) 可用于添加和编辑组。例如,要添加一个名为 teamtwo 的组,然后确认它存在:
xxxxxxxxxx使用操作员组时必须小心,因为可能会授予非预期的超级用户访问权限,包括但不限于关闭、重新启动和访问组中 /dev 中的所有项目。示例9. 使用 pw(8) 添加组
xxxxxxxxxx# pw groupadd teamtwo# pw groupshow teamtwo输出应类似于以下内容:
xxxxxxxxxxteamtwo:*:1100:在这个例子中, 1100 是 teamtwo 的GID。目前, teamtwo 没有成员。此命令将把 jru 添加为 teamtwo 的成员。
示例10. 使用 pw(8) 将用户帐户添加到新组
xxxxxxxxxx# pw groupmod teamtwo -M jru# pw groupshow teamtwo输出应类似于以下内容:
xxxxxxxxxxteamtwo:*:1100:jru-M 的参数是一个逗号分隔的用户列表,用于添加到新的(空)组或替换现有组的成员。对于用户来说,此组成员资格与密码文件中列出的用户主组不同(并且是附加的)。这意味着,当使用 pw(8) 的 groupshow 时,用户不会显示为成员,但当通过 id(1) 或类似工具查询信息时,用户会显示。当 pw(8) 用于将用户添加到组中时,它只操纵 /etc/group ,而不会尝试从 /etc/passwd 读取其他数据。
示例11. 使用 pw(8) 向组中添加新成员
xxxxxxxxxx# pw groupmod teamtwo -m db# pw groupshow teamtwo输出应类似于以下内容:
xxxxxxxxxxteamtwo:*:1100:jru,db在这个例子中, -m 的参数是一个逗号分隔的要添加到组中的用户列表。与前面的示例不同,这些用户被附加到组中,不会替换组中的现有用户。
示例12. 使用 id(1) 确定组成员资格
xxxxxxxxxx% id jru输出应类似于以下内容:
xxxxxxxxxxuid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)在这个例子中, jru 是 jru 和 teamtwo 组的成员。
有关此命令和 /etc/group 格式的更多信息,请参阅 pw(8) 和 group(5) 。
在FreeBSD中,每个文件和目录都有一组相关的权限,并且有几个实用程序可用于查看和修改这些权限。了解权限的工作原理是必要的,以确保用户能够访问他们需要的文件,并且无法不正确地访问操作系统使用的或其他用户拥有的文件。
本节讨论FreeBSD中使用的传统UNIX®权限。有关更细粒度的文件系统访问控制,请参阅【16.11. 访问控制列表】。
在UNIX®中,基本权限是通过三种访问方式分配的:读取、写入和执行。这些访问类型用于确定文件所有者、组和其他人(其他所有人)的文件访问权限。读、写和执行权限可以表示为字母 r 、 w 和 x 。它们也可以表示为二进制数,因为每个权限都是开或关(0)。当表示为数字时,顺序始终读取为 rwx ,其中 r 的on值为4,w 的on值是2 ,x 的on值也是1。
表4.1总结了可能的数字和字母可能性。在读取“目录列表”列时,使用 - 表示设置为关闭的权限。
| 值 | 权限 | 目录列表 |
|---|---|---|
| 0 | 不能读,不能写,不能执行 | --- |
| 1 | 不能读,不能写,能执行 | --x |
| 2 | 不能读,能写,不能执行 | -w- |
| 3 | 不能读,能写,能执行 | -wx |
| 4 | 能读,不能写,不能执行 | r-- |
| 5 | 能读,不能写,能执行 | r-x |
| 6 | 能读,能写,不能执行 | rw- |
| 7 | 能读,能写,能执行 | rwx |
在 ls(1) 中使用 -l 参数可以查看一个长目录列表,其中包括一列关于文件对所有者、组和其他所有人的权限的信息。例如,任意目录中的 ls -l 可能会显示:
xxxxxxxxxx% ls -l输出应类似于以下内容:
xxxxxxxxxxtotal 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) 。
符号权限使用字符而不是八进制值来为文件或目录分配权限。符号权限使用(who)(action)(permissions)语法,其中有以下可用值:
| 选项 | 字母 | 代表 |
|---|---|---|
| (who) | u | User,用户 |
| (who) | g | Group owner,组所有者 |
| (who) | o | Other,其他人 |
| (who) | a | All(“world”),所有人,全世界 |
| (action) | + | Adding permission,添加权限 |
| (action) | - | Removing permission,移除权限 |
| (action) | = | Explicitly set permission,明确设置权限 |
| (permissions) | r | Read,读 |
| (permissions) | w | Write,写 |
| (permissions) | x | Execute,执行 |
| (permissions) | t | Sticky bit,粘滞位 |
| (permissions) | s | 设置UID或GID |
这些值与 chmod(1) 一起使用,但使用字母而不是数字。例如,以下命令将阻止与 FILE 关联的组的成员和所有其他用户访问 FILE :
xxxxxxxxxx% chmod go= FILE当必须对文件进行多组更改时,可以提供逗号分隔的列表。例如,以下命令删除 FILE 上的组和“world”写入权限,并为每个人添加执行权限:
xxxxxxxxxx% chmod go-w,a+x FILE除了文件权限,FreeBSD还支持使用“文件标志”(file flags)。这些标志为文件增加了额外的安全性和控制级别,但不包括目录。使用文件标志,甚至可以防止 root 删除或更改文件。
使用 chflags(1) 修改文件标志。例如,要在文件 file1 上启用系统不可删除标志,请发出以下命令:
xxxxxxxxxx# chflags sunlink file1要禁用系统不可删除标记,请在 sunlink 前加上 no :
xxxxxxxxxx# chflags nosunlink file1要查看文件的标志,请在 ls(1) 中使用 -lo :
xxxxxxxxxx# ls -lo file1-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1几个文件标志只能由 root 用户添加或删除。在其他情况下,文件所有者可以设置其文件标志。有关更多信息,请参阅 chflags(1) 和 chflags(2) 。
setuid 、 setgid 和 sticky 权限除了已经讨论过的权限之外,还有其他三个所有管理员都应该知道的特定设置。它们是 setuid 、 setgid 和 sticky 权限。
这些设置对于某些UNIX®操作很重要,因为它们提供了通常不授予普通用户的功能。为了理解它们,必须注意真实用户ID和有效用户ID之间的区别。
真正的用户ID是拥有或启动进程的UID。有效UID是进程运行时的用户ID。例如,当用户更改密码时,passwd(1) 会使用真实的用户ID运行。但是,为了更新密码数据库,该命令将以 root 用户的有效ID运行。这允许用户更改密码,而不会看到 Permission Denied 错误。
可以通过为用户添加 s 权限来象征性地添加 setuid 权限,如下例所示:
xxxxxxxxxx# chmod u+s suidexample.shsetuid 权限也可以通过在权限集前加上数字四(4)来设置,如下例所示:
xxxxxxxxxx# chmod 4755 suidexample.shsuidexample.sh 上的权限现在看起来如下:
xxxxxxxxxx-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh请注意, s 现在是为文件所有者指定的权限集的一部分,取代了可执行位。这允许需要提升权限的实用程序,如 passwd(1) 。
xxxxxxxxxxnosuid mount(8) 选项将导致此类二进制文件静默失败,而不会提醒用户。该选项并不完全可靠,因为nosuid包装器可能能够绕过它。要实时查看此信息,请打开两个终端。在其中一个上,以普通用户的身份键入 passwd 。在等待新密码的同时,检查进程表并查看 passwd(1) 的用户信息:
在终端A:
xxxxxxxxxxChanging local password for trhodesOld Password:在终端B:
xxxxxxxxxx# ps aux | grep passwdtrhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwdroot 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 权限:
xxxxxxxxxx# chmod g+s sgidexample.sh或者,为 chmod(1) 提供前导二(2):
xxxxxxxxxx# chmod 2755 sgidexample.sh在以下列表中,请注意 s 现在位于为组权限设置指定的字段中:
xxxxxxxxxx-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidexample.shxxxxxxxxxx在这些示例中,即使所讨论的shell脚本是一个可执行文件,它也不会使用不同的EUID或有效用户ID运行。这是因为shell脚本可能无法访问 `setuid(2)` 系统调用。setuid 和 setgid 权限位可能会通过允许提升权限来降低系统安全性。第三个特殊权限,即 sticky bit (粘滞位),可以加强系统的安全性。
当在目录上设置粘滞位时,它只允许文件所有者删除文件。这有助于防止不拥有文件的用户在公共目录(如 /tmp)中删除文件。要使用此权限,请将 t 模式添加到文件中:
xxxxxxxxxx# chmod +t /tmp或者,在权限集前加一(1):
xxxxxxxxxx# chmod 1777 /tmpsticky bit 权限将在权限集的末尾显示为 t :
xxxxxxxxxx# ls -al / | grep tmpdrwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmpFreeBSD目录层次结构是全面了解系统的基础。最重要的目录是root或 / 。此目录是启动时安装的第一个目录,它包含为多用户操作准备操作系统所需的基本系统。根目录还包含在向多用户操作过渡期间挂载的其他文件系统的挂载点。
挂载点是一个目录,可以将其他文件系统移植到父文件系统(通常是根文件系统)上。这在【3.6. 磁盘组织】中有进一步的描述。标准挂载点包括 /usr/ 、 /var/ 、 /tmp/ 、 /mnt/ 和 /media/ 。这些目录通常引用 /etc/fstab 中的条目。此文件是各种文件系统和装载点的表,由系统读取。/etc/fstab中的大多数文件系统都是在启动时从脚本 rc(8) 自动挂载的,除非它们的条目包含 noauto 。详细信息可以在【3.7.1. 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/ | 进程文件系统(process file system)。详见 procfs(5) 。 |
| /rescue/ | 如 rescue(8) 所述,用于紧急恢复的静态链接程序。 |
| /root/ | root 帐户的主目录。 |
| /sbin/ | 系统程序和管理实用程序是单用户和多用户环境的基础。 |
| /tmp/ | 在系统重启过程中通常不会保留的临时文件。基于内存的文件系统通常挂载在 /tmp 。这可以使用 rc.conf(5) 中与 tmpmfs 相关的变量或 /etc/fstab 中的条目进行自动化;有关详细信息,请参阅 mdmfs(8) 。 |
| /usr/ | 大多数用户实用程序和应用程序。 |
| /usr/bin/ | 通用实用程序、编程工具和应用程序。 |
| /usr/include/ | 标准C包括文件。 |
| /usr/lib/ | 档案(Archive)库。 |
| /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集合(可选)。 |
| /usr/sbin/ | 用户执行的系统守护进程和系统实用程序。 |
| /usr/share/ | 独立于架构的文件。 |
| /usr/src/ | BSD和/或本地源文件。 |
| /var/ | 多用途日志、临时、瞬态和假脱机文件。 |
| /var/log/ | 其他系统日志文件。 |
| /var/tmp/ | 通常在系统重新启动时保留的临时文件。 |
FreeBSD用来查找文件的最小组织单位是文件名。文件名区分大小写,这意味着 readme.txt 和 README.TXT 是两个独立的文件。FreeBSD不使用文件的扩展名来确定文件是程序、文档还是其他形式的数据。
文件存储在目录中。一个目录可能不包含文件,也可能包含数百个文件。一个目录还可以包含其他目录,允许在彼此之间建立目录层次结构,以便组织数据。
通过给出文件或目录名,后跟正斜杠、/ ,后跟任何其他必要的目录名来引用文件和目录。例如,如果目录 foo 包含一个目录 bar ,其中包含文件 readme.txt ,则文件的全名或路径为 foo/bar/readme.txt 。请注意,这与Windows®不同,Windows®使用\分隔文件名和目录名。FreeBSD在路径中不使用驱动器号或其他驱动器名称。例如,在FreeBSD上不会键入 c:\foo\bar\readme.txt 。
目录和文件存储在文件系统中。每个文件系统在最顶层只包含一个目录,称为该文件系统的 根目录 (root directory)。此根目录可以包含其他目录。一个文件系统被指定为 根文件系统(root file system)或 / 。其他所有文件系统都挂载在根文件系统下。无论FreeBSD系统上有多少磁盘,每个目录似乎都是同一磁盘的一部分。
考虑三个文件系统,称为 A 、 B 和 C 。每个文件系统都有一个根目录,其中包含另外两个目录,称为 A1 、 A2 (以及 B1 、 B2 和 C1 、C2)。
将A称为根文件系统。如果 ls(1) 用于查看此目录的内容,它将显示两个子目录 A1 和 A2。目录树看起来像这样:

文件系统必须装载到另一个文件系统中的目录上。当将文件系统 B 挂载到目录 A1 时, B 的根目录会替换 A1 , B 中的目录也会相应出现:

根据需要,可以使用路径 /A1/B1 或 /A1/B2 访问 B1 或 B2 目录中的任何文件。 /A1 中的所有文件都已暂时隐藏。如果从 A 卸载 B ,它们将重新出现。
如果将 B 挂载在 A2 上,则图表如下:

路径将分别为 /A2/B1 和 /A2/B2 。
文件系统可以挂载在彼此之上。继续上一个例子,C 文件系统可以挂载在 B 文件系统的 B1 目录之上,导致这种安排:

或者 C 可以直接挂载到 A 文件系统的 A1 目录下:

完全有可能拥有一个大型根文件系统,而不需要创建任何其他根文件系统。这种方法有一些缺点,也有一个优点。
多文件系统的好处
nosuid 方式挂载。此选项可防止存储在文件系统上的可执行文件上的 suid/guid 位生效,从而可能提高安全性。单一文件系统的好处
文件系统的大小是固定的。在FreeBSD安装过程中创建文件系统并给它一个特定的大小时,可能是想让分区更大。如果不进行备份,使用新大小重新创建文件系统,然后还原备份的数据,这是不容易实现的。
xxxxxxxxxxFreeBSD具有 growfs(8) 命令,它可以动态增加文件系统的大小,从而消除了这一限制。文件系统只能扩展到其所在分区中的可用空间。如果分区后有空间,可以使用 gpart(8) 扩展分区。如果该分区是虚拟磁盘上的最后一个分区,并且磁盘已扩展,则可以扩展该分区。文件系统包含在分区中。使用几种分区方案之一将磁盘划分为分区;请参阅【2.6.3. 手动分区】。较新的方案是GPT;较旧的基于BIOS的计算机使用MBR。GPT支持将磁盘划分为具有大小、偏移量和类型的分区。它支持大量分区和分区类型,建议在可能的情况下使用。GPT分区使用带有后缀的磁盘名称,其中后缀为 p1 表示第一个分区, p2 表示第二个分区,依此类推。但是,MBR只支持少数分区。MBR分区在FreeBSD中被称为 slices ,切片。切片可用于不同的操作系统。FreeBSD切片使用BSD标签细分为分区(参见 bsdlabel(8) )。
切片编号跟在设备名称后面,前缀为 s ,从1开始。因此,da0s1 是第一个SCSI驱动器上的第一个切片。一个磁盘上只能有四个物理切片,但在适当类型的物理切片内可以有逻辑切片。这些扩展片从 5 开始编号,因此 ada0s5 是第一个SATA磁盘上的第一个扩展片。这些设备由希望占用切片的文件系统使用。
每个GPT或BSD分区只能包含一个文件系统,这意味着文件系统通常由其在文件系统层次结构中的典型挂载点或所包含分区的名称来描述。
FreeBSD还使用磁盘空间作为交换空间(swap space)来提供虚拟内存(virtual memory)。这允许计算机表现得好像它有比实际多得多的内存。当FreeBSD内存不足时,它会将当前未使用的一些数据移动到交换空间,并在需要时将其移回(将其他数据移出)。这被称为分页(paging)。
一些BSD分区有一些与之相关的约定。
| 分区 | 约定 |
|---|---|
| a | 通常包含根文件系统。 |
| b | 通常包含交换空间。 |
| c | 通常与封闭切片的大小相同。这允许需要在整个切片上工作的实用程序(如坏块扫描程序)在 c 分区上工作。通常不会在此分区上创建文件系统。 |
| d | 分区 d 曾经具有与之相关的特殊含义,尽管现在已经消失了, d 可以像任何正常的分区一样工作。 |
切片和“危险专用”物理驱动器包含BSD分区,用从 a 到 h 的字母表示。此字母附加在设备名称后,因此 da0a 是第一个 da 驱动器上的 a 分区,这是“危险专用的”。 ada1s3e 是第二个SATA磁盘驱动器第三个切片中的第五个分区。
最后,识别系统上的每个磁盘。磁盘名称以指示磁盘类型的代码开头,然后是一个数字,指示它是哪个磁盘。与分区和切片不同,磁盘编号从0开始。常见代码列在【表4. 磁盘设备名称】中。
在引用切片中的分区时,请包含磁盘名称、s、切片编号,然后是分区字母。示例如【表5. 示例盘】所示。GPT分区包括磁盘名p,然后是分区号。
【示例13. 磁盘的概念模型】显示了使用MBR切片的磁盘布局的概念模型。
安装FreeBSD时,如果使用MBR,请配置磁盘切片,并在切片内创建用于FreeBSD的分区。如果使用GPT,请为每个文件系统配置分区。无论哪种情况,都要在每个分区中创建一个文件系统或交换空间,并决定每个文件系统的挂载位置。有关操作分区的信息,请参见 gpart(8) 。
表4. 磁盘设备名称
| 驱动器类型 | 驱动器设备名称 |
|---|---|
| SATA 和 IDE 硬盘 | ada |
| SCSI硬盘和USB存储设备 | da |
| NVMe存储 | nvd 或 nda |
| SATA和IDE CD-ROM驱动器 | cd |
| SCSI CD-ROM驱动器 | cd |
| 软盘驱动器 | fd |
| SCSI磁带机 | sa |
| RAID驱动器 | 示例包括: Adaptec®AdvancedAID的 aacd Mylex®的 mlxd 和 mlyd AMI MegaRAID®的 amrdCompaq Smart RAID的 idad 3ware®RAID的 twed Dell PERC的 mfi |
表5. 示例磁盘、切片和分区名称
| 名称 | 含义 |
|---|---|
ada0s1a | 第一SATA磁盘(ada0)上第一切片(s1)上的第一分区(a)。 |
da1s2e | 第二SCSI磁盘(da1)上第二切片(s2)上的第五个分区(e)。 |
示例13. 磁盘的概念模型
此图显示了FreeBSD对连接到系统的第一个SATA磁盘的视图。假设磁盘大小为250 GB,包含80 GB切片和170 GB切片(MS-DOS®分区)。第一个切片包含Windows®NTFS文件系统 C: ,第二个切片包含FreeBSD安装。这个FreeBSD安装示例有四个数据分区和一个交换分区。
这四个分区各自保存一个文件系统。分区 a 用于根文件系统, d 用于 /var/ , e 用于 /tmp/ , f 用于 /usr/ 。分区字母 c 指的是整个切片,因此不用于普通分区。

文件系统最好被视为一棵树,可以说是根在 / 。 /dev 、 /usr 和根目录中的其他目录都是分支,它们可能有自己的分支,如 /usr/local 等。
将其中一些目录放在单独的文件系统上有各种原因。/var/ 包含目录 log/ 、 spool/ 和各种类型的临时文件,因此可能会被填满。填充根文件系统不是一个好主意,因此将 /var 从 / 中分离出来通常是有利的。
在其他文件系统上包含某些目录树的另一个常见原因是,如果它们被放置在单独的物理磁盘上,或者是单独的虚拟磁盘,如【32.3. 网络文件系统(NFS)】中描述的网络文件系统挂载或CDROM驱动器。
在引导过程中(【15. FreeBSD引导过程】), /etc/fstab 中列出的文件系统会自动挂载,但包含 noauto 的条目除外。此文件包含以下格式的条目:
xxxxxxxxxxdevice /mount-point fstype options dumpfreq passnodevice
【表4. 磁盘设备名称】中解释的现有设备名称。
mount-point
用于挂载文件系统的现有目录。
fstype
传递给 mount(8) 的文件系统类型。FreeBSD的默认文件系统是 ufs 。
options
rw 表示读写文件系统,ro 表示只读文件系统,后面跟着可能需要的任何其他选项。一个常见的选项是 noauto ,用于在引导过程中通常不会挂载的文件系统。其他选项列在 mount(8) 中。
dumpfreq
由 dump(8) 使用,以确定哪些文件系统需要转储。如果字段缺失,则假定值为 0 。
passno
确定重新启动后 fsck(8) 检查UFS文件系统的顺序。应跳过的文件系统的 passno 应设置为 0 。在执行其他操作之前,需要检查根文件系统,并将其 passno 设置为 1 。其他文件系统应设置为大于1的值。如果多个文件系统具有相同的 passno ,如果可能的话, fsck(8) 将尝试并行检查文件系统。
有关 /etc/fstab 的格式及其选项的更多信息,请参阅 fstab(5) 。
mount(8) 文件系统使用 mount(8) 挂载。最基本的语法如下:
xxxxxxxxxx# 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 标志。这也是一个有用的安全选项。
umount(8) 要卸载文件系统,请使用 umount(8) 。此命令接受一个参数,可以是装载点、设备名称、 -a 或 -A 。
所有形式都使用 -f 强制卸载,使用 -v 表示冗长。请注意, -f 通常不是一个好主意,因为它可能会使计算机崩溃或损坏文件系统上的数据。
要卸载所有已挂载的文件系统,或仅卸载 -t 后列出的文件系统类型,请使用 -a 或 -A 。请注意, -A 不会尝试卸载根文件系统。
FreeBSD是一个多任务操作系统。任何时候运行的每个程序都称为进程。每个正在运行的命令都会启动至少一个新进程,并且FreeBSD会运行许多系统进程。
每个进程都由一个称为进程ID(process ID,PID)的数字唯一标识。与文件类似,每个进程都有一个所有者和组,所有者和组权限用于确定进程可以打开哪些文件和设备。大多数进程也有一个启动它们的父进程。例如,shell是一个进程,在shell中启动的任何命令都是一个以shell为父进程的进程。例外情况是一个名为 init(8) 的特殊进程,它总是在启动时首先启动的进程,并且其PID始终为 1 。
一些程序不是为在连续用户输入的情况下运行并在第一时间与终端断开连接而设计的。例如,web服务器响应web请求,而不是用户输入。邮件服务器是这类应用程序的另一个例子。这些类型的程序被称为守护进程(daemon)。守护进程一词来自希腊神话,代表一个既非善也非恶的实体,它无形中执行着有用的任务。这就是为什么BSD吉祥物是一个穿着运动鞋和拿着叉子的快乐精灵。
有一种惯例是用尾随的“d”来命名通常作为守护进程运行的程序。例如,BIND是伯克利互联网域名,但实际执行的程序是 named 。Apache web服务器程序是 httpd ,行式打印机后台进程是 lpd 。这只是一个命名约定。例如,Sendmail应用程序的主邮件守护进程是 sendmail ,而不是 maild 。
要查看系统上运行的进程,请使用 ps(1) 或 top(1) 。要显示当前运行的进程、其PID、使用的内存量以及启动时使用的命令的静态列表,请使用 ps(1) 。要显示所有正在运行的进程并每隔几秒钟更新一次显示,以便交互式地查看计算机正在做什么,请使用 top(1) 。
ps(1)默认情况下, ps(1) 仅显示用户正在运行和拥有的命令。例如:
xxxxxxxxxx% ps PID TT STAT TIME COMMAND8203 0 Ss 0:00.59 /bin/csh8895 0 R+ 0:00.00 psps(1) 的输出被组织成多个列。
PID 列显示进程ID。PID从1开始分配,一直到99999,然后返回到开头。但是,如果PID已在使用中,则不会重新分配。TT 列显示程序正在运行的tty。STAT 显示程序的状态。TIME 是程序在CPU上运行的时间量。这通常不是程序启动后经过的时间,因为大多数程序在需要在CPU上花费时间之前,会花很多时间等待事情发生。COMMAND 是用于启动程序的命令。有许多不同的选项可用于更改显示的信息。最有用的集合之一是 auxww ,其中
a 显示所有用户的所有正在运行的进程的信息,u 显示进程所有者的用户名和内存使用情况,x 显示守护进程的信息。ww 使 ps(1) 显示每个进程的完整命令行,而不是在它太长而无法显示在屏幕上时截断它。top(1)top(1) 的输出类似:
x% toplast pid: 9609; load averages: 0.56, 0.45, 0.36 up 0+00:20:0310:21:46107 processes: 2 running, 104 sleeping, 1 zombieCPU: 6.2% user, 0.1% nice, 8.2% system, 0.4% interrupt, 85.1% idleMem: 541M Active, 450M Inact, 1333M Wired, 4064K Cache, 1498M FreeARC: 992M Total, 377M MFU, 589M MRU, 250K Anon, 5280K Header, 21M OtherSwap: 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% Xorg8198 dru 2 52 0 449M 82736K select 3 0:08 5.96% kdeinit48311 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% moused9551 dru 1 21 0 16600K 2660K CPU3 3 0:01 0.98% top2357 dru 4 37 0 718M 141M select 0 0:21 0.00% kdeinit48705 dru 4 35 0 480M 98M select 2 0:20 0.00% kdeinit48076 dru 6 20 0 552M 113M uwait 0 0:12 0.00% soffice.bin2623 root 1 30 10 12088K 1636K select 3 0:09 0.00% powerd2338 dru 1 20 0 440M 84532K select 1 0:06 0.00% kwin1427 dru 5 22 0 605M 86412K select 1 0:05 0.00% kdeinit4输出分为两部分:
标题(前五或六行)显示了:
标头中的其他数字与正在运行的进程数、已使用的内存和交换空间以及系统在不同CPU状态下花费的时间有关。如果已加载ZFS文件系统模块,则ARC行指示从内存缓存而不是磁盘读取了多少数据。
标题下方是一系列列,其中包含与 ps(1) 输出类似的信息,如PID、用户名、CPU时间和启动进程的命令。默认情况下, top(1) 还显示进程占用的内存空间量。这分为两列:一列是总大小,一列是驻留(RESident)大小。总大小是应用程序所需的内存量,驻留大小是它现在实际使用的内存量。
top(1) 每两秒自动更新一次显示。可以用 -s 指定不同的间隔。
与任何正在运行的进程或守护进程通信的一种方法是使用 kill(1) 发送信号(signal)。有许多不同的信号;有些具有特定的含义,而另一些则在应用程序的文档中进行了描述。用户只能向自己拥有的进程发送信号,向其他进程发送信号将导致权限拒绝错误。根用户是个例外,他可以向任何人的进程发送信号。
操作系统也可以向进程发送信号。如果应用程序编写错误并试图访问不应该访问的内存,FreeBSD将向该进程发送“分段违规”信号(Segmentation Violation,SIGSEGV )。如果编写了一个应用程序,在一段时间后使用 alarm(3) 系统调用发出警报,则会向其发送“警报”信号(Alarm,SIGALRM)。
有两个信号可以用来停止进程: SIGTERM 和 SIGKILL 。
SIGTERM 是杀死进程的礼貌方式,因为进程可以读取信号,关闭它可能打开的任何日志文件,并尝试在关闭之前完成它正在做的事情。在某些情况下,如果进程处于某个无法中断的任务的中间,则可能会忽略 SIGTERM 。SIGKILL 。向进程发送 SIGKILL 通常会当场停止该进程。SIGHUP 、 SIGUSR1 和 SIGUSR2 。由于这些是通用信号,不同的应用程序会有不同的响应。例如,在更改web服务器的配置文件后,需要告诉web服务器重新读取其配置。重新启动 httpd 将导致web服务器短暂停机。相反,向守护进程发送 SIGHUP 信号。请注意,不同的守护进程将有不同的行为,因此请参阅守护进程的文档,以确定 SIGHUP 是否会达到预期的结果。xxxxxxxxxx杀死系统上的随机进程是一个坏主意。特别是 init(8),PID 1,是特殊的。运行 /bin/kill -s kill 1 是一种快速且不推荐的关闭系统的方法。在按 Return 键之前,请务必仔细检查要杀死的参数。shell提供了一个用于与操作系统交互的命令行界面。shell从输入通道接收命令并执行它们。许多shell提供内置函数来帮助完成日常任务,如文件管理、文件全局定位、命令行编辑、命令宏和环境变量。FreeBSD附带了几个shell,包括Bourne shell(sh(1))和扩展的C shell(tcsh(1))。其他shell可以从FreeBSD Ports集合中获得,如 zsh 和 bash 。
使用哪个shell真的是个人品味问题。C程序员可能会对类似C的shell(如 tcsh(1))感到更舒服。Linux®用户可能更喜欢 bash 。每个shell都有独特的属性,这些属性可能适用于也可能不适用于用户首选的工作环境,这就是为什么可以选择使用哪个shell的原因。
一个常见的shell功能是文件名完成。用户键入命令或文件名的前几个字母并按 Tab 键后,shell将完成命令或文件的其余部分。考虑两个名为 foobar 和 football 的文件。要删除 foobar ,用户可以键入 rm foo 并按 Tab 键完成文件名。
但是shell只显示 rm foo 。它无法完成文件名,因为 foobar 和 football 都以foo开头。如果多个名称匹配,一些shell会发出嘟嘟声或显示所有选项。然后,用户必须键入更多字符来标识所需的文件名。键入 t 并再次按 Tab 键就足以让shell确定所需的文件名并填写其余部分。
shell的另一个特性是使用环境变量。环境变量是存储在shell环境中的变量/密钥对。这个环境可以被shell调用的任何程序读取,因此包含大量的程序配置。【表6. 公共环境变量】提供了一个公共环境变量及其含义的列表。请注意,环境变量的名称总是大写的。
表6. 公共环境变量
| 变量 | 描述 |
|---|---|
USER | 当前登录用户名。 |
PATH | 用冒号分隔的目录列表来搜索二进制文件。 |
DISPLAY | 要连接的Xorg显示器的网络名称(如果可用)。 |
SHELL | 当前的shell。 |
TERM | 用户终端类型的名称。用于确定终端的能力。 |
TERMCAP | 终端转义码的数据库条目,以执行各种终端功能。 |
OSTYPE | 操作系统的类型。 |
MACHTYPE | 系统的CPU架构。 |
EDITOR | 用户首选的文本编辑器。 |
PAGER | 用户一次查看一页文本的首选实用程序。 |
MANPATH | 用冒号分隔的目录列表来搜索手册页。 |
设置环境变量的方法因shells而异。在 tcsh(1) 和 csh(1) 中,使用 setenv 设置环境变量。在 sh(1) 和 bash 中,使用 export 设置当前环境变量。此示例将 tcsh(1) shell的默认编辑器设置为 /usr/local/bin/emacs :
xxxxxxxxxx% setenv EDITOR /usr/local/bin/emacsbash 的等效命令是:
xxxxxxxxxx% export EDITOR="/usr/local/bin/emacs"要展开环境变量以查看其当前设置,请在命令行上的名称前键入 $ 字符。例如, echo $TERM 显示当前的 $TERM 设置。
Shell将特殊字符(称为元字符)视为数据的特殊表示。最常见的元字符是 * ,它表示文件名中任意数量的字符。元字符可用于执行文件名全局搜索。例如, echo * 相当于 ls ,因为shell会获取所有匹配 * 的文件,echo会在命令行上列出它们。
为了防止shell解释特殊字符,请以反斜杠(\)开头将其从shell中转义。例如, echo $TERM 打印终端设置,而 echo \$TERM 直接打印字符串 $TERM 。
永久更改默认shell的最简单方法是使用 chsh 。运行此命令将打开在 EDITOR 环境变量中配置的编辑器,默认设置为 vi(1) 。将 Shell: 行更改为新Shell的完整路径。
或者,使用 chsh -s ,它将在不打开编辑器的情况下设置指定的shell。例如,要将shell更改为 bash :
xxxxxxxxxx% chsh -s /usr/local/bin/bash在提示下输入密码,然后按 Return 键更改shell。注销并重新登录以开始使用新shell。
xxxxxxxxxx新shell必须存在于 /etc/shells 中。如果shell是从FreeBSD Ports集合安装的,如【安装应用程序:Packages和Ports】中所述,它应该会自动添加到此文件中。如果缺少,请使用以下命令添加它,将路径替换为shell的路径:# echo /usr/local/bin/bash >> /etc/shells然后运行 chsh(1)。UNIX®shell不仅仅是一个命令解释器,它还是一个强大的工具,允许用户执行命令、重定向输出、重定向输入并将命令链接在一起,以改进最终的命令输出。当此功能与内置命令混合使用时,用户将获得一个可以最大限度提高效率的环境。
Shell重定向是将命令的输出或输入发送到另一个命令或文件中的操作。例如,要将 ls(1) 命令的输出捕获到文件中,请重定向输出:
xxxxxxxxxx% ls > directory_listing.txt目录内容现在将列在 directory_listing.txt 中。某些命令可用于读取输入,例如 sort(1) 。要对此列表进行排序,请重定向输入:
xxxxxxxxxx% sort < directory_listing.txt输入将被排序并放置在屏幕上。要将该输入重定向到另一个文件中,可以通过混合方向来重定向 sort(1) 的输出:
xxxxxxxxxx% sort < directory_listing.txt > sorted.txt在前面的所有示例中,命令都是使用文件描述符执行重定向的。每个UNIX®系统都有文件描述符,其中包括标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。每个都有一个目的,输入可以是键盘或鼠标,提供输入的东西。输出可以是屏幕或打印机中的纸张。错误是指用于诊断或错误消息的任何东西。这三个都被认为是基于I/O的文件描述符(file descriptors),有时也被认为是流(streams)。
通过使用这些描述符,shell允许输出和输入通过各种命令传递,并重定向到文件或从文件重定向。另一种重定向方法是管道操作符。
UNIX®管道运算符“|”允许将一个命令的输出直接传递或定向到另一个程序。基本上,管道允许将命令的标准输出作为标准输入传递给另一个命令,例如:
xxxxxxxxxx% cat directory_listing.txt | sort | less在该示例中, directory_listing.txt 的内容将被排序,输出将传递给 less(1) 。这允许用户以自己的速度滚动输出,并防止其从屏幕上滚动。
大多数FreeBSD配置都是通过编辑文本文件完成的,因此熟悉文本编辑器是一个好主意。FreeBSD附带了一些作为基础系统的一部分,还有更多可以在Ports Collection中找到。
一个简单的编辑器是 ee(1) ,它代表easy editor(简单的编辑器)。要启动此编辑器,请键入 ee filename ,其中 filename 是要编辑的文件的名称。一旦进入编辑器,用于操纵编辑器功能的所有命令都会列在显示的顶部。插入符号(^)表示 Ctrl ,因此 ^e 扩展为 Ctrl+e 。要离开ee(1) ,请按 Esc 键,然后从主菜单中选择【leave editor】选项。如果文件已被修改,编辑器将提示保存任何更改。
FreeBSD还附带了更强大的文本编辑器,如 vi(1) ,作为基础系统的一部分。其他编辑器,如 editors/emacs 和 editors/vim ,都是FreeBSD Ports Collection的一部分。这些编辑器以更复杂的学习为代价提供了更多的功能。从长远来看,学习 vim 或 Emacs 等更强大的编辑器可以节省更多时间。
许多修改文件或需要键入输入的应用程序会自动打开文本编辑器。要更改默认编辑器,请按照Shells中的说明设置 EDITOR 环境变量。
设备是一个术语,主要用于系统中与硬件相关的活动,包括磁盘、打印机、图形卡和键盘。当FreeBSD启动时,大多数启动消息都指向被检测到的设备。引导消息的副本保存到 /var/run/dmesg.boot 。
每个设备都有一个设备名称和编号。例如, ada0 是第一个SATA硬盘,而 kbd0 代表键盘。
FreeBSD中的大多数设备都必须通过位于 /dev 中的名为设备节点的特殊文件进行访问。
FreeBSD最全面的文档是手册页的形式。系统上的几乎每个程序都附带了一份简短的参考手册,解释了基本操作和可用参数。这些手册可以使用 man 查看:
xxxxxxxxxx% man command其中 command 是要学习的命令的名称。例如,要了解有关 ls(1) 的更多信息,请键入:
xxxxxxxxxx% man ls手册页分为代表主题类型的部分。在FreeBSD中,以下部分可用:
在某些情况下,同一主题可能会出现在在线手册的多个部分。例如,有 chmod 用户命令和 chmod() 系统调用。要告诉 man(1) 显示哪个部分,请指定部分编号:
xxxxxxxxxx% man 1 chmod这将显示用户命令 chmod(1) 的手册页面。在书面文档中,对在线手册特定章节的引用传统上放在括号中,因此 chmod(1) 表示用户命令, chmod(2)表示系统调用。
如果手册页的名称未知,请使用 man -k 在手册页描述中搜索关键字:
xxxxxxxxxx% man -k mail此命令显示在其描述中包含关键字“mail”的命令列表。这相当于使用 apropos(1) 。
要阅读 /usr/sbin 中所有命令的说明,请键入:
xxxxxxxxxx% cd /usr/sbin% man -f * | more或者:
xxxxxxxxxx% cd /usr/sbin% whatis * |moreFreeBSD包括自由软件基金会(Free Software Foundation,FSF)开发的几个应用程序和实用程序。除了手册页,这些程序可能还包括称为 info 文件的超文本文档。这些可以使用 info(1) 查看,或者如果安装了 editors/emacs ,则可以使用emacs的info模式查看。
要使用 info(1) ,请键入:
xxxxxxxxxx% info如需简要介绍,请键入 h 。如需快速命令参考,请键入 ?。