Linux-工具秘籍-全-

Linux 工具秘籍(全)

原文:zh.annas-archive.org/md5/CA17A1452E9A171FA85666D109FEB63D

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

《Linux 实用工具手册》展示了如何解决 Linux 计算机上的典型问题。信息以“配方格式”提供,允许用户快速高效地找到所需的主题。执行任务的步骤得到了清晰的解释并经过了测试以确保准确性。还有一个关于 shell 脚本的部分。

本书涵盖内容

第一章,使用终端/命令行,介绍了如何充分利用 Linux 命令行。

第二章,桌面,介绍了 Linux 可用的一些桌面环境。

第三章,文件和目录,解释了文件、目录以及如何管理它们。

第四章,网络和互联网,涵盖了连接性以及连接性中断时如何修复。

第五章,权限、访问和安全,简要概述了 Linux 安全功能。

第六章,进程,解释了如何在 Linux 中管理进程。

第七章,磁盘和分区,简要介绍了磁盘管理。

第八章,使用脚本,介绍了如何在 Linux 中编写脚本。

第九章,使用 Cron 自动化任务,解释了如何自动运行作业。

第十章,内核,介绍了如何为您的系统制作自定义内核。

附录 A,Linux 最佳实践,展示了如何像专业人士一样设置和运行您的系统。

附录 B,寻找帮助,涵盖了快速定位所需信息。

您需要为本书做好准备

要跟随本书中的示例,您需要在计算机上运行主流 Linux 发行版。作者使用了 Red Hat 的 Fedora 来创建本书以及示例和脚本。但是,任何发行版都应该可以正常工作。请注意,大多数可以从制造商的网站免费下载和安装。

本书适合对象

本书适用于希望了解更多关于 Linux 的有些经验的计算机用户。该配方格式旨在允许快速访问经常出现的典型任务。

约定

在本书中,您会发现一些文本样式,用于区分不同类型的信息。以下是一些这些样式的示例,以及它们的含义解释。

文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄显示如下:“我们可以通过使用include指令包含其他上下文。”

任何命令行输入或输出都以以下形式书写:

export PS1=”screen$WINDOW \h \u \w \$ "

新术语重要单词粗体显示。例如,屏幕上看到的单词,如菜单或对话框中的单词,会以这种形式出现在文本中:“点击下一步按钮会将您移至下一个屏幕”。

注意

警告或重要提示会以这种形式出现在一个框中。

提示

提示和技巧会以这种形式出现。

文本部分的命令将以这种形式指示:运行cd /tmp

读者反馈

我们始终欢迎读者的反馈。请让我们知道您对本书的看法——您喜欢或不喜欢的地方。读者的反馈对我们开发您真正受益的标题非常重要。

要向我们发送一般反馈,只需发送电子邮件至<feedback@packtpub.com>,并在消息主题中提及书名。

如果有您擅长的话题,并且您有兴趣撰写或为书籍做出贡献,请参阅我们的作者指南www.packtpub.com/authors

客户支持

现在您是 Packt 书籍的自豪所有者,我们有许多事情可以帮助您充分利用您的购买。

勘误

尽管我们已经尽一切努力确保内容的准确性,但错误确实会发生。如果您在我们的书中发现错误——也许是文本或代码中的错误——我们将不胜感激地向我们报告。通过这样做,您可以帮助其他读者避免挫折,并帮助我们改进本书的后续版本。如果您发现任何勘误,请访问www.packtpub.com/submit-errata报告,选择您的书,点击勘误提交表链接,并输入您的勘误详情。一旦您的勘误经过验证,您的提交将被接受,并且勘误将被上传到我们的网站上,或者添加到该标题的勘误列表中的任何现有勘误下的勘误部分。您可以通过从www.packtpub.com/support选择您的标题来查看任何现有的勘误。

盗版

互联网上的版权盗版是所有媒体的持续问题。在 Packt,我们非常重视版权和许可的保护。如果您在互联网上发现我们作品的任何非法副本,请立即向我们提供位置地址或网站名称,以便我们采取补救措施。

请通过链接到涉嫌盗版材料的电子邮件<copyright@packtpub.com>与我们联系。

我们感谢您在保护我们的作者和为您带来有价值的内容方面的帮助。

问题

如果您在书的任何方面遇到问题,请通过<questions@packtpub.com>与我们联系,我们将尽力解决。

第一章:使用终端/命令行

在本章中,我们将涵盖:

  • 命令检索和行编辑

  • 使用历史记录

  • 文件名自动完成

  • shell 提示

  • 其他环境变量

  • 使用别名

  • .bashrc文件

  • 处理文件名中的空格和特殊字符

  • 了解$?变量

  • 重定向和管道

  • 将输出从一个终端发送到另一个终端

  • 使用 Screen 程序

介绍

了解如何有效使用命令行将真正帮助您充分利用计算机。在输入命令时,有许多节省时间和精力的方法,您只需要知道它们是什么。

有许多不同的 Linux 环境可用。本章重点介绍了流行的Bash shell。

命令检索和行编辑

标准的 Bash 终端自动设置为插入模式,因此您无需按Insert键来插入文本。使用上下箭头键来回忆以前的命令,然后使用其他光标键根据需要编辑该行。

命令检索和行编辑

准备工作

对于此示例,您只需要运行 Bash shell 的终端。其他终端可能没有这些功能。

如何做...

我们将按以下方式运行一些命令:

  1. 输入命令route并按Enter键。

  2. uptimelsdatesync执行相同的操作,每次输入命令后按Enter

  3. 现在再按一次上箭头键。您应该会看到以下命令:

sync

  1. 现在再按两次上箭头键。您应该会看到datels

  2. Enterls命令将再次运行。按Enter将始终运行显示的命令。

它是如何工作的...

该行存储在具有完整编辑功能的缓冲区中。当按下Enter键时,该缓冲区将被发送到操作系统。

用于检索和编辑的键的摘要如下:

  • 上箭头:用于向上滚动历史缓冲区

  • 下箭头:用于向下滚动历史缓冲区

  • Home:用于将光标移动到行的开头

  • End:用于将光标移动到行的末尾

  • 删除:用于删除光标右侧的字符

  • 退格键:用于删除光标左侧的字符并移动行

  • 左右箭头:这些是光标移动键

使用历史记录

标准的 Bash shell 包括一个history功能。它记录每个命令在一个数据库中,可以通过运行history命令来显示。在本节中,我们已经展示了如何做到这一点。

准备工作

您只需要一个 Bash 终端来按照给定的步骤进行操作。

请参阅以下屏幕截图:

准备工作

如何做...

  1. 运行一些命令,如routeuptimedatesync

  2. 运行history命令。

  3. 查找您想再次运行的命令,但是不要输入命令,而是输入感叹号(!),然后输入历史列表中命令旁边的数字,然后按Enter

  4. 该命令将再次运行。

它是如何工作的...

将命令行历史视为线性数据库。您可以向上或向下滚动,直到看到所需的命令。这也有助于回忆一段时间前所做的事情。HISTSIZE环境变量控制将在缓冲区中保存多少个命令。

提示

在使用此功能时要小心。确保在运行之前输入正确的命令。

文件名自动完成

运行命令时,您无需输入完整的文件名。这样可以节省大量时间和精力,还可以帮助防止输入错误。

Tab键用于调用文件名自动完成。请参阅以下屏幕截图:

文件名自动完成

您只需输入足够的字符使您想要的文件名变得唯一,然后按Tab。如果您没有输入足够的字符,您将听到控制台发出哔哔声(在大多数 shell 中)。如果现在再次按Tab,则将显示所有可能性。

准备工作

在此示例中,你只需要运行 Bash shell 的终端。

如何做...

  1. 切换到你的主目录,我的情况下是:
cd /home/jklewis.

  1. 使用以下命令创建一个目录:
mkdir Linuxbook

  1. 使用以下命令切换到 Linuxbook
cd Linuxbook
ls > file2.txt
ls > file3.txt
ls > file4.txt
ls > unique1.txt

  1. 现在让我们创建一些虚拟文件;使用以下命令运行:
ls > file1.txt

  1. 现在输入 ls -la u,然后按 Tab。其余的文件名 "unique1.txt" 将出现。按 Enter

  2. 现在输入 ls -al file 并按 Tab。什么也不会发生,你的控制台可能会响起。再次按 Tab。现在所有 4 个文件名将出现。

  3. 添加一个 4,再次按 Tab,然后按 Enter。命令 ls -la file4 将运行。

这可能看起来复杂甚至笨拙,但如果你给它一个机会,你将很快成为专家。

shell 提示符

标准终端通常具有相当晦涩的命令行提示符。这应该通过修改 PS1 环境变量来更改。

如何做...

以下是一个示例:

如何做...

参考行 export PS1="\u \h \w $ "

  1. \u 命令表示显示此 shell 的当前用户。

  2. \h 命令显示此计算机的主机名。

  3. \w 命令表示显示当前目录的完整路径。强烈建议进行此更改,因为用户不必一直输入 pwd (Print Working Directory) 来了解正在使用的目录。

  4. $ 表示显示 $# 取决于有效的 UID。

还有更多...

还有许多其他选项,比如显示时间和日期,使用颜色等。要获取更多信息,请运行 man bash 并搜索 PS1

其他环境变量

PS1 变量只是成百上千个环境变量中的一个。别担心,你不必全部了解它们!以下是一些非常有用的变量:

  • PS1: 显示并设置命令行提示符

  • USER: 显示当前用户

  • HOSTNAME: 显示此计算机的当前主机名

  • HOME: 显示当前用户的主目录

  • SHELL: 显示此终端正在运行的当前 shell

  • TERM: 显示正在使用的终端类型

  • PATH: 显示并设置程序搜索的目录

  • PWD: 显示当前工作目录

  • EDITOR: 可以设置为所需文本编辑器的完整路径,以便与某些命令一起使用,如 crontab -e

  • TZ: 显示并设置时区变量

  • HISTSIZE: 显示并设置历史缓冲区的大小

其中大多数都是不言自明的;但有一些需要更多讨论。PATH 环境变量是在文件系统中搜索命令的地方。

echo 命令用于显示变量的内容:

其他环境变量

如何做...

  1. PATH 前加一个点意味着程序将首先在当前目录中查找,然后再搜索其余的路径。例如,在代码开发期间,这非常有用。通过运行以下命令来实现这一点:
export PATH=".:$PATH"

  1. EDITOR 变量可以设置为你喜欢的文本编辑器。大多数人使用 vi (或 vim);但是,你可以指向你想要的编辑器。如果更改了这个,请确保使用完整路径。要更改 EDITOR 变量,请执行以下操作:
export EDITOR=/lewis/bin64/kw

  1. export 可以通过将其设置为空来移除:
export EDITOR=

  1. 按照惯例,环境变量通常以大写字母编写。查看 man 手册和/或在 Google 上搜索有关这些变量的更多信息。

它是如何工作的...

把这些环境变量想象成你使用编程语言时的变量一样。在这种情况下,变量的类型由操作系统确定。例如,你可以输入 A=1A="This is a string"

操作系统知道区别。此外,还有变量范围。请注意,我上面没有使用 export。这意味着此 A 局部于此 shell。只有导出变量才能使其在其他 shell 中可用(在源文件后)。

使用别名

如果您可以轻松创建一个简单的命令而无需将其制作成脚本,那不是很好吗?好吧,有办法。这是使用别名完成的。

如何做...

以下是创建别名的步骤:

  1. 输入tput clear并按Enter。您的屏幕应该已经清空了。

  2. 现在输入alias cls="tput clear"。现在当您运行cls时,它将执行相同的操作。

  3. 让我们再创建一些。要显示长目录列表,请输入alias la="ls -la"。输入'la'来运行别名。

  4. 要显示最新文件的长列表,请输入'alias lt="ls -latr"'

如果您创建了一个别名,然后决定不再需要它,可以使用unalias命令将其删除,例如unalias cls

您还可以使用别名有效地在文件系统中移动。这非常方便,将为您节省大量的输入。以下是一些示例:

  1. mkdir /home/jklewis/linuxbook

  2. alias lbook="cd /home/jklewis/linuxbook"

  3. lbook

现在您将进入该目录。这是我在我的系统上经常使用的东西:

  1. export LBOOK="/home/jklewis/linuxbook"

  2. alias lbook="cd $LBOOK"

  3. lbook

如您所见,运行lbook将带您到如上所示的目录。但是,您也可以使用LBOOK变量将文件复制到该目录:

  1. cd /tmp

  2. touch f1.txt

  3. cp f1.txt $LBOOK

文件f1.txt现在将存在于/home/jklewis/linuxbook目录中。当使用非常长的文件名时,这将变得更加方便。

提示

要删除lbook别名,请运行unalias lbook

您可以通过只运行alias而不使用任何参数来列出您的别名。每当您发现自己不断输入相同的命令或文件名时,请考虑为其创建别名。

还有更多...

请注意,上述示例仅在该终端中有效,并且不会在重新启动后保留。请参阅下一节,了解如何使更改永久生效。

此外,在某些情况下,您想要做的可能对于别名来说太复杂了,例如,检查正确数量的参数。这就是您可以创建一个 shell 脚本的地方,这将在第八章中介绍,使用脚本

.bashrc 文件

我们可以查看和更改许多环境变量。但是,我们肯定不想每次启动新 shell 时都输入这些内容。有一个特殊的文件,名为.bashrc,用于存储您的设置。它位于用户的主目录中。例如,root 用户的.bashrc文件位于/root目录中。

以下是我其中一个系统的.bashrc文件:

.bashrc 文件

如何做...

行的描述如下:

  1. 要注释一行,请在其前面加上#符号。

  2. 要创建一个变量,请使用export标签。

  3. 要创建别名,请使用alias标签(如本章前面所示)。

  4. 允许控制语句;请参见前面屏幕截图中的if子句。

  5. 修改您的.bashrc文件后,请记得使用点运算符对其进行源操作,如下所示:

. .bashrc

处理文件名中的空格和特殊字符

Linux(和 Unix)文件系统最初并不是为处理文件名中的空格而设计的。这可能会导致许多问题,因为 shell 会将空格后的每个项目视为另一个文件或参数。解决方案是使用引号、反斜杠或Tab键。

以下各节假定用户尚未修改 Bash 内部字段分隔符(IFS)变量。

如何做...

请参阅以下屏幕截图。我故意创建了三个“坏”文件名:

如何做...

  1. 运行ls -la file with blanks.txt并注意错误。

  2. 现在再次运行它,但用引号括起文件名:ls -la "file with blanks.txt";现在它将正常工作。

  3. 输入ls -la file并按Tab。它会为您转义空格。

  4. 运行ls -la special>.txt。观察错误。

  5. 在使用以下命令之前加上引号:

ls -la "special>.txt"

  1. 现在尝试ls -la -startswithdash.txt,然后尝试用引号括起来。不起作用,对吧?

  2. 使用以下命令在文件名之前加上./操作符:

ls -la ./-starWtswithdash.txt

正如你所看到的,如果文件名中使用了特殊字符,这也可能是一个问题。仔细研究一下,它会变得清晰的。记住Tab键;它对几乎每种情况都非常有效。如果文件以破折号开头,使用./操作符。它表示引用当前目录中的文件。

还有...

空格和特殊字符的问题在脚本中更加严重。这将在第八章使用脚本中更详细地介绍。

理解$?变量

通常,当在 Linux 中运行命令时,它执行一个任务;它要么报告它做了什么,要么指示发生了错误。还会生成一个内部返回代码,并通过运行echo $?命令显示出来。请注意,这必须是在原始命令之后输入的下一个东西。

以下截图显示了echo $?

理解变量

如何做...

这是echo $?的一个快速示例:

  1. 运行以下命令:
ping -c 1 packt.com

  1. 它应该成功。运行以下命令:
echo $?

  1. 你应该得到一个0表示成功。

  2. 现在运行以下命令:

ping -c 1 phooey

提示

可能需要一两秒才能完成。

  1. 再次运行echo $?。它应该返回一个非零值表示失败。

它是如何工作的...

一般来说,返回值为零表示成功。非零返回表示发生了错误,在许多情况下,返回的代码表示了错误是什么。记住这一点,下次你输入一个命令,按Enter,并且没有任何东西发生时,就会得到 shell 提示符。

还有...

命令的maninfo页面通常包含一个条目,显示错误的含义。如果man页面缺少,可以查阅网页。

重定向和管道

假设你运行一个命令,比如route,并想将输出保存在一个文件中。重定向(>)操作符用于这个目的,而不是将输出发送到屏幕上。

如何做...

让我们尝试一些重定向:

  1. 输入ifconfig > file1.txt。你看不到任何东西,因为输出已经进入文件中。

  2. 运行cat file1.txt。现在你应该看到输出。

  3. 这也适用于另一个方向,要从文件中读取,运行以下命令:

sort < file1.txt

  1. 你甚至可以一步完成两个操作:
sort < file1.txt > output-file.txt

  1. 你还可以使用管道操作符将输出发送到另一个命令。例如,运行route | grep eth0。上面的命令将只显示包含短语eth0route行。

还有...

这是我经常使用的一个东西。假设我很久以前用 C 语言写了一个程序,有几个版本,并且想找到最新的版本。我可以运行locate来找到它们:

locate crc.c

这可能会返回很多行。我怎样才能对每个文件运行ls来找到最新的文件?通过将输出导入xargs命令,然后再运行ls

locate crc.c | xargs ls -la

现在将显示每个文件的时间和日期。

这一开始可能有点复杂,但如果你稍微尝试一下,它将成为你的第二天性。

从一个终端发送输出到另一个终端

这是 Linux/UNIX 系统独有的一个非常方便的功能。它在脚本中最有用,但也可以在命令行上使用。如果你有一个可用的系统,请尝试给定的步骤。

准备工作

你需要两个打开的终端。

如何做...

我们将在以下步骤中展示如何将一个终端的输出发送到另一个终端:

  1. 在一个终端中运行tty命令。输出应该是类似/dev/pts/16的东西。

  2. 在另一个终端中运行route命令。你将在那个终端中看到输出。

  3. 现在再次运行route,但现在使用命令:

route > /dev/pts/16

  1. 输出将进入另一个终端。

它是如何工作的...

Linux 系统上的终端是具有自己的缓冲空间的设备。通过名称引用设备,你可以向其写入。

还有...

这个功能在脚本中更有用,我们将在第八章中看到,使用脚本

使用 Screen 程序

Screen是一个全屏窗口管理器,与其他进程(通常是其他终端/ shell)共享物理终端。通常在没有其他管理器或桌面可用时使用,例如在服务器上。它具有滚动回退历史缓冲区,并且还允许在窗口之间复制和粘贴文本。

准备就绪

以下是一些 Screen 可用的许多键绑定的简要列表:

  • Ctrl + A + ?:它显示命令列表及其键绑定

  • Ctrl + A + C:它会弹出一个新窗口

  • Ctrl + A + D:它会分离一个窗口

  • Ctrl + A + N:它用于转到序列中的下一个窗口

  • Ctrl + A + P:它用于转到序列中的上一个窗口

  • Ctrl + A + #(其中#是一个数字):它用于直接转到该窗口

  • Ctrl + A + ":它显示窗口列表;用户可以通过数字选择任何一个

以下是一些经常使用的命令列表:

  • screen -list:它显示所有窗口

  • screen <program>:它创建一个新窗口并在其中运行该程序

如何做...

运行 Screen 实用程序的示例如下:

  1. 在终端中运行screen -L命令。

  2. 现在按下Ctrl + A,然后按C。这将创建另一个窗口。

  3. 再做两次。

  4. 尝试输入Ctrl + A + 0

  5. 尝试Ctrl + A + 3

它是如何工作的...

在上一节中,第 1 步将创建一个新窗口,“窗口 0”。如果您正在窗口管理器中运行,您可能会注意到标题更改,显示它是哪个窗口。

第 2 步将创建另一个窗口。完成第 3 步后,您将总共有 4 个窗口。

当您执行第 4 步中的操作时,您应该在窗口 0中。输入Ctrl + a + 3将带您到窗口 3

还有更多...

这是一个有用的提示,如果您只运行命令行而没有桌面,您可能希望在.bashrc文件中将您的PS1变量更改为以下内容:

export PS1="screen$WINDOW \h \u \w \$ "

现在提示将始终显示您在哪个窗口。

这仅描述了 Screen 可以做的一小部分。请参阅man页面以获取更多信息。

第二章:桌面

在本章中,我们将涵盖这些桌面环境:

  • GNOME 2

  • KDE 桌面

  • xfce

  • LXDE

  • Unity

  • Mate

介绍

计算机桌面通常由窗口,图标,目录/文件夹,工具栏和一些艺术品组成。窗口管理器处理用户看到的内容和执行的任务。桌面有时也被称为图形用户界面GUI)。

Linux 系统有许多不同的桌面可用。以下是一些较常见的桌面的概述。

GNOME 2

GNOME 2是由 Red Hat 公司主要开发的桌面环境和图形用户界面。它提供了一个非常强大和传统的桌面界面。有一个启动器菜单,可以更快地访问应用程序,还有任务栏(称为面板)。请注意,在大多数情况下,这些可以放置在用户希望的屏幕上。

运行在 Fedora 14 上的 GNOME 2 的截图如下:

GNOME 2

这显示了桌面,命令窗口和计算机文件夹。顶部和底部的“行”是面板。从顶部开始,从左到右依次是应用程序位置系统菜单。然后是一个屏幕保护程序,Firefox 浏览器,终端,Evolution和记事本。中间是锁屏应用程序,最右边是有关更新的通知,音量控制,Wi-Fi 强度,电池电量,日期/时间和当前用户。请注意,我已经定制了其中的一些,例如时钟。

准备就绪

如果您有一台运行 GNOME 2 桌面的计算机,可以在本节中跟着做。一种很好的方法是通过运行来自许多不同 Linux 发行版的 Live 镜像。

显示添加到面板窗口的截图如下:

准备就绪

如何做...

让我们稍微调整一下这个桌面:

  1. 通过在任务栏的空白位置上右键单击来打开此对话框。

  2. 添加一些酷的东西。向下滚动,直到看到天气报告,点击它,然后点击底部的添加按钮。

  3. 在面板上,您现在应该看到类似0°F的东西。右键单击它。

  4. 这将打开一个对话框,选择首选项

  5. 您现在在常规选项卡上。随意更改您想要的任何内容,然后选择位置选项卡,并输入您的信息。

  6. 完成后,关闭对话框。在我的系统上,正确的信息立即显示出来。

  7. 现在让我们添加更酷的东西。再次打开添加到面板对话框,这次添加工作区切换器

  8. 默认的工作区数量是两个,我建议添加两个。完成后,关闭对话框。

  9. 现在您会在屏幕右下角看到四个小方框。点击其中一个会带您到该工作区。这是 GNOME 2 非常方便的一个功能。

还有更多...

我发现 GNOME 2 非常直观和易于使用。它功能强大,可以进行广泛的定制。但是它也有一些缺点。它往往有些“沉重”,在性能较差的机器上可能表现不佳。它也不总是正确报告错误。例如,使用 Firefox 打开一个在您的系统上不存在的本地文件(即file:///tmp/LinuxBook.doc)。应该出现一个文件未找到对话框。现在尝试打开另一个本地文件,该文件存在,但您没有权限访问。它不会报告错误,实际上似乎什么也没做。如果发生这种情况,请记住这一点。

KDE 桌面

KDE桌面是为台式电脑和强大的笔记本电脑设计的。它允许进行广泛的定制,并且可以在许多不同的平台上使用。以下是一些其特点的描述。

准备就绪

如果您有一台运行 KDE 桌面的 Linux 机器,可以跟着做。这些截图来自运行 Fedora 18 的 Live Media 镜像上的 KDE。

最右边的桌面图标允许用户访问工具箱

准备就绪

你可以使用这个对话框添加面板、小部件、活动、快捷方式、锁定屏幕,以及更多。

底部的默认面板以 Fedora 图标开始。这个图标叫做Kickoff 应用程序启动器,允许用户快速访问某些项目。这些包括收藏夹应用程序、一个计算机文件夹、一个最近使用文件夹,以及一个离开按钮。

如果你点击下一个图标,它会带出活动管理器。在这里你可以创建活动并监视它们。下一个图标允许你选择当前在前台的桌面,接下来的项目是当前打开的窗口。最右边是剪贴板

这是剪贴板菜单的截图:

准备工作

接下来是音量控制、设备通知器和网络状态。

这是接口连接对话框的截图:

准备工作

最后,有一个按钮可以显示隐藏的图标和时间。

如何做...

让我们向这个桌面添加一些东西:

  1. 我们应该添加一个控制台。在桌面的空白处右键单击。会出现一个对话框,选择Konsole。现在你应该有一个终端了。

  2. 通过点击空白处关闭该对话框。

  3. 现在让我们添加一些更多的桌面。右键单击屏幕左下角的第三个图标。会出现一个对话框,点击添加虚拟桌面。我个人喜欢有四个这样的桌面。

  4. 现在让我们向面板添加一些东西。在面板的空白处右键单击,将鼠标悬停在面板选项上;点击添加小部件

  5. 你会看到一些小部件。注意列表可以滚动查看更多内容。例如,滚动到网页浏览器,然后双击它。

  6. 网页浏览器图标会出现在靠近时间的面板上。

还有更多...

显然你可以使用 KDE 桌面进行相当多的自定义。我建议尝试所有不同的选项,看看哪些是你最喜欢的。

KDE 实际上是一个由开源开发者组成的大社区,KDE Plasma 桌面是其中的一部分。这个桌面可能是被审查的桌面中最重的,但也是最强大的之一。我认为这是需要一个非常精心设计的桌面环境的人的一个不错选择。

xfce

xfce 是 Linux 和 UNIX 系统的另一个桌面环境。它倾向于运行得非常流畅,不使用太多系统资源。它非常直观和用户友好。

准备工作

以下是我正在用来写这本书的 Linux 机器上运行的 xfce 的截图:

准备工作

如果你有一台运行 xfce 桌面的机器,你可以执行这些操作。我建议从 Fedora 网页下载一个实时媒体镜像。

虽然与 GNOME 2 有些相似,但布局有些不同。从顶部的面板(面板 1)开始是应用程序菜单,然后是注销对话框。接下来是当前打开的窗口。点击其中一个将根据其当前状态将其带上或最小化。下一个项目是工作区,我有四个,然后是互联网状态。最后是音量和混音应用程序以及日期和时间。屏幕内容大部分都是不言自明的;我有三个终端窗口打开和文件管理器文件夹。

屏幕底部的较小面板称为面板 2

如何做...

让我们稍微调整一下面板:

  1. 为了改变面板 2,我们必须先解锁它。右键单击顶部面板,然后转到面板 | 面板首选项

  2. 使用箭头来切换到面板 2。查看下面的截图:如何做...

  3. 你可以看到它被锁定了。点击锁定面板来解锁它,然后关闭这个对话框。

  4. 现在转到面板 2(在底部),右键单击其中一个侧边。点击添加新项目...

  5. 添加你想要的应用程序。

还有更多...

这绝不是 xfce 可以做的详尽列表。这些功能是模块化的,可以根据需要添加。有关更多信息,请参阅www.xfce.org

LXDE

LXDE轻量级 X11 桌面环境)旨在在资源条件较低的情况下良好运行,是一个相对较新的环境。与大多数其他桌面环境不同,LXDE 的组件没有太多依赖性,可以独立运行。

准备就绪

如果您有一台使用此桌面的计算机,可以按照本节进行操作。

这是 Fedora 18 Live Media 镜像上运行的 LXDE 的屏幕截图:

准备就绪

正如你所看到的,有两个终端打开和文件管理器。在面板的左侧是一个熟悉的 Fedora 图标,刚刚被点击了。它弹出了下拉菜单。接下来的图标是文件管理器,然后是一个 LXTerminal。

下一个图标上写着“左键点击图标化所有窗口。中键点击使其变暗”。我选择保持这个图标不变。

接下来是两个桌面图标,然后是事件列表。更远的右边是一个 Wi-Fi 图标(Wi-Fi 未激活),有线以太网状态,系统监视器,音量控制和网络管理器小程序。之后是剪贴板管理器,时间,锁屏图标和注销框。

如何做...

让我们稍微使用一下这个桌面:

  1. 右键单击面板的空白处,将显示一个下拉菜单。

  2. 点击面板设置。将弹出以下屏幕:如何做...

  3. 让我们改变字体大小。点击外观,然后点击字体下的大小

  4. 使用滚动键更改值为其他内容。更改将立即显示。当看起来不错时,选择关闭

  5. 让我们添加一个应用程序。再次打开面板设置,然后点击添加/删除面板项目

  6. 点击添加,向下滚动并点击桌面编号/工作区名称。当前工作区的名称将显示在面板的最右侧。我个人非常喜欢这个功能。

还有更多...

我发现 LXDE 非常直观和快速。我相信它会在笔记本电脑和移动设备上表现良好,特别是在功耗有限的情况下。

Unity

Unity是一个用于 Ubuntu 系统的 GNOME 环境的外壳界面。它旨在在小屏幕上表现良好,例如,它使用垂直应用切换器。与其他桌面/管理器不同,它本身不是一组可执行文件,而是使用现有的应用程序。

准备就绪

如果您有一台运行 Unity 桌面的计算机,可以按照本节进行操作。

以下是 Ubuntu 12.04 上运行的 Unity 的屏幕截图:

准备就绪

在桌面上是一个 GNOME 终端会话和主文件夹。从左侧的垂直面板开始,是 Dash Home 图标。它允许用户快速找到东西。在下面是主文件夹(已经打开),然后是 Firefox 网络浏览器。接下来是 Libre Office Writer,计算器和 Impress。接下来是 Ubuntu 软件中心,用于搜索和购买应用程序。接下来的图标是 Ubuntu One,终端,系统设置,工作区切换器和垃圾箱。

为了完成对顶部面板的讨论,最右边是 Evolution 的图标。接下来是电池状态图标,网络状态(有线和无线),以及音量控制。剩下的图标是时间,切换用户帐户图标和注销按钮。

有趣的是,默认情况下,此客户端桌面上并没有终端。

如何做...

让我们向这个桌面添加一个终端:

  1. 打开主文件夹,然后点击文件系统

  2. 双击usr文件夹,然后双击bin文件夹。

  3. 点击搜索打开对话框。

  4. 输入gnome-terminal并按Enter

  5. 双击gnome-terminal图标。

  6. 它将在屏幕上打开,您还会在左侧面板上看到它作为一个图标。

  7. 右键单击此图标,然后选择锁定到启动器。现在您有一个终端图标。

Unity 上的顶部面板与其他桌面的工作方式略有不同。尝试给定的步骤:

  1. 打开主文件夹

  2. 如果您还没有这样做,请打开终端。

  3. 现在,在主文件夹的某个地方单击。主文件夹的文本将显示在面板上。

  4. 现在单击终端。现在出现了终端文本。面板上列出的菜单项始终对应于具有焦点的窗口或应用程序。

操作步骤...

还有更多...

我发现 Unity 与其他桌面非常不同。起初有点困难,但像其他一切一样,随着时间的推移会变得更好。我相信这个桌面将受到那些没有太多 Linux/UNIX 系统经验的用户的欢迎。

Mate

Mate桌面是为了给用户一个类似于 GNOME 2 的更具生产力的环境。我目前在我的笔记本电脑上使用 Mate 运行 Fedora 19,一切都很顺利。请注意,我下载了 F19 安装 DVD,并在安装过程中选择了 Mate。

入门指南

您可以使用 Fedora 网站上的 Live Image 或完整安装 DVD 来按照这些步骤进行操作,无论您喜欢哪种方式。

以下是 Fedora 19 上 Mate 的屏幕截图:

入门指南

您可以看到我已经打开了两个终端。左上角是应用程序下拉菜单,允许您浏览和运行已安装的应用程序。接下来是位置,允许您访问文档、文件夹和网络位置。接下来是系统,您可以在这里更改桌面外观和行为,获取帮助或注销。图标是 Caja,一个文件管理器,然后是一个终端。是的,Mate 的人们足够聪明,已经默认包含了一个。接下来的图标是 Firefox,一个邮件应用程序和一个即时通讯应用程序。我添加了锁定屏幕图标,它在中间。右边是音量,然后是 Wi-Fi 信号,电池状态和日期(我稍微自定义了一下)。

左下角是一个图标,允许您隐藏所有窗口并显示桌面。最后,在最右边是四个工作区。

操作步骤...

让我们在这个桌面上做一些改变:

  1. 首先让我们添加锁定屏幕应用程序。在顶部面板的中间右键单击。

  2. 单击添加到面板...

  3. 单击锁定屏幕并按照说明操作。关闭对话框。

  4. 现在让我们来处理时间和日期。单击它,您会注意到显示了一个日历。

  5. 再次单击时间和日期以关闭日历,然后右键单击它。单击首选项选项卡。

  6. 应该显示时钟首选项窗口。在这里,您可以更改时间和日期的显示方式。我单击了显示秒,因为我喜欢看到完整的时间。

  7. 关闭对话框。

还有更多...

正如您所看到的,Mate的工作方式非常类似于GNOME 2。它非常直观和易于使用。设计师们在创建这个桌面时做得很好。

第三章:文件和目录

在本章中,我们将涵盖:

  • 复制、删除和更新文件和目录

  • 使用 find 和 locate 查找文件

  • 创建文本文件 - vim、Emacs 等

  • 使用文件命令

  • 使用 grep 查找模式

  • 使用 ZIP 和 TAR 压缩文件

  • 其他有用的命令,如 stat、sum、touch 等

介绍

您可以将 Linux 文件系统中的所有内容视为字节流。这简单地称为文件。目录也是一个包含其他文件的文件。大多数文件位于计算机的硬盘上。但是,有些文件位于内存中,例如/proc/sys实际上是虚拟文件系统。文件也可以存储在可移动介质上,例如 USB 设备、CD/DVD 和其他机器上(即 NFS 挂载)。

理解 inode 和超级块

文件系统中的每个文件都有一个称为inode的特殊编号。inode 是操作系统存储文件属性的地方,并包含以下信息:

  • 文件类型,如常规、目录、特殊、链接、套接字、管道或块设备

  • 所有者和组信息

  • 文件的权限(更多信息请参见第五章,权限、访问和安全性

  • 文件创建的日期和时间以及最后更改或读取的时间

  • 文件大小

  • inode 还包含一些其他信息

在 inode 中不可用的内容是文件本身的完整路径和名称。这些信息存储在/proc文件系统下的进程 ID(PID)拥有文件的进程下。

超级块是将文件系统上的所有 inode 联系在一起的东西。它包含管理文件所需的所有信息。对于系统非常重要,大多数 Linux 文件系统都定期备份超级块的副本,同时也保留在内存中。

dumpe2fs命令可用于显示超级块的内容。以下是在 Fedora 17 上使用dumpe2fs的屏幕截图:

理解 inode 和超级块

这显示了这个硬盘上第一个分区的超级块信息。

复制、删除和更新文件和目录

在本节中,我们将简要探讨如何复制、删除和更新文件。

准备好

有几本关于文件系统管理的书已经出版,因此这将作为一个简要概述。如果您有一台 Linux 机器可用,可以尝试这些命令。我们将在/tmp文件系统中进行所有操作,因此您不必担心在系统上搞砸任何东西。

如何做...

以下是创建一些文件和目录的方法:

  1. 转到/tmp目录:
cd /tmp

  1. 创建一个测试目录:
mkdir lbooktest3

  1. 转到目录:
cd lbooktest3

  1. 让我们创建一些文件:
ls > f1; ls > f2; ls > f3

  1. 还要创建一些目录:
mkdir dir1 dir2 dir3

  1. 复制的语法是cp 源文件目标文件,现在运行cp f1 f5。这将创建文件f5,它是文件f1的副本。

  2. 您可以复制到一个目录:

cp f1 dir1

  1. 上面是相对路径,因为它从当前目录开始。要使用绝对路径,请执行以下操作:
cp f1 /tmp/lbooktest3/dir1

  1. 现在让我们从当前目录中删除文件f3
rm f3

  1. 让我们将文件f2移动到dir2
mv f2 dir2

  1. mv命令也用于重命名文件。将f1重命名为f6
mv f1 f6

  1. 要查看此目录的文本模式图形表示,请运行以下命令:
tree

  1. 清理我们刚刚做的一切是可选的,cd /tmp然后运行:
rm -r lbooktest3

以下是上述命令的屏幕截图:

如何做...

还有更多...

可以将文件从计算机上的另一个位置复制到当前目录。这是使用点运算符执行的:

 cp /tmp/somefile 

您不必首先cd到目录。您可以执行以下命令:

 cp /bin/bash /tmp

这非常方便,特别是在配置机器时。

那么如果你将一个文件复制到已经存在的文件会发生什么呢?假设你有适当的权限,被复制的文件会覆盖另一个文件。此外,在 Linux 系统上使用rm时要小心,因为很难恢复已删除的文件。

使用 find 和 locate 查找文件

find命令通常用于从当前目录开始搜索文件。locate命令使用updatedb数据库在整个系统(有一些例外)中查找文件或目录。

如何做...

让我们使用findlocate来查找一些常见的 Linux 文件:

  1. 首先将目录更改为/usr
cd /usr

  1. 运行以下命令:
find -name bash

  1. 现在尝试使用通配符:
find -name bash*

  1. 它也会找到目录:
find -name bin

现在假设我们想要查找一个文件,但实际上不知道它可能在系统的哪个位置。find命令有时也很慢,因为它必须从当前点搜索文件系统。这就是locate非常方便的地方。

  1. 在这个例子中,你可以在任何目录中。运行以下命令:
locate gnome-terminal

  1. 现在尝试命令:
locate vim

  1. 看看这有多快?现在尝试:
locate ifconfig

  1. 要忽略大小写,请执行:
locate -i sudo

还有更多...

find命令有 100 多个参数;请参考 man 页面获取更多信息。

locate命令使用数据库来存储文件的位置。这个数据库通常会在每天晚上由一个 cron 作业自动重新创建。如果你想立即刷新数据库,请运行updatedb命令。请注意,在大型文件系统和/或慢速计算机上可能需要一段时间。

创建文本文件 - vim,Emacs 和其他编辑器

大多数用户可能熟悉基于 GUI 的文字处理程序。例如,我正在使用 LibreOffice Writer 来撰写这本书。但是,你也可以使用命令行来编辑文件。我们中的一些人甚至更喜欢这样做。

准备好

假设读者可以访问带有各种文本编辑器的 Linux 机器。我们将从vim开始,这是每个 Linux/Unix 系统上都有的文本编辑器。如果你的系统上没有Emacs,请尝试使用yum install emacsapt-get install emacs进行安装。

如何做...

以下是使用vi命令创建和编辑文本文件的方法:

  1. 让我们去tmp目录。运行以下命令:
cd /tmp

  1. 现在运行:
vim lbookfile1.txt

  1. 你的终端应该已经清空,vim 正在其中运行。Vim 是无模式的,所以总是必须告诉它要处于什么模式。按A键。

  2. 现在 Vim 应该处于插入模式。你可能会在屏幕底部看到类似-- INSERT --的东西。现在输入一些字符。

  3. 正常的光标控制键应该是有效的。编辑完成后,按Esc键退出插入模式。

  4. 要进入命令模式,请按冒号键,然后输入任何字母。例如,要保存文件,请输入:w

  5. 要保存文件然后退出 vim,请按Esc,然后输入:wq

以下是 vim 编辑 Java 文件的屏幕截图:

如何做...

现在让我们来看看 Emacs 编辑器:

  1. 切换到/tmp目录:
cd /tmp

  1. 要以文本模式启动 Emacs,请按:
 emacs -nw lbooktest3.txt

  1. 它将以编辑模式启动。输入几行

  2. 要保存文件,请按Ctrl + C,然后按Ctrl + S

  3. 标准光标键应该可以让你在屏幕上移动;试试看。

  4. Ctrl+H+?打开帮助窗口。

  5. 要返回到原始屏幕,按Ctrl+X+1

  6. 要关闭 Emacs 会话,请按Ctrl + X,然后按Ctrl + C

以下是 Emacs 编辑 Java 文件的屏幕截图:

如何做...

还有更多...

Vim 和 Emacs 是非常强大的编辑器。它们通常被程序员用来编写代码,系统管理员用来维护 shell 脚本。要获取更多信息,请参考 man 和/或 info 页面,或者它们的网站。

作为奖励,这是我个人编写的文本编辑器的图片:

还有更多...

这是 20 年前在 DOS 下用 C 语言编写的。我现在已经在 20 多个不同的平台上编译和运行了它。

使用 file 命令

我们上面讨论了文本文件。一般来说,人类可以很容易地阅读和编辑文本文件。二进制文件是不同的,它是(宽泛地说)计算机“读取”的内容。例如,当您运行vim filename1.txt这样的命令时,vim 是一个二进制文件,filename1.txt是一个文本文件。

如何做...

以下是运行 Linux file命令的示例:

  1. 将目录更改为/tmp,与往常一样:
cd /tmp

  1. 让我们创建一个文本文件:
ls > temp1.txt

  1. 它是什么类型的文件?运行以下命令:
file temp1.txt

  1. 正如您所看到的,file命令可以告诉我们某个文件是什么类型。

  2. 现在运行以下命令:

file /bin/bash

  1. 所有这些信息都意味着它是一个二进制文件。它还显示了 bash 是为哪个平台编写的,以及其他一些信息。

  2. 尝试在系统上运行文件以了解那里有什么。

提示

您必须具有适当的权限才能运行file命令,因为它必须对文件执行打开操作。

还有更多...

我们提到了编辑文本文件。如果您真的知道自己在做什么,二进制文件也可以编辑。有时在低级工作中,例如在设备驱动程序上工作时,这是必要的。二进制编辑器可能看起来像以下的截图:

还有更多...

提示

哦不,我已经编辑了一个文件,但现在无法保存它!

偶尔,您可能会陷入一个看似无望的文本编辑情况。您已经花了一些时间更改一个文件,但现在无法保存它。错误通常是“权限被拒绝”。通常有两件事可能会导致这种情况;您无法写入文件所在的目录,或者文件已经存在但没有适当的可写权限。如果程序允许,保存您的工作的最佳方法是将文件简单地写入其他地方,例如/tmp

这是一个相当简单的例子,但它传达了这个想法。我希望第一次发生这种情况时我已经知道这个程序。

如何做...

以下是在出现权限错误时保存文件的方法:

  1. 作为普通用户(而不是 root)转到/usr目录:
cd /usr

  1. 现在运行以下命令:
vim lbookfake1.txt

  1. 它应该像平常一样打开一个空文件。按A,然后输入一些文本。

  2. 现在按Esc,然后输入:w

  3. 它应该显示一个写入错误,所以将文件保存到/tmp

:w /tmp/lbookfake1.txt

  1. 那应该成功。然后您可以采取措施来纠正真正的问题(也就是说,不要在不应该编辑文件的地方编辑文件!)。

使用 grep 查找模式

处理文件时,能够在文本中搜索模式是很方便的。这在代码开发中经常使用。这里我们展示如何使用grep

准备工作

我们将使用dmesg程序来显示有关运行内核的信息。如果它不可用,或者如果您的计算机已经运行了很长时间,那么以下内容可能不会完全匹配您的系统。

如何做...

以下是使用grep的示例:

  1. 运行以下命令:
cd /tmp

  1. 使用dmesg创建一个文件,这样我们就可以搜索一些关于您的系统的信息:
dmesg > dmesg1.txt

  1. 让我们看看能否确定正在使用哪个网络设备。运行:
grep network dmesg1.txt

  1. 输出可能不是很有信息性。但如果大小写有问题怎么办?尝试以下命令:
grep -i network dmesg1.txt

  1. -i告诉grep忽略大小写。现在您应该看到您的系统正在使用哪个网络驱动程序。现在尝试以下命令:
grep -i cdrom dmesg1.txt

  1. grep返回一个基于搜索结果的代码。再次运行上面的命令(记住上箭头快捷键吗?):
grep -i cdrom dmesg1.txt

  1. 现在运行以下命令:
echo $?

  1. 假设找到了文本,返回代码将为0。现在搜索一个不应该存在的字符串:
grep -i jimlewis dmesg1.txt

  1. 运行以下命令:
echo $?

  1. 返回代码不应为0

提示

这可能看起来有点反常,0 表示成功,非零表示失败。这对许多 Linux 命令都是常见的,因为在许多情况下返回的数字是错误代码。

还有更多...

grep程序可以以令人难以置信的多种方式进行搜索。您还可以指定非常复杂的模式。有关更多信息,请参阅 man 页面。此外,我们将在第八章中再次讨论grep的返回代码,使用脚本

使用 ZIP 和 TAR 压缩文件

毫无疑问,Linux 系统有大量的文件。一个典型的代码开发项目可能有 1000 多个文件,分布在几个目录中。我们如何备份所有这些东西?

答案是文件打包和压缩。这里我们将展示两个最喜欢的,ZIPTAR

准备工作

大多数 Linux 系统都有 ZIP 和 TAR,因此可以假定它们已经在您的系统上可用。

如何做...

在这里,我们将尝试zipunzip命令:

  1. 运行以下命令:
cd /tmp

  1. 让我们创建一个临时目录:
mkdir lbooktemp

  1. 运行以下命令:
cd lbooktemp

  1. 现在让我们创建一些文件:
ls > f1.txt; route > f2.txt; dmesg > f3.txt

  1. 然后,创建一些更多的文件:
ifconfig > ifconfig.dat; dmesg > dmesg.dat

  1. 让我们将前面的文件打包和压缩成一个文件:
zip lbook1.zip f1.txt f2.txt f3.txt

  1. 正如您所看到的,ZIP 的语法是“zip zipped-file files-to-zip”。我们也可以在上面使用通配符:
zip lbook1.zip *.txt

  1. 现在让我们包括其他文件:
zip lbook1.zip *.txt *.dat

  1. unzip 程序用于从压缩文件(也称为存档)中提取文件。使用以下命令创建另一个目录:
mkdir test

  1. 运行以下命令:
cp lbook1.zip test

  1. 运行以下命令:
cd test

  1. 现在解压文件:
unzip lbook1.zip

  1. 执行ls -la命令。您应该像以前一样看到文件。

  2. 您还可以查看 ZIP 文件的内容,而无需提取任何内容,只需运行以下命令:

unzip -l zipped-file

当只有少量文件时,或者当我将它们发送给运行非 Linux 操作系统的人时,我使用 ZIP。虽然 ZIP 可以用于跨目录,但通常无法很好地处理一些 Linux 文件。Tar 是一个更好的选择:

  1. 我们可以使用与之前相同的文件:cd /tmp/lbooktemp

  2. 运行tar cvzf lbook1.tar.gz *.txt。这将创建一个 gzip 压缩的存档文件。

  3. 现在运行file lbook1.tar.gz。它应该显示类似以下的输出:

lbook1.tar.gz: POSIX tar archive (GNU)

  1. 要提取,首先将其复制到测试目录:
cp lbook1.tar.gz test

  1. 运行以下命令:
cd test

  1. 运行以下命令:
tar xvzf lbook1.tar.gz

  1. 执行ls -la命令。您应该再次看到文件。

  2. 要查看 tar 存档,请使用t(用于告诉)选项:

tar tvzf lbook1.tar.gz

  1. 现在让我们将整个目录打包成 TAR:
cd /tmp

  1. 运行以下命令:
tar cvzf lbooktemp1.tar.gz lbooktemp

  1. 这将获取整个目录,甚至包括任何隐藏文件。

以下是zip命令的屏幕截图:

如何做...

还有更多...

ZIP 和 TAR 在系统管理中经常用于备份所有内容。需要注意的是,“打包”系统,将该文件复制到另一台机器,并“解包”文件是克隆一个盒子的好方法(我经常使用这个)。

稍后,当我们在第九章中讨论 crontab 时,使用 Cron 自动化任务,我将展示如何使用 TAR 每晚备份我的系统。

其他有用的命令,如 stat、sum、touch 等

Linux 中有许多处理文件的命令。在本节中,我展示了如何使用其中一些。

如何做...

以下是我经常使用的一些命令:

  1. 运行以下命令:
cd /tmp

  1. 创建一个文件:
dmesg > file1.txt

  1. 现在运行ls -la并记住信息。我们稍后会用到这个。

  2. 使用stat命令可以查看关于文件的几乎所有你想知道的信息:

stat file1.txt

  1. 现在假设您已将该文件发送给正在运行 Linux 系统的人,并希望确保它在传输过程中没有损坏。运行以下命令:
sum file1.txt

  1. 第一个数字是校验和,第二个是该文件的块数。如果其他人在他的文件副本上运行sum并看到相同的信息,那么这些文件是相同的。

提示

文件名不必匹配。

  1. 我们通过使用重定向运算符创建了许多文件。您还可以使用 touch 命令:
touch file2.txt

  1. 由于file2.txt之前不存在,touch 将创建一个空文件。事实上,让我们证明一下:
file file2.txt

  1. 那么,如果我们在现有文件上运行 touch 会发生什么?它会清空它吗?不会,它会更新文件的时间和日期。运行以下命令:
ls -la file1.txt

  1. 现在运行以下命令:
touch file1.txt

  1. 再次运行ls -la。你应该注意到它现在显示了该文件的当前日期和时间。

  2. 假设你只想查看一个文本文件。运行以下命令:

less file1.txt

  1. 使用less命令时按空格键向下滚动。按Q退出。

  2. 假设我们只想看到该文件的前几行:

head file1.txt

  1. head命令默认显示前 10 行。那么最后 10 行呢?运行以下命令:
tail file1.txt

还有更多...

正如我之前所说,有许多其他处理文件的命令。而且,我提到的命令只是它们所能做的冰山一角。如常,查阅 man 手册以获取更多信息。

第四章:网络和互联网

在本章中,我们将涵盖:

  • 故障排除不良连接

  • 将文件复制到另一台机器-FTP 和 SCP

  • 登录到另一台机器- Telnet 和安全外壳

  • 获取网页而不使用浏览器-wget

  • 浏览网页-Firefox

  • 电子邮件-使用网络邮件程序

  • 运行您自己的 Web 服务器-httpd

  • 谁在使用那个端口?/etc/services 文件

  • IPv4 与 IPv6

介绍

在今天的世界中,“上网”至关重要。在这里,我们将解释连接性以及在它不起作用时该怎么办。但首先,我们将解释有线连接与无线连接的优缺点。

典型的有线以太网连接速度快且可靠。通常不会遭受中断或丢包。像 Cat 5E 或 Cat 6 这样的优质电线可以在数英尺范围内运行而不会丢失信号。

无线连接使您可以自由地使用,嗯,首先不需要有线。当正确配置时,它可以轻松使用并且非常可靠。

有线连接具有以下优点:

  • 有线连接通常比无线连接快

  • 总的来说,它更可靠

  • 它不会遭受周期性的中断或丢包

  • 更容易配置和故障排除

有线连接具有以下缺点:

  • 我们需要使用电线;在计算机实验室环境中重新排列或更改可能非常困难

  • 我们需要有人设计和物理连接网络

  • 在使用具有多个以太网端口的大型服务器时可能会令人困惑

无线连接具有以下优点:

  • 它很方便;我们不必处理电线

  • 在某些情况下,它可以离基础路由器相当远

  • 它很容易设置为访客访问

无线连接具有以下缺点:

  • 它并不总是可靠的。丢包比有线连接频繁得多。

  • 它可能很难设置,特别是第一次。

  • 我们必须处理密码和加密以防止未经授权的访问。

故障排除不良连接

这似乎偶尔会发生,并且发生在最糟糕的时候。这是我通常采取的诊断和解决有线连接问题的步骤。假设连接在过去的某个时候正常工作。

准备就绪

对于这个例子,没有特殊的设置,除非您碰巧在某个地方有一台坏掉的机器。您可以在不担心损坏良好系统的情况下运行大多数这些命令。

如何做...

在诊断网络问题时,请尝试以下步骤:

  1. 首先,让我们通过 ping 一个已知的外部地址来确保连接确实中断了。我使用 Road Runner 作为我的 ISP,所以对我来说,命令将是:
ping rr.com

  1. 应该出现类似于这样的东西:如何做...

  2. Ctrl + C停止输出。如果命令行显示超时,或者显示关于没有主机或错误路由的内容,则连接确实中断了。让我们尝试修复它。

  3. 找到您的网关地址。运行route命令;您的网关应该显示在输出的顶部。请注意,route命令花费很长时间才能完成也是连接中断的迹象。

  4. Ping 上面route提供的网关。如果 ping 成功,则问题很可能出在路由器或 ISP 本身。

  5. 如果不能得到良好的 ping,请尝试这个。如果您已经知道接口名称,请跳到下一步。如果不知道,请使用ifconfig命令找到。查找一个类似eth0p3p2的段落。

  6. 在接口上运行ethtool命令。在我的情况下是ethtool eth0。看看最后一行;它应该说:

Link detected:   yes

  1. 如果不行,问题可能是电线。如果您的端口有 LED,请查看它们是否亮着。其中一个应该不时地闪烁。尝试摇动电线。当然,如果您有一根已知良好的电线,请尝试更换它。请注意,“已知良好的电线”不一定意味着刚从包装中拿出来的电线。有一次就被这样的电线坑过。

  2. 如果电线看起来没问题,让我们深入一点。确保在上面的步骤中,你使用了正确的接口。在这一点上,你可能只想阅读这些步骤,而不是运行命令,因为它们会让你的网络断开。

  3. 尝试运行ifdown <interface>命令。你可能看不到任何输出。

  4. 现在运行ifup <interface>命令。可能需要几秒钟,然后你应该会看到一些输出。如果你正在使用 DHCP,你应该会看到连接正在建立。当你收到提示时,再试一次 ping。

  5. 我会假设如果你还在阅读,ping失败了,连接仍然断开。你的路由器和/或调制解调器可能已经卡住了。尝试关闭它们,等大约一分钟,然后再打开它们。

  6. 等待网络稳定后再次尝试ping。如果仍然无法连接,继续下一步。

  7. 尽管我讨厌这个解决方案,但在这一点上,我建议进行冷关机。关闭除一个终端之外的所有内容,然后运行以下命令:

shutdown -h now

  1. 我喜欢在重新启动之前等几分钟,只是为了确保内存实际上已经清空。好的,现在重新打开它,等待它完全启动。

  2. 再试一次ping命令。如果现在可以工作,我会怀疑是某种瞬态错误或问题。如果它继续工作,那太好了。但是,如果再次失败,我会怀疑硬件可能出了问题。

  3. 如果重新启动后ping命令仍然失败,我会尝试启动一个 Live Media 镜像。如果这样可以并且能上网,那么你的基本系统文件可能出了问题。如果不行,我会再次怀疑硬件。

  4. 最后一件事;确保没有人对你的 DHCP 服务器进行了任何更改。配置错误的服务器可能会导致各种糟糕的事情发生,比如无法连接。

还有更多...

希望这一部分对你有用。这些步骤在过去无数次对我有用。我还想建议你查看你的/var/log/messages文件(和/或dmesg)。它可能会解释为什么连接失败。

注意

使用 IP 地址、子网、域名等进行工作

这将作为对 IP 地址、子网和域的简要概述。理解这些信息将有助于你阅读本书的后续部分。

IP 地址一般是在网络上区分一台计算机与另一台计算机的东西。它是一组数字,比如66.69.172.30。在家庭网络中,由于NAT网络地址转换)最有可能被使用,你可能更熟悉本地地址,比如192.168.1.115

以下是术语的快速列表:

  • IP 地址:这台机器的互联网协议地址,例如192.168.1.115

  • 子网:第三个八位组(或数字组)是子网。例如,192.168.1.115192.168.1.120在同一个子网上。但是,192.168.2.115不在。

  • :域通常由主机名表示,比如rr.com。它也有一个数字 IP。使用ping命令来确定主机名使用的 IP。

将文件复制到另一台机器 - FTP 和 SCP

除了电子邮件,将文件复制到另一台机器的两种最常见的方法是FTP文件传输协议)和SCP安全复制)。在这里我们将讨论两者。

FTP 已经存在很多年了,今天仍然被广泛使用。然而,标准 FTP 确实有一个严重的缺点。数据是以所谓的“明文”发送的。这意味着在适当的条件下,一个有知识的人可以获取数据。我们稍后会谈论这个问题。

准备工作

我们假设 FTP 服务器已经设置好,并且可以用于这个练习。通常情况下,你会从一台机器(客户端)使用ftp命令到另一台机器(服务器)。然而,在这个例子中,我只使用了一台机器。开始 FTP 会话的命令是ftp 服务器名称,其中服务器名称可以是你网络上已知的主机名,或者是一个数字 IP 地址。在这个例子中,我在/tmp中创建了一个名为f1.txt的文件,以及在/home/jklewis中创建了一个名为f5.txt的文件。

大多数 Linux 发行版已经设置好允许使用scp命令,这非常方便。我们假设你的发行版允许这样做。请注意,有些发行版不允许 root 访问,所以我们将使用一个访客账户。

SCP 的语法包括给定的命令。

复制到一台机器:

scp local-filename username@hostname:/directory

从一台机器复制:

scp username@hostname:/directory/filename 

(不要忘记上面的冒号。)

以下是 Fedora 18 上 FTP 帮助屏幕的截图:

准备就绪

如何做…

以下是如何使用ftp命令:

  1. 在客户端的终端会话中,运行以下命令:
ftp 192.168.1.115

  1. 它应该会出现一个提示。输入用户名并按Enter

  2. 输入密码并按Enter

  3. 它应该显示类似登录成功的内容。如果没有,那么你没有登录,尽管仍会有一个 FTP 提示。假设它已登录,运行以下命令:

ls -la

  1. 你应该会看到一个文件列表。运行help来显示命令列表。它们可能并不都在你的系统上可用(我认为这是一个错误)。

  2. 在使用ftp时要记住的一件事是随时知道自己在哪里。很容易混淆。经常使用pwd。现在运行它:

pwd

  1. 你输入的命令是在服务器上。要在本地运行命令,请在前面加上感叹号。尝试这些命令:
!pwd, !ls

  1. 所以,让我们真正做点什么。通过运行以下命令将你的本地目录更改为/tmp
lcd /tmp

  1. 运行!ls命令。现在让我们将文件f1.txt复制到服务器上:
put f1.txt

  1. 现在让我们从服务器检索文件f5.txt
get f5.txt

  1. 这一开始可能会有点混乱。那是因为它确实如此。然而,如果你经常使用它,它会变得更容易。记住,你把它放到服务器上,然后从服务器上取回来。

  2. 当你完成 FTP 会话时,运行以下命令:

quit

  1. 现在让我们运行一些scp命令,开始吧:
cd /tmp

  1. 通过运行以下命令创建一个测试文件:
ls > f1.txt

  1. 运行以下命令:
scp f1.txt guest1@192.168.1.115:/temp

  1. 输入用户guest的密码。

  2. 假设文件f5.txt在远程/temp上,要获取它运行:

scp guest1@192.168.1.115:/temp/f5.txt

  1. 不要忘记上面的冒号。运行ls -la看看情况如何。

还有更多…

我提到 FTP 以明文发送其数据。安全外壳命令(在下一节中详细介绍)使用加密,因此安全性不是问题。此外,可以设置一台机器,使得不需要密码。有关更多信息,请参阅ssh-keygen命令。这个主题也在附录 A 中有所涉及,Linux 最佳实践。例如,要配置sshd以更改 root 登录的工作方式,请参阅sshd_config文件。

登录到另一台机器——Telnet 和安全外壳

Telnet 是一个较老的协议,但今天仍然被广泛使用。它和 FTP 一样存在安全问题,因为它以非加密格式发送文本。然而,在受到良好防火墙保护的实验室环境中仍然很有用。

准备就绪

我将再次使用同一台机器作为客户端和服务器。在这个例子中,我们将假设 Telnet 客户端和服务器已经安装并运行。

开始 Telnet 会话的命令是telnet 主机名。主机名可以是你网络上可达的名称,也可以是一个数字 IP。

安全外壳SSH)是一个更受欢迎的协议,因为它提供了密码和文本的强加密。在我看来,它也更容易使用。

要开始一个安全外壳,命令如下:

ssh username@hostname

如何做…

在这里我们将运行一些 Telnet 和 SSH 命令:

  1. 运行以下命令:
telnet 192.168.1.115

  1. 应该会出现一个横幅和提示。输入用户名。

  2. 输入密码。

  3. 可能会显示每日消息(/etc/motd)文件。这是放置消息和其他信息供任何登录用户查看的好地方。在此终端中,您可以运行几乎任何文本模式命令。尝试pwd

  4. 您可以切换到另一个目录,编辑文件,以及几乎您在实际系统上通常会做的任何事情。

  5. 会话结束后,运行:

exit

这是在 Fedora 18 上运行 Telnet 的屏幕截图:

如何做...

  1. 现在让我们尝试运行一个安全外壳会话:
ssh jklewis@192.168.1.115

  1. 输入您的密码。/etc/motd文件应该像以前一样显示。让我们尝试一些命令。运行以下命令:
pwd

  1. 运行以下命令:
uptime

  1. 与 Telnet 一样,每个基于文本的命令都应该像您在实际机器上一样工作。会话结束后,运行:
exit

还有更多...

安全复制和安全外壳是复制文件和访问远程机器的最佳方式。要充分了解它们。我上面提到ssh-keygen程序允许无需密码即可复制文件。这对 SSH 也适用。我在家里的所有机器上都使用这个功能,还有我的网站,它是由一个服务提供商托管的。要获取有关这个非常酷的功能的更多信息,请运行man ssh-keygen

还有一件事,我提到 Telnet 和 SSH 会话应该像您在实际机器上一样工作。但是当客户端在非 Linux 机器上运行时,情况并非总是如此。例如,一些按键可能映射不同。查看您使用的客户端程序的文档,可能有办法调整按键映射。

无需浏览器即可获取网页 - wget

可能每个人都收到过来自可疑来源的电子邮件。您知道不应该点击其中任何链接,但如果有一种安全的方法来确定该网站上有什么,那不是挺好的吗?实际上是有的。

wget程序允许您从 URL 下载文件。尽管它可以做很多事情,但最简单的命令形式是:wget <some URL>。假设没有错误,它将把该文件放在当前目录中。如果您没有指定文件名,默认情况下它将尝试获取index.html文件。

如何做...

以下是运行wget的方法:

  1. 运行以下命令:
cd /tmp

  1. 运行以下命令:
wget www.jklewis.com

  1. 生成的文件将被命名为index.html。使用more index.html查看它。是的,这是我的个人网页。

  2. 您还可以引用特定文件。尝试:

wget www.jklewis.com/shipfire.gif

  1. 尝试一些其他网站。您可以在可疑的网站上进行此操作,以查看其是否安全。

  2. 如果您心中有一个可疑的网站,请对文件进行wget。查看它并寻找到其他网站的链接。如果您看到类似http:/DoWeCheatThemAndHow.com的东西。我可能不会点击它。

还有更多...

wget命令可以做更多。通过正确的参数,它可以用来克隆整个网站和许多其他有趣的事情。查阅手册以获取更多信息。

浏览网页 - Firefox

对于 Linux 系统,有几种不同的浏览器可供选择。在这里,我们将重点放在 Mozilla 的 Firefox 上。

准备工作

通过单击桌面上的浏览器图标,通常可以打开 Firefox。您也可以从命令行启动它。在此示例中,我们将首次以用户jklewis启动 Firefox。

以下屏幕截图显示了用户jklewis第一次打开 Firefox 的样子:

准备工作

如何做...

以下是从终端运行 Firefox 的方法:

  1. 为访客用户打开一个终端会话。例如,我运行了su - jklewis并输入了我的密码

  2. 运行firefox &(&表示在后台运行命令,这样您仍然可以访问该终端。错误消息也将显示在这里)。

  3. Firefox 应该以默认设置启动。让我们更改其中一些设置。转到编辑 | 首选项

Click on Edit->Preferences

  1. Firefox 首选项屏幕应该出现在常规部分。看到主页的位置,将其更改为更有用的内容。我将我的更改为jklewis.com

  2. 常规部分也是您可以控制下载窗口行为的地方。我选择为这个用户保持勾选状态。

  3. 现在点击标签部分。我个人非常讨厌浏览器标签,所以我已经将它们关闭了。要做到这一点,请取消在新标签中打开新窗口始终显示标签栏的复选标记。请注意,您不必在本练习中这样做。

  4. 内容部分允许您控制显示的内容。好好看看这个页面,不过我通常保持这些设置不变。

  5. 应用程序部分显示了可用的浏览器插件。我在这里不做任何更改。

  6. 现在点击隐私部分。这里可以清除历史记录和处理 cookie。

  7. 现在点击安全。我建议保持原样。

  8. 同步部分可以让您与移动设备同步。

  9. 高级部分有几页内容。常规页面可以让您控制浏览器的操作方式。现在点击网络页面。这是您配置缓存的地方。

  10. 更新页面处理自动更新的内容,加密页面是设置协议和查看/修改证书的地方。我建议保持原样。

  11. 现在关闭首选项对话框。

  12. 现在让我们查看一个网站并将其加为书签。转到 URL 字段并双击它。按下删除键。现在输入jklewis.com

提示

通常情况下不需要输入"www"。

  1. 您应该看到我的网页。现在点击书签

  2. 点击将此页加为书签。会出现一个名为已加为书签的页面的对话框(实际上这是完全错误的,因为页面还没有被加为书签)。在这里,您可以更改书签的标题或放置的文件夹。现在只需点击完成即可。

  3. 页面现在应该已经被加为书签。

还有更多...

如您所见,还有很多选项。根据需要进行探索。以下是浏览时的一些建议。

在给页面加书签时,好好看看给出的标题。由于某种原因,它们并不总是给出一个好的描述性名称。"账户登录"并没有告诉我太多信息。但是,如果我将其更改为"Hi-Fee 银行和信托 - 登录",那就告诉我这是哪个账户了。

我强烈建议您从访客账户而不是 root 账户运行浏览器。请注意,如果您正在访客用户下运行桌面(也强烈建议),从图标启动 Firefox 就可以了。

在 URL 字段的右侧是一个星号。点击它会弹出历史。旁边是一个带箭头的半圆。这是刷新按钮。如果页面加载速度过慢,或者出现问题,尝试点击这个图标刷新页面。

电子邮件 - 使用网络邮件程序

有许多可用的网络邮件客户端,如EvolutionThunderbird。我两者都用过,发现它们在某些方面有所不足。因此,出于这个原因和其他原因,我选择使用浏览器网络邮件应用。

准备工作

如果您已经使用过网络邮件程序,这可能对您来说已经很熟悉了。但是,如果您以前没有使用过,这应该非常有帮助。请注意,对于本节,我建议您不要尝试运行这些命令,只是阅读它们。

如何做...

以下是使用 Firefox 访问网络邮件客户端的方法:

  1. 在服务提供商的网站上登录您的账户。网站上应该有一个链接可以访问您的电子邮件。您的服务提供商甚至可能会让您选择使用哪个网络邮件应用。我选择了Squirrel Mail

  2. 无论您选择哪一个,它都应该打开并要求您输入电子邮件账户密码。请记住,这可能与您用于登录服务提供商主账户的密码不同。

  3. 一旦您进入邮件应用程序,应该会显示收件箱的内容。在这里,您可以回复邮件,转发邮件,提供附件等等。

  4. 还应该有一个地址簿。找到它,打开它,并了解如何使用它。如果服务提供商有一种将地址簿文件导出到您的计算机的方法,请经常使用该功能,以便在出现损坏时可以恢复它。

  5. 请记住,如果要撰写电子邮件并附加文件,请先附加文件,然后再填写其他字段并撰写文本。相信我,您的朋友、家人、潜在雇主等等都会感谢您没有忘记附件。

  6. 大多数网络邮件程序不会自动刷新屏幕。因此,如果您将其保持打开(我一直这样做),并离开计算机,当您回来时,请务必刷新电子邮件会话。通常通过单击收件箱标题来完成此操作。您也可以单击浏览器的刷新按钮。

  7. 关于网络邮件的最后一件事;邮件可能最终会填满您分配的空间,您甚至可能会收到来自服务提供商的一些关于此问题的电子邮件。我通常会等到收件箱使用了大约 80%的空间,然后直接转到最后一页(通常是第 30 页左右)并将这些邮件移到垃圾箱。我会一页一页地删除这些邮件,直到我回到第 20 页。

  8. 有些人在使用邮件时会删除邮件。如果您擅长这样做,那很好。我不擅长。如果我以这种方式做,最终会删除我希望能够找回的东西。

  9. 说到找回文件,通常可以通过在垃圾箱文件夹中查找来恢复已删除的文件。但是,一旦您清空了文件夹,这些电子邮件将永远消失。清理通常每周自动进行(某些邮件程序可配置)。

还有更多...

网络邮件的一个很好的功能是您应该能够从任何机器上的任何浏览器访问您的电子邮件。所有信息都存储在服务提供商的网站上。

以下是Squirrel Mail | Options的屏幕截图:

还有更多...

运行您自己的网络服务器 - httpd

也许有一天您会想要运行自己的网络服务器。在我作为软件工程师的职业生涯中,我经常被要求运行部门实验室。让我的用户了解正在发生的事情的最简单方法是将笔记和文件放在我自己控制的本地网站上。这可能听起来很难,但实际上并不是。

准备就绪

这假设您有一个 Linux 系统可用于尝试此操作。如果没有,您仍然可以从本节中获得很多信息。这还假设httpd尚未安装。这些步骤是在运行 Fedora 18 的笔记本电脑上执行的。

如何做...

以下是在 Fedora 上安装自己的 Apache httpd 服务器的步骤:

  1. 首先安装 httpd:
yum install httpd

  1. 现在切换到配置目录:
cd /etc/httpd/conf

  1. 备份文件:cp httpd.conf /tmp/httpd.conf.orig。您可能需要选择一个更合适的备份目录。

  2. 使用文本编辑器编辑文件:

vi httpd.conf

  1. 该文件包含了设置 httpd 服务器所需的几乎所有信息。请仔细阅读第一页,其中介绍了 ServerRoot。

  2. 简而言之,如果文件名以斜杠开头,服务器将使用所指示的路径。但是,如果使用相对路径,则将添加 ServerRoot 的值。例如,滚动到这一行:

Include conf.modules.d/*.conf

  1. 由于这是相对路径,并且 ServerRoot 设置为/etc/httpd,因此将包含的目录实际上是/etc/httpd/conf.modules.d

  2. 在另一个终端中,现在切换到该目录:

cd /etc/httpd

  1. 一定要记住 ServerRoot 是如何工作的!这将为您节省大量时间。现在让我们更详细地了解一下httpd.conf文件。Listen指令告诉 httpd 要使用哪个端口。现在将其保留在80

  2. 滚动到 ServerName。这是您可以输入您特定服务器名称的地方。现在先留空。

  3. 我们将讨论的最后一个是 DocumentRoot。这是您的网页将被提供的目录。它应该设置为/var/www/html

  4. 实际上让我们启动 httpd 服务。运行systemctl start httpd.service。这应该悄悄地返回到命令行。

  5. 我们还必须使用命令systemctl enable httpd.service来启用它。这应该显示一个成功的链接消息。

  6. 现在让我们试试:

cd /var/www/html

  1. 运行ls -la。它可能是空的。通过运行以下命令创建一个文件:
dmesg > dmesg1.txt

  1. 现在要么转到要么打开浏览器会话。我们将首先在本地检查一下,所以在 URL 字段中输入file:///var/www/html/dmesg1.txt

  2. 文件内容应该显示。现在让我们创建另一个文件:

echo "This is a new file" > newfile.txt

  1. 用您的 IP 替换我的 IP,在 URL 字段中尝试这个:192.168.1.115:/newfile.txt。应该显示newfile.txt的内容。

还有更多...

如果您决定进行大量的“Web 服务”,请务必阅读并了解httpd.conf文件。网络上也有大量的信息可用。

您可能会发现您实际上无法从网络上的另一台计算机访问您的文件。这很可能是由于防火墙(iptables)问题,但是您的路由器可能也需要一些配置。这将在第五章中进行介绍,权限、访问和安全

谁在使用那个端口?/etc/services 文件

有时您可能需要知道特定端口上运行的服务是什么。/etc/services 文件包含了这些信息以及更多信息。

如何做...

在这里,我们将看一下 Linux 系统上一些常见的服务:

  1. 查看您的/etc/services 文件:more /etc/services

  2. 按一次空格键向下滚动页面。看到它显示“ftp”吗?下一列中的21表示 FTP 正在使用的端口。/tcp/udp表示该端口可用于两种协议。

  3. 您还应该看到telnet(如果没有,请按Enter几次)。它应该显示端口23

  4. 现在让我们搜索一个服务。按几次 Backspace 键返回到顶部,并输入/nameserver

  5. 我们可以看到nameserver正在使用端口42,并且可用于 TCP 和 UDP。

  6. 该文件非常长(在我的系统上超过 11,000 行),因为有许多标准端口。

还有更多...

按照惯例,端口编号为01023被认为是“众所周知的端口”。端口编号为102449151是“注册端口”。私有和动态端口从4915265535。如果您正在开发应用程序或以其他方式处理端口,请务必遵循此端口使用约定。

以下是 Fedora 18 上/etc/services的前几行的屏幕截图:

还有更多...

IPv4 与 IPv6

截至撰写本书时,Internet Protocol Version 4IPv4)用于路由 Internet 上的大部分网络流量。它使用 32 位(4 字节)地址,允许有 232 个地址的空间。在 IPv4 下,剩余的地址不足以容纳现在使用的所有互联网设备,这就是为什么创建了IPv6。在本节中,我们将首先运行一些命令,然后讨论 IPv4 和 IPv6。

如何做...

让我们尝试使用两种协议的一些命令:

  1. 让我们从 IPv4 开始。运行以下命令:
ping 192.168.1.115

  1. 然后,运行以下命令:
ssh 192.168.1.115

  1. 现在让我们尝试 IPv6。首先让我们看看您的计算机是否有 IPv6 地址。在您的接口上运行ifconfig;在我的笔记本电脑上是ifconfig wlan0

  2. 您应该看到类似以下输出:

inet 192.168.1.115  netmask 255.255.255.0  broadcast 192.168.1.255

  1. 您还应该看到类似以下输出:inet6 2002:244:b303:0:221:5eff:feff:f15d。尝试 ping 它。在我的电脑上,它是ping 2002:244:b303:0:221:5eff:feff:f15d

  2. 你得到了ping: unknown host错误吗?那是因为我们必须使用 ping 的 IPv6 版本。再试一次,但像以下命令一样:

ping6 2002:244:b303:0:221:5eff:feff:f15d

  1. 现在尝试ssh,它似乎已经知道 IPv6:
ssh 2002:244:b303:0:221:5eff:feff:f15d

还有更多...

一般来说,在 IPv4 下,数字 IP 地址写作xxx.yyy.zzz.www,这被称为点分十进制格式。由点分隔的 3 个数字中的每一个被称为一个八位组。高阶八位组,在这个例子中是xxx,指示了这是哪个类的 IP。以下是 IPv4 中可用的类的部分列表:

端口
私有网络 10.0.0.0
本地环回 127.0.0.1
链路本地 169.254.0.0
私有网络 192.168.0.0
IP 组播 224.0.0.0
广播 255.255.255.255

您已经看到了我在家庭网络上使用的一些私有地址的示例。格式通常类似于以下一组命令:

ping 192.168.1.115
scp file1.txt guest1@192.168.1.115:/temp
telnet 192.168.1.115
ssh 192.168.1.115

IPv4 地址空间在 2011 年正式耗尽。因此,以及其他原因,IPv6 被创建。

IPv6 是互联网协议的最新版本。与使用 32 位地址的 IPv4 相反,IPv6 使用 128 位地址。这是 2128 个地址,足够地球上的每个人都拥有超过一百万个地址供自己使用。我们可能不会很快用完这些地址。

IPv6 地址有 8 组 4 位十六进制数字,用冒号分隔:2002:4244:b323:0:4687:fcff:fe69:4d0f

是的,这看起来很可怕,但改变有几个原因:

  • 更长的地址可以实现更有效的路由

  • 它允许特殊的寻址技术

  • 子网的大小现在是 264 个地址

  • 在 IPv4 下重新编号现有网络可能非常复杂;当正确配置时,IPv6 不会出现这个问题

  • 多播更有效率

  • IPv6 具有无状态地址自动配置SLAAC

IPv6 地址可以缩写如下:前导零可以省略。

连续的零组可以省略并用两个冒号替换。

看下面的例子:IP 地址是2002:0244:0000:0000:0000:fcff:fe69:4d0f

省略前导零,我们得到2002:244:0:0:0:fcff:fe69:4d0f

现在省略零组,我们得到2002:244::fcff:fe69:4d0f

有关更多信息,请参阅 man 页面和互联网。IPv6 的大规模使用仍然遥遥无期,但最终会到来。

第五章:权限、访问和安全

在本章中,我们将涵盖:

  • 创建和管理用户账户 - useradd

  • 使用密码

  • 处理文件权限

  • 使用防火墙和路由器设置

  • 使用安全 Linux SELinux

  • 使用 sudo 保护系统

  • /tmp 目录

介绍

这一章将作为对 Linux 文件权限的简要回顾,并介绍密码系统处理机器访问的方式。它还将展示如何使用防火墙和路由器中的安全功能,并提到 SELinux 和 sudo。

创建和管理用户账户 - useradd

在这一节中,我们将向您展示如何使用useradd程序添加用户账户。

准备工作

这些命令不应该对你的系统造成破坏;然而,你需要以 root 用户身份执行。

注意

在大多数 Linux 发行版中,有两个版本的这个命令,useraddadduser。它们并不总是做同样的事情,所以请查阅你的man页面(和/或file命令)以确保你运行的是正确的命令。在 Fedora 中,adduseruseradd的符号链接,因此它们是等效的。

如何做...

在这里,我们将运行useradd命令来添加一个用户,然后使用passwd命令来设置密码。在下一节中将更多讨论passwd

  1. 首先,我们将更改/etc/passwd,所以让我们先备份一份。运行以下命令:cp /etc/passwd /tmp/passwd.orig

  2. 现在让我们创建一个名为test1的用户:

useradd test1

  1. 它应该悄无声息地返回到命令行。现在让我们试一下:
su  -  test1

  1. 你应该看到提示发生了变化。运行whoami,它应该会显示test1。确保每次使用su时都运行这个命令。现在让我们更改密码:
run 
passwd

  1. 它会说类似于Changing password for user test1。但然后它会提示输入当前密码。这是什么意思?它想要什么密码?

  2. 我真的不知道答案,而且man页面也没用。它们总是跳过这一步,这相当奇怪。有一些使用加密功能和其他复杂程序的方法。然而,以下是我的方法:

  3. 按下Ctrl + C退出passwd命令,并运行exit返回到 root 账户。现在编辑/etc/passwd并转到底部一行。1003下面的内容在你的系统上可能会有所不同,但你应该看到类似于这样的一行:

test1:x:1003:1003::/home/test1:/bin/bash

  1. 删除x,这样这一行看起来就像这样:
test1::1003:1003::/home/test1:/bin/bash

  1. 保存文件并退出。如果出现权限错误,请记住你必须以 root 用户身份执行此过程。

  2. 现在运行su再次成为test1用户:

su – test1

  1. 运行passwd

  2. 嘿,很酷,这次没有要求输入当前密码。所以现在可以创建一个密码,因为我们真的不想在系统上留下一个开放的账户。如果你打算保留这个账户,我建议你把这个密码写下来,或者更好地把它放到一个加密文件中的安全位置。

  3. 两次输入相同的新密码后,你应该会收到类似的消息:

passwd: all authentication tokens updated successfully

现在我们有了一个新用户。请注意,一般来说,这个用户可以在命令行上执行大部分他有适当权限的活动。然而,根据 Linux 发行版的不同,用户可能无法访问所有资源(例如声音系统)。

这是我在我的 Fedora 17 系统上使用useradd --help命令得到的截图:

如何做...

还有更多...

useradd命令不仅可以创建新账户,还可以做很多其他事情。你可以更改现有账户的工作方式,或者设置过期时间。你甚至可以给用户系统权限,使他几乎拥有 root 用户一样的权限。请参阅 man 页面或使用--help选项获取更多信息。

使用密码

我在前面的步骤中提到了passwd命令。它用于更新用户的身份验证令牌。你需要以 root 用户身份执行此示例。我们将使用上一节中创建的test1用户。

如何做...

让我们稍微使用一下passwd命令:

  1. 从用户帐户登录到test1,以确保仍然按预期工作:
su - test1

  1. 在提示时输入密码。这应该可以正常工作,没有错误。

  2. 现在让我们锁定此帐户。退出到根目录并运行:

passwd -l test1

  1. 从用户帐户运行su - test1并再次输入密码。它应该失败。

  2. 返回到根目录,并使用命令passwd -u test1解锁帐户。再次登录以确保它有效。

  3. 现在让我们使帐户过期。这将强制用户创建新密码。作为 root 运行以下命令:

passwd -e test1

  1. 现在作为访客用户,使用命令su - test1登录test1。输入密码。

  2. 您将被要求创建新密码。在这里要小心,因为您必须再次输入旧(当前)密码,然后两次输入新密码。是的,似乎很奇怪,我们必须再次输入旧密码,因为我们刚刚这样做了。

  3. 请注意,您可以通过运行passwd -d test1删除用户帐户的密码。这比直接编辑/etc/passwd文件更容易,就像我们在上一节中所做的那样。

还有更多…

您可以在用户帐户上设置很多其他内容。这些包括帐户保持活动的时间以及何时开始警告用户更改其密码。有关更多信息,请参阅 man 页面。

注意

关于密码的一些话

在过去,我们会选择一个相对简单的密码并永远保留它。我们不需要一直更改它,并且可以将其用于一切,因此不需要将其写下来。不幸的是,现在情况已经改变。密码通常需要是大写字母,数字,甚至特殊字符的组合。它们的长度也必须更长。您不能总是将它们用于一切,因为一个系统上的密码规则可能与另一个系统上的规则不同。出于这些原因,我建议在合理的情况下为每个帐户使用不同的密码,并将其记录在安全的地方。您很可能需要定期更改此密码。

处理文件权限

由于 Linux 被设计为多用户操作系统,每个文件都有与之关联的文件权限和所有权。这是为了防止一个用户覆盖另一个用户的文件(无论是有意还是无意)。根用户可以(通常)访问系统中的每个文件。

做好准备

以下是基本文件系统权限的快速回顾。在本例中,假定umask设置为0022。运行umask以确保。

观察我的备份脚本 b 的以下ls -la列表:

-rwxr-xr-x. 1 guest1 root 559 Mar 28 12:43 b

从左边开始,第一个位置表示这是什么类型的文件。如所示的-表示这是一个常规文件。d表示目录,l表示链接。接下来的三组三个字母是文件权限,可以用符号模式或数字模式引用。我们将使用数字(八进制)模式。

前三组rwx是此文件所有者(guest1)的设置。接下来的三个r-x是组(root)的设置。第三组是所有其他人的设置。r表示文件可读,w表示可写,x表示可执行。

chmod命令接受一个到四个八进制数字。如果缺少一个数字,则假定为前导零。第一个数字设置用户 ID,组 ID 或粘性位。第二个数字选择此用户的权限,第三个数字选择其他用户的权限。

现在让我们更改临时文件的一些权限,看看会发生什么。

如何做…

让我们处理一些文件权限:

  1. 让我们使用以下命令切换到/tmp目录:
 cd  /tmp

  1. 如果文件f1存在,请使用以下命令删除它:
rmf1

  1. 使用访客帐户(在我的情况下是jklewis)使用以下命令创建临时文件:
ls>f1

  1. 现在运行以下命令:
ls -al f1

  1. 它应该显示类似以下输出:
-rw-rw-r--. 1 jklewisjklewis 131 Mar 29 10:35 f1

  1. 这些是基于umask命令的默认权限。这表明所有者和组具有读取和写入权限,其他用户只有读取权限。

  2. 那么我们如何更改这些?通过使用chmod命令。假设这是一个脚本,我们想要使其可执行。运行以下命令:

chmod 775  f1

  1. 现在运行ls -la f1;它现在应该看起来像以下输出:
-rwxrwxr-x. 1 jklewisjklewis 131 Mar 29 10:35 f1

  1. 这些x表示每个用户都可以运行该文件。我们再做一个。运行chmod 000 f1,然后运行ls -la f1,它将显示以下输出:
----------. 1 jklewisjklewis 131 Mar 29 10:35 f1

哇!现在没有人能够对这个文件做任何事情了,对吧?嗯,不,文件的所有者仍然可以更改权限。说到所有权,chown命令用于更改该字段。通常以 root 用户身份运行。

还有更多...

我没有提到setuidsetgidsticky位。请参考chmod手册页了解这些设置的信息。受限删除位在* /tmp 目录*部分中提到。

使用防火墙和路由器设置

防火墙用于防止未经授权的网络访问到一台或多台机器,同时仍然允许正常(或合法)的流量通过。iptables命令用于设置、配置和查看内核中 IPv4 规则的表。它有点复杂,因此这只是一个简单的概述。

iptables使用一个或多个表。每个表都有一些预定义的链,并且还可以包含用户创建的链。链是规则的列表,规则指定匹配的数据包应该执行什么操作。这种“匹配”称为目标

当数据包不匹配时,将查看链中的下一个规则。如果匹配,可以为数据包指定以下内容之一:

  • ACCEPT:它允许数据包通过

  • DROP:它拒绝了数据包

  • QUEUE:它将数据包传递到用户空间

  • RETURN:它停止此链的运行,并在调用链中的下一个规则处继续

如何做到...

以下是一些iptable命令。不要在您的系统上运行这些命令;这只是一个示例:

  1. 要删除所有现有规则,请使用以下命令:
iptables -F

  1. 要阻止特定的 IP 地址,请使用以下命令:
iptables  -A INPUT -s 192.168.1.115  -j DROP

  1. 要允许环回访问,请使用以下命令:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

现在让我们谈谈路由器。大多数路由器都内置了防火墙,可以通过 Web 浏览器进行管理。虽然它不能取代iptables,但通常更容易配置,并且可以在整个网络中工作。

典型家用路由器的网页通常具有192.168.1.1地址。现在在浏览器中尝试一下。

这是我在安全页面上的路由器的屏幕截图:

如何做...

您可能需要输入 ID 和密码。如果您尚未更改它们,请参考路由器文档中的默认值。转到安全(或等效)选项卡以访问这些功能。

还有更多...

iptables还有很多内容,足以填满一本整书。有关更多信息,请参考手册页或防火墙书籍。还有一些关于这个主题的很好的网站。

使用安全 Linux - SELinux

本节将作为安全增强型 LinuxSELinux)的概述。在使用文件权限部分,我们讨论了标准 Linux 如何为系统提供保护。这种方法称为自主访问控制DAC),并且有一些限制。例如,典型用户可以无意或有意地打开他的文件,以便其他用户读取或写入。这可能允许未经授权的访问敏感信息。为了提供更多安全性,SELinux 使用MAC强制访问控制)。MAC 使用覆盖系统中所有进程和文件的安全策略。SELinux 中的所有文件都具有包含安全相关信息的标签。

例如,以下是 DAC 下文件的正常列表:

ls -la ifcfg-eth0
-rw-r--r--. 1 root root 73 Apr 22  2011 ifcfg-eth0

相同的文件,但使用ls的 Z(安全上下文)选项:

ls -Z ifcfg-eth0
-rw-r--r--. root root unconfined_u:object_r:default_t:s0ifcfg-eth0

unconfined_u是用户,object_r是角色,default_t是类型,s0是级别。这些信息用于进行访问控制决策。请注意,首先检查正常的 DAC 规则,如果它们不允许操作,则不使用 SELinux 规则。

准备工作

我们只会以 root 身份运行一些命令并查看一些设置。我们不会对配置进行任何更改。本示例将假定您已经在 Enforcing 模式下运行 SELinux。要确定是否如此,请运行sestatus命令。输出应类似于以下屏幕截图

准备工作

如何做...

好的,让我们运行一些 SELinux 命令。

  1. 运行getenforce;它应该报告 enforcing。

  2. 现在让我们查看映射列表:

semanage login -l

  1. 要查看进程的 SELinux 上下文,请运行以下命令:
ps –eZ

  1. 要查看用户的上下文,请运行以下命令:
id –Z

  1. 当发生错误时,使用sealert命令查看完整的 SELinux 消息。检查您的/var/log/messages文件,看看是否生成了任何警报,如果有,可以运行sealert -l查看详细信息。

  2. 要获取带有描述的 SELinux 布尔值的详细列表,请运行以下命令:

semanage boolean –l

  1. 要查看列表但不包括描述,请运行以下命令:
getsebool –a

  1. 要检查文件和目录是否具有正确的 SELinux 上下文,请运行以下命令:
matchpathcon

还有更多...

正如我提到的,SELinux 通常默认安装在大多数发行版中。在某些情况下,您甚至可能没有意识到它的存在。但是,有时它会妨碍您。例如,如果您尝试安装服务,比如vsftpd,可能会失败,因为它会违反 SELinux 策略。通常会弹出一个相当不错的错误消息。该消息甚至可能告诉您如何解决问题,但是在实践中,我发现它不起作用。您执行它给出的操作,似乎没有错误,但是访问仍然被拒绝。在这些情况下,我使用setenforce命令将 SELinux 置于 Permissive 模式,然后继续我的活动:

setenforce 0

请注意,这只在下次重启之前有效。

有关 SELinux 的更多信息,请参阅 Fedora 网站上的一份相当出色的指南。

使用 sudo 来保护系统

有时,特别是作为系统管理员,您可能希望给用户更多对计算机的访问权限,但实际上不是 root 权限。这可以通过修改/etc/sudoers文件并让用户调用sudo命令来实现。

准备工作...

以下步骤不应损害您的系统。我们将使用上面创建的用户帐户执行这些步骤。您需要成为 root 用户才能执行此部分。

如何做...

在这里,我们将使用/etc/sudoers文件:

  1. 备份你的/etc/sudoers 文件
cp /etc/sudoers /tmp/sudoers.orig

  1. 您不直接编辑此文件,而是使用visudo命令。如果需要,任何文本编辑器都可以使用。如果需要,设置变量然后运行命令:
visudo

  1. 这个命令会创建一个sudoers文件的临时副本并对其进行编辑。如果一切顺利,完成后会将临时文件复制到原始文件上。所以,让我们来看看这个文件。

  2. 阅读别名部分。它们被分成组,用于诸如网络、软件、服务、locate等的事物。现在让我们跳进来看看这是如何工作的。

  3. 但首先让我们尝试一些东西。以 guest 用户身份打开另一个会话。我将使用我的jklewis帐户。

  4. jklewis帐户下键入以下命令:

cd /tmp

  1. 使用以下命令创建一个文件:
ls>f1

  1. 现在尝试将该文件复制到/usr/bin
cp f1 /usr/bin

  1. 您应该收到一个错误。这当然是正确的,普通用户通常不能写入/usr/bin目录。现在返回到您的visudo会话。

  2. 您将需要您机器的主机名。在本示例中,我们将使用数字 IP。如果需要,您可以从ifconfig命令中获取它。

  3. 就在提到关闭命令的行之后,我们将为我们的访客用户添加一行。语法是用户名、主机名、命令和选项,因此添加以下行:

jklewis  192.168.1.115=(ALL)  ALL

  1. 保存文件并关闭visudo会话。现在再次尝试此命令。仍然在/tmp目录中运行cpf1 /usr/bin。它应该仍然显示错误消息。现在尝试以下命令:
sudo cp f1 /usr/bin

  1. 啊,它要求输入密码,对吧?是的,它要求用户的密码,而不是 root 的密码。这可能很容易混淆(至少对我来说是这样)。记住的最好方法是,你可能不应该知道 root 密码是什么。输入你的密码。

  2. 如果这是该用户第一次使用sudo,可能会弹出一个有趣的通知。阅读并理解它,以避免系统管理员的愤怒。

  3. 在所有这些之后,这次命令应该可以无错误地进行。很酷,对吧?由于我们在sudoers文件中添加的行中使用了ALL,它实际上已经给予了这个用户完全访问权限。请注意,有些事情仍然不会工作得一样,例如重定向。

  4. 好吧,我们可能真的不希望这个jklewis混蛋搞乱我们的系统,所以让我们稍微微调一下。再次运行visudo

  5. 向下滚动或搜索进程。通过删除#标记取消注释# Cmnd_Alias PROCESSES行。

  6. 再次向下滚动到我们之前添加的jklewis行。将其更改为:

jklewis  192.168.1.115=(ALL) PROCESSES

  1. 现在我们需要一个要终止的进程。以 root 身份启动一个vi会话。类似vi mybook的东西会起作用。

  2. 在您的用户会话中运行psauxw | grep”vi mybook”并记住进程号(PID)。

  3. 还在您的用户会话中运行kill -9上面的 PID。它会出错。现在再次运行,但使用以下命令:

sudo kill -9 <pid>

  1. 应该终止vi进程。

提示

如果屏幕保持蓝色或其他颜色,只需运行ls 命令。那应该解决问题。

以下是我的/etc/sudoers文件的屏幕截图:

如何做...

还有更多...

您可以从sudoers文件中看到,可以对其进行很多微调。用户可以被赋予非常少的额外权限,或者非常多的权限。有关更多信息,请运行man sudoers

这是我对sudo的两分钱。有许多计算机用户可以信任以 root 身份运行而不会损害系统。但也有例外。如果您设置了sudo,您可能会花很多时间尝试使其完美,只能发现您总是不得不添加更多内容。您的用户会因为无法进行更改而感到沮丧。然后,当您认为最终已经完美无缺时,有人使用sudo,仍然会搞砸并严重搞砸。根据我的经验,如果用户犯了这个错误一次,他会一次又一次地犯。

/tmp目录

/tmp目录在某种程度上是特殊的,因为默认情况下允许所有用户向其中写入文件。这是我系统上/tmp的列表:

drwxrwxrwt.  10 root    root      4096 Mar 31 03:48 tmp

您可以看到这是对所有人开放的。权限中的t表示目录上设置了受限删除位。那么这实际上意味着什么呢?对于目录,它防止普通用户删除或重命名他们没有适当权限的目录中的文件。

作为普通用户,当写入/tmp时仍然需要小心,因为有一些限制。

如何做...

让我们尝试一些事情,以了解/tmp的工作原理:

  1. 运行以下命令:
cd /tmp

  1. 如果有任何早期部分留下的临时.txt文件,请清理它们;rm *.txt文件应该可以做到。

  2. 现在运行以下命令:

ls>root1.txt

  1. 在另一个会话中,作为一个访客用户(我将使用jklewis),运行以下命令:
cd /tmp

  1. 运行以下命令:
ls>jklewis.txt

  1. 这应该可以无错误地工作。现在尝试:
 ls>root1.txt

  1. 您应该收到权限被拒绝的错误。为什么?因为即使普通用户都可以写入/tmp目录,但仍必须遵循正常文件系统(DAC)权限。

还有更多...

基于上述原因,我建议除了真正临时的文件之外,不要在/tmp目录中使用任何东西。此外,大多数发行版会定期清理/tmp,因此任何不属于 root 用户的文件都将被删除。在生成临时文件时请记住所有这些,特别是在编写脚本时(更多内容请参见第八章,“脚本处理”)。

第六章:进程

在本章中,我们将涵盖以下主题:

  • 理解进程

  • 使用 ps 检查进程

  • 使用 top 检查进程

  • 使用 nice 更改优先级

  • 使用/proc 文件系统观察进程

介绍

在 Linux 中运行的所有程序都是进程。在本章中,您将学习如何使用 ps 和 top 查看它们的状态,如何设置它们运行的优先级,以及如何使用/proc 文件系统查看进程的内部。

理解进程

每个进程都有一个称为进程标识符PID)的唯一标识符。此外,每个进程都有一个父进程标识符PPID)。有一个例外,即init(或systemd)。init进程启动所有其他进程,并具有 PID 为 1。该进程很特殊,因为它无法被终止(任何尝试这样做通常都是致命的)。

与文件类似,进程也具有访问权限。这些被称为真实用户和组 ID。这通过不允许非特权用户访问关键操作系统任务来提供一定程度的保护。内存、打开的文件和其他资源由进程拥有,并与其他进程(在大多数情况下)分开。

从用户的角度来看,进程通常是从命令行或桌面启动的。例如,使用vi编辑文件。用户启动会话并与编辑器进行交互。他可以保存文件或编辑其他文件。只要会话处于活动状态,就会有一个 PID 与之关联。当用户终止vi时,PID 和所有相关资源也将终止。该 PID 将被回收并稍后由操作系统再次使用。以这种方式运行的程序称为前台进程。

进程也可以在后台运行。例如,在第四章中,网络和互联网,我们使用firefox &命令运行浏览器。&符号将进程放入后台,释放该终端以进行更多的输入/输出。请注意,应用程序(例如此示例中的 Firefox)发出的消息仍将输出到该终端。在调试时,这真的很有帮助。还要注意,后台运行的进程往往以比前台任务更低的优先级运行(稍后会详细介绍优先级)。在旧时代,后台进程通常也被称为作业。

每个进程都有一些特殊的文件句柄:

  • 标准输入stdin):进程从此处获取其正常输入(句柄 0)

  • 标准输出stdout):进程将其正常输出写入此处(句柄 1)

  • 标准错误stderr):进程将其错误输出写入此处(句柄 2)

以下是显示标准句柄的屏幕截图:

理解进程

由进程打开的其他文件从句柄 3 开始。有一些进程被赋予特殊名称。例如,Linux 系统上的许多进程在后台运行,并且在大多数情况下,从不打算从命令行运行。这些被称为服务或守护进程。超文本传输协议守护进程HTTPD)Web 进程是服务的一个很好的例子。

通常,服务会等待事件发生,执行一个或多个操作,然后再次等待。如果服务记录任何活动,通常会记录到/var/log/<service-name>目录。

注意

如果启动后台作业的终端被终止,后台作业也将结束。一些 Linux 发行版将尝试警告用户此条件。

如何做…

以下是可以用来查看进程的命令的简要列表:

  • 要查看当前在系统上运行的进程的快照:
ps auxw

  • 要实时查看进程,请运行:
top

  • 要查看所有类型的进程目录:
ls /proc

还有更多...

一个进程可以衍生出其他进程。它也可以衍生出线程。线程继承父进程的所有句柄和资源。通常在编程中用于同时执行一个小任务,而主任务正在运行,并且快速返回。

资源有限制吗?是的。ulimit命令用于查看和设置进程的硬限制和软限制。通常用户不需要它;但是,如果您好奇,可以在您的系统上运行ulimit -a。您应该看到类似以下截图的输出:

更多内容...

有关ulimit的更多信息,请参阅 man 页面。

使用 ps 检查进程

ps程序允许用户查看系统上运行的进程的快照。通过使用适当的参数,输出可以更改以包含更多或更少的信息。在本节中,我们将以 root 身份运行,并使用 BSD 风格的ps。选项可以分组,不使用破折号。

如何做...

执行以下步骤来运行ps

  1. 只运行ps而不带任何参数会得到以下类似的输出:
 Big4 /temp/linuxbook/chap6 # ps
 PID TTY          TIME CMD
 5197 pts/25   00:00:00 su
 5218 pts/25   00:00:00 bash
 17789 pts/25   00:00:00 ps

  1. 由于这并不是非常具有信息性,让我们显示每个具有 TTY 的进程:
ps a

  1. 现在,包括那些没有 TTY 的进程:
ps ax

  1. 以更加用户友好的格式显示输出:ps aux。注意标题的变化。

  2. 如果在您的系统上行被截断了,可以使用以下命令添加宽选项:

ps auxw

  1. 输出确实很多。以下是一些处理它的想法:
ps auxw | more

  1. 您也可以将输出重定向到文件:ps auxw > ps-output.txt,然后使用morevi查看它。

  2. 您也可以使用grep来查找特定的进程 ID。在另一个终端中,运行以下命令:

vi file1.txt

  1. 现在回到您的原始终端,运行以下命令:
ps auxw | grep file1.txt

  1. 您应该看到一行包含文本vi file1.txt。这就是您要找的 PID,也是ps的最常见用途之一。

  2. 您还可以显示进程的树状视图:

pstree

工作原理...

ps命令从/proc文件系统获取信息。每个运行的进程都有一个相关的条目。我们将在本章后面更详细地讨论/proc

还有更多...

BSD 风格的标题将类似于以下内容:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

每个术语的定义如下:

  • USER:它是进程的所有者

  • PID:它是进程标识符

  • %CPU:它给出了 CPU 时间除以进程运行时间的比例

  • %MEM:它给出了进程内存与物理内存的比例

  • VSZ:它包含了进程的虚拟内存大小

  • RSS:它包含了实际内存驻留集大小

  • TTY:它表示与该进程关联的终端

  • STAT:它表示进程的状态

  • START:它给出了进程启动的时间

  • TIME:它给出了总 CPU 时间

  • COMMAND:它是命令的名称

ps命令还有很多其他选项。您可以查看线程,获取安全(SELinux)信息,通过用户名紧缩显示内容,并更改输出格式。您甚至可以修改一些环境变量以改变ps的工作方式。请参阅 man 页面以获取更多信息。

以下截图展示了在我的 Fedora 17 系统上ps - auxw的样子:

更多内容...

使用 top 检查进程

top程序类似于ps,只是它实时显示系统的状态。您可以使用命令行开关和/或其交互式界面来控制其操作。它还可以使用配置文件。您可以通过top做很多事情。以下是一些可能的示例。

准备就绪

不需要特殊设置。这些命令将以 root 身份运行。

要获取top的帮助,可以运行以下命令行:

 top -h or -v

这些是等效的,并显示库版本和用法。

top的一般语法如下:

 top -bcHisS -d delay -n iterations -p pid [,pid...]

以下是在 Fedora 17 上运行top的截图:

准备就绪

如何做...

以下是使用命令行开关的一些示例:

  1. 每 2 秒更新一次屏幕:
top -d 2

  1. 每半秒更新一次屏幕:
top -d 0.5

  1. 要更新 10 次然后退出:
top -n 10

  1. 要同时执行两者:
top -d 0.5 -n 10

  1. 要立即更新屏幕,请按空格键或Enter

  2. 要监视特定的 PID,请使用-p选项。这将显示init(或systemd)进程:

top -p 1

  1. 让我们监视一些进程。首先运行ps auxw,并记住四个进程的 PID。

  2. 然后运行top,用之前获得的 PID 替换:

top -p pid1,pid2,pid3,pid4

  1. 要省略显示空闲进程,请运行以下命令:
top -i

  1. 要显示线程,请运行top -H。要仅监视特定用户的进程,语法是top -u <username>。尝试使用 root:
top -u root

  1. 你可以以批处理模式运行top。例如,要将输出保存到文件中:
top -b -n 10 > top1.txt

以下是使用交互命令的一些示例。启动top并跟随操作:

  1. 要仅显示特定用户(此示例中为 root)拥有的进程,请按U,然后输入root

  2. 要更改延迟时间,请按D,然后按1输入时间。

  3. 要显示多核机器上的所有 CPU,请按1(再次按1切换回来)。

  4. 要切换显示命令行与程序名称,请按C

  5. 要更改进程的 nice 设置,请按R,然后输入所需的优先级。

  6. 要激活安全模式,请按S(之后查看安全模式的解释)。

  7. 要向进程发送信号,请按K,然后输入要发送的信号。在执行此操作之前,请确保您有正确的 PID 和信号。

  8. 要写入配置文件,请按W。这将在用户的主目录中创建文件.toprc,并在下次启动top时使用其中的设置。

  9. 要显示帮助屏幕,请按H

  10. 要退出 top,请按Q

它是如何工作的...

以下是前一张截图中显示的前五行的描述:

  • top:它包含了当天的时间、机器的运行时间、用户数量和平均负载

  • Tasks:它给出了总任务数、当前运行、睡眠、停止和僵尸的数量

  • Cpu(s):不同类型的 CPU 状态如下:

  • us:它代表用户时间

  • sy:它代表系统时间

  • ni:它代表了 nice 时间

  • id:它代表空闲时间

  • wa:它代表了 I/O 等待时间

  • hi:它给出了用于服务硬件中断的时间

  • si:它给出了用于服务软件中断的时间

  • st:它代表被窃取的 CPU 时间

  • Mem:它给出了机器上的总内存;已使用的、空闲的和缓冲区的大小(以 KB 为单位)

  • Swap:它给出了总交换空间;已使用的、空闲的和缓存的大小(以 KB 为单位)

以下是标准标题的定义。请注意,这些可能会根据命令行选项或交互命令而更改:

  • PID:它定义了进程标识符

  • USER:它保存了此任务的所有者的用户名

  • PR:它保存了这个任务的优先级

  • NI:它包括 nice 值(下一节将更多介绍优先级)

  • VIRT:它展示了此任务使用的虚拟内存总量

  • RES:它给出了此任务使用的物理内存

  • SHR:它给出了此任务使用的共享内存

  • S:它代表进程状态,可能是以下之一:

  • S:它代表睡眠状态

  • D:它表示不可中断的睡眠状态

  • R:它表示进程正在运行(或准备运行)

  • T:它表示进程已被跟踪或停止

  • Z:它表示僵尸状态

  • %CPU:它给出了自上次更新以来经过的 CPU 时间的份额,以百分比表示

  • %MEM:它保存了当前使用的可用物理内存的份额,以百分比表示

  • TIME+:它给出了此任务自开始运行以来使用的总 CPU 时间

  • COMMAND:这是用来启动此任务的命令

还有更多...

除了用户配置文件外,还可以有一个全局文件。它的名字是/etc/toprc,包括以下两行:

S # Line 1: secure mode switch
2.0 # Line 2: delay in seconds

此文件是由 root 用户手动创建的。如果此文件存在,则会激活安全模式并更改top的操作方式:

  • 显示了帮助屏幕的不同版本

  • 用户无法终止任务

  • 用户无法重新设置任务

  • 用户无法更改top的延迟间隔

如果top似乎不按预期工作,请检查用户和 root 的配置文件是否存在。您可以使用top做很多其他事情。您可以更改字段的排列和排序方式。您可以更改颜色和突出显示。还有一个多窗口选项。有关更多信息,请参阅top的 man 页面。

以下是我在我的 Fedora 17 系统上的top的屏幕截图:

还有更多...

使用 nice 更改优先级

nice命令允许您调整进程运行的优先级。现代操作系统通常会很好地进行任务调度。但是,某个特定进程可能偶尔需要进行一些调整。在这里,我们将展示如何使用nice

优先级称为 niceness 级别。进程可以具有的 niceness 范围从 19(最不利)到最大值-20(最有利)(如果这对您来说似乎是反向的,对我来说也是)。

最有利 ________________________ 最不利

20 __________________________________19

最高优先级 ________________________ 最低优先级

您可能还记得上一节关于top的 NI 列。这是 niceness 设置,在 Fedora 上,有几个服务以最有利的-20 设置运行。

请注意,更改进程的 niceness 设置并不保证操作系统会遵守它。这只是对调度程序的建议。

还要注意,给 nice 的命令不能是内置命令。

nice的语法如下:

 nice [Option]... [Command [Arg] ...]

如何做...

现在,让我们运行一些nice命令:

  1. 要查看当前的 niceness 值,请单独运行 nice:
nice 

  1. 现在在自身上运行 nice:
nice nice

  1. 看到输出为 10 吗?如果没有给出默认调整,那就是默认值。

  2. 现在将其设置为最大值:

nice -n -20 nice

  1. 对于最小值:
nice -n 19 nice

  1. 现在让我们尝试其他事情。在另一个终端中,运行以下命令:
nice -n 15 vi testfile.txt

  1. 然后找到它的 PID:
ps auxw | grep testfile.txt

  1. 现在在先前的 PID 上运行top
top -p <pid>

  1. niceness 列(NI)应显示 15 的 niceness。

以下是显示在 Fedora 17 上运行nice的屏幕截图:

如何做...

还有更多...

与大多数其他 Linux 程序不同,nice没有更多内容。如果您尝试将其设置为高于 20 的最大值,它仍将使用 20,如果您尝试将其设置为低于-19 的最小值,它将使用-19。此外,top程序允许您动态调整进程的 niceness 级别。

使用/proc 文件系统观察进程

/proc文件系统是 Linux 存储与当前运行的进程相关数据的地方。在大多数情况下,普通用户可能永远不需要(希望永远不需要)了解这些信息。但是,在调试期间或者只是想了解一些 Linux 内部情况时,这些信息可能会非常有帮助。

如何做...

以下步骤解释了如何查看/proc中包含的信息:

  1. 让我们尝试在/proc中作为 root 运行一个实验:
file uptime

  1. 它显示uptime: empty,对吧?因此,如果我们 cat 它,理想情况下应该没有输出,对吧?试试看:
cat uptime

  1. 哇,那是怎么发生的?/proc中的文件很特殊,因为信息是实时从中读取的。让我们尝试一些更多的内容,并运行以下命令:
cat interrupts

  1. 现在运行cat versioncat meminfo

  2. 在另一个会话中,运行以下命令:

vi test5.txt

  1. 让我们找到它的 PID:
ps auxw | grep “vi test5.txt”

  1. 更改到/proc中的目录:cd /proc/<pid-from-above>

  2. 现在将目录更改为文件描述符FD)目录:

cd fd

  1. 运行ls -la命令。您应该看到类似以下输出:
Big2 /proc/20879/fd # ls –la.
 total 0
 dr-x------. 2 root root  0 Apr 11 16:27 .
 dr-xr-xr-x. 8 root root  0 Apr 11 16:27 ..
 lrwx------. 1 root root 64 Apr 11 16:27 0 -> /dev/pts/10
 lrwx------. 1 root root 64 Apr 11 16:27 1 -> /dev/pts/10
 lrwx------. 1 root root 64 Apr 11 16:27 2 -> /dev/pts/10
 lrwx------. 1 root root 64 Apr 11 16:27 4 -> /tmp/.test5.txt.swp

您可以看到这确实是我们的vi编辑test5.txt文件的会话。请注意,显示的文件是由vi创建并在执行期间保持打开的临时文件。

还有更多...

以下截图显示了 Fedora 17 系统中/proc目录的列表:

还有更多...

那么这一切意味着什么呢?这些数字是,正如你可能已经猜到的,进程 ID。每个进程都会在这里有一个数字,实际上是包含了关于该进程的几乎所有你想知道的东西的目录。

以下是其中一些文件的用途。我没有列出每一个,但涵盖了我认为最有趣的那些:

  • buddyinfo: 它包含有关节点和内存的数据

  • cgroups: 它包含了有关 CPU 组的数据

  • cmdline: 它是启动进程时给出的命令行

  • consoles: 它提供了有关控制台的信息

  • cpuinfo: 它包含了你的系统中 CPU 的非常详细的列表

  • crypto: 它包含了系统中可用的加密例程的信息

  • devices: 它包含了设备的列表

  • diskstats: 它包含了磁盘统计信息的列表

  • dma: 它包含了 DMA 的列表

  • filesystems: 它提供了可用文件系统的列表

  • interrupts: 它包含了系统正在使用的中断的非常详细的列表

  • iomem: 它提供了 I/O 内存信息

  • ioports: 它提供了 I/O 端口的信息

  • kallsyms: 它包含了操作系统符号的列表

  • kcore: 它代表了这台机器的内存映像

  • meminfo: 它包含了系统内存使用情况的非常详细的列表

  • modules: 它包含了系统使用的模块的列表

  • mounts: 它包含了系统中已挂载的文件系统(真实和虚拟)的列表

  • partitions: 它包含了分区的列表

  • slabinfo: 它包含了一个 slab 内存对象的列表

  • softirqs: 这是另一个 IRQ 列表

  • uptime: 它提供了机器已经运行的时间(参见uptime命令)

  • version: 这是内核版本(参见uname命令)

  • vmstat: 它提供了虚拟内存统计信息

  • zoneinfo: 这是另一个相当详细的内存列表

除了少数例外,你可以使用 cat 命令查看大多数这些文件中的重要内部数据。注意,不要 cat(或对)kcore文件做任何操作。不要尝试编辑这些文件。另外,如果你 cat 一个文件,但似乎什么也没发生,按下CtrlC键应该让你退出。

使用 C 语言编写的程序可以利用/proc中的信息做一些非常酷的事情。例如,我开发了一段代码,可以让程序确定它是正常运行到屏幕上,还是被重定向到文件中。程序可以根据情况采取适当的行动,例如,如果正常运行,则清除屏幕,如果被重定向到文件,则不清除。这样,控制代码就不会嵌入到文件中。我还有另一段 C 代码,可以确定程序当前打开的任何文件的完整路径和文件名。

以下是top的另一个截图:

还有更多...

这是通过运行top然后按下Z键创建的。你可以对top进行相当多的自定义。查看 man 页面以获取更多信息。

第七章:磁盘和分区

在本章中,我们将涵盖以下主题:

  • 使用fdisk

  • 使用mkfs格式化驱动器

  • 使用fsck检查文件系统

  • 逻辑卷管理(LVM)

介绍

在安装机器时,您可以采用默认设置或根据需要设置磁盘。以下是对分区和文件系统的简要回顾。典型的 Linux 系统通常至少有三个单独的分区。它们被标记为//bootswap/(发音为root)是目录结构的父目录。/boot是系统内核和映射文件所在的地方。当内存的部分需要移动到硬盘上时,将使用swap分区。这被称为因过度承诺而将内存部分交换出到磁盘上。

以下通常位于单独的分区上:

  • /:它是父目录

  • /boot:引导和映射文件位于此处

  • (交换):它表示交换空间

以下传统上位于单独的分区上,但不一定要这样:

  • /home

  • /tmp

  • /etc

  • /var

以下是 Linux 系统上通常存在的文件系统和目录及其一般用途的部分列表。这是来自 Fedora 17 64 位的信息:

  • /:它是父目录。

  • /boot:引导、映射文件和系统内核都在其中。

  • (交换):它代表交换空间。

  • /root:这是超级用户的主目录。

  • /home:用户目录放在这里(例如,/home/guest1,在本书中一直在使用)。

  • /tmp:这是一个具有文件删除位设置的目录。用户和各种其他程序可以将临时文件放在这里。由 root 运行的cron作业会定期清理/tmp(通常一周一次)。

  • /usr:它包括操作系统(OS)的父用户目录。

  • /usr/bin:它包含操作系统的可执行程序。

  • /usr/etc:它包含操作系统的配置文件。

  • /usr/games:它包括发行版提供的游戏。

  • /usr/include:它包括用于编程语言如 C 的文件。

  • /usr/lib:它包含操作系统的库文件。

  • /usr/lib64:它包括 64 位版本的操作系统库文件。

  • /usr/local:系统管理员可以将用户程序放在这里供其使用。

  • /usr/sbin:它包含系统使用的操作系统可执行程序。

  • /usr/share:它包括操作系统的共享程序和文件。

  • /usr/src:操作系统的内核源代码、包含和制作文件都放在这里

  • /dev:它代表设备目录。例如,/dev/sda设备指向第一个 SCSI 硬盘。

  • /lib:它是指向/usr/lib的符号链接。

  • /lib64:它是指向/usr/lib64的符号链接。

  • /mnt:它用作挂载点。

  • /opt:它代表可选文件。

  • /var/logs:它包括操作系统的日志。

  • /var/spool:它包含打印机文件。

  • /var/run:操作系统在此处保存运行中的程序的数据。

  • /run:它是指向/var/run的符号链接。

  • lost+found:这是操作系统用来跟踪文件系统数据的地方。

  • /etc:它的发音是etcetera,代表其他所有东西。配置文件通常位于此处。

不同类型的虚拟文件系统如下:

  • /proc:操作系统在此处跟踪进程。有关更多信息,请参阅上一章。

  • /sys:操作系统在此目录中跟踪其他进程。

以下是以下列表中定义的一些其他有用术语:

  • 设备:它指的是整个磁盘。例如,第一个 SCSI 磁盘通常被命名为/dev/sda

  • 分区:它是设备名称后跟一个数字。第一个 SCSI 分区将是/dev/sda1

  • 文件系统:它定义了正在使用的文件系统类型。一些示例是ext2ext3ext4vfatxfs

  • 挂载点:它是指向分区的目录。/etc/fstab文件包含一个表,显示挂载点和它们关联的分区。这个文件是由系统安装程序(如 Anaconda)创建的,可以由超级用户手动编辑以添加或删除设备和挂载。

引导分区是操作系统内核和其他启动文件所在的位置。以下是在/boot中找到的文件的描述:

  • vmlinuz:它代表内核的符号链接。例如,在 Fedora 14 上,它指向vmlinuz-2.6.35.6-45.fc14.x86_64

  • initramfs:它代表初始 RAM 磁盘。在 Fedora 14 上,它被命名为initramfs-2.6.35.6-45.fc14.x86_64.img

  • config:此文件用于配置内核。我们将在第十章内核中看到更多内容。在 Fedora 14 上,它被命名为config-2.6.35.6-45.fc14.x86_64

  • map:这是系统映射文件,其中包含对各种内核例程的入口点。在 Fedora 14 上,它被命名为System.map-2.6.35.6-45.fc14.x86_64

初始 RAM 磁盘需要更多解释。该文件包含加载和运行内核所需的所有设备驱动程序。例如,内核需要访问硬盘才能启动。如果它需要特殊驱动程序(即,如果仅靠 BIOS 无法访问),则必须位于initramfs文件中,否则将无法完成该过程。initramfs文件是在系统安装期间创建的,并且可以由经验丰富的人修改。这通常在测试和/或使用新硬件时完成。这是一个压缩的GZIP文件,在启动时会被解压并放置在 RAM(内存)磁盘上。

以下是我 Fedora 17 系统上/boot和文件命令的快照:

介绍

df程序用于报告文件系统磁盘空间使用统计信息。以下输出是我 Fedora 14 系统上的df -h列表。-h参数将输出放入更易读的形式(在大型磁盘上很有用):

Big4 ~ # df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              97G   48G   45G  52% /
tmpfs                 5.9G  780K  5.9G   1% /dev/shm
/dev/sda1             485M   51M  409M  12% /boot
/dev/sda2             385G  124G  242G  34% /data
/dev/sda5              49G  8.3G   38G  19% /lewis
/dev/sdf1             932G  243G  690G  27% /megadrive
/dev/sdg1             7.3G  3.1G  4.3G  42% /usb

第一列显示文件系统的分区。第二列显示分区的大小。第三列是已使用的量,后面是仍可用的量。Use%是使用的百分比,最后一列是挂载点。

此输出告诉您有关我如何设置此系统的许多信息。我没有为/home/tmp/etc/var创建单独的分区。它们都在/下的同一分区中。我有所需的/boot分区,我将其大小设置得比默认值大,因为我经常构建新内核。还有一个单独的/data/lewis分区。所有提到的分区都在/dev/sda设备上。那么/dev/sdf1/dev/sdg1是什么设备和分区?第一个是 Iomega 外部 USB 驱动器,第二个是 8GB 的通用串行总线USB)存储设备。这些用于备份,以防主要驱动器出现故障。

fsck程序用于检查和可选修复损坏的文件系统。它可以并行检查多个文件系统以加快处理速度。如果未给出参数,则fsck默认为检查/etc/fstab文件中的文件系统。

在使用分区时,必须记住目录挂载在哪里。例如,假设/上的空间变得紧张,因此您决定删除位于/tmp目录中的一些大文件。您首先需要确保/tmp确实挂载在/上,而不是在自己的分区上。很容易犯这个错误,所以要记住。如果您是许多设置不同的机器的系统管理员,这将更加成问题。

使用 fdisk

fdisk程序用于操作磁盘分区表。您可以使用此实用程序创建、修改和删除分区。

做好准备

只要不使用写入磁盘的操作,您可以按照这些命令进行操作。但是,为了安全起见,您可能希望使用 USB 存储设备或其他您不在乎的驱动器或系统。

交互式版本的fdisk的语法是fdisk <device-name>。我将使用一个 4GB 的 USB 存储设备,/dev/sdb作为这个例子。请记住,fdisk适用于整个设备,因此在启动命令时不使用分区号。我们将以 root 用户身份执行这些操作。

以下是 Fedora 18 上fdisk的屏幕截图:

准备就绪

如何做...

执行以下步骤来运行fdisk

  1. 通过在设备上运行fdisk来启动命令:
fdisk /dev/sdb

  1. 显示帮助菜单:输入 an m。它会显示可以在此设备上执行的操作列表。

  2. 显示分区表:输入 a p。将显示此设备上的分区列表。

  3. 在我的 USB 存储设备的情况下,只有一个分区。所以让我们删除它:

enter a d

  1. 由于只有一个分区,默认情况下已删除。现在让我们添加一个:
enter an n
  1. 由于这是第一个分区,按a p键选择主分区。

  2. 现在运行输入 a 1并采用默认的起始扇区。

  3. 现在我们必须输入一个大小。这可以通过扇区号或大小来完成。让我们使用大小,将其设置为 1GB:

enter +1G

  1. 再次运行输入 a p以查看我们有什么。您应该看到类似以下输出:
 Command (m for help): p
 Disk /dev/sdb: 4009 MB, 4009754624 bytes, 7831552 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk identifier: 0xc3072e18
 Device Boot      Start         End      Blocks   Id  System
 /dev/sdb1            2048     2099199     1048576   83  Linux
 Command (m for help):

  1. 看起来不错。现在让我们添加另一个,然后采用默认设置:
enter n, then p, then 2, and the default first sector

  1. 这次让我们使用 2GB 的大小:
enter +2G

  1. 查看它的样子:
enter a p

  1. 现在表格应该显示两个分区。在这一点上,您可以继续创建更多分区,或者保存表格。如果您有所需的磁盘空间,随时可以稍后创建更多分区。

  2. 在这个例子中,我们将不保存更改而退出:

enter a q

  1. 为了确保没有出错,运行fdisk /dev/sdb -l来获取列表。它应该显示与我们开始时相同的内容。

还有更多...

您可能已经注意到fdisk帮助屏幕上提供了其他一些操作。您可以更改显示单位的方式,列出已知的分区类型,以及其他一些内容。有关更多信息,请参阅fdisk man页面。

使用 mkfs 格式化驱动器

mkfs命令在设备上构建文件系统(类似于格式化驱动器)。它确定文件系统类型并调用适当的mkfs.<type>程序。例如,如果您要运行mkfs -t ext4 /dev/sdb5,它实际上会运行mkfs.ext4程序。mkfs选项如下:

  • -t:指定所需的文件系统类型

  • -V:生成详细输出

  • -V:如果作为唯一参数使用,它会显示版本信息

  • -h:显示帮助屏幕

请注意,没有传递其他参数给文件系统的特定程序。还要注意,在某些情况下,需要提供大小值。

准备就绪

mkfs程序将销毁当前驻留在分区中的任何数据。因此,在继续此命令之前,请确保已备份所需的数据。一旦执行了此操作,就无法撤消。如果您想按照这些步骤操作,您应该先在一个您不在乎的 USB 存储设备或其他设备上练习。

在继续之前,请确保卸载分区。

如何做...

执行以下步骤来在 Linux 中格式化分区:

  1. 在这个例子中,我插入了一个 USB 存储设备(我不在乎的一个)。为了确保我们有正确的设备,请运行dmesg并查看最后一行:
dmesg | tail -20

  1. 在我的系统上,它显示设备是/dev/sdh1(根据您的设备进行替换)。它没有挂载,所以我准备好继续。但是,如果您的设备是自动挂载的,您应该能够通过运行以下命令卸载它:
umount /dev/sdh1

  1. 请注意,以下命令将销毁设备上的任何数据。因此,在继续之前,请确保已备份要保留的任何数据!

  2. 运行命令mkfs -V -t vfat /dev/sdh1。我的系统上显示以下输出:

Big2 /temp # mkfs -V -t vfat /dev/sdh1
mkfs (util-linux 2.21.2)
mkfs.vfat /dev/sdh1
mkfs.vfat 3.0.12 (29 Oct 2011)

  1. 现在挂载设备:mount /dev/sdh1 /usb2(根据需要替换您的设备和挂载点)。

  2. 运行ls -la /usb2。它应该看起来像以下输出:

Big2 /temp # ls -la /usb2
total 8
drwxr-xr-x.  2 root root 4096 Dec 31  1969 .
dr-xr-xr-x. 25 root root 4096 Jun  7 10:04 ..

这基本上就是mkfs的全部内容。在使用此命令时要非常小心,并在继续之前仔细检查一切。

使用 fsck 检查文件系统

为了检查和修复 Linux 文件系统,使用fsck程序。实际上,fsck只是文件系统特定检查器的前端(类似于mkfs)。

fsck程序可以并行运行在不同的文件系统上以加快处理速度。请注意,此功能可以在资源较低的机器上禁用。

一般来说,fsck的语法如下:

 fsck [-lsAVRTMNP] [-C [fd]] [-t fstype] [filesys...]  [--] [fs-specific-options]

准备工作

如果不正确使用fsck程序,可能会损坏当前驻留在分区上的数据。因此,在执行此命令之前,请确保已经备份了所有所需的数据。一旦执行了此操作,就无法撤销。如果您想要按照这些步骤操作,可以先在一个您不在乎的 USB 存储设备上练习。

在运行命令之前,设备必须被卸载。

如何操作...

执行以下步骤来检查和运行分区:

  1. 在此示例中,我插入了一个我不太在乎的 USB 存储设备。为了确保我们有正确的设备,请运行dmesg并查看最后一行:
dmesg | tail -20

  1. 在我的系统上,它显示设备是/dev/sdh1(相应地替换您的设备)。它没有挂载,所以我准备好继续。但是,如果您的设备是自动挂载的,您应该能够通过运行umount /dev/sdh1来卸载它。

  2. 现在我们可以运行fsck程序。我首先想看看它将采取什么行动,因此将使用-N选项。运行fsck -N /dev/sdh1。在我的系统上显示以下输出:

Big2 /home/guest1 # fsck -N /dev/sdh1
fsck from util-linux 2.21.2
[/sbin/fsck.vfat (1) -- /dev/sdh1] fsck.vfat /dev/sdh1

  1. 看起来不错,所以让我们包括一个进度条并真正运行它:fsck -C /dev/sdh1。在我的系统上获得以下结果:
Big2 /home/guest1 # fsck -C /dev/sdh1
fsck from util-linux 2.21.2
dosfsck 3.0.12, 29 Oct 2011, FAT32, LFN
/dev/sdh1: 1743 files, 234381/977025 clusters

由于这个 USB 存储设备没有问题,输出并不是很令人兴奋。我过去曾看到一些非常严重的错误,如果这种情况发生在您身上,我建议尽快将数据从驱动器上取出,然后使用mkfs重新格式化驱动器,或者为了安全起见,获取一个新的驱动器。

还有更多...

以下是fdisk的简要选项列表以及它们的功能:

  • -l:它将在检查之前锁定设备,一次只能用于一个设备。

  • -s:它将串行化文件检查操作。在交互模式下检查多个文件系统时很有用。

  • -A:它使用/etc/fstab文件中的条目一次性检查所有文件系统。通常,首先检查根文件系统,然后根据passno值检查其他文件系统。有关可用选项的更多信息,请参阅fstabman页面。

  • -C:它将显示一个进度条。

  • -M:指定不检查已挂载的文件系统。

  • -N:它将显示将在此设备上执行的操作,但实际上不会执行。

  • -P:它将并行检查根文件系统和其他系统。绝对不要使用此选项。

  • -R:它将在检查其他系统时跳过根文件系统。

  • -V:它将启用详细输出,因此建议使用。

以下是通常由特定文件系统程序支持的选项列表:

  • -a:它将自动修复文件系统,无需任何问题。请非常小心使用此选项,因为我曾在多次情况下看到它出现严重错误。

  • -n:此选项应告诉特定的检查器不执行任何修复。它不可靠,因此不建议使用。

  • -r:它将以交互方式修复文件系统。如果并行运行fsck,不要使用此选项。

  • -y:它告诉某些特定的检查器自动进行修复。

理论上,像ext3ext4这样的日志文件系统不应需要大量的检查或修复。如果在您的系统上不是这种情况,我会怀疑是硬件或者硬件 CMOS 级别的问题。确保系统中的所有内容都刷新到正确的版本。

注意

为了修复文件系统,它必须没有挂载。此外,检查已挂载的文件系统有时可能会产生虚假的错误消息。

逻辑卷管理(LVM)

Linux 的 LVM 允许将磁盘或磁盘阵列管理为一个大的存储池。一个 LVM 由一个或多个物理卷以及一个或多个逻辑卷组成。

例如,/root/home等目录位于一个逻辑卷中。有一些命令用于管理 LVM。有些操作在物理卷上进行,有些在逻辑卷上进行,有些在两者上都进行。

以下列表可用作 LVM 命令的快速参考指南:

  • pvcreate:它初始化磁盘或分区

  • pvchange:它改变一个或多个物理卷的分配权限

  • pvck:它检查物理卷的元数据

  • pvdisplay:它显示物理卷的属性

  • pvmove:它移动物理区段

  • pvremove:它移除一个物理卷

  • pvresize:它调整磁盘或分区的大小

  • pvs:它报告有关物理卷的信息

  • pvscan:它扫描所有磁盘以查找物理卷

  • vgcfgbackup:它备份卷组描述符区域

  • vgcfgrestore:它恢复卷组描述符区域

  • vgchange:它改变卷组的属性

  • vgck:它检查卷组的元数据

  • vgconvert:它转换卷组的元数据格式

  • vgcreate:它创建一个卷组

  • vgdisplay:它显示卷组的属性

  • vgexport:它使卷组对系统不可见

  • vgextend:它向卷组添加物理卷

  • vgimport:它使导出的卷组对系统可见

  • vgimportclone:它导入并重命名重复的卷组

  • vgmerge:它合并两个卷组

  • vgmknodes:它重新创建卷组目录和逻辑卷特殊文件

  • vgreduce:它从卷组中删除未使用的物理卷

  • vgremove:它移除一个卷组

  • vgrename:它重命名一个卷组

  • vgs:它报告有关卷组的信息

  • vgscan:它扫描所有磁盘以查找卷组并重建缓存

  • vgsplit:它将卷组分割成两个

  • lvchange:它改变逻辑卷的属性

  • lvconvert:它将逻辑卷从线性转换为镜像或快照

  • lvcreate:它在现有卷组中创建逻辑卷

  • lvdisplay:它显示逻辑卷的属性

  • lvextend:它扩展逻辑卷的大小

  • lvmdiskscan:它扫描所有对 lvm2 可见的设备

  • lvmdump:它为诊断目的创建 lvm2 信息转储

  • lvreduce:它减小逻辑卷的大小

  • lvremove:它移除一个逻辑卷

  • lvrename:它重命名逻辑卷

  • lvresize:它调整逻辑卷的大小

  • lvs:它报告有关逻辑卷的信息

  • lvscan:它扫描所有磁盘以查找逻辑卷

准备工作

以下命令假定您正在运行一个了解 LVM 的系统。请注意,您不需要实际上将驱动器格式化为 LVM 格式才能尝试这些命令。

如何做...

以下是您可以在系统上尝试的一些非破坏性命令(您需要以 root 用户身份运行这些命令):

  1. 让我们看看系统上的所有物理卷:
pvdisplay

  1. 现在让我们扫描磁盘:
pvscan

  1. 然后,显示卷组的属性:
vgdisplay

  1. 我们报告有关卷组的信息:
vgs

  1. 然后扫描所有卷组的磁盘:
vgscan

  1. 然后需要显示逻辑卷的属性(这个经常使用):
lvdisplay

  1. 扫描所有对 LVM 可见的设备:
lvmdiskscan

  1. 报告有关逻辑卷的信息:
lvs

  1. 扫描所有磁盘以查找逻辑卷:
lvscan

以下是我在我的 Fedora 14 系统上的pvdisplayvgdisplay的屏幕截图:

如何做...

还有更多...

如果您习惯于传统的磁盘驱动器配置方法,LVM 可能需要一段时间才能习惯。我发现 man 页面在这方面非常好,互联网上也有一些很好的文章。

了解不同的文件系统

在撰写本文时,Linux 上有 60 多种不同的文件系统可用。以下是您可能经常遇到的常见文件系统的简要概述:

  • Btrfs:B 树文件系统是由 Oracle 于 2007 年开发的写时复制文件系统。它仍处于开发阶段,被认为是实验性的。Btrfs的意图是允许文件系统随着驱动器变得越来越大而扩展。由于其优势,它被认为是取代ext4的文件系统。

  • ext2:它是在 1993 年引入的。这个文件系统没有日志记录,因此每个周期的写入较少,使其成为闪存驱动器的良好选择。

  • ext3:它与ext2非常相似,但增加了日志记录,这提高了可靠性,特别是在非正常关闭后。

  • ext4:发布于 2008 年,被认为是ext3的后继者。它可以处理高达 1 exbibyte 的卷和高达 16 tebibytes 的文件。这个文件系统使用范围来替代早期版本的 ext 使用的传统块映射方案。它具有增强功能,可以加快文件系统检查(fsck)的速度。

  • FAT:这是文件分配表的缩写,最初由 DOS、OS/2 和 Windows 使用。它主要在内核中提供对外部设备(如 USB 闪存驱动器)的支持。

  • ReiserFS(或Reiser3):这是一个带有日志记录的通用文件系统,最初由 Hans Reiser 设计和编写。当它被创建时,它包含了当时尚未可用的许多功能,包括日志记录、在线增长和限制内部碎片的方案。

  • Reiser4:这是ReiserFS的后继者(由于设计者 Hans Reiser 因谋杀罪被定罪,未来的发展是不确定的)。

第八章:使用脚本

在本章中,我们将涵盖以下主题:

  • 从文件中删除文本

  • 使用脚本参数

  • 在脚本中编写循环

  • 备份您的系统

  • 一次只能为一个用途锁定文件

  • 熟悉 Perl

介绍

知道如何编写脚本将使您能够更有效地运行您的系统。编写脚本很容易;您不需要计算机科学学位或类似的东西。更好的是,您需要创建和运行脚本的一切都已经在您的 Linux 系统上可用。

编程时要记住的主要事情是要像计算机一样思考。尝试理解每个步骤的作用。如果遇到问题,请仔细查看相关的行。计算机会按照您的指示每次执行。

在这些示例中,我们将编写Bash shell 脚本。以指示使用的 shell 为开头的每个脚本是良好的编程实践。这是通过以第一列开始的一行来完成的,例如以下内容:

#!/bin/sh

使用文本编辑器创建脚本。我看到有人试图使用文字处理软件来编写脚本,但我不建议这样做。文字处理软件笨重,似乎总是会在文件中插入不良字符(尽管它们声称不会)。如果您现在还不知道,学习如何使用EMACSvi或其他文本编辑器(参见第三章,“文件和目录”)。您会为此感到高兴的。

为了将脚本作为命令执行,您需要更改文件的权限。例如,如果您已经创建并保存了一个名为mycmd的文本文件,您可以通过运行以下命令使其可执行:

 chmod 755 mycmd

如果您没有进行过太多的脚本编写,为了安全起见,我建议在创建和运行脚本时使用用户帐户。当您感到舒适(或者如果您已经感到舒适),您可以以 root 身份运行。您可能会在某个时候必须这样做,特别是如果您是系统管理员。

以下段落中给出了几个脚本示例。这些应该很好地说明了脚本可以用于什么以及如何编写它们。

从文件中删除文本

脚本可以编写成几乎您能想象到的任何事情。以下是一个这样的例子。

如何做到...

以下是一个可以用于去掉示例中行号的脚本的清单。然后您可以在您的系统上按原样运行它们。

脚本 1 - 去掉行号

 1  #!/bin/sh
 2  # removelines 5/1/2013
 3  if [ "$1" = "" ] ; then
 4   echo "Usage: removenumbers filename > newfile"
 5   echo " This script will remove the line numbers from the beginning of the lines"
 6   echo " in filename. It assumes the number field is 5 characters wide."
 7   echo " Use the redirection operator to save the output to a new file."
 8   exit
 9  fi
 10  cat $1 | cut -c 1-5 --complement

它是如何工作的...

让我们讨论一下前面给出的行是做什么的。

  • 第一行告诉操作系统这个脚本是为哪个 shell 准备的。

  • 第 2 行在第一列有一个#。这被称为注释行。这里我有脚本编写的日期。

  • $1变量是您在命令名称之后给出的第一个参数。如果没有给出参数,它将等于空字符串("")。Usage文本将显示,并且脚本将在第 8 行退出。

  • 如果确实给出了参数,此脚本假定它是一个文件名,因此,处理将继续到第 10 行。

  • 第 10 行使用cat命令来流式传输文件的内容。在这种情况下,流被传输到cut命令。

  • cut命令通常会保留每行的前五个字符并丢弃其余部分。但是,由于我使用了--complement标志,它做的恰恰相反。许多 Linux 命令都有这个选项或类似的选项。

还有更多...

如果您想在您的系统上尝试这个,请执行以下步骤:

  1. 打开一个文本编辑会话,例如vi removelines.txt

  2. 通过按I.vi置于插入模式。

  3. 从书中复制脚本的文本并粘贴到vi中。保存文件并退出:wq

  4. 现在运行以下命令:

cat removelines.txt | cut -c 1-5 --complement > removelines

  1. 然后使其可执行:
chmod 755 removelines

  1. 运行以下命令:
removelines

如果一切顺利,使用屏幕应该会出现。您现在可以在本章的其余示例中使用此脚本。

使用脚本参数

这里我们展示了如何计算和显示给脚本的参数数量。

如何做...

以下是脚本清单:

脚本 2 - 参数

 1  #!/bin/sh
 2  # 5/1/2013
 3  echo Script showing how to count and show the parameters
 4  N=$#
 5  echo Number of parameters: $N
 6  if [ $N -eq 0 ] ; then
 7    echo "Usage: $0 parameters and/or a mask"
 8    exit
 9  fi
 10  for i in $* ; do
 11   echo Parm: $i
 12  done

它是如何工作的...

  • 您已经知道第 1 到 3 行的作用。$#内置变量包含给脚本的参数数量。在第 4 行,我们将变量N设置为该值。

  • 第 5 行显示了N的值。请注意,要访问变量,必须在其前面加上$字符。

  • 在第 6 行,我们测试N以查看是否给出了任何参数。如果没有,我们显示Usage消息,并在第 8 行退出。

  • 第 10 行是一个for循环的示例。注意语法,并不要忘记循环结束时的done命令。请注意,$*是一个内置变量,其中包含给脚本的所有参数的列表。

  • 在第 11 行,我们显示了i变量的值。

还有更多...

  1. 通过按照前一节中的示例进行更改,将其命名为parameters,使其成为您系统上的可执行脚本。

  2. 运行它:parameters(您可能需要在系统上运行. /parameters)。

  3. 您应该看到Usage消息。现在使用以下命令运行它:

parameters 1 34 56

  1. 它应该显示数字 3,然后每个参数一行。

  2. 尝试使用其他数字。还尝试一些通配符字符。

注意

变量需要更多的解释。例如,以下是数字:

i=1
RC=0

您可以按以下方式测试数字:

if [ $i -eq 0 ] ; then           # test for equal
if [ $RC -ne 0 ] ; then       # test for not equal

以下是字符串:

FNAME=Jim
LNAME=Lewis
if [ "$FNAME" = "Jim" ] ; then     # test string equality
if [ "$LNAME" = "Lewis" ] ; then   # test string equality

这是另一种情况,记住它是相反的。使用诸如-eq之类的字母来测试数字,使用=和其他数字运算符来测试字符串。

在脚本中编写一个循环

我们之前的脚本是快速运行完成的命令。这是一个运行直到您决定终止它的脚本的示例。请注意,如果不需要参数,则可能不需要Usage部分(但一定要在注释部分说明脚本的功能)。

此脚本通过每分钟一次 ping 服务提供商来监视网络连接的状态。失败将被记录到文件中。

如何做...

以下是程序清单:

脚本 3 - 循环

 1  #!/bin/sh
 2  #
 3  #  Check network once a minute and log failures to a file
 4  PROVIDER=192.168.1.102
 5  tput clear
 6  while [ 1 ]
 7  do
 8    echo Written by Jim Lewis 2/21/2007
 9    echo Pinging $PROVIDER
 10    ping -c 1 $PROVIDER
 11    rc=$?
 12    if [ $rc -ne 0 ] ; then
 13      echo Cannot ping $PROVIDER
 14      date >> log1.txt
 15      echo Cannot ping $PROVIDER >> log1.txt
 16    fi
 17    sleep 60
 18  done

它是如何工作的...

  • 第 4 行是您的服务提供商的 IP 地址或域名。在本例中,我使用了我的bigtwo机器。请注意,如果将此变量放在您的.bashrc文件中(参见第一章,“使用终端/命令行”),那么如果将来更换服务提供商,您只需要在一个地方进行更改。

  • 第 5 行清除屏幕。

  • 第 6 行可能看起来有点奇怪。是的,这就是所谓的无限循环。但是,脚本仍然可以通过按下CtrlC,通过向其发出 kill 命令,或者通过让它监视一个文件(稍后会详细介绍)来终止。

  • 在第 7 行,记住while语句需要在其后有一个语句。

  • 第 10 行使用了ping命令。-c 1变量告诉它只 ping 一次。

  • 第 11 行保存了上一个命令的错误代码。

  • 如果没有错误,则ping命令返回0。如果存在错误,第 14 行将系统日期附加到log1.txt文件中。

  • 第 15 行然后将文本附加到日志文件中。

  • 第 17 行等待 60 秒,然后循环在第 6 行重新开始。

我从 2007 年 1 月开始运行这个脚本。我已经多次使用log1.txt文件来说服我的服务提供商改进他们的服务。

以下是我在 Fedora 17 系统上运行的脚本的截图:

它是如何工作的...

还有更多...

执行以下步骤来运行此脚本:

  1. 按照前几节的步骤创建文件。您可以根据需要对其进行命名,只要不会与另一个脚本或程序冲突即可。我将其命名为loop1

  2. 在您的系统上打开一个终端。我建议将其设置得比之前的截图小一些。

  3. 您无需以 root 身份运行此脚本。因此,只需键入您给它的名称即可启动它。

  4. 请记住,这个脚本是一个循环;它会一直运行直到你终止它。

  5. 你应该不时查看log1.txt文件,以了解你的互联网连接有多可靠。请注意,如果你的连接经常中断,这个文件可能会变得非常大。

这样的脚本经常被使用,特别是在执行系统管理职责时,用于监视网络资源。

一个警告,谨慎使用ping等服务。例如,不要过多地 ping 你的提供商。一分钟一次就可以了。在开发这样的脚本时,使用本地 ping 地址进行测试,直到你完全掌握它。

系统备份

自动化任务是使脚本真正强大的地方。你可以花一些时间把脚本做得完美,然后让它自己运行。我现在每个 Fedora 系统上至少有十个脚本在运行。

这就是我所谓的穷人备份实用程序。过去,我曾尝试过一些商店购买的程序,但对软件质量感到失望。最糟糕的是需要备份文件,然后发现根本没有!这个脚本由一个cron作业每天晚上 3 点调用。我们将在下一章介绍 cron。

如果你想尝试并使用这个脚本,请确保你理解正在发生什么。备份目录必须首先手动创建,以及filenum1文件。

如所写的这个脚本必须以 root 身份运行。

如何做...

我使用以下脚本来备份我的文件:

脚本 4 - 备份

 1  #!/bin/sh
 2  #   Jim's backup program
 3  # Change to an appropriate directory on your system
 4  cd /lewis/backup
 5  VER="File backup by Jim Lewis 4/25/2011 A"
 6  echo $VER
 7  date >> datelog.txt
 8  T=`cat filenum1`
 9  T=`expr $T + 1`
 10  if [ $T -gt 7 ] ; then
 11   T=1
 12  fi
 13  echo $T > filenum1
 14  TDIR=/temp/linuxbook/chap8/backups$T
 15  echo "Removing files from $TDIR"
 16  cd $TDIR
 17  pwd
 18  rm *.gz
 19  echo "Backing up files to $TDIR"
 20  X=`date "+%m%d-%H"`              # create a timestamp
 21  echo $X
 22  cd /
 23  tar -cvzf "$TDIR/lewis$X.gz" lewis
 24  tar -cvzf "$TDIR/temp$X.gz" temp
 25  tar -cvzf "$TDIR/root$X.gz" root
 26  cd /home
 27  tar -cvzf "$TDIR/guest$X.gz" --exclude=Cache --exclude=.cache --exclude=.evolution --exclude=vmware --exclude=.thumbnails  --exclude=.gconf --exclude=.kde --exclude=.adobe   guest1
 28  echo $VER
 29  cd $TDIR
 30  pwd
 31  ls -lah

它是如何工作的...

  • 第 4 行切换到我的备份目录。你会想在你的系统上更改这个。

  • 第 7 行将当前日期附加到datelog.txt文件中。我不时检查这个文件,确保一切看起来都很好。

  • 第 8 行看起来真的很奇怪;那些反引号是干什么的?filenum1文件包含一个数字,这是下一个要复制备份文件的目录(总共 7 个)。你知道,如果你cat这个文件,它会在屏幕上显示它的内容。嗯,反引号的意思是运行这个命令,但将结果表达式放入一个变量中。这听起来很复杂,但你会很快习惯的。

  • 变量T现在有了下一个要使用的目录的编号。第 9 行使用expr命令来评估表达式,并将1加到T上。

  • 第 10 行检查T是否大于7,如果是,就将它设置回1。是的,我做了七次备份,每周一次。叫我偏执狂吧!

  • 第 13 行将T的新值复制回filenum1以供下次使用。

  • 第 14 行设置了TDIR变量,其中包含我们要复制文件的备份目录。

  • 第 16 行切换到TDIR

  • 第 17 行显示当前工作目录。我在编写这个脚本时加入了这个,习惯了它的存在,所以留了下来。这完全是可选的。

  • 第 18 行删除了先前压缩的备份文件。我强烈建议你在首次尝试这个脚本时注释掉这一行。然后,在确保一切正常之后,你可以把它放回去。

  • 第 20 行设置了一个日期时间戳。同样,反引号操作符被用来将日期的值放入一个变量中(在这种情况下是X)。

  • 第 22 行切换到/

  • 第 23、24 和 25 行备份了/lewis/temp/root目录。

  • 第 26 行切换到/home

  • 第 27 行打包了我的/home/guest1目录。tar的参数告诉它从归档中排除哪些目录。查看tar man页面以获取更多信息。

  • 第 28 行显示脚本版本,第 29 行返回到备份目录,第 30 行显示目录名称,第 31 行显示文件列表。

这个脚本更像是一个示例,而不是一个真正的备份程序,但这是一个很好的起点。我使用的真正的备份程序与此类似,但还将文件复制到外部 USB 驱动器和另一台远程计算机(使用无人值守的scp)。每当我想要创建一个新的 Linux 机器时,我只需将这些文件复制到它并解压缩,配置和源我的.bashrc,然后我就可以运行了。

一次只能使用一个文件的锁定

这对我来说经常发生。有时候您可能想通过运行一个简单的脚本在终端中编辑一个文件。但是,如果文件已经在另一个终端中打开,那么一个会话中进行的更新可能会在另一个会话中被覆盖。以下脚本应该有助于防止这种情况发生。

操作步骤...

以下是防止同一个文件同时被多个终端编辑的简单方法:

脚本 5 - 文件锁定

 1  #!/bin/sh
 2  # todo script 5/1/2013
 3  FN1=/tmp/file.lock
 4  if [ -f $FN1  ] ; then
 5   echo -n "File is being used in tty: "
 6   cat $FN1
 7   exit
 8  fi
 9  echo `tty` > $FN1
 10  # perform your actions(s) here
 11  kw /lewis/todo.txt
 12  rm $FN1

它是如何工作的...

  • 第 3 行将变量FN1设置为锁定文件的名称。

  • 第 4 行检查锁定文件是否存在。如果存在,它会显示锁定文件的内容并退出脚本。

  • 如果锁定文件不存在,我们将到达第 9 行。现在通过将tty命令的输出重定向到文件来创建锁定文件。

  • 在第 11 行,您可以执行任何您想要的操作。在我的情况下,我在这里使用kw,我的文本编辑器编辑/tmp/todo.txt。即使编辑器会话关闭,脚本的处理也会继续。

  • 第 12 行删除锁定文件。

这很简单,而且效果非常好。我使用这个脚本的一个版本来编辑我的几个重要文件。todo脚本可以从系统的任何位置运行,并且todo.txt文件会显示在我的文本编辑器中。如果我在文件仍在被编辑时离开到另一个会话或窗口,然后尝试再次运行todo,它将不允许编辑。它还会告诉我tty是否在原始会话中。这可以帮助我更快地再次找到它,这对我来说非常有用,因为我总是有很多工作区和终端打开。

介绍 Perl

Perl 是一种可以用于文本处理、Web 开发、网络编程、系统管理、GUI 开发等等的编程语言。它被设计成易于使用和高效,您可以在脚本中使用传统的过程化方法或面向对象的方法。Perl 还有一个相当大的第三方附加模块列表,使其具有更多的功能。

准备工作

在本节中,我们将只涵盖 Perl 的基础知识。大多数典型的 Linux 系统都已经安装了它和文档。要查看简要介绍,请在您的系统上运行perldoc perlintro。Perl 介绍应该会立即出现。

要运行 Perl 脚本,可以使用以下 Perl 命令:

perl filename.pl

.pl参数是通常赋予 Perl 脚本的扩展名。您还可以在脚本中放置 Perl 的路径,类似于我们在bash中所做的。首先运行which perl以查看 Perl 的位置,然后将其放在脚本的第一行中:

#!/usr/bin/perl

这是 Fedora 上的正确路径。与bash脚本一样,使用文本编辑器创建它们,并使用chmod 755 filename.pl使其可执行。现在,您只需输入命令的名称即可运行它。

操作步骤...

以下是我在开始学习这种语言时写的一个小 Perl 脚本:

 1  #!/usr/bin/perl
 2  #  t1.pl - Perl practice script 1
 3  use strict;
 4  use warnings;
 5  sub displaymessage
 6  {
 7   my $message = shift;
 8   print "message: $message\n";
 9  }
 10  system("tput clear");
 11  print "Practice script 1 5/4/2013\n";
 12  my $name = "Jim";
 13  print "name: $name\n";
 14  my @numbers = (23, 42, 69, 71);
 15  print "numbers 0: $numbers[0]\n";
 16  print "Last element is: $numbers[$#numbers]\n";
 17  if($numbers[0]==23)
 18  {
 19   print "numbers 0 is equal to 23\n";
 20  }
 21  my $count = 0 ;
 22  foreach (@numbers)
 23  {
 24   print "Element $count is  $_\n";
 25   $count++;
 26  }
 27  print "Opening input.txt ...\n";
 28  open(my $in,  "<",  "input.txt")  or die "Cannot open input.txt for reading: $!";
 29  print "Opening output.txt ...\n";
 30  open(my $out, ">",  "output.txt") or die "Cannot open output.txt for writing: $!";
 31  while (<$in>)
 32  {
 33   print "line $_";
 34   print $out $_;
 35  }
 36  close $in or die "$in: $!";
 37  close $out or die "$out: $!";
 38  displaymessage("Type some keys. Press 'c' to clear the screen and 'q' to quit:");
 39  my $key = 1;
 40  $count = 1;
 41  while($count < 500)
 42  {
 43  # read a key from the keyboard
 44   open(TTY, "+</dev/tty") or die "no tty: $!";
 45   system "stty  cbreak </dev/tty >/dev/tty 2>&1";
 46   $key = getc(TTY);
 47   if($key eq 'c')
 48   {
 49    system("tput clear");
 50   }
 51   if($key eq 'q')
 52   {
 53    print "\nEnding the script\n";
 54    $count = 10000;
 55   }
 56   $count++;
 57  }

它是如何工作的...

  • 第 1 行告诉 shell 要使用哪个解释器。

  • 第 3 行告诉编译器在语法上要非常严格。也始终使用这一行。

  • 第 4 行表示显示所有警告。也始终使用这个。

  • 第 5 到 9 行是一个子例程。第 7 行将子例程的第一个参数放入变量消息中。第 8 行显示它。

  • 第 10 行清除屏幕。

  • 第 11 行告诉我们这个脚本应该是什么。请注意行尾的\n参数。这代表换行,表示将下一个打印输出继续到下一行。

  • 第 12 行将变量名设置为Jim。注意名称前面的$符号。不要忘记它。

  • 第 13 行显示变量。

  • 第 14 行创建一个数字数组。注意@字符。

  • 第 15 行显示数组中的第一个元素。

  • 第 16 行使用特殊的 Perl 语法$#numbers显示最后一个元素。

  • 第 17 行检查元素0是否真的等于23。注意双等号。

  • 第 21 行创建变量count并将其设置为0

  • 第 22 行是另一个特殊的 Perl 约定。foreach命令表示逐个遍历数组中的元素。这是一个非常方便的功能。

  • 第 24 行展示了特殊的$_结构如何显示数组的每个元素。

  • 第 25 行将计数增加1

  • 下面的几行是在 Perl 中处理文件的一种方法。它尝试打开input.txt文件进行读取,output.txt进行写入。input.txt文件必须存在,否则程序将出错并在此停止。input.txt的内容如下:

line 1
line 2
line 3
line 4
line 5

  • 第 30 行打开输出文件。

  • 第 31 到 35 行读取input.txt中的每一行并将其写入output.txt

  • 第 36 和 37 行关闭文件。不要忘记在脚本中执行这一步。

  • 第 38 行使用我们之前创建的子例程显示一条消息。

  • 第 39 行创建并设置key变量。

  • 第 40 行将count变量重新设置为1

  • 第 41 行开始一个while循环。

  • 第 43 到 46 行是在 Perl 中从键盘读取键的一种方法。如果这对你来说看起来很复杂,我完全同意。

其余的行都是不言自明的。当用户按下q退出时,count变量增加到10000。这会导致第 41 行的while循环提前结束,有效地结束脚本。你也可以在这里使用一个循环控制变量。

以下是我系统上运行的上一个脚本的屏幕截图:

它是如何工作的...

还有更多...

尽管这是一个非常琐碎的脚本,但你可以用 Perl 做很多事情。许多年前,当我刚开始接触家用电脑时,有一个基于星际迷航的文本模式游戏可以玩。我得到了这个 BASIC 游戏的副本,最终用 C 语言重写了它。几个月前,我决定再次重写它,这次使用 Perl。它还没有完成,可能是因为我太忙于写这本书,但它正在进行中。

关于 Perl 的好书应该很容易找到。我买了几本,发现它们在我试图更详细地学习它时非常有价值。

有几百个标准的 Linux 实用程序可以独立使用或在脚本中使用。以下是一些最常见的一些命令的简短列表。每当你需要执行任何任务时,请在这里检查,看看你是否可以将其中一些命令纳入你的脚本中。

以下实用程序位于/bin目录中:

  • awkgawk:用于模式扫描和处理语言

  • basename:用于从文件名中剥离目录和后缀

  • bash:GNU 的 Bourne-Again Shell

  • cat:用于连接文件并在标准输出上打印

  • chmod:用于更改文件模式位

  • chown:用于更改文件所有者和组

  • cp:用于复制文件和目录

  • cut:用于从文件的每一行中删除部分

  • date:用于打印或设置系统的日期和时间

  • dmesg:用于打印或控制内核环形缓冲区

  • echo:用于显示一行文本

  • find:用于在目录层次结构中搜索文件

  • grepegrepfgrep:用于打印匹配模式的行

  • hostname:用于显示或设置系统的主机名

  • ls:用于列出目录内容

  • mkdir:用于创建目录

  • mktemp:用于创建临时文件或目录

  • mv:用于移动(重命名)文件

  • pingping6:用于向网络主机发送ICMP ECHO_REQUEST

  • ps:用于报告当前进程的快照

  • pwd:用于打印当前工作目录的名称

  • rm:用于删除文件或目录

  • sed:用于调用流编辑器来过滤和转换文本

  • sleep:表示延迟一定时间

  • sort:用于对文本文件的行进行排序

  • tar:用于将文件组合并可选地压缩到单个存档中

  • touch:用于更改文件时间戳

以下实用程序位于/usr/bin中:

  • diff:用于逐行比较文件

  • dirname:用于从文件名中剥离最后一个组件

  • expr:用于评估表达式

  • file:用于确定文件类型

  • flock:用于从 shell 脚本管理锁

  • stat:用于显示文件或文件系统状态

  • tee:用于从标准输入读取并写入标准输出和文件

  • time:用于计时简单命令或提供资源使用情况

  • tty:用于打印连接到标准输入的终端的文件名

  • uniq:用于报告或省略重复的行

  • unzip:用于列出、测试和提取ZIP存档中的压缩文件

  • who:用于显示谁已登录

  • xargs:用于从标准输入构建和执行命令行

以下命令内置于 shell 中:

  • cd:用于更改目录

  • echo:用于显示一行文本

  • exit:导致 shell 退出(带有可选的返回代码)

  • export:用于设置环境变量

  • kill:用于向进程发送信号或终止进程

  • read:用于从键盘获取字符串并将其放入变量中

第九章:使用 Cron 自动化任务

在本章中,我们将涵盖:

  • 创建和运行 crontab 文件

  • 每隔一周运行一个命令

  • 报告来自 crontab 文件的错误

介绍

cron 守护程序通常由操作系统自动启动,每分钟查看所有 crontab 文件。如果满足了标准,就会运行命令。在本章中,我们将展示如何使用 crontab 程序创建和维护您的 crontab 文件。

根据系统设置的方式,cron 作业是否允许(允许或不允许)取决于用户。控制这一点的文件位于/etc中,命名为cron.allowcron.deny。这些将在以下部分中解释:

  • cron.allow:如果此文件存在,则用户必须在其中列出,才能使用 crontab

  • cron.deny:如果cron.allow不存在但cron.deny存在,则用户不得列在cron.deny文件中

如果两个文件都不存在,则只有 root 用户可以使用该命令。在大多数 Linux 系统中,只有cron.deny存在且为空。在运行以下命令之前,请在您的系统上检查这一点。

我们将使用一个用户帐户来尝试 crontab。crontab命令用于对 crontab 文件进行更改,不应直接编辑。要查看当前用户的 crontab,请运行crontab -l

编辑当前用户的 crontab 文件的命令是crontab -e。默认情况下,这将在 vi 编辑器中打开 crontab 文件。但是,您可以更改EDITOR环境变量以使用任何文本编辑器。

以下是典型用户 crontab 文件的格式:

#
#  crontab for jklewis
# Field 1   2    3            4              5             6
#      Min Hour Day of month Month of year  Day of week
#     0-59 0-23 1-31         1-12           0-6   0=Sun /path/command
#
# Days of the week: 0=Sun 1=Mon 2=Tues 3=Wed 4=Thu 5=Fri 6=Sat

我总是将此模板添加到 crontab 文件的顶部,以便我可以轻松记住这些字段是什么。以下是一个示例 crontab 条目:

 10     0     *     *     0     /path/mycommand

这些值可以是整数、范围、元素或元素列表,或星号。星号表示匹配所有有效值。

  • #:这表示一行被注释。它必须是行上的第一件事(不要把它放在行的末尾)。

  • 字段 1:这是分钟。它从 0 开始,意味着 00:00。

  • 字段 2:这是小时。它从 0 开始,意味着凌晨 12:00。

  • 字段 3:这是一个月中的日期。

  • 字段 4:这是一年中的月份。也可以使用名称。

  • 字段 5:这是一周中的日期。它从 0 开始,即星期日。也可以使用名称。

  • 字段 6:这是要运行的路径/命令。

此示例条目将在每个星期日的凌晨 12:10 运行mycommand

提示

只使用空格来分隔字段。不要使用制表符。

创建和运行 crontab 文件

在这里,我们将展示创建和运行用户 crontab 文件的示例。

准备工作

确保您的系统按照介绍中概述的方式设置。我们将使用两个终端会话,以便更容易地查看我们的结果。

如何做...

以下是创建和运行 crontab 文件的示例:

  1. 在终端会话中运行tty并记住输出。这将在第 10 步中使用。

  2. 打开或使用另一个终端,使用用户帐户。我将使用jklewis,就像在前几章中一样。

  3. 让我们通过运行以下命令来查看 crontab 文件:

crontab -l

  1. 它可能会说类似于jklewis 没有 crontab,这是可以接受的。

  2. 现在让我们通过运行以下命令来创建一个:

crontab -e

  1. 它可能会说类似于jklewis 没有 crontab - 使用空的,这是好的。

  2. Crontab 应该在 vi 中打开一个临时文件(除非您已更改了EDITOR变量,就像我在我的系统上做的那样)。在保存文件并结束会话之前,文件不会被使用。

  3. 我建议将我上面创建的模板剪切并粘贴到您的 crontab 文件中。这将使您更容易记住这些字段。

  4. 现在让我们添加一个条目,我们可以看到效果很快。将以下行插入文件(剪切和粘贴应该有效):

TTY=/dev/pts/17
# crontab example 1
*   *   *    *    *     date > $TTY; echo "Yes it works" > $TTY

  1. TTY行更改为您在步骤 1 中找到的内容。

  2. 现在保存文件并退出会话。您应该会看到以下消息:

crontab: installing new crontab

  1. 在接下来的一分钟内,您应该在另一个会话中看到以下输出:
Tue May  7 19:52:01 CDT 2013
Yes it works

  1. 我们刚刚使用所有这些星号创建的条目意味着每分钟运行一次命令。再次编辑 crontab 并将行更改为以下代码:
*/5    *   *   *   *   date > $TTY; echo "Every 5 minutes"  > $TTY

  1. 那种奇怪的语法是一种跳过或增加值的方法。现在尝试以下命令:
35     9     *     *     1-5   date > $TTY; echo "9:35 every week day"  > $TTY

  1. 每周一至周五上午 9:35 运行。日期字段中的 1-5 是一个范围。

  2. 名称也可以用于日期和月份字段,如以下命令:

17   13    8     May   Wed   date > $TTY; echo "May 8 at  13:17"  > $TTY

  1. 以及以下命令:
0   0    *     *      Fri   date > $TTY; echo "Run every  Friday at 12:00 am"  > $TTY

对于名称,使用标准的三个字母缩写,大小写不重要。使用名称可能更容易,但是您不能在名称中使用范围或步长。

每隔一周运行一次命令

现在我们已经了解了 cron 的基础知识,您将如何设置条目以每隔一周运行一次命令?您可能会尝试类似以下代码的东西:

 *  *  *  *  0/2   /path/command

这意味着从星期日开始,然后每隔一周运行一次,对吗?不,这是错误的,但是您经常会在网站上看到这样的解决方案。Cron 实际上没有内置的方法来做到这一点,但有一个解决方法。

操作步骤如下...

以下是每隔一周运行命令的步骤:

  1. 在您的主目录中创建以下脚本,并将其命名为cron-weekly1(随意剪切和粘贴):
#!/bin/sh
# cron-weekly1
# Use this script to run a cron job every other week
FN=$HOME/cron-weekly.txt
if [ -f $FN  ] ; then
 rm $FN
 exit
fi
touch $FN
echo Run the command here

  1. 通过运行以下命令使脚本可执行:
chmod 755 cron-weekly1

  1. 通过运行以下命令在您的用户帐户下运行:
crontab -e

  1. 添加以下行:
 0  0  *  *  0    $HOME/cron-weekly1

  1. 结束您的编辑会话。这将安装修改后的 crontab 文件。

工作原理...

看看这个脚本。第一次运行时,cron-weekly.txt文件不存在,因此它会被创建,并且会执行命令(您想每隔一周运行的命令)。下周,当再次运行此脚本时,它会看到cron-weekly.txt文件存在,然后删除它,然后退出脚本(不运行命令)。这样每周交替进行,有效地每隔一周运行一次命令。很酷,对吧?

在前面的cron-weekly1脚本中,命令在第一次运行脚本时执行。您可以通过将运行命令的行移动到if语句内部来更改为从下一周开始运行命令。

尽管这样做可能非常诱人,但不要在行尾加上注释#。Cron 无法判断它是注释还是命令的一部分。如果 cron 报告了一些您不理解的错误,请检查放错位置的注释。是的,我承认我偶尔还会这样做。

如果您做了 cron 不喜欢的事情(例如在前面部分显示的* * * * 0/2 command行),当您关闭会话时它通常会报告错误。然后它会给您重新编辑文件的选项。务必这样做,要么解决问题,要么至少注释该行。您可以稍后返回并再次编辑它。

您可以通过运行crontab -r完全删除 crontab 文件。我建议在执行此操作之前先备份文件,以防万一。您应该能够通过您选择使用的任何文本编辑器将文件保存为新名称。

还有更多...

Crontab 文件可以使用环境变量。以下是一些常见的环境变量:

  • SHELL:这告诉操作系统使用特定的 shell,覆盖了/etc/passwd文件中的内容。例如,SHELL=/bin/sh

  • MAILTO:这告诉 cron 将错误邮寄给此用户。语法是MAILTO=<user>,即MAILTO=jklewis

  • CRON_TZ:用于设置特定的时区变量,即CRON_TZ=Japan

Cron 有一些快捷方式可供使用。这些用于替代 5 个时间和日期字段,如下所示:

命令的快捷方式 命令 输出
@reboot 重启后运行一次
@yearly or @annually **0 0 1 1 *** 每年的第一天
@monthly **0 0 1 * *** 每月第一天
@weekly 0 0 * * 0 每周日凌晨 12:00 运行
@daily **0 0 * * *** 每天凌晨 12:00 运行
@hourly **0 * * * *** 每小时整点运行

因此,在前面的示例中,我们可以放置@weekly $HOME/cron-weekly1

不要将 cron 用于任何时间敏感的任务。通常在运行命令之前会有短暂的延迟,只有几秒钟。如果您需要更好的粒度,可以使用脚本和 sleep 例程。

您还可以为 root 设置一个 crontab。要了解更多信息,请使用man -a crontab

报告 crontab 文件中的错误

您可能会想知道,如果 crontab 文件中有错误,计算机会如何报告它?它通过使用 sendmail 系统向 crontab 用户发送邮件来完成此操作。

如何做...

以下是 cron 报告错误的示例:

  1. 使用用户帐户打开终端。

  2. 通过运行以下命令编辑您的 crontab 文件:

crontab -e

  1. 现在让我们故意引发一个错误。滚动到底部并添加以下行:
* * * *    date > /baddirectory/date.txt

  1. 保存文件。等到 cron 在下一分钟运行,然后在用户终端中按Enter

  2. 您应该看到一条消息,说您有邮件。运行以下命令:

mail

  1. 应该有一封邮件指示错误(在本例中,文件未找到)。您可以通过按下D然后按Q来删除邮件。

  2. 最后,确保重新编辑您的 crontab 文件并删除我们刚刚添加的错误行。

还有更多...

您还可以监视/var/log/cron文件,以查看系统在一天中的运行情况。当首次创建 crontab 文件并尝试使其正确时,这非常有帮助。

第十章: 内核

在本章中,我们将涵盖以下主题:

  • 对模块命令的简要介绍

  • 从 kernel.org 构建内核

  • 使用 xconfig 修改配置

  • 使用 GRUB

  • 了解 GRUB 2

介绍

内核是操作系统的主要组件或核心。 它控制系统中的所有资源,时间,中断,内存分配,进程分离,错误处理和日志记录。 在典型的 Linux 计算机中,内核是模块化的,它具有核心文件(或文件),然后根据需要加载其他设备驱动程序。 在某些情况下,比如嵌入式设备,内核可能由一个包含所有所需驱动程序的大图像文件组成。 这被称为单片内核。

在决定是否需要构建自定义内核之前,您应该首先确保自己确实需要一个。 运行自定义内核的利弊如下。

以下是运行自定义内核的优点:

  • 如果您知道自己在做什么并且有时间进行研究,您可以得到最大化硬件性能的内核

  • 您可以利用股票内核可能没有的功能或设备

  • 通过查看所有内核设置,您可以更好地了解 Linux

  • 构建和运行自己的内核只是纯粹的乐趣

以下是运行自定义内核的缺点:

  • 您自己的自定义内核可能不包含发行版所需的功能

  • VMware 和其他虚拟环境可能需要额外的努力才能正常工作

  • 请注意,如果运行自己的内核,您很可能不再得到发行版支持渠道的支持

提示

运行自己的内核的大多数缺点都可以解决。 这取决于您花多少时间来解决它。

对模块命令的简要介绍

有几个命令用于操作系统上的模块。 请注意,根据您的发行版,这些命令可能只能以 root 身份运行。

如何做...

在以下步骤中,我们将运行lsmodmodprobeinsmodmodinfo命令:

  1. 要查看系统上当前加载的模块的状态,请运行lsmod

  2. 要从当前的/lib/modules/<kernel name>目录加载模块,您将使用modprobe命令。 例如modprobe pcnet32

  3. 直接加载模块,使用insmod命令。 例如insmod /temp/pcnet32.ko

  4. 要显示有关模块的信息,请使用modinfo命令。 首先运行lsmod查找模块,然后在其中一个名称上尝试modinfo

工作原理...

lsmod命令获取/proc/modules文件的内容并以易于阅读的格式显示出来。 使用它来确定系统中加载了哪些模块。

以下屏幕截图显示了我 Fedora 19 系统中lsmod的部分列表:

工作原理...

modprobe命令用于向 Linux 内核添加和删除模块。 它从当前的/lib/modules/<kernel name>目录加载模块。 modprobe命令比insmod做得更多,例如一次加载多个模块以解决依赖关系,并且通常优先于insmod。 由于modprobe可以加载多个模块,因此/etc/modprobe.d中的文件和/etc/modules.conf文件用于解决任何问题。

insmod命令可用于将模块插入系统。 通常用于直接加载模块。 例如,如果您想加载新创建的pcnet32模块的版本,您首先会将目录更改为正确的目录,然后运行insmod pcnet32.ko

modinfo命令显示有关 Linux 内核模块的信息。这是一个非常有用的命令,允许您查看特定模块的详细信息,例如它将接受哪些参数。以下是在我的 Fedora 17 系统上从modinfo输出的样子:

BIG2 /temp/linux-3.9.1 # modinfo nouveau
filename:       /lib/modules/3.6.1-1.fc17.x86_64/kernel/drivers/gpu/drm/nouveau/nouveau.ko
license:        GPL and additional rights
description:    nVidia Riva/TNT/GeForce
author:         Stephane Marchesin
alias:          pci:v000012D2d*sv*sd*bc03sc*i*
alias:          pci:v000010DEd*sv*sd*bc03sc*i*
depends:        drm,drm_kms_helper,ttm,mxm-wmi,i2c-core,wmi,video,i2c-algo-bit
intree:         Y
vermagic:       3.6.1-1.fc17.x86_64 SMP mod_unload
parm:           agpmode:AGP mode (0 to disable AGP) (int)
parm:           modeset:Enable kernel modesetting (int)
parm:           vbios:Override default VBIOS location (charp)
parm:           vram_pushbuf:Force DMA push buffers to be in VRAM (int)
parm:           vram_notify:Force DMA notifiers to be in VRAM (int)
parm:           vram_type:Override detected VRAM type (charp)
parm:           duallink:Allow dual-link TMDS (>=GeForce 8) (int)
parm:           uscript_lvds:LVDS output script table ID (>=GeForce 8) (int)
parm:           uscript_tmds:TMDS output script table ID (>=GeForce 8) (int)
parm:           ignorelid:Ignore ACPI lid status (int)
parm:           noaccel:Disable all acceleration (int)
parm:           nofbaccel:Disable fbcon acceleration (int)
parm:           force_post:Force POST (int)
parm:           override_conntype:Ignore DCB connector type (int)
parm:           tv_disable:Disable TV-out detection (int)
parm:           tv_norm:Default TV norm.
 Supported: PAL, PAL-M, PAL-N, PAL-Nc, NTSC-M, NTSC-J, hd480i, hd480p, hd576i, hd576p, hd720p, hd1080i.
 Default: PAL
 *NOTE* Ignored for cards with external TV encoders. (charp)
parm:           reg_debug:Register access debug bitmask:
 0x1 mc, 0x2 video, 0x4 fb, 0x8 extdev, 0x10 crtc, 0x20 ramdac, 0x40 vgacrtc, 0x80 rmvio, 0x100 vgaattr, 0x200 EVO (G80+) (int)
parm:           perflvl:Performance level (default: boot) (charp)
parm:           perflvl_wr:Allow perflvl changes (warning: dangerous!) (int)
parm:           msi:Enable MSI (default: off) (int)
parm:           ctxfw:Use external HUB/GPC ucode (fermi) (int)
parm:           mxmdcb:Santise DCB table according to MXM-SIS (int)

rmmod命令允许您从 Linux 内核中删除已加载的模块。通常的语法是rmmod modulename。不使用扩展名。您也可以使用modprobe -r命令。

depmod程序生成modules.dep.map文件。通常情况下,用户不需要手动执行它,因为它在内核构建期间运行。它通过检查/lib/modules/<kernelname>中的模块并确定它们需要哪些符号以及它们导出哪些符号来创建模块依赖列表。

其中一些命令有一个强制选项。它将尝试执行所需的功能,绕过任何检查。我从未见过这种方法可靠地工作,因此不建议使用。如果您决定尝试,请确保您有完整的操作系统备份。

在运行设备驱动程序命令时,通常可以通过查看/var/log/messages文件获得更多信息。我建议打开一个终端并在其中运行tail -f /var/log/messages。始终保持这个终端可见。还要注意,该文件最终会被回收,因此命令将不得不停止并重新启动(在我的系统上大约每周一次)。一个简单的测试是运行logger hellojim。如果你没有看到它出现,那么是时候重新启动 tail 会话了。

您还可以运行dmesg命令。以下是 Fedora 17 上dmesg输出的一个简短示例:

Linux version 3.6.1-1.fc17.x86_64 (mockbuild@) (gcc version 4.7.2 20120921 (Red Hat 4.7.2-2) (GCC) ) #1 SMP Wed Oct 10 12:13:05 UTC 2012
Command line: BOOT_IMAGE=/vmlinuz-3.6.1-1.fc17.x86_64 root=/dev/mapper/vg_bigtwo-lv_root ro rd.md=0 rd.dm=0 SYSFONT=True rd.lvm.lv=vg_bigtwo/lv_swap KEYTABLE=us rd.lvm.lv=vg_bigtwo/lv_root LANG=en_US.UTF-8 rd.luks=0 rhgb quiet
smpboot: Allowing 4 CPUs, 2 hotplug CPUs
Booting paravirtualized kernel on bare hardware
Kernel command line: BOOT_IMAGE=/vmlinuz-3.6.1-1.fc17.x86_64 root=/dev/mapper/vg_bigtwo-lv_root ro rd.md=0 rd.dm=0 SYSFONT=True rd.lvm.lv=vg_bigtwo/lv_swap KEYTABLE=us rd.lvm.lv=vg_bigtwo/lv_root LANG=en_US.UTF-8 rd.luks=0 rhgb quiet
Memory: 3769300k/5242880k available (6297k kernel code, 1311564k absent, 162016k reserved, 6905k data, 1032k init)
Console: colour dummy device 80x25
tsc: Fast TSC calibration using PIT
tsc: Detected 2699.987 MHz processor
CPU: Processor Core ID: 0
CPU0: Thermal monitoring enabled (TM2)
smpboot: CPU0: Intel Pentium(R) Dual-Core  CPU      E5400  @ 2.70GHz stepping 0a
NMI watchdog: enabled on all CPUs, permanently consumes one hw-PMU counter.
smpboot: Booting Node   0, Processors  #1
smpboot: Total of 2 processors activated (10799.94 BogoMIPS)
atomic64 test passed for x86-64 platform with CX8 and with SSE
NET: Registered protocol family 38
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
Console: switching to colour frame buffer device 80x30
fb0: VESA VGA frame buffer device
input: Power Button as /devices/LNXSYSTM:00/device:00/PNP0C0C:00/input/input0
ACPI: Power Button [PWRB]
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
Non-volatile memory driver v1.3
Linux agpgart interface v0.103
ACPI: PCI Interrupt Link [LSA0] enabled at IRQ 21
ata1: SATA max UDMA/133 abar m8192@0xfe9fc000 port 0xfe9fc100 irq 21
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: Manufacturer: Linux 3.6.1-1.fc17.x86_64 ehci_hcd
usb usb1: SerialNumber: 0000:00:04.1
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 8 ports detected
usb usb2: Manufacturer: Linux 3.6.1-1.fc17.x86_64 ohci_hcd
usb usb2: SerialNumber: 0000:00:04.0
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
USB Serial support registered for generic
usbserial: USB Serial Driver core
serio: i8042 KBD port at 0x60,0x64 irq 1
serio: i8042 AUX port at 0x60,0x64 irq 12
mousedev: PS/2 mouse device common for all mice
rtc0: alarms up to one year, y3k, 114 bytes nvram, hpet irqs
device-mapper: uevent: version 1.0.3
device-mapper: ioctl: 4.23.0-ioctl (2012-07-25) initialised: dm-devel@redhat.com
cpuidle: using governor ladder
cpuidle: using governor menu
drop_monitor: Initializing network drop monitor service
ip_tables: (C) 2000-2006 Netfilter Core Team
input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input2
ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata1.00: ATA-8: WDC WD5000AAVS-00N7B0, 01.00A01, max UDMA/133
ata1.00: 976773168 sectors, multi 0: LBA48 NCQ (depth 31/32)
ata1.00: configured for UDMA/133
scsi 0:0:0:0: Direct-Access     ATA      WDC WD5000AAVS-0 01.0 PQ: 0 ANSI: 5
Freeing unused kernel memory: 1032k freed
Write protecting the kernel read-only data: 12288k
nouveau 0000:00:10.0: setting latency timer to 64
[drm] nouveau 0000:00:10.0: Detected an NV40 generation card (0x063000a2)
Console: switching to colour dummy device 80x25
usb 1-6: New USB device found, idVendor=0bda, idProduct=0181
Initializing USB Mass Storage driver...
scsi4 : usb-storage 1-6:1.0
tsc: Refined TSC clocksource calibration: 2699.931 MHz
usb 2-3: Manufacturer: American Power Conversion
hid-generic 0003:051D:0002.0001: hiddev0,hidraw0: USB HID v1.00 Device [American Power Conversion Back-UPS RS 700G FW:856.L3 .D USB FW:L3  ] on usb-0000:00:04.0-3/input0
EXT4-fs (dm-1): mounted filesystem with ordered data mode. Opts: (null)
e1000: Intel(R) PRO/1000 Network Driver - version 7.3.21-k8-NAPI
e1000: Copyright (c) 1999-2006 Intel Corporation.
r8169 0000:04:00.0: irq 43 for MSI/MSI-X
r8169 0000:04:00.0: eth0: RTL8102e at 0xffffc90010fae000, 44:87:fc:69:4d:0f, XID 04c00000 IRQ 43
microcode: CPU0 updated to revision 0xa0b, date = 2010-09-28
ALSA sound/pci/hda/hda_intel.c:1593 Enable delay in RIRB handling

还有更多...

查阅这些命令的 man 或 info 页面以获取更多信息。特别是查看man modprobe.conf,了解如何使用modprobe的配置选项。

您可以使用uname -r命令查看当前的内核版本。通常情况下,您会发现在脚本和别名中使用uname -r表达式效果很好。

从 kernel.org 构建内核

在这个示例中,我们将使用来自kernel.org网站的内核文件。

准备工作

在不会对系统造成任何可能的伤害的情况下,您应该能够执行除了最后一步之外的所有步骤。make install命令将修改您的 GRUB 文件,因此至少我会备份这些文件。为了更安全,因为我们已经知道我是偏执的,如果您要安装新的内核,我建议在测试机器上运行所有这些步骤。

这个示例假设您的计算机已安装为完整的开发系统。您将需要最新版本的GCCmake,QT 开发包等。如果您选择安装了当前发行版的软件开发包(或等效包),那么您可能已经准备就绪。我建议在您计划进行构建的分区上至少有 10GB 的文件空间可用;如果您将要创建大量的内核树(内核 3.9.1 中的文件使用了 6.5GB),则需要更多。

vmlinuzinitramfsmap文件将被复制到/boot,因此请确保它足够大,以处理您想要的额外内核的数量(大约 500MB 是典型的)。

您需要以 root 身份运行make modules_installmake install命令。我建议在整个过程中都以 root 身份运行,以避免任何文件权限问题。

如何做...

以下是获取和构建内核的步骤:

  1. 在您的浏览器中,导航到kernel.org

  2. 点击黄色方框内的Latest Stable Kernel,并保存文件。在 Fedora 上,Downloads目录是/home/<user>/Downloads

  3. 您想要构建的位置基本上取决于您。我个人不喜欢很长的目录路径,所以我把我的放在/temp目录中。如果您愿意,您可以选择另一个位置。

  4. .xz文件从Downloads目录复制或移动到/temp。在本例中,文件名是linux-3.9.1.tar.xz

  5. 切换到/temp目录并提取文件tar xvf linux-3.9.1.tar.xz。这以前需要很长时间,但现在也不太糟糕。

  6. 完成后,切换到cd /temp/linux-3.9.1目录。

  7. 下一步是获取一个内核配置文件。除非你已经有一个特定的文件在脑海中,我通常从/boot目录中取最新的一个。在我的系统上,我运行了以下命令:

cp /boot/config-3.6.1-1.fc17.x86_64

  1. 您可以直接复制文件到.config,但是,我喜欢看到我从哪里开始。现在就这样做:
cp config-3.6.1-1.fc17.x86_64  .config

  1. 现在我们需要运行一个内核构建程序来使一切同步。我们将使用xconfig程序,这将在下一节中详细讨论。现在,只需运行以下命令:
make xconfig

  1. 这将带来一个看起来很酷的屏幕,上面有大约一百万个东西。点击文件 | 保存,然后文件 | 退出

  2. 现在您应该回到文本屏幕,显示类似以下内容:

Big4 /temp/linux-3.9.1 # make xconfig
 HOSTCC  scripts/kconfig/conf.o
 HOSTCC  scripts/kconfig/zconf.tab.o
 HOSTCXX scripts/kconfig/qconf.o
 HOSTLD  scripts/kconfig/qconf
scripts/kconfig/qconf Kconfig
#
# configuration written to .config
#

  1. 现在运行make命令。根据您的计算机速度,这可能需要很长时间。如果你喝咖啡或茶,这可能是一个去喝一些的好时机。

  2. 检查确保没有错误,然后运行以下命令:

make modules_install

  1. 下一步将修改您的 GRUB 配置。我总是确保我有备份以防万一。完成后,要安装内核,请运行以下命令:
make install

  1. 在大多数情况下,make install命令将设置新内核为默认值。您可以通过查看 GRUB 配置文件来检查这一点(我们稍后将在本章中看到更多关于 GRUB 的内容)。

  2. 要实际尝试新的内核,您必须重新启动系统(稍后会详细介绍)。当屏幕出现时,请确保菜单上选择了正确的内核。

  3. 由于我们没有进行实质性的更改,内核应该可以正常启动。通过运行uname -a命令来检查是否启动了正确的内核。您不应该在这个内核中看到或注意到任何差异。但是,根据几个因素,它可能不像预期的那样工作,甚至可能根本无法启动。如果是这种情况,您应该能够重新启动到之前的良好内核。

重新启动时,我强烈建议进行冷启动。执行有序关机(shutdown -h now),让机器至少静置几秒钟;几分钟也不会有什么坏处。我曾经看到一些非常奇怪的事情发生在热启动上,任何理智的人都会说这是不可能的。

使用 xconfig 修改配置

如前一节所述,.config文件控制着进入内核文件的一切。这包括vmlinuzinitramfs文件,以及设备驱动程序模块。.config是一个文本文件,但不是直接编辑的,而是可以使用几种不同的程序之一。在本章中,我们将向您展示如何使用xconfig程序来对.config文件进行更改。

准备工作

在执行这些步骤之前,请参阅前一节中有关准备工作的内容。

如何做...

在这里,我们将使用xconfig来修改配置:

  1. 切换到内核构建目录并运行以下命令:
make xconfig

  1. 那个看起来很酷的屏幕应该再次出现。这个程序需要几分钟来适应,所以我们将一步一步地进行。

  2. 首先,找到字符串处理器类型和特性并点击。屏幕会发生变化。

  3. 现在,在右侧面板下的处理器系列下,点击Core 2/newer Xeon。点击文本,而不是单选按钮。

  4. 现在您应该看到类似以下截图的内容(来自我使用 3.9.9 内核的 Fedora 19 系统):如何做...

  5. 在使用这个程序时必须小心。很容易意外点击单选按钮,改变你不打算改变的东西。因此,我建议频繁备份你的.config文件。由于它是一个文本文件,你可以使用diff程序查看文件之间的更改。如果你不熟悉diff,运行man diff获取更多信息。

  6. 所以,让我们继续改变一些东西。如果你正在运行现代硬件,它可能有一个 Core 2 或 Xeon 处理器。运行cat /proc/cpuinfo查看你有什么。如果看起来合适,点击Core 2/newer Xeon行上的单选按钮。

  7. 这些是配置新内核的基础。刚开始时,我建议在构建之间尽量少做更改。这样,如果出现问题,跟踪导致问题的更改将更容易。

  8. 完成对xconfig的讨论,让我们尝试另一个字段。在左侧,点击常规设置的文本。

  9. 你会看到右侧的文本发生变化。通常,在使用xconfig时,你点击文本来改变显示,点击适当的按钮来展开或压缩条目,点击单选按钮来实际更改值。方框中的小黑点表示将构建一个模块。

还有更多...

你可以使用diff命令查看你保存的.config文件之间的差异。在调试时,这将节省大量时间。

这个程序可能有些令人困惑。在某些地方,右侧的文本会指示在此处选择 Y。这意味着确保复选框中有一个勾。同样,No表示没有勾选。在某些情况下,程序会说在一个没有复选框的字段中指示 Y 或 N。我想这些是错误,如果是的话,它们已经存在很长时间了。

你也可以点击帮助 | 介绍,了解如何使用xconfig的简要信息。

在构建内核时必须格外小心。在使用xconfig修改.config文件时很容易出错,导致内核无法启动。以下是一些要点:

  • 每次更改时都要备份当前的.config文件。

  • 尽量一次性做尽可能少的更改。试图通过做很多更改来节省时间是很诱人的,如果这对你有效那太好了。但对我来说行不通。

  • 如果你的最新内核无法启动,请尝试使用diff来比较你的最新.config文件和上一个好的文件。你可能能够立即发现问题。

  • 如果一切失败,回到已知的工作配置文件,然后从那里重新开始。你一直在备份你的.config文件,对吧?

使用 GRUB

在处理内核时,你可能需要不时地更改你的 GRUB 配置文件。你可以修改默认启动的内核,内核选择菜单的超时值,传递给内核的参数,启动其他操作系统,以及许多其他内容。

grub.conf文件通常位于/boot/grub中,或者你可以使用/etc/grub.conf文件,它是一个符号链接。

以下是我在我的 Fedora 14 系统上的grub.conf的样子:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda3
#          initrd /initrd-[generic-]version.img
default=2
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora (3.9.1)
 root (hd0,0)
 kernel /vmlinuz-3.9.1 ro  root=UUID  rhgb quiet
 initrd /initramfs-3.9.1.img
title Fedora (2.6.38.4)
 root (hd0,0)
 kernel /vmlinuz-2.6.38.4 ro root=UUID rhgb quiet
 initrd /initramfs-2.6.38.4.img
title Fedora (2.6.35.6-45.fc14.x86_64)
 root (hd0,0)
 kernel /vmlinuz-2.6.35.6-45.fc14.x86_64 ro root=UUID rhgb quiet
 initrd /initramfs-2.6.35.6-45.fc14.x86_64.img

如何做...

在这里,我们将向你展示如何更改grub.conf文件中的一些项目。请注意,这里的错误可能导致系统无法启动,所以要么只是跟着做,要么非常小心。

  1. 切换到正确的目录:
cd /etc

  1. 备份副本:cp grub.conf /temp(或其他适当的位置)。

  2. 用 vi 或等效工具进行编辑:

vi grub.conf

  1. 参考上面的文件,让我们默认启动第一个段落。将default=2行更改为default=0。请注意,它们从 0 开始计数。

  2. 现在让我们增加等待你进行选择的时间;将timeout值更改为10

  3. 假设你想以文本模式启动,要做到这一点,请注释掉(即在前面加上#splashimagehiddenmenu行。

  4. 并且从段落(或所有段落)中删除rhgb quiet

  5. 如果你有任何要传递给内核的参数,你可以直接添加到kernel行的末尾。

它是如何工作的...

让我们在下一节中看一下上述步骤的分解:

  • 注释部分说你有一个/boot 分区。这意味着所有内核和 initrd 路径都是相对于/boot 的。这是在试图说的是,当你遇到后面包含类似/vmlinuz-3.9.1的行时,它实际上意味着/boot/vmlinuz-3.9.1。不要忘记它是这样工作的,你以后会省去很多麻烦。

  • default=2表示使用第三个标题或段落(是的,这又是另一个从 0 开始计数而不是从 1 开始计数的地方)。

  • timeout=5表示在启动默认内核之前显示内核启动菜单 5 秒钟。

  • splashimage行在启动时在屏幕上显示一个图形图像。我非常不喜欢这个,所以我把它注释掉了。

  • hiddenmenu行表示隐藏内核启动菜单。取消注释此行以显示菜单。是的,又是反过来,但不像从 0 开始计数那么尴尬。

  • 第一行标题开始一个内核段。在该行和下一个标题行(或文件结束)之间的所有内容都与该内核相关联。在这种情况下,列出的第一个内核是我创建的最新的一个(3.9.1)。

  • root (hd0,0)行表示我的/boot目录位于第一个硬盘的第一个分区上。

  • 下一行是实际的内核文件和参数。

  • 这个段落的最后一行是初始的 RAM 磁盘映像文件。

  • 如你所见,这台机器上还有两个更多的段落(内核)可用。我正在运行2.6.35-6-45.fc14.x86_64,这是 Fedora 14 64 位的默认内核。

理解 GRUB 2

GRUB 2 现在被许多 Linux 发行版使用。这是一个完全的重写,旨在解决 GRUB Legacy 中的一些问题。它仍在开发中,因此这里的信息可能不完整或过时。

使用 GRUB 2 时的引导配置在/boot/grub2/grub.cfg文件中。你也可以通过/etc/grub2.cfg文件来引用它,这是一个符号链接。

以下是我在我的 Fedora 17 系统上看到的前几行的样子:

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
 load_env
fi
set default="1"
if [ x"${feature_menuentry_id}" = xy ]; then
 menuentry_id_option="--id"
else
 menuentry_id_option=""
fi

正如注释行所说,这个文件不是用来直接编辑的。相反,/etc/default/grub文件与/etc/grub.d目录中的一组文件一起使用。

Big2 /etc/grub.d # ls -la
total 76
drwx------.   2 root root  4096 Oct 18  2012 .
drwxr-xr-x. 167 root root 12288 May 15 03:34 ..
-rwxr-xr-x.   1 root root  7528 Aug  2  2012 00_header
-rwxr-xr-x.   1 root root  9265 Aug  2  2012 10_linux
-rwxr-xr-x.   1 root root  9948 Aug  2  2012 20_linux_xen
-rwxr-xr-x.   1 root root  2564 Aug  2  2012 20_ppc_terminfo
-rwxr-xr-x.   1 root root  9339 Aug  2  2012 30_os-prober
-rwxr-xr-x.   1 root root   214 Aug  2  2012 40_custom
-rwxr-xr-x.   1 root root   216 Aug  2  2012 41_custom
-rw-r--r--.   1 root root   483 Aug  2  2012 README

如何做...

以下是使用 GRUB 2 时对引导配置进行更改的步骤。记住,grub.cfg文件不是直接编辑的;而是对/etc/grub.d目录中的文件进行更改。

  1. 让我们改变timeoutrhgb的值。编辑/etc/default/grub文件。

  2. GRUB_TIMEOUT更改为10

  3. GRUB_CMDLINE_LINUX中,删除rhgb quiet。保存文件。

  4. 通过运行以下命令创建新文件:

grub2-mkconfig -o /boot/grub2/grub.cfg

  1. 修改后的grub.cfg文件应该已经准备好启动了。

它是如何工作的...

以下是/etc/grub.d目录中脚本的用途的描述:

  • 00_header:这生成grub2.cfg的标题,并从/etc/default/grub文件获取信息

  • 10_linux:这加载菜单条目

  • 20_linux_xen:这会查找 zen 内核并将它们添加到菜单中

  • 20_ppc_terminfo:这在 PPC 系统上检查正确大小的终端

  • 30_os-prober:这会在硬盘上搜索其他操作系统,以便将它们添加到启动菜单中

  • 40_custom:这是一个模板,可用于向引导菜单添加额外的条目

  • 41_custom:如果存在,这会从/boot/grub/custom.cfg中读取信息

  • README:这是一个包含其他有用信息的文件

还有更多...

以下是操作系统中可用的 GRUB 2 命令的部分列表:

  • grub2-editenv:这编辑 GRUB 环境块

  • grub2-fstest:这是一个用于 GRUB 文件系统驱动程序的调试工具

  • grub2-kbdcomp:这将生成一个 GRUB 键盘布局文件

  • grub2-menulst2cfg:这将把传统的menu.lst转换成grub.cfg

  • grub2-mkfont:这将创建 GRUB 字体文件

  • grub2-mkimage:这将创建一个可引导的 GRUB 镜像

  • grub2-mklayout:这将生成一个 GRUB 键盘布局文件

  • grub2-mkpasswd-pbkdf2:这将为 GRUB 生成一个哈希密码

  • grub2-mkrelpath:这将使系统路径相对于其根目录

  • grub2-mkrescue:这将创建一个 GRUB 救援镜像

  • grub2-mkstandalone:这将创建基于内存磁盘的 GRUB 镜像

  • grub2-script-check:这将检查grub.cfg的语法错误

  • grub2-bios-setup:这将设置设备使用 GRUB 引导

  • grub2-install:这将 GRUB 安装到设备上

  • grub2-mkconfig:这将生成一个 GRUB 配置文件

  • grub2-mknetdir:这将准备一个 GRUB 网络引导目录

  • grub2-ofpathname:这将为设备查找 OpenBOOT 路径

  • grub2-probe:这将探测 GRUB 的设备信息

  • grub2-reboot:这将设置 GRUB 的默认引导项,仅用于下一次引导

  • grub2-set-default:这将设置保存的默认 GRUB 引导项

  • grub2-sparc64-setup:这将设置设备使用 GRUB 引导

要了解更多关于 GRUB 2 的信息,请访问官方网页www.gnu.org/software/grub/grub.html

附录 A:Linux 最佳实践

在本附录中,我们将涵盖以下主题:

  • 超级用户与普通用户

  • 运行图形用户界面

  • 创建、验证和存储备份

  • 权限和您的身份

  • 实时备份

  • 环境变量和 shell

  • 最佳环境

  • 使用和监控 UPS

  • 复制文件时要小心

  • 验证存档文件并使用校验和

  • 防火墙、路由器设置和安全性

  • 如果发现入侵应该怎么办

  • 文件名中的空格

  • 使用脚本和别名节省时间和精力

  • 使用 scp 和 ssh 进行自动身份验证

  • 保存历史记录和截图

  • 驱动器上的空间

  • 对新想法持开放态度

介绍

有许多事情可以让您充分利用 Linux 系统。常识告诉我们,在计算机上执行特定任务有很多方法。这是正确的,但实际上通常只有一种好的方法来完成某件事。诀窍在于要开放思想,并在好事发生时看到好处。

超级用户与普通用户

作为 root 用户和普通用户运行主要取决于您所处的环境。如果每个人都有自己的工作站,并且负责设置它,那么对您来说,作为 root 运行可能非常自然(尤其是如果您不犯错误)。但是,如果您在银行或其他可能因打字错误而导致数百万美元账户被清空的情况下工作,那么作为 root 显然是不明智的。在这些情况下,假设您有权限,只有在必要时才切换到 root,并且只执行所需的任务。如果已正确配置,还可以使用 sudo。有关 sudo 的更多信息,请参见第五章,“权限、访问和安全性”。

还要记住的一件事是,您作为 root 运行时的舒适程度。如果您容易出错或紧张,并且/或者过去曾因作为 root 而造成严重损害,那么显然在这种情况下需要非常小心。另一方面,如果您一直作为 root 运行并且从未犯过错误,那就太好了。这肯定更有效率。

特别提示给系统管理员:我在不止一个场合看到过这种情况,所以在这里提一下。这适用于新手和经验丰富的系统管理员。您(也许还有您的经理)通常是系统上唯一具有 root 权限的人。这听起来是个好主意,对吧?这样可以避免有人犯错误导致整个项目崩溃。而且,成为负责人感觉很好。当别人需要更改时,他们会来找您,而您也很乐意帮忙。然后他们再来,再来,再来。在某个时刻,您意识到如果不处理这些请求,就无法完成任何工作,而他们如果没有您在身边也无法完成工作。所以您尝试设置 sudo。现在情况更糟了;每次您认为已经设置好处理任何事情时,如果再次失败,有人可能会再次来找您。那么您该怎么办呢?

您可能可以为选定的用户提供 root 访问权限。凭直觉行事。例如,观察个别用户的打字方式。他们在使用命令行时感到舒适吗?他们打字是否有权威性,还是对机器感到害怕?如果某个特定用户一直使用图形用户界面执行在命令行上更有效的任务,那么我会将其视为一个强烈的警告信号。

随着时间的推移,您将对谁可以信任 root 访问权限有所了解,并能够授予他们访问权限。当然,如果有人犯了错误,那也不是世界末日。他们实际上无法对整个项目造成严重损害,因为您一直在创建和验证每日备份,对吧?您可以恢复损坏并从他们那里收回 root 权限。请注意,只需要一个错误。我不会再信任那个用户拥有 root 权限。

运行图形用户界面

虽然我有点快速地信任我的用户拥有 root 访问权限,并且大部分时间我自己也使用 root,但我绝对不建议以这种方式运行 GUI。有些发行版甚至不允许这样做。通过以 root 身份运行 GUI,实际上你正在以 root 身份运行很多其他东西,比如你的浏览器和邮件程序。这绝对不是一个好主意。

以下是我在 Linux 或 UNIX 系统上的首选环境。我使用 Fedora,但这些想法应该适用于大多数其他发行版。安装系统后,我做的第一件事之一是更改系统,使得机器以命令行模式而不是图形界面启动。这样,如果发生图形问题,诊断和纠正就容易得多。我还可以选择通过运行适当的startx类型命令来启动哪个图形界面。在命令提示符下,我以普通用户或访客用户身份登录。在我的 Fedora 14 系统上,我然后运行startx,这将启动 Gnome 2。

在图形界面完全启动后,我打开一个终端会话并运行su到 root。我检查确保机器可以 ping 通,并通常进行一些其他的合理性检查。如果一切正常,我然后运行我的jset脚本。它执行一些桌面定制,比如将终端窗口打开到它们正确的目录,并提醒我要运行什么命令(我写了很多程序,所以真的需要这个)。它还会挂载我的 USB 设备,或者在出现问题时警告我。然后我将终端会话定位到我想要的位置。现在我可以开始工作了。

以下是一个类似于我在启动后用来设置我的桌面的脚本:

#!/bin/sh
# last update 6/9/2013 (rebooted)

echo percentused - run go
cd /lewis/java/percentused
xterm +sb -title Xterm    -geom 80x20 &

echo apcupsd - run go
cd /lewis/java/apc
xterm +sb -title Xterm    -geom 80x20 &

echo jtail - run jtail
cd /lewis/jtail-f/jtail
xterm +sb -title jtail -geom 137x30   &

echo jsecure - run jsecure
cd /lewis/jtail-f/jsecure
xterm +sb -title jtail -geom 125x33   &

echo ping - run loop1
cd /lewis/ping
xterm +sb -title ping  -geom 86x8 &

echo runbackup1 - run runbackup1
cd /lewis/backup
xterm +sb -title runbackup1 -geom 65x21 &

echo jwho - run jwho
cd /lewis/jwho
xterm +sb -title jwho  -geom 65x8  &

# mount usb stick
mount /dev/sdg1 /usb
# mount Iomega external drive
mount /dev/sdf1 /megadrive 

创建、验证和存储备份

我无法强调创建系统备份的重要性有多大。至少,将您的个人和业务数据以及配置文件复制到安全的地方。有些人甚至备份操作系统本身。无论您决定做什么,都要制定计划并坚持下去。正如第八章中所提到的,使用脚本,现在是设计和使用脚本的好时机。如果需要,使用crontab自动执行定期备份。

tar命令非常适合备份整个目录。请注意,它也会获取任何隐藏文件。如果需要,您可以排除特定目录,并且可以使用tar执行其他一些操作。以下是类似于我用来备份/home/guest1目录的命令。

提示

tsback1是一个包含要从中开始的数字的文本文件。

cat tsback1
0

以下是脚本的开始:

 cd /home
 NUM=`cat tsback1`        # get the next number to use
 tar -cvzf /megadrive/backups/backup$NUM.gz --exclude=Cache  --exclude=.cache --exclude=.thumbnails  guest1

请记住将要备份的目录作为行中的最后一项。首先更改/home目录,因为对于tar,您希望在要备份的子目录的父目录中。下一行将NUM变量设置为要使用的下一个变量。最后一行直接在我的 USB 外部驱动器中的适当目录中创建tar文件。

我在创建备份时尝试非常小心。我实际用来备份东西的脚本还做了很多其他事情。例如,它会检查我的 USB 外部驱动器是否真的存在,并且可以被写入(它还应该检查驱动器上是否有足够的可用空间,这是我的 TODO 之一)。如果代码确定驱动器不存在或发生其他错误,就会发出非常响亮和讨厌的警报。如果我在 5 分钟内没有回应这个警报,就会向我的手机发送电子邮件。这对于偏执狂来说怎么样?

备份是很好的。但是,如果备份无法使用,那就没有多大用处。因此,定期验证备份是明智的。多久验证一次取决于您和您的舒适水平。我的脚本定期将备份文件复制到另一台机器,然后解压并运行一些测试。如果有任何不对劲的地方,就会发出另一个警报。所有这些都是在脚本中自动完成的。

好了,我们现在正在进行备份和验证。那么存储呢?假设你已经把一切都搞定了,所有的文件都被复制和验证了,它们都位于同一个地方,比如你的家或办公室。然后发生了一些不可言喻的事情,比如火灾或盗窃。我同意,这种事情发生的可能性非常低,但它仍然可能发生。至少我不想尝试自 1982 年以来编写的百万行代码,所以我在各个地方都有备份,包括外部存储。在我工作过的一些公司中,文件被复制到磁带、CD 和/或硬盘上,并存放在一个防火的步入式保险柜中。非常好的主意。

权限和你的身份

这主要涉及系统管理员。作为系统管理员,你可能会大部分时间以 root 用户的身份进行工作。你设置访客账户和配额,甚至可能创建脚本等等。有时很容易忘记你的用户没有 root 权限。

记住这一点,一定要从用户的角度检查你的添加和更改。用su成为那个用户,确保你可以正常访问一切。这将为你节省很多时间,甚至可能避免尴尬,如果你在用户之前发现了问题。

实时备份

在编辑脚本和其他文件时,最好做一些编号的备份。没有什么比让一些东西工作,然后在做了一些更改后出现问题,然后不能快速地让它重新工作更令人沮丧的了。有了编号的备份,你总是可以回到之前工作的版本,然后使用diff找到错误。我确实是以最艰难的方式学到了这一点。

以下是我为本书的用户编写的备份脚本(我通常使用的是用 C 编写的)。它的名字是mkbak

#!/bin/sh
# mkbak script to create backup files
if [ "$1" = "" ] ; then
 echo "Usage: mkbak filename(s)"
 echo "Creates numbered backup file(s) in the current directory."
 exit
fi
for i in $* ; do
 if [ ! -f $i ] ; then
 echo File $i not found.
 continue
 fi

 num=1
 while [ 1 ]
 do
 ibak=bak-$num.$i
 if [ -f $ibak ] ; then
 num=`expr $num + 1`
 else
 break
 fi
 done
 cp $i $ibak
 rc=$?
 if [ $rc -eq 0 ] ; then
 echo File $i copied to $ibak
 else
 echo "An error has occurred in the cp command, rc: $rc"
 fi
done

这个脚本是免费的,但有一些限制。它不能处理带空格的文件名,只能处理当前目录中的文件。请注意,你可以先cd到你想要的目录,然后再运行它。

以下是我用来备份当前正在工作的书籍文件的脚本:

#!/bin/sh
# b1 script to copy book file
# Date 1/22/2013
FN=startA1.txt                    # name of file to back up
STARTDIR=`pwd`                    # remember the starting directory
cp $FN /usb/book                  # copy to USB stick
cd /usb/book                      # cd to it
mkbak $FN                         # make the numbered backup

cd $STARTDIR                      # go back to the starting directory
cp $FN /megadrive/book            # copy to USB external drive
cd /megadrive/book                # cd to it
mkbak $FN                         # make the numbered backup

cd $STARTDIR                      # go back to the starting directory
sum $FN /usb/book/$FN /megadrive/book/$FN     # use sum to check
scp $FN $B2:/temp                 # copy to my other machine
ssh $B2 /usr/bin/sum /temp/$FN       # check the copy

在编辑文件(FN变量)时,我会不时手动运行这个脚本,通常是在做了很多更改之后,以及在我起身休息之前。

环境变量和 shell

在系统管理中经常遇到的一个问题是监控多台机器。同时打开 5 或 6 个ssh会话并不罕见,如果有多个显示器的话,会更多。知道哪个会话在哪台机器上运行是至关重要的,因为在错误的机器上输入正确的命令可能会造成灾难。因此,出于这个原因和其他原因,我建议在登录到远程机器时使用自定义的PS1变量。

这在第一章中提到,使用终端/命令行,在讨论环境变量时。以下是我在运行 Fedora 17 的机器上PS1变量的样子:

Big2 /temp/linuxbook/chapA # echo $PS1
Big2 \w #
Big2 /temp/linuxbook/chapA #

简单,而不会太混乱。当我登录到另一台机器时,PS1的样子如下:

BIG4 BIG4 BIG4 BIG4 BIG4 BIG4 BIG4 BIG4 /temp # echo $PS1
BIG4 BIG4 BIG4 BIG4 BIG4 BIG4 BIG4 BIG4 \w #
BIG4 BIG4 BIG4 BIG4 BIG4 BIG4 BIG4 BIG4 /temp #

应该很难混淆它们。

当谈到环境变量时,还有一些事情需要记住。当你对.bashrc文件进行更改并进行源代码化时,这些更改只在该会话中可见(以及任何新打开的会话)。为了在其他现有会话中看到更改,你必须在其中也进行源代码化。如果有一种方法可以通过一个命令使更改在每个会话中可见,那将是相当酷的,然而,我不相信这是可能的。当然,有人可能会说shutdown -r现在可以做到。

最好的环境

对一个人最好的可能对另一个人不是最好的。然而,我知道当我使用一个快速的桌面系统,有足够的内存和存储空间,以及两个大显示屏时,我是最高效的。以下是我的典型设置:

在我的左侧显示器上,我放置了脚本和以下用于监控系统的程序:

  • 一个用 Java 和 C 编写的磁盘空间监控程序

  • 一个监视我的不间断电源UPS)的程序,也是用 Java 和 C 编写的

  • 一个每分钟一次对网络进行 ping 并记录任何故障的脚本

  • 一个使用tail -f /var/log/messages来监控内核消息的程序

  • 我的备份脚本每天凌晨 3 点运行一次。

  • 一个“穷人版”入侵检测脚本(稍后详细介绍)

  • 一个每天两次向我的手机发送系统状态的脚本

  • 我将“计算机”和“访客”文件夹图标设置为可见并易于访问

  • 任何连接到远程机器的ssh会话

  • 还有一些其他太无聊不值得一提的东西

所有这些都设置为在所有工作区中保持可见。说到工作区,我通常有四个。我总是将相同的程序和终端会话放在相同的工作区,并且在屏幕上大致相同的位置。这样,我可以非常快速地到达想要去的地方。您是否曾经处于一个情况,您的团队即将错过重要的截止日期,而您被迫观望,因为其他人在系统上浪费了大量时间寻找或做某事?您绝对不想成为那个人。

在右侧显示器上,我进行大部分实际工作。以下是我的工作区布局方式:

  • 在工作区 1 有两个终端。它们已经准备好,以防我需要立即做一些事情

  • 工作区 2 通常用于程序开发。我在这里进行 C、Java 和脚本开发

  • 工作区 3 是我目前正在使用自定义文本编辑器输入这本书的地方(最终将被导入到LibreOffice中)

  • 工作区 4 是我放置我的网络邮件客户端的地方

说到浏览,我倾向于在左侧显示器上打开它们,并在与我当前工作相关的工作区中打开。这样非常快捷高效,而且在需要时也更容易剪切和粘贴。

并非所有人都有快速机器或双显示器的奢侈条件,特别是在我们的工作中,有时似乎更重要的是为了节省成本,而不是给员工提供他们需要提高生产力的条件。我能说的就是,尽力获取您需要以尽可能高效地完成工作。

使用和监控 UPS

在我看来,至少应该在主要工作站上使用 UPS。如果电源突然断开(或更糟糕的是,变压器故障),硬件可能会出现各种问题,更不用说数据可能会发生什么了。我意识到,使用现代日志文件系统,数据丢失是相当罕见的,但为什么要冒这个险呢?而且,我真的不喜欢重新启动。永远不喜欢。

根据您的情况,尽量购买您能负担得起的最好的 UPS。您需要一个能够长时间运行系统并为您的显示器、调制解调器、路由器和外部驱动器提供电源的 UPS。这样,如果电源短暂中断,您就不会丢失任何数据,并且不必等待所有设备重新启动。

今天有许多不同品牌的 UPS 可用。我对美国电源转换APC)设备有些偏爱。我有几个,它们在 Linux 上运行良好。确保购买一个带有电话连接器到 USB 端口的 UPS,因为旧式串行端口的设备无法正常工作。

apcupsd守护程序可用于监控 UPS。如果您的发行版尚未安装它,可以安装该软件包。

  • 如果使用 Fedora,请运行yum -y install apcupsd(根据需要替换您的软件包安装程序)

  • /etc/apcupsd/apccontrol文件中注释掉WALL语句,以防止烦人的消息被广播到每个终端

  • 运行apcaccess status来查询 UPS

你可以用apcupsd做更多的事情,更多信息请查看它的网站www.apcupsd.com。这也列出了一些可能与 Linux 不兼容的 UPS 设备。

还有一件事,你可能想要使用 UPS 的自动关机功能。它可以在停电时间过长时自动关闭你的机器。大多数设备允许你设置在关闭之前运行的时间。请记住,UPS 在电池上运行的时间越长,它们的寿命就会越短。

在复制文件时要小心

在将文件复制到目录时,请确保它确实是一个目录。这种情况发生得足够频繁,以至于我不得不提到它,我必须承认我有时仍然会犯这个错误。很容易将许多文件复制到你认为是目录的地方,但实际上并不是。结果就是只有最后一个被复制的文件会存在,如果你没有保留源文件,它们可能会丢失。在复制文件之前,使用file命令验证目标是否真的是一个目录。

验证存档文件并使用校验和

经常出现的一件事是在创建将要发送给其他人或站点的tarzip存档时,会发现未被注意到的错误。

以下是应该遵循的步骤:

  1. 将文件复制到适当的目录(确保它确实是一个目录)。

  2. 使用ziptar进行压缩和创建存档。

  3. 使用telllist选项确保它看起来正确。对于 TAR,是tar -tvzf filename.gz,对于 ZIP,是unzip -l filename.zip

  4. 对你的文件运行sum命令,然后将文件发送到需要去的地方。

  5. 如果使用scp,请使用ssh在远程系统上运行sum命令,如下所示:

ssh <user@remote-host> /usr/bin/sum filename.gz

  1. 两个sum值应该匹配。

  2. 如果使用电子邮件,在你的端上运行sum,并将结果与电子邮件一起发送。

给开发人员的一个建议;假设你正在创建一个编程项目的存档。为了确保你已经复制了它所需的每个文件,创建存档,然后将其复制到另一台机器上。像平常一样解压并构建它。如果缺少所需的文件,将会出现错误。

防火墙、路由器设置和安全性

防火墙在第五章中有所涉及,权限、访问和安全,所以这只是一个简要的回顾。如果你运行的是家庭系统并且使用一个好的路由器,iptables的默认设置可能已经足够了。它可能需要一些调整,例如使用扫描仪,但大部分时间你可能已经免受黑客的攻击。另一方面,如果你是一个大公司的系统管理员,iptables可能不够用。我会调查使用硬件入侵设备或其他方法,以确保数据和系统的安全。

强烈建议始终使用带有内置防火墙的路由器。我绝不会直接将系统连接到互联网。尽管典型的 Linux 系统可能会幸存下来,但我曾经看到 Windows 系统在不到 30 分钟内感染了病毒。

默认的路由器设置可能已经足够强大,可以防止典型的黑客入侵。为了确保,也为了了解路由器内部发生了什么,最好定期登录并检查一切。在大多数路由器上,将浏览器指向192.168.1.1会弹出登录界面。在大多数情况下,需要输入 ID 和密码。

who命令可以在 Linux 中用来显示系统上每个用户的用户名、tty、日期、时间和 IP 地址,如下面的截图所示:

防火墙、路由器设置和安全性

还有另一件事可以帮助防止入侵。拒绝ssh/scp的 root 访问是个好主意,因为黑客通常会尝试以 root 身份入侵。这可以通过编辑/etc/ssh/sshd_config文件来实现。找到一行写着#PermitRootLogin yes的地方,将其改为PermitRootLogin no。不要忘记去掉#(井号)。你还需要重新启动sshd。现在,任何以 root 身份登录的尝试都将失败。我已经将我所有的机器都设置成了这样,作为额外的预防措施。

最后一件事,每当有人登录(或尝试登录)到你的系统时,都会有记录。在 Fedora 上,这会记录在/var/log/secure文件中。你可以不时地检查这个文件,或者使用tail -f /var/log/secure命令来监视它。

现在是一个额外的奖励。以下是一个我用来监视对我的机器的未经授权访问的简单脚本:

#!/bin/sh
tput clear
echo "jwho by Lewis 10/23/2011"
numusers=`who | wc -l`
while [ 1 ]
do
 rc=`who | wc -l`       # get number of users
 if [ $rc -gt $numusers ] ; then
 echo "Someone new has logged on!!!!!!!!!!!"
 date
 who
 jalert5 &            # see below
 numusers=$rc
 elif [ $rc -lt $numusers ] ; then
 echo "Someone logged off."
 date
 numusers=$rc
 fi
 sleep 5
done

基本上,这个脚本每 5 秒检查一次用户数量是否发生了变化。如果增加了,jalert5脚本将在后台运行。它每 5 秒播放一个非常讨厌的 WAV 文件,直到我关闭它。这也会在每次打开新会话时触发,所以你可能会希望在启动后最后运行它。

如果发现入侵怎么办

假设你发现发生了入侵。你应该怎么办?

提示

这些说明适用于你的机器或你完全负责的机器。如果这发生在你工作的机器上,立即按照公司针对安全事件的任何程序进行操作。

如果怀疑发生了入侵,需要迅速采取行动。运行who命令或cat /var/log/secure并检查输出。如果看到可疑的 IP 地址,采取以下行动:

  • 如果这是一台非常重要的机器,上面有关键数据,我会立即拔掉以太网线并立即关闭它。然后我会从救援介质启动,尝试确定是否发生了任何不好的事情。检查他们进入的日期和时间(从who命令)可能会让你知道他们可能造成了多大的破坏。

  • 如果这是我的家庭系统,我会首先拔掉以太网线。然后我会运行ps auxw命令将系统当前的运行情况保存到文件中。我会将这个文件复制到其他机器或设备上,然后关闭系统。

通过检查ps输出并查看tty值,我可能可以确定他们正在运行的程序,如果有的话。这可能会指出他们试图通过进入系统来实现什么目的。

显然,如果有人真的进入了你的系统,他们很可能是通过猜测或某种方式确定了密码。我可能会将所有密码重置为更难破解的密码,然后告诉我的用户选择更好的密码。或者可能自己分配密码。

好吧,至少有一个人在读这篇文章时会想为什么要拔掉以太网线?为什么不只是关闭接口?因为一个狡猾的攻击者会考虑到这一点,一旦他获得了访问权限,他就会在系统上自动放置代码,以便在接口关闭时自动重新打开它。他甚至可能给它加上一个定时器,或以其他方式隐藏它。

攻击者可能有时间做各种事情。他甚至可能修改了whops和其他命令,使得几乎不可能从运行的系统中跟踪他所做的事情(或仍在做的事情)。考虑到这一点,你仍然需要尽快关闭系统,然后使用救援盘或等效物重新启动。需要查看的一些事情是pswho等命令。运行file命令,它应该显示它们是二进制可执行文件,而不是 shell 脚本。如果它们是 shell 脚本,你可能会发现攻击者已经用.重命名了可执行文件,以隐藏它们,然后将它们包装在一个脚本中,以帮助掩盖他的存在。还有许多其他隐藏的方法。

文件名中的空格

在为自己或其他人生成文件时,不要在文件名中包含空格。这可能会在 Linux 和 UNIX 机器上引起很多问题。如果必要,使用大写字母和/或下划线。也不要使用括号或其他特殊字符。我第一次使用 Firefox 下载文件时真的很惊讶,因为它插入了括号以将其与同名文件区分开。我很感激它没有简单地覆盖原始文件,但使用括号是一个非常糟糕的主意。

使用脚本和别名来节省时间和精力

我在现场看到的一件事是,人们浪费时间和精力一遍又一遍地输入相同的东西。不要这样做。使用别名和脚本。不要考虑编写脚本可能需要多少时间,而是考虑通过能够一直使用它来节省多少时间。您可能还可以在以后将其合并到另一个脚本中(特别是如果一开始就写得很好)。此外,有了这些可用的东西应该有助于满足截止日期。

使用自动身份验证的 scp 和 ssh

按照以下步骤允许使用ssh/scp而无需输入密码。您需要是 root 用户。

  1. 首先,确保客户端至少使用过ssh。这将创建所需的正确目录。

  2. 在主机上运行ssh-keygen -t rsa命令。这将创建一些必要的文件。

  3. 如果客户端上不存在/root/.ssh/authorized_keys文件,您可以运行scp /root/.ssh/id_rsa.pub <hostname>:/root/.ssh/authorized_keys

  4. 否则,将id_rsa.pub文件复制到客户端,然后将其添加到authorized_keys文件中(我通常将其放在底部)。

  5. 现在,您应该能够在不输入密码的情况下对客户端进行scpssh。这真的很方便,特别是在脚本中。

您还可以将此条目添加到另一个用户帐户中。例如,我将其添加到了我的/home/guest1/.ssh/authorized_keys文件中。这样,我可以作为 root 从一台机器复制文件,另一台机器仍然会接受它。

保存历史记录和截屏

在处理计算机时,我们都必须学习新的东西。有时所涉及的步骤非常复杂,我发现实际上每一种情况下,无论我用来执行这些步骤的文档或网站都存在错误。它不完整,作者跳过了重要的步骤等等。因为这些原因和其他原因,当我(终于)让某些东西运行起来后,我会在会话中运行history命令并将其输出到文件中。然后我以合适的名称保存这个文件,以便以后能够找到它。

根据所需的努力程度,如果合适的话,我也可能对每个步骤进行截屏。这可以作为以后的参考,如果您必须帮助其他人完成相同的任务。或者,如果有人说服您有朝一日写一本关于它的书。

驱动器上的空间

在过去,硬盘空间总是不够。我们总是快用完或者用完了,试图找到增加存储空间的方法。现在,在现代社会,这可能不再是一个问题。但是,随时监视您的可用空间仍然是一个好主意。

有很多方法可以做到这一点。在我的系统上,我使用了我用 C 和 Java 编写的一个程序。它叫做“使用百分比空间”,只是在底层使用了df -h。您可以将df放入脚本中,或者不时手动检查空间。只是不要用完!填满分区是一种让您手忙脚乱的好方法,特别是如果它是系统分区。

接受新想法

这是我给想更好地了解 Linux 的人的最后一条建议。我经常看到在这个领域里的人们在做他们的日常工作,而且都是以同样的方式。要时刻注意如何改进你执行日常任务的方式。如果你看到一个同事做一些对你来说很奇怪的事情,不要假设他的方式是错的,你的是对的。他的方法可能比你的好得多。向他学习。另一方面,他可能没有更好的方法,你的可能更好。在这一点上,你可以决定是否尝试分享你的想法。我发现大多数人对此非常抵触。

不要让自己陷入“你的方式不比我的好,只是不同”的争论中。正如我之前提到的,通常只有一种正确的执行任务的方式,但大多数人并不明白这一点。尽量在你能找到的时候找到它,并且只在对方愿意接受帮助的情况下分享你的想法。

附录 B:寻求帮助

在本附录中,我们将涵盖以下主题:

  • 使用man页面

  • 使用info命令

  • 命令和Usage部分

  • 本地文档目录

  • 浏览网页以寻求帮助

  • 发行说明

  • Linux 用户组

  • Internet Relay Chat(IRC)

介绍

在 Linux 上寻求帮助的地方有很多。实际上,有很多可用的信息;事实上,在某些情况下太多了。很难从好东西中过滤出噪音。在这里,我们试图向您展示如何快速有效地获得所需的内容。

使用 man 页面

man实用程序是本地参考手册的接口。它用于快速查找有关程序、实用程序、函数和其他主题的信息。man实用程序将接受几个选项;但是,通常的调用只是man page,其中 page 实际上是指一个主题。您甚至可以单独运行man来学习如何使用它。

以下是man man命令的屏幕截图:

使用 man 页面

在页面上运行man显示感兴趣的主题。空格键用于向下翻页,Q用于退出。页面(主题)以更或多或少标准的顺序呈现,可能的部分名称有:NAMESYNOPSISCONFIGURATIONDESCRIPTIONEXAMPLESOVERVIEWDEFAULTSOPTIONSEXIT STATUSRETURN VALUEENVIRONMENTFILESVERSIONSCONFORMING TONOTESBUGSAUTHORSHISTORYSEE ALSO

man显示找到的第一页,即使其他部分中有更多页面。例如,假设您正在寻找有关如何在 C 程序中编写readlink函数的信息。您可以尝试以下命令:

man readlink

它会打开一个页面,但是命令是readlink而不是 C 函数。为什么?因为它显示第一页,除非您在页面之前指定部分编号。好吧,您怎么知道那是什么?您可以以以下方式使用man选项-a运行man

man -a readlink

这将像以前一样提出readlink命令。现在按Q退出。页面消失了,但是man会话显示如下内容:

Big4 /lewis/Fedora/17 # man -a readlink
--Man-- next: readlink(2) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]

这给了您一个选择:按Enter将显示下一页(主题),Ctrl + D将跳转到下一个主题,Ctrl + C将结束man会话。当您在最后一个主题上按Q时,man将像以前一样正常终止。

那么,如果您已经知道要直接加载第三部分的页面,该怎么办?您可以以以下方式指定它:

man 3 readlink

这将跳过前两个,直接进入 POSIX 程序员手册中的readlink页面。

以下是各节编号及其名称的列表:

  • 1:可执行程序或 shell 命令

  • 2:系统调用(内核提供的函数)

  • 3:库调用(程序库中的函数)

  • 4:特殊文件(通常在/dev中找到)

  • 5:文件格式和约定(例如,/etc/passwd

  • 6:游戏

  • 7:其他(包括宏包和约定),例如,man(7)和 groff(7)

  • 8:系统管理命令

  • 9:内核例程

本地参考手册可以是获取信息的重要来源。它们包含有关 Linux 系统中几乎所有内容的大量数据。不幸的是,它们也有一些缺点。大多数写得很好并且有意义。有些则相当糟糕。当发生这种情况时,还有其他地方可以寻求帮助。

使用 info 命令

除了 man 页面外,大多数 Linux 系统还有Info文档。这些是通过使用info程序访问的。一般来说,Info文档提供的数据往往比典型的man页面更详细和更有信息量。

man一样,您可以单独运行 info:

info info

这是如何使用info的介绍。最后一段说如果对 info 不熟悉,现在输入'h'。这将带你进入一个程序化的指令序列。如果你有兴趣学习如何充分利用info,我建议在这里按H来运行教程。

以下是运行info info然后按H的屏幕截图:

使用 info 命令

命令和用法部分

Linux 中的大多数命令都有一个Usage部分,可以通过使用--help选项来显示。典型的例子有catcutifconfigbashrm等。

以下是rm --help的屏幕截图:

命令和用法部分

请注意,一般来说,Usage部分并不真的意在教会某人很多关于一个命令。它真的是用来提醒用户参数是什么,以及命令的一般格式。

请注意,一些命令,特别是那些需要参数才能完成某些操作的命令,只需调用而不提供参数就会显示它们的用法信息。

以下是运行awk命令而不带参数的屏幕截图:

命令和用法部分

本地文档目录

大多数完整的 Linux 发行版都有包含各种主题文档的目录。根据使用的发行版不同,布局可能略有不同,但在大多数情况下,文件位于/usr/share/doc目录中。以下是从 Fedora 14 中/usr/share/doc目录的部分列表:

  • /usr/share/doc/BackupPC-3.1.0

  • /usr/share/doc/ConsoleKit-0.4.2

  • /usr/share/doc/Django-1.2.3

  • /usr/share/doc/GConf2-2.31.91

  • /usr/share/doc/GeoIP-1.4.7

  • /usr/share/doc/GitPython-0.2.0

  • /usr/share/doc/HTML

  • /usr/share/doc/ImageMagick-6.6.4.1

  • /usr/share/doc/ModemManager-0.4

  • /usr/share/doc/MySQL-python-1.2.3

  • /usr/share/doc/NetworkManager-0.8.1

  • /usr/share/doc/abrt-1.1.13

  • /usr/share/doc/ant-1.7.1

  • /usr/share/doc/apcupsd-3.14.8

  • /usr/share/doc/doxygen-1.7.1

  • /usr/share/doc/ethtool-2.6.38

  • /usr/share/doc/fedora-release-14

  • /usr/share/doc/gcc-4.5.1

  • /usr/share/doc/gcc-c++-4.5.1

  • /usr/share/doc/gimp-2.6.11

  • /usr/share/doc/git-1.7.3.1

  • /usr/share/doc/gnome-desktop-2.32.0

  • /usr/share/doc/gnuchess-5.07

  • /usr/share/doc/httpd-2.2.16

  • /usr/share/doc/httpd-tools-2.2.16

  • /usr/share/doc/java-1.6.0-openjdk-1.6.0.0

  • /usr/share/doc/java-1.6.0-openjdk-devel-1.6.0.0

  • /usr/share/doc/kaffeine-1.1

  • /usr/share/doc/mailx-12.4

  • /usr/share/doc/make-3.82

  • /usr/share/doc/man-db-2.5.7

  • /usr/share/doc/man-pages-3.25

还有一个文档查看器/浏览器,通常通过文件夹对话框访问。例如,如果你打开文件管理器并转到/usr/share/doc下的一个目录,你会看到许多文件。点击README文件将会带出更多关于你系统上特定程序的信息。还可能有其他可读的文件,比如CONTENTAUTHORMAINTAINERSINSTALLATION等等。

浏览网页寻找帮助

使用互联网肯定是在 Linux 任务上寻找帮助的好方法。在许多情况下,它甚至可能比依赖本地来源更好,因为自从文档上次放在你的系统上以来可能已经发生了更新。当我需要使用网络查找某些东西时,我直接去谷歌高级搜索。

以下是www.google.com/advanced_search的屏幕截图,其中一些字段已经填写:

浏览网页寻找帮助

使用这种搜索方法很快,你可以使用这些字段来缩小你要查找的范围。

请记住,互联网上有很多信息。其中一些是准确的,正是您所寻找的。然而,在许多情况下,信息是不正确的。回答问题的人可能会表现得自己是该主题的专家,而实际上并非如此。许多人在提出解决方案之前也不总是检查他们的解决方案。在尝试互联网上给出的解决方案时要注意这一点。

这种情况的反面也是正确的。如果您想帮助他人,那绝对是很好的。但是,在发送答复之前,请考虑并测试您希望提供的任何解决方案的准确性。

发行说明

了解有关您的 Linux 发行版的更多信息的一个很好的方法是查看其发行说明。这些通常包含以下信息:

  • 它们记录了自上次发布以来所做的更改。通常分为特定用户的部分,如系统管理员、桌面用户、开发人员等。请注意,在某些发行版中,“技术说明”文档中提供了更多信息。

  • 它们详细说明了运行“发行版”所需的最低硬件要求/架构。特别关注内存、图形和视频问题。

  • 它们提供了重点介绍引导和特殊或不寻常设置的安装说明。

  • 它们提供了可以安装的可能桌面环境的列表,通常附有安装步骤。这是一个非常重要的部分,因为使用设计不佳和/或有错误的桌面会影响您的生产力。

  • 它们解释了新功能、功能和程序的添加情况。有时会跟上添加背后的原因,以及替换了哪个程序。

  • 它们包括一个列出被弃用(移除)的程序和功能的列表。

  • 它们指出了在哪里获取额外帮助的指针,如网站和聊天室。

  • 它们包含了“发行版”中仍然存在的已知错误和问题的列表,以及可能的解决方法的信息。在提交错误报告之前,始终查阅此列表。

  • 它们提供了如何就发行版和发行说明提供反馈意见的说明,以及您希望添加/更改的任何功能。

以下是来自[http://docs.fedoraproject.org/en-US/Fedora/19/html/Release_Notes/index.html]的 Fedora 19 发行说明的截图:

发行说明

以下是来自[https://wiki.ubuntu.com/RaringRingtail/ReleaseNotes]的 Ubuntu 13.04 发行说明的链接:

发行说明

以下截图是来自[http://www.debian.org/releases/stable/amd64/release-notes]的 Debian 7.0(Wheezy):

发行说明

发行说明非常值得一读。在安装新发行版之前、期间和之后,我都会浏览它们。这确保我充分利用了我的发行版,告诉我新功能,并帮助我避免花费过多时间和精力来解决已知的错误或问题。

Linux 用户组

另一个很好的寻求帮助的地方是您当地的用户组。要找到您附近的用户组,请尝试在 Linux 用户组上进行高级 Google 搜索,然后输入您的城市(如果需要,还有州)。您应该会看到一些选项。请注意,大多数只需要有效的电子邮件地址即可订阅该组。一般来说,要提问,您只需像平常一样撰写问题,然后将其发送到组的电子邮件地址。通常,对该领域有了解的人通常会迅速提供帮助,并通过电子邮件向组回复可能的答案。在大多数情况下,您还可以搜索组的存档以查找信息。

我通过在Central Texas Linux Users GroupCTLUG)上提问找到了许多困难问题的答案。

以下是ctlug.org/的 CTLUG 网站的屏幕截图:

Linux users' groups

Internet Relay Chat (IRC)

使用 IRC 是了解您感兴趣的各种主题的好方法。这也是一个很好的寻求帮助的地方。经常访问这些聊天室的人通过加入与他们感兴趣并且了解的主题相关的频道来实现。这也都是实时进行的,无需等待电子邮件回复。您只需要一个 IRC 客户端、一个服务器和一个组(频道)来加入,(在大多数情况下)就可以开始了。有很多不同的 IRC 客户端。其中一些是文本模式(命令行),一些是基于 GUI 的。

以下是www.irchelp.org/irchelp/clients/unix/的屏幕截图,这是一个展示 Linux 和 Unix 的不同 IRC 客户端的网站:

Internet Relay Chat (IRC)

如果您是 IRC 的新手,以下是一些指针,可以帮助您入门。我之前没有安装过 IRC 客户端,所以首先安装了irssi在我的 Fedora 17 机器上,通过以 root 身份运行yum命令:

yum -y install irssi

这很顺利。

以下是 Fedora 17 上irssi –help的屏幕截图:

Internet Relay Chat (IRC)

这个程序允许进行相当多的自定义。我的系统上的默认配置包含在/home/<user>/.irssi/config文件中。您可以使用先前的设置来覆盖这些设置。现在,让我们先简单运行它,看看它是什么样子。

  1. 首先运行irssi。它应该会带出一个文本模式屏幕,并向您显示欢迎消息,因为这是您第一次进入。

  2. 连接到服务器。在这个例子中,我们将使用 freenode。运行:

/connect irc.freenode.net

  1. 您应该看到另一条欢迎类型的消息。现在我们需要一个频道。在这个例子中,运行/join #chat命令(不要忘记#符号)。

  2. 您现在应该通过#chat频道连接到 freenode,并能够与其他用户聊天。

请注意,irssi确实需要一点时间来适应。底部是一个状态屏幕。您可能会看到类似[ Act: 2]或等效的内容。这表示另一个窗口中有新的文本,您可以通过按下Alt键,然后按数字来访问该窗口。因此,Alt + 2将带您到下一个屏幕。

您在其中输入的任何内容,如果没有以/符号开头,都将发送给当前组中的所有人。请记住这是一个公共论坛;请小心您说的话,并遵循指示。还要注意不要在聊天会话中透露个人信息。

有很多网站上包含有关 IRC 的信息。以下是我找到的一些网站:

有很多 Linux 频道可供选择,很难把它们列成一份清单。有些需要认证,而有些则可以立即开始聊天。找到它们的最佳方法是在互联网上搜索你需要帮助的主题,并包括短语 IRC。连接到适当的服务器,加入频道,遵循可能存在的任何特殊指示,并享受聊天乐趣!

posted @ 2024-05-16 19:40  绝不原创的飞龙  阅读(22)  评论(0编辑  收藏  举报