原文:Learn Raspberry Pi 2 with Linux and Windows 10
协议:CC BY-NC-SA 4.0
一、你的第一个树莓派
这一章是我们最终动手的地方。如果您急于开始运行,决定跳过介绍,这很好;你不会错过这一章的任何关键内容。但是,请注意在不久的将来去参观一下这个介绍,因为它会给你很多关于 Pi 的背景知识,以及它的特别之处。
现在,回到脏手!我们将从打开 Pi 的包装开始,并浏览您实际启动和运行它所需的一系列东西。一旦我们把所有的东西都连接起来,我们就需要为它的运行挑选一些东西——在这个例子中,是 Raspbian Linux(稍后会详细介绍)。一旦我们运行了 Raspbian,我们仍然需要对它进行配置,有些选项是技术性的,并且是特定于 Linux 的;但是不要担心,我们也有你。为了圆满完成这一章,我们将沐浴在 Raspbian 桌面的光辉中,然后前往第二章看看我们可以用它做些什么。
你新烤的圆饼来了
好了,邮递员刚刚送来了你期待已久的包裹,在急切地撕开带衬垫的信封后,你只剩下一个小盒子,(小是关键词)。你只是情不自禁地往信封深处看,看看是否有什么东西在底部徘徊。如果目测没有发现任何东西,毫无疑问,你会继续使用古老的忠实方法,把信封倒过来,摇一摇。虽然你可能会抖掉包装单(不知何故,它们似乎总是超级粘在里面),但你不会找到其他任何东西。
亲爱的读者,当你点一杯树莓派时,这就是你将要得到的全部(见图 1-1 )。
图 1-1。
What falls out of the envelope WHY A PICTURE OF JUST A BOX AND SOME BITS?
诚实的原因是,当这一切出现时,我们的第一个想法是,一定有什么东西不见了。是的,当你订购时,网站会告诉你这是你将得到的全部,这真的很有意义。
我们要强调的是,这是你得到的全部,还不足以让你的 Pi 挂上号,投入业务。你还需要一些其他的东西(你可能已经有了一些或者全部),在开始的时候强调这一点是很重要的。在下一节中,我们将介绍您实际需要的入门工具包。
如果你还没有订购 Pi(或者正在等待它出现在邮件中),图 1-2 显示一个坐在空白 DVD 旁边。
图 1-2。
A Raspberry Pi next to a blank DVD
尽管圆周率的大小是众所周知的,而且它装在一个如此小的盒子里,但直到你真正把它拿在手里,你才会意识到它有多小!在“啊”了一声之后(以及其他碰巧听到他们声音的人),我们觉得是时候开始表演了。
这就是事情突然停止的地方。我们有了圆周率,但我们才刚刚意识到,我们根本不知道我们实际上需要什么来让它运行。尽管我们对这一切并不陌生,但我们已经让自己陷入了这一时刻,无论出于什么原因,都没有考虑到 Pi 需要任何特殊的东西(或者至少是你的普通极客类型的人不会在家里挂着的东西)。
如果你没有直接从德克斯特的实验室里拿出一柜子的杂物,你可能需要收拾一些东西。幸运的是,它们都很容易找到,你应该可以在当地的电脑商店买到你需要的任何东西。如果你不想去寻宝,许多公司会提供你需要的一切入门套件。因为这些套件变化很快,所以找到可用套件的最佳方式是上网搜索“raspberry pi starter kit”。
配料清单
为了把你的圆饼烤得完美,你需要以下原料:
- 树莓派
- 微型 USB 引线(用于电源)
- USB 电源适配器(也用于电源)
- HDMI 引线:Type A to Type A(连接显示器或电视)
- HDMI 显示器
- 微型 SD 卡:8 GB 至 64 GB(用于存储 Windows 物联网需要 10 级)
- 微型 SD 卡读卡器
- USB 键盘和鼠标
微型 USB 引线
如果你碰巧有一部安卓手机或 Kindle,很有可能你已经得到了一条线索,你可以重新使用它来驱动 Pi。这条导线实际上并不是用来传输数据的,尽管你可以从 USB 端口获取电力(你可以将其插入你的主 PC 或笔记本电脑),但你不能将 USB 连接用于其他任何事情。不同类型的 USB 连接器很难描述,如果你还没有见过一个。请看图 1-3 中的一些例子。
图 1-3。
Different types of USB connectors Warning
尽管运气好的话,您可以从 USB 端口运行原始 Pi,但 Raspberry Pi 2 消耗的功率几乎是原始 Pi 的四倍,而且由于非协商 USB 仅提供少量电流,您无法从 USB 端口运行新 Pi。相反,你需要一个大功率的电源,比如那些用来给平板电脑充电的电源。请注意,即使他们声称提供足够的电力,他们也可能不会好好对待你的 Pi。如果您的 Pi 崩溃,连接网络有问题或通常有奇怪的行为,请首先检查您的电源。
你感兴趣的连接器是左边的第一个,称为微型 USB。请小心,因为在快速检查时,微型 USB 插头很容易被误认为迷你 USB 插头(左侧第二个)。你最不想做的事情就是专程去商店,然后回来却发现你拿错了!
USB 电源适配器
如上所述,一个普通的 USB 端口可以为 A 型 Pi(没有内置以太网的那种)供电,但对于现代 Pi,你需要一个更强大的东西。
幸运的是,大量的设备已经采用 USB 作为充电方式,这意味着你可以非常便宜和容易地获得电源适配器。至于选择哪种适配器,这实际上取决于个人选择。然而,由于 B 型需要 800 毫安而没有插入任何其他东西,并且您总是希望有一点扩展空间,您可能应该争取获得一个至少可以提供 1000 毫安(或 1 安培)并且最好是 2000 毫安(2 安培)的适配器。从我们高度科学的测试(逛遍无数店铺,眯着眼看包装标签)来看,似乎 1000 ma 其实是最常见的额定值。我们确实遇到了一些额定为 500 毫安的,虽然这对于大多数 USB 设备来说已经足够了,但对于您的需求来说还不够。
HDMI 引线
在过去的几年里,HDMI 已经成为将无数设备连接到显示器和电视的事实上的标准。这真的很方便,因为这意味着如果一个设备支持 HDMI,它可以很容易地连接到任何支持它的显示器。这听起来可能不那么令人印象深刻,但就在不久前,电视和显示器还是非常独立的东西,通常没有直接的方式连接,比如说,将计算机连接到电视或 VCR 连接到显示器(尽管有趣的是,如果你回到 20 年前,所有的家用计算机都直接连接到电视(例如,Commodore 64 或 Spectrum))。当然,你可以得到特殊的硬件,一些高端设备确实提供了一系列不同的连接器,但作为一个规则,这两个世界并没有真正混合。
幸运的是,Pi 使用 HDMI,所以我们可以忽略过去的烦恼。要将您的 Pi 连接到显示器,您需要一根“A 型到 A 型”导线。A 型是您在电视机或显示器背面可以找到的尺寸;你所要做的就是找到一根导线,通过 HDMI 将某个设备连接到电视上,并且两端尺寸相同。大多数消费电子产品使用 A 型,所以如果你有一台 Xbox 360 或你的笔记本电脑有 HDMI,你很可能已经有了正确类型的线索。
支持 HDMI 的显示器
你可能已经看到了这一点,但你需要某种支持 HDMI 的显示器。由于近年来被广泛采用,几乎每台新电视都配有一个或多个 HDMI 端口,大多数新显示器也是如此。如今,在电视上看到三个或四个端口是相当常见的,因为你需要这么多来连接你所有的新数字设备。
确定您的电视或显示器是否支持 HDMI 非常容易。你所要做的就是寻找一个物理 HDMI 端口。你更有可能在你的电视上找到它,而不是在你的显示器上,但是现在许多甚至更基本的显示器似乎都支持它。
在我们的例子中,结果是我们老化的显示器不支持 HDMI,尽管客厅的电视支持。当然,作为主电视意味着人们想在上面看电视,不可否认,我们不希望盘腿坐在大电视前的地板上,试图说服一个私家侦探开机。最后,我们决定买一个支持它的新显示器。虽然我们可以买一个 DVI 转换器,但我们决定不能错过获得一个新的闪亮玩具的机会。
如果你不能重复使用你的电视或电脑显示器,你应该能够很容易地得到一台支持 HDMI 的基本电视或显示器。
微型 SD 卡
大多数计算机使用某种硬盘作为它们的主要存储形式。即使笔记本电脑大小的磁盘也比 Pi 大,尽管较新的固态硬盘(SSD)型号消耗的功率很少,但它们肯定会大大增加 Pi 所需的功率。幸运的是,我们有一个替代方案。我们可以借用相机已经使用多年的技术:闪存,而不是使用硬盘这样的重型设备。尽管这些卡在空间和性能上无法与硬盘相提并论,但它们在电力使用方面非常出色,尽管它们比以前的同类产品更小;64 GB(您的 Pi 的最大值)仍然是一个相当可观的数量,可能比您的 Pi 需要的还要多。
微型 SD 卡是标准化的,所以没有太多要说的。如果可以的话,你确实想得到一张高性能卡(通常被称为 10 级卡),但它们最终都做同样的工作。也就是说,我们听说过一些微型 SD 卡没有与 Pi 一起工作,但如果你坚持使用一个知名品牌,你会得到一个 10 级卡,你应该没事。Linux 在卡的性能上还是挺宽容的,但是 Windows 10 IoT 好像很挑剔。我们只能让它在 10 级 SD 上工作,这似乎得到了微软最新文档的支持。如果你想试用 Windows,你肯定需要一个 10 级的 SD 卡。
由于目前有许多不同类型的存储卡,图 1-4 显示了微型 SD 卡的实际外观。
图 1-4。
SD card with micro SD and adapter
最左边的卡是你典型的 SD 卡;最右边是一个微型 SD 卡。它们在智能手机(特别是基于 Android 的手机)中的使用已经变得非常流行,因为大多数手机都配有小卡(就存储空间而言),所以购买更大的卡或在手机包装中加入一张卡并不罕见。如果你碰巧有一个这样的东西,你可以把它和你的 Pi 一起使用。
微型 SD 卡读卡器
现在你有了你的微型 SD 卡,你需要一些方法来实际使用它。Pi 为您提供保护,并内置了一个微型 SD 卡插槽。然而,它在设备上实际上没有任何其他存储,所以它实际上是一个空白,直到你插入一个安装了有用的东西(如 Linux)的 SD 卡。问题是,要把 Linux 放在卡上,你需要一个已经启动并运行的设备,它还能读写卡。这是一个典型的两难处境。即使你可以借用别人已经安装了 Linux 的卡,你也不能简单地把卡换掉,因为一旦你这么做了,你就再也没有 Linux 了!
再次感谢数码相机的普及,许多电脑都内置了读卡器。许多(通常被称为媒体个人电脑)带有一系列插槽,适用于各种不同的卡类型。所以很可能你已经有了一种阅读卡片的方法。如果你还没有读卡器,你可以从当地的电脑商店买到便宜的多卡读卡器。它们通常不贵,并且支持许多不同类型的卡。在你交出你的血汗钱之前,确保它有一个微型 SD 卡插槽(由于某些原因,通常隐藏在不同的一侧)!作为参考,我们使用的适配器类似于图 1-5 中的适配器。
图 1-5。
Multicard reader (micro SD reader is on the left edge near the bottom)
USB 键盘和鼠标
最后但并非最不重要的是良好的旧键盘和鼠标。尽管 Pi 很高级,但它还没有心灵感应,所以你需要一些方法来控制它。这是常识,但是随着现代计算机通常配备无线键盘和鼠标,以及相当多的使用蓝牙而没有 USB 适配器的计算机(甚至一些有适配器的计算机也已知会导致问题),您可能会发现您当前的键盘和鼠标无法与您的新玩具一起工作(恐怕 Pi 上没有蓝牙)。这里真的没有必要像任何标准的键盘和鼠标一样详细介绍,这主要是提醒你在出去购买 Pi 制作材料之前检查一下你实际上有什么,以避免当你回到家发现你完全被卡住时的无尽沮丧。
呼,我们完了!
我们终于拥有了我们需要的一切!将所有这些东西挂在您的 Pi 上非常容易,特别是因为每个项目都有独特的形状,所以它只能放入一个插槽中(见图 1-6 中的成品 Pi)。
图 1-6。
A fully loaded Pi
如果你把所有东西都放在一起,插上电源,打开你的电视,你应该会看到…一个全黑的屏幕。
不要慌!
当你的个人电脑或笔记本电脑启动时,有一个叫 BIOS 的软件为你启动一切。它测试内存,设置基本显示,并允许您的所有设备初始化。在一些机器上(特别是苹果的),机器会有一个 EFI 而不是 BIOS。对于所有的意图和目的(至少从我们的角度来看),它们基本上是等价的。不管使用什么技术,最终是这个系统将控制权交给你的引导装载程序,这个软件负责启动你的操作系统。BIOS 本质上是非常嘈杂的,如果你出错了,它要么会发出很多哔哔声(带有一些你只能在 3 年前扔进垃圾箱的 BIOS 手册中找到的神奇数字代码),要么在屏幕上显示一些有用但神秘的消息。简而言之,它可能做不到你想要的,但至少你知道你的电脑还活着。虽然它有一个红色的小 LED“亮着”,但除非它的 SD 卡上有一个可启动的操作系统,否则 Pi 不会做任何事情。如果你期待某种闪屏或其他生命迹象(举起手;我们知道我们是),你运气不好(可能认为你有一个死了的 Pi)。
现在你知道了你需要什么来恢复 Pi 的生命(一个可引导的操作系统),是时候进入我们的主计划的第二阶段,给我们一些 Linux 了!
Linux 操作系统
由于这是一本针对初学者的书,我们将花点时间来谈谈 Linux,它来自哪里,它有什么特别之处,以及一些时常让人犯错的小陷阱。如果你已经知道这些东西(或者根本不关心),请随意跳到下一节“下载 NOOBS”对于那些想快速复习的人来说,继续读下去吧。
什么是 Linux?
啊,这个简单的问题打开了一个很多人都想方设法避免的大麻烦。原因是,在技术术语中,Linux 意味着一件事,但在一般的讲话中,它往往意味着另一件事。当谈到一般的操作系统时,我们认为微软视窗和苹果 OSX 是独立的整体。如果你说“我运行 Windows”,每个人都知道你在说什么。有了 Linux,就有点不一样了。
Linux 只是一个操作系统内核,这意味着它处理所有低级的零碎东西,如处理设备驱动程序,并提供对网络和硬盘的轻松访问。真正让 Linux 变得可用的是围绕它的所有软件。这没什么大问题,但是当你意识到人们对应该用什么软件包装它有不同的看法时,事情就变得复杂了。谈到计算,没有简单或次要的观点!
由于这个软件是开源的,任何人都可以用他们喜欢的任何方式把它组装起来,人们已经能够构建他们自己的 Linux 发行版。这是一个以 Linux 为核心的操作系统,但其周围的生态系统是为满足构建它的人的目标而建立的。例如,Red Hat Enterprise Linux (RHEL)被构建为健壮、可支持和长期稳定的。另一方面,Fedora 大约每 6 个月发布一次,每个版本都有最新最好的东西。Gentoo 要求您从源代码构建您的软件(因此它可以完全针对您的机器进行优化),Debian 竭尽全力以引入新功能为代价来保持稳定和安全。
OPEN SOURCE
在过去,当计算机价格高达数百万美元时,销售的是机器本身,而不是其上运行的应用程序。为了让你买他们的机器,一家公司为你编写软件是很常见的做法。直到计算机成为商品,价值才突然体现在软件中,公司开始保护他们编写的软件。做到这一点的一个方法是提供没有源代码的现成软件(这实际上是如何制作软件的蓝图)。这意味着你不能改变软件或做出改进来适应你不断变化的需求。
许多人认为软件应该总是附带源代码,这样人们就可以进行修改。开源围绕着人们能够自由交换、修改和集体改进软件的想法。只有当源代码被免费提供并且被允许(通过开放源码许可)进行这些修改时,才能做到这一点。
整本书都可以并且已经写了这个主题,但是你可以找到彼得几年前在他的大学里关于这个主题的演讲: http://www.youtube.com/watch?v=c-1LQIGh6cI
那么哪个最好呢?嗯,那要看你的需求了!没有完美的分布。最适合特定工作的人。对于 Pi,官方支持的平台是 Raspbian,它基于 Debian 发行版。因为它是受支持的,也因为它是最容易使用的(而且很可能是出现问题时更新和修复最快的),所以在本书中我们将坚持使用 Raspbian。如果你确实喜欢稍微不同的东西,Brendan Horan 的书(也来自 Apress),《实用树莓 Pi》将向你深入展示如何安装 Fedora,以及(如果你感觉特别勇敢)如何定制 Gentoo!
当 Linux 内核在 20 世纪 90 年代初首次亮相时,没有人真正意识到它将对计算世界产生的巨大影响。在此之前,开源软件已经存在了很长时间,并且已经发布了无数用于 UNIX 平台的工具(比如令人敬畏的 GCC 编译器)。然而,它们只是工具和软件包。他们仍然需要一个专有的操作系统来运行(当时唯一可用的操作系统)。为了与开源精神完全兼容,我们需要一个开源内核来驱动这些系统,而这正是 Linux 所提供的。虽然许多人会谈论这是如何给计算世界带来自由和希望的,但是我们将把你从这个特定的演讲中拯救出来(尽管不可否认它有相当多的真实性),并且简单地说是 Linux 内核真正把开源带到了普通大众的眼前。
现在全世界都有了 Linux,我们到底能用它做什么?几乎任何我们喜欢的东西——比如在我们的 Pi 上免费安装。
noob 简介
在这本书的第一版中,我们下载了一个 Raspbian 图像文件。当时,所有不同的 Pi 发行版都是作为图像文件分发的。你所要做的就是下载感兴趣的图像,并把它写到你的 SD 卡上。
在过去的几年里,不仅仅是 Pi 的硬件有所改进。现在,您可以下载一个 Pi 安装程序,它甚至更容易设置,并提供了一个完整的操作系统列表供您选择(尽管我们仍将使用 Raspian,请查看“为什么使用 Raspian”侧栏)。
NOOBS 的开发是为了让 Pi 用户能够以最少的麻烦和头疼来选择和安装操作系统。对于经验丰富的用户来说,写一张 SD 卡并不麻烦,但对于大多数用户来说,这是一件非常陌生的事情。这也意味着理解成像是如何工作的,以及复制一个文件和把它写成图像之间的区别。
对 NOOBS 来说,这已经成为过去。首先,不是下载一个图像文件,而是下载一个 zip 文件,这是现在几乎每个人都熟悉的东西。然后将该 zip 文件的内容直接提取到 SD 卡上。好吧,就这样,你完了!只需弹出 SD 卡,启动您的 Pi 就可以了。
那么这是如何工作的呢?嗯,在你的普通电脑上,你需要设置好一切,这样 BIOS 就能找到操作系统并启动它。Pi 的不同之处在于,它不附带传统意义上的固件,而是从 SD 卡加载所有内容。这使得启动有点慢,但是使得 Pi 基金会很容易更新一些东西,否则需要特殊的工具来更新。因此,Pi 在 SD 卡上寻找一个特定的文件,并简单地执行它。在 NOOBS 的例子中,你正在运行一个安装程序,从那里,你可以选择你想要安装的操作系统——所有这些都通过一个漂亮的图形界面!
两个角落
你可以下载两个版本的 NOOBS。第一个是完整的安装程序,简称为 NOOBS,第二个是 NOOBS 建兴。他们之间唯一的实质性区别是,NOOBS 与拉斯比安和 NOOBS 建兴不附带任何东西。请记住,NOOBS 是一个安装程序,而不是操作系统本身,所以它需要有一种方法来检索你感兴趣的操作系统。在所有情况下,如果你不想拉斯扁,NOOBS 将上网,并从互联网上下载发布。如果你真的想要拉斯扁(老实说,你可能真的想要),那么你还不如得到完整版的 NOOBS。另一方面,如果你只对其他操作系统感兴趣,下载完整版绝对没有好处,你应该坚持使用 NOOBS 精简版。
下载 noob
无论你喜欢哪个版本的 NOOBS,你都可以通过图 1-7 所示的 Raspberry Pi 下载网站获得。
图 1-7。
Pick your NOOBS
https://www.raspberrypi.org/downloads/
正如我们之前提到的,有两个版本可供下载。如果你正在阅读这本书,那么我们强烈建议你选择完整版的 NOOBS,因为你会想要安装 Raspbian。不可否认的是,你仍然可以用 NOOBS lite 来做这件事,但是如果你想安装一些 Pi,你就必须在每次安装时有效地下载 Raspbian。
WHY RASPBIAN?
正如您在下载页面上看到的,有许多发行版可供选择,尤其是如果您在其他地方使用过 Linux,您可能会倾向于选择 Raspbian 以外的发行版。然而,在下载这个奇特的发行版之前,您应该知道大多数使用 Pi 的人都运行 Raspbian——因此大多数支持、博客文章和教程(更不用说这本书)都是基于它的。这意味着如果你选择了其他的事情,如果事情没有按计划进行,你会发现很难得到帮助。
另一个更微妙的问题是,Raspberry Pi 是基于 ARM 的设备。它的工作方式和你的电脑不太一样。例如,Pi 没有 PCI 总线,所以任何希望有 PCI 总线的工具(而且不止一个)都不能工作。这些其他发行版也有不少缺陷,它们可能不如 Raspbian 维护得好。简而言之,如果你不选择拉斯边开始,你将承担更多的工作。
把 NOOBS 放到你的 SD 卡上
“把 Raspbian 放到你的 SD 卡上并不像简单地拷贝文件那么简单.”–在第一版中,我们就是这样开始这一部分的。然而今天,它就像将文件复制到 SD 卡一样简单。首先,我们需要确保您的 SD 卡已准备好使用。在本例中,我们将使用 Windows,因为这是大多数人都会使用的。然而,如果你使用的是 Mac,这个过程基本上是一样的,你可能不会有麻烦。
首先让我们插入 SD 卡。在“This PC”下,我们可以看到卡已被检测到(图 1-8 ):
图 1-8。
Freshly inserted SD card
这是一张从包装上直接拿下来的卡片(说真的,我还在流血,因为我试图把它从“易开”包装上撕下来)。正如你所看到的,它上面没有文件,这是安装 NOOBS 的一个重要前提(图 1-9 ):
图 1-9。
The card is empty
到目前为止一切顺利,现在我们需要做的就是打开 NOOBS 的 zip 文件,并将内容直接提取到这个磁盘中。如果你没有做任何特别的事情,你的浏览器会将 NOOBS 下载到你的“下载”文件夹中。你正在寻找一个看起来像这样的图标(图 1-10 ):
图 1-10。
What you’ll see in Explorer
当你双击打开它时,(假设你没有安装一个不同的应用程序来处理 zip 文件,如 WinZip)你会看到看起来像一个普通的文件夹,里面有文件(图 1-11 ):
图 1-11。
The contents of the NOOBS zip file
现在我们只需要提取它。如果你点击“提取”,你会看到一个弹出菜单。你可以忽略左边的东西,你想要右边的“全部提取”图标 1-12 ):
图 1-12。
Extract all
如果你已经遵循了这些步骤,你将在这个阶段领先,因为你已经有一个干净的 SD 卡插入你的电脑了。在前面的例子中,我们向您展示了我们的 SD 卡被拾取为“E:”。我们点击浏览并选择我们的 SD 卡,你应该做同样的事情。当它返回主屏幕时,它将只显示设备名称,在我们的例子中当然是“E”:(图 1-13 ):
图 1-13。
Extract everything to the SD card
一旦你选择了你的 SD 卡,你可以按下提取按钮。Windows 会给你一个漂亮的进度条。如果你的电脑和我们的一样,这将需要一点时间,所以现在可能是一个很好的时间去拿咖啡。Windows 总共花了大约五分钟的时间将所有文件解压到 SD 卡上。我们使用的是 10 级卡,所以如果你使用的是稍旧的卡(比如 4 级卡),那么你可能会发现它会花更长的时间(图 1-14 ):
图 1-14。
This can take a while to copy, but at least it’s pretty!
完成后,它会打开您的 SD 卡,并显示您的文件。如果一切正常,它应该与我们之前在 zip 文件中看到的完全相同。如果你看到类似下面的屏幕截图,那么你就成功了。现在剩下的就是实际尝试用它启动你的 Pi(图 1-15 ):
图 1-15。
What your SD card should look like after you’re done
好吧,这有点乏味,但是相信我们,这比我们必须使用的旧方法要简单得多。所以事不宜迟,让我们看看我们是否可以预订您的 Pi(图 1-13 )!
第一次开机
终于是时候启动你的 Pi 了!有了新镜像的 SD 卡,我们终于可以开始了。插入键盘、鼠标和显示器,并将 SD 卡插入 Pi。你现在所要做的就是接上电源线,你就可以开始了!一切正常,您最初应该会看到如图 1-16 所示的屏幕。
图 1-16。
The Pi’s first boot—it lives! If you can see something similar, congratulations, your Pi is up and running! You can skip to the next section. If not, there are a few common things that might have gone wrong
首先要检查的是您的 Pi 是否有一个漂亮的红色发光电源 LED。现在我们知道这听起来是显而易见的,我们知道这可能是你检查的第一件事,但是不检查它也是最容易犯的错误。如果你的桌子看起来像我们的一样,你会有一大堆电缆。不难看出您可能插错了电缆,或者您使用的电缆实际上没有插上电源(例如,一些笔记本电脑在睡眠时会关闭 USB 电源)。不管怎样,这是你应该首先检查的,因为如果你犯了一个错误,只有你会知道。这比在论坛上进行长时间的讨论,试图获得帮助,然后才意识到哎呀!你忘了插上电源。
第二件要检查的事情是你是否在电视或显示器上选择了正确的输入。如今,大多数电视都有多个输入,显示器通常不会默认 HDMI(我们的没有),即使这是它们接收的唯一输入信号。显然,我们不能告诉你如何准确地修复或检查这个,因为这完全取决于你使用的设备。然而,浏览不同的输入来查看 Pi 是否出现应该是相当容易的。在一个有趣的例子中,尽管电视上的端口清楚地显示 HDMI2,但 Pi 实际上在 HDMI3 上是可见的。我们不知道这是为什么,但是如果我们在摆弄圆周率之前能想到浏览一下输入,我们就能避免一些痛苦。
第三件要检查的事情是 SD 卡是否完全插入其插槽。Pi 实际上什么都不会做,除非它能找到卡并从中启动,所以如果你得到的只是一个黑屏,这很可能就是原因。如果你确定卡插入正确,但你仍然没有任何运气,它可能是出了什么问题,当你复制文件到卡。在那种情况下,翻到最后一节,再来一遍。如果您仍然没有任何进展,并且您已经检查了所有的东西都插好了,您的显示器上有正确的输入,并且您有一个愉快地发光的电源 LED,那么它可能是更麻烦的事情。不幸的是,没有和你一起看着你可怜的 Pi,我们真的不能给出任何更具体的建议。幸运的是,你并不孤单;在 Raspberry Pi 论坛上有很多人愿意帮忙。要访问论坛,请前往 www.raspberrypi.org
并点击论坛链接(就在树莓派标志的左下方)。这将带你到主论坛页面;您正在寻找的特定板是使用 Raspberry Pi 的基本用法和设置。
用 NOOBS 安装拉斯扁
过一会儿,您应该会看到 NOOBS 启动并开始初始化自己(图 1-17 ):
图 1-17。
NOOBS setting itself up
在这张截图中,你可以看到 NOOBS 已经知道了 Raspbian,右边的图标(一个 SD 卡)告诉你操作系统已经在卡上了,可以使用了。现在,理论上接下来应该发生的是,你应该看到这样的屏幕(图 1-18 ):
图 1-18。
NOOBBS detected lots more operating systems to install
NOOBS 在网上找到了一些可供选择的操作系统,你可以安装它们。它们没有 SD 卡图标,而是有一个以太网连接器,显示它们“在网络上”可用——换句话说,你需要下载它们。现在我们说“理论上”的原因是因为我们不能让它开箱即用。事实上,我们不得不摆弄 IP 地址和各种各样的东西,以便让安装程序真正检测在线操作系统。事实上我们得到的是这个(图 1-19 ):
图 1-19。
NOOBS network init failed
幸运的是,我们使用的是 NOOBS 的完整版本,所以我们不能上网下载其余的操作系统也没关系。我们预计这是我们的 Pi 或我们的设置的问题,这可能是你自己不会看到的。也就是说,我们希望提到它,以防它突然出现,并向您保证,即使有这个问题,您仍然可以安装 Raspbian。
好了,让我们实际开始安装过程!您所要做的就是勾选 Rasbian 左侧的方框,然后按下“安装”按钮(图 1-20 ):
图 1-20。
Time to install Raspbian
你会得到一个最后的警告,这将删除 SD 卡,但这是一个有争议的点,因为你必须删除卡,让 NOOBS 在那里摆在首位。尽管你完全确定一切都会好起来,但再次检查总是一个好主意(图 1-21 ):
图 1-21。
Last chance to back out
一旦你点击了是,NOOBS 将开始安装拉斯扁,你所要做的就是等待。您将看到一些有用的信息屏幕(出于明显的原因,我们不会在此重复这些信息),而且,可能是时候装满那个咖啡杯了,因为从同一个 SD 卡复制大量数据是一个缓慢的过程,不管是不是 class 10 SD 卡(图 1-22 )。
图 1-22。
Raspbian is installing
最后,安装好所有东西(图 1-23 ):
图 1-23。
Finally everything is installed
现在是时候重启你的 Pi 了。这一次,当它重新启动时,NOOBS 将离开,取而代之的将是拉斯边。达到这个阶段花费了相当多的时间,但是我们保证这是值得的!
当它启动时(这次是真的),您应该会看到类似这样的内容(图 1-24 ):
图 1-24。
Finally Raspbian is booting!
配置您的 Pi
在一连串难以理解的文本之后(尽管我们确信它对某人来说意味着什么),你应该会看到如图 1-25 所示的配置。在这里,我们将配置您的 Pi 用于一般用途,以便下次您打开它时,迎接您的将是一个漂亮的桌面,而不是一些粗短的文本。
图 1-25。
First boot: time to configure your Pi!
我们在这里只讨论基本的配置选项(一旦您的 Pi 启动并运行,您随时可以返回并更改它们),因为我们希望您尽快地使用一台工作的计算机。
扩展文件系统
第一个感兴趣的选项是“扩展文件系统”。当您直接从磁盘映像安装 Raspbian 时,它只占用少量空间。开发者不知道你的 SD 卡有多大,没有人想下载 16GB 或更大的图像,这样他们就可以充分利用卡上的空间。为了解决这个问题,Raspbian 支持在安装后扩展磁盘,以充分利用磁盘空间。然而,这是 NOOBS 已经为你做的事情,所以如果你尝试这个选项,你可能会看到这个消息(图 1-26 ):
图 1-26。
The filesystem is already expanded if you used NOOBS
我们在这里提到它的原因是,在某些时候你可能会决定直接从一个镜像安装,如果你这样做,你肯定想使用这个选项!
引导至桌面
下一个选项允许我们配置 Pi 将以何种模式引导。在下一章,我们将带你对桌面进行一次简短的游览,对于书中的大多数主题,我们假设你真的坐在 Pi 前面。考虑到这一点,我们想引导到桌面。因此,选择此选项,然后从下一页的列表中选择“以用户‘pi’身份登录桌面”(图 1-27 ):
图 1-27。
Boot to the desktop
更改用户密码
接下来,我们将更改pi
用户帐户的密码。这是您将在整本书中使用的帐户,对于大多数人来说,这将是您在 Pi 上需要的唯一帐户。目前,虽然密码被设置为raspberry
并且是默认的,这意味着任何人都可以登录到您的 Pi。虽然保护您的 Pi 免受未授权入侵者的攻击可能不是您优先考虑的事情,但是为了以防万一,改变这一点仍然是一个很好的做法。稍后,您可能会通过互联网提供您的 Pi,在兴奋之余,您可能会忘记您实际上并没有去更改密码。坏事会发生。所以,让我们抓住机会,现在就做出改变。高亮显示“Change User Password”
并按回车键,你会看到类似图 1-28 的东西。
图 1-28。
Changing your password
当你按回车键时,配置工具将执行标准的passwd
命令,这就是为什么你看到的是文本提示而不是漂亮的菜单。只需输入您的新密码(记住它是区分大小写的:HeLLo
与hello
或Hello
不同)并按回车键。出于安全原因,密码不会显示在显示屏上,也不会显示任何星号来让您知道您确实输入了一些东西。然后会提示您再次输入密码(图 1-29);按回车键后,将得到如图 1-30 所示的确认。再次按回车键,你将回到主菜单。
图 1-30。
Password changed successfully
图 1-29。
Enter your password
设置一些国际选项
Linux 的一个优点是它对国际化有很好的支持,并且可以(相对)容易地定制您的安装来满足您的需求。我们可以配置许多项目,如图 1-31 所示。当您设置每个选项时,您将被带回到主菜单,因此要更改下一个设置,只需再次选择国际化菜单:
图 1-31。
International Settings menu
首先是配置您的语言环境。通过告诉 Linux 你在世界的哪个地方,它可以决定有用的事情,比如数字之间的分隔符和使用哪个货币符号。例如,在美国,我们可能会写 1,000.00,但在欧洲的许多地方,它会被写成 1.000,00。无论哪种方式,为了最大限度的舒适和确保一切看起来正确,我们需要设置区域。突出显示“更改区域设置”选项,然后按回车键。
现在,您将看到一个可供选择的不同地区的详细列表(参见图 1-32 )。名称中的前两个字母指定语言,而第二对字母指定地区差异。例如,en_US 将是为美国用户定制的英语,但是 en_GB 将具有特定于在英国说英语的人的设置。您应该选择最符合您需要的语言和国家对,并通过按空格键来选择它们。你可能想要 ISO-8859 和 UTF-8 两个版本。如果您决定两面下注并选择所有语言环境,请注意您将会等待很长时间,因为 Pi 会为您生成所有的语言环境设置。事实上,我们尝试了这个选项,在等待了很长时间才生成两个语言环境后,我们厌倦了并拔掉了插头。选择所需的语言环境后,按一次 Tab 键突出显示 OK 按钮,然后按 Enter 键进入下一屏幕(语言环境生成后,参见图 1-33 )。在这里你需要选择你想要默认使用的区域设置(见图 1-30 )。做出选择后,高亮显示并按 Enter 键。然后,您将看到区域设置生成过程(见图 1-34 ),完成后(这确实需要一段时间),我们将再次回到主配置页面。
图 1-34。
Generating locales
图 1-33。
Select the default language
图 1-32。
Picking your locale
更改时区
“更改时区”选项和它说的差不多。选择此选项后,您将看到一个区域列表(如图 1-35 所示)。在本例中,我们正在配置 Pete 的 Pi,因此我们选择了亚洲。下一个屏幕将给你一个微调选择的机会,并选择你的国家或城市(见图 1-36 )。一旦你找到了最接近的匹配,选择该选项并按下回车键。
图 1-36。
Pick your closest city
图 1-35。
Pick your region
配置键盘
下一个感兴趣的选项是“Configure Keyboard”
。默认情况下,Raspbian 假定一个 UK 键映射,但是您可能想要其他的东西。不过,要注意的是,拉斯边知道大量的键盘,而且数量之多可能会让人困惑。例如,你知道你有一个通用的 104 键键盘还是实际上是一个 105 键的版本吗?我们也不确定,所以我们坚持使用默认的:如图 1-37 所示的通用 104 键 PC。
图 1-37。
Choosing your keyboard type
如果你能找到你确切的模型,尽一切可能自由选择它。如果你不确定,你最好跟随我们的领导,坚持默认设置。一旦你选定了键盘,按下回车键进入下一个屏幕。现在我们要选择我们想要使用的键映射。默认情况下,它列出了各种英国键盘映射(如图 1-38 所示),但是如果你没有足够幸运拥有一个英国键盘,将该栏向下移动到其他,按 Enter,然后滚动列表以找到更适合你需要的东西。一旦你找到了正确的键盘,再次按下回车键进入下一个屏幕。
图 1-39。
Customize your keyboard configuration
图 1-38。
Choose your layoutIf you’re not sure what to select from the menu (shown in Figure 1-39), you’re not alone
对于大多数人来说,键盘默认值就可以了,因为它们将包括您的特定键映射已经提供的任何特殊组合键。这是一个如果你需要做出改变的时候,你可能已经知道为什么和选择什么。如果你有任何疑问,只要保持默认选择,并按下回车键。现在你会看到另一个看起来可疑地像它的前任的菜单(如图 1-40 所示),至少在知道挑选什么方面。同样,你可能已经知道你是否需要在这里改变什么;如果你不确定,你应该通过按回车键来选择默认值。
图 1-40。
Customize your keyboard some more
下一个菜单(如图 1-41 所示)对老派的 Linux 用户来说毫无意义。过去,如果您的 GUI 决定放弃您,您可以通过按住 Ctrl + Alt + backspace 有效地“重启”会话。随着 GUI 变得越来越稳定,Linux 变得越来越主流,这个特性经常被禁用。我们已经很多年没用过它了,尽管我们碰巧认为它很有用。默认情况下是否定的,这可能就是您想要的。如果您发现自己渴望这个特殊的特性,您可以随时返回并更改它。要选择默认值(并最终返回主菜单),只需按 Enter 键。
图 1-41。
Do you want to enable the X server kill switch?
启用摄像头
此菜单允许您启用摄像机。这里特指 Pi 基金会提供的摄像头,不影响 USB 网络摄像头等其他摄像头。这是默认设置为禁用,但你可以在这里启用它,如果你碰巧有一个。我们没有在这里包括截图,因为真的没有什么可看的。
添加到栅格
Rastrack 是一个非官方项目,要求自愿注册,以帮助了解 Pi 在世界各地的使用情况。如图 1-42 中的广告词所示,这只是为了好玩,但许多人并不特别希望他们的 Pi 被跟踪。幸运的是,Rastrack 是自愿加入的,所以你可以完全忽略它,除非你想参加。
图 1-42。
Register on Rastrack
如果你想参加,只需按照简单的屏幕要求一些细节。一旦你输入了所有东西,它们将被提交给 Rastrack,你将返回到主菜单。
使…超频
爱好者长期以来一直喜欢超频他们的 CPU,也就是说,让它们运行得比设计的更快更热。Pi 也支持这一点,许多人认为它非常安全。然而,我们建议不要这样做,如果 Pi 不够快,不能满足您的开箱即用需求,那么您可能不应该使用 Pi 来做您正在做的任何事情。
另一方面,如果你真的想让你的 Pi 跑得更快,你可以从这个菜单中选择一个速度(图 1-43 ):
图 1-43。
How fast would you like to go?
高级功能
我们不会逐一介绍这些菜单项,对于许多人(如果不是大多数人的话)来说,这些菜单项中的大部分都不会用到。我们唯一感兴趣的是内存分割。作为参考,菜单如下所示(图 1-44 ):
图 1-44。
Advanced options
分配内存
“内存分割”选项需要解释一下。您的 Pi 有两个主要处理器:CPU(或中央处理器)和 GPU(或图形处理器)。CPU 负责机器的一般运行,GPU 负责处理显示器,并提供 2D 和 3D 加速等功能,以及对解码高质量视频流的硬件支持。GPU 专用于处理图形(大部分情况下),不能执行 CPU 的角色。然而,这确实意味着如果 CPU 可以将所有复杂的图形工作卸载到 GPU,CPU 就不必如此强大。通过这两者,Pi 保持了良好的低成本和低功耗要求,但没有牺牲太多的性能。
到目前为止还不错;但是这和分裂记忆有什么关系呢?Pi 2 总共配有 1GB 的 RAM,它需要同时提供 CPU 和 GPU。由于 GPU 实际上是一个独立的单元,它需要自己的内存分配。可以在两个处理器之间分配 1GB 的内存,而不是两个处理器都有专用内存。默认情况下,Pi 只为 GPU 分配少量资源。如果您想将 Pi 用作服务器,或者从未打算将显示器连接到您的 Pi,这是理想的选择。如果你不使用图形,分配额外的内存给 GPU 是没有意义的。
另一方面,如果您计划将您的 Pi 用作迷你桌面计算机或显示高质量的电影,您将希望尽可能多的内存分配给 GPU(在 Pi 2 的情况下,这意味着为 GPU 分配 256MB)。很难预测每个人将如何使用他们的 Pi,除了给 Pi 本身增加更多的内存(并提高成本)之外,没有简单的解决方案。幸运的是,我们有能力自己选择如何分配内存。
对于一般用途和“入门”类型的任务,我们建议您为 GPU 分配 64MB。要进行设置,从菜单中选择memory_split
选项,按下回车键,你将得到类似于图 1-45 的东西。键入所需的内存拆分,然后按 Tab 键选中 OK 按钮,然后按 Enter 键。
图 1-45。
Choose your memory split
终于来了!配置好了!
哇,我们终于坚持到最后了!在所有这些努力之后,您现在可以重启 Pi 并(最终)开始使用它了!按 Tab 键两次以选中“Finish”按钮,然后按 Enter 键。您的 Pi 应该关闭,然后重新启动。在所有这些努力之后(在 Pi 启动时还要等待一段时间),您最终应该看到一个漂亮的图形显示,看起来应该如图 1-46 所示。
图 1-46。
At long last, we have a desktop!Congratulations!
你现在有一个功能齐全的树莓派!如果你没有一个漂亮的桌面,你可能需要调整一下你的配置。在登录提示符下,您可以使用安装过程中设置的用户名pi
和密码登录。如果您随后运行以下程序,您将能够更改设置(“Boot behaviour”
是您想要更改的选项):
$ sudo raspi-config
您也可以尝试使用以下命令手动启动图形界面:
$ startx
摘要
本章将带您从接触到 Pi 一直到启动和运行它。我们故意慢慢来,涵盖了所有的基础知识,因为总是那些所谓的简单的东西会绊倒人(包括我们!).我们看了盒子里有什么(更重要的是没有什么),并提供了一个购物清单,列出了烘焙 Pi 所需的所有物品。
然后,我们简单介绍了 Linux——什么是发行版,以及为什么我们决定在本书中坚持使用 Raspbian。然后我们讲述了如何下载 NOOBS,并把它存在你的 SD 卡上。
配备了一个完全加载的卡,我们启动了 Pi,并完成了初始设置和配置过程,最终我们在一个同样令人印象深刻的桌面中间看到了非常漂亮的 Raspberry Pi 徽标。
在下一章,我们将开始探索你的新桌面。我们将带您快速浏览 Raspbian 开箱即用的特性,最后我们将向您展示如何调整和定制它以满足您的需求。
二、探索场景
尽管本书的大部分内容都集中在让您熟悉命令行并真正接触 Linux 上,但是如果我们不首先向您展示如何使用您的 Pi 附带的图形界面,我们将会完全出错。它不像你在 PC 或 Mac 上看到的那样华丽,但它速度快,易于使用,可以让你做所有你习惯做的事情。当然,这一切都在一个可以放在口袋里的设备上,比它所连接的显示器或电视耗电更少。
我们从环顾桌面开始这一章,看看我们有什么有趣的东西可以玩。有些显然是有用的应用程序,而有些在这个阶段可能没那么有用(例如,除非你是用 Python 编程的,否则你不会对 Python 开发环境感兴趣)。然后我们将浏览各种菜单,看看我们找到了什么。
欢迎来到 LXDE
与 Windows 不同,Linux 没有集成特定的 GUI,而是使用单独的应用程序(在这种情况下是客户机和服务器)来提供 GUI。这个应用程序被称为 X-server,它曾经是 Linux 宇宙中最复杂、最难设置的东西。它已经变得更好,但在不久前,如果你想在你的新尖牙鼠标中使用滚轮,需要花费大量的时间和精力。不用说,这种乐趣很快就会消失。如今,X-server 几乎是一个黑匣子,你很少需要真正接触它。出于这个原因,我们在本书中不会对这个主题进行更深入的探讨,但如果你有点好奇想了解更多,请查看: http://en.wikipedia.org/wiki/X_Window_System
。
X-server 提供了使用 GUI 的框架,但它实际上并没有提供我们习惯看到的漂亮桌面。这些是由桌面环境提供的。同样,我们不打算讨论所有这些是如何工作的,只是说,像 Linux 世界中的其他东西一样,您可以选择您更喜欢哪一个。对于大多数人来说,这取决于他们选择哪个 Linux 发行版,尽管大多数发行版都提供了选择。更先进的有各种各样的功能和特效,可以理解的是,它们在使用的时候会消耗大量的资源。在最新最棒的台式机或笔记本电脑上,这几乎不是问题,大多数人都抓住机会让他们昂贵的机器实际上做一些工作。然而,当你运行一个不那么高规格的机器,比如 Pi 时,这就成了一个问题。
不仅仅是 Pi 会有困难——仅仅几年前的计算机还能轻松运行 Linux,但可能会在新的高度图形化的界面上有困难。当你考虑甚至是经常被扔掉的旧机器时,有了合适的显示管理器,它们可以很容易地表现为一台非常有用的 PC。然而还有更多——现代上网本的设计是低功耗的,目标是高效的电池消耗和成本。当谈到桌面时,他们也受益于极简设计。
当您需要扩展您的处理预算时,最省钱的地方就是图形界面的特性集。你真的需要那些花哨的功能吗?透明的窗户对你正在做的事情是必要的吗?你真的需要那个 3D 渲染的时钟吗?如果没有,并且您想减少一些脂肪,像 LXDE 这样的桌面环境将会适合您。
LXDE(Lightweight X11 Desktop Environment 的缩写)是为那些对能效和在低端性能的硬件上运行的需求至关重要的机器设计的。它的目标是在 CPU 周期和内存使用方面有效率,虽然一些窗口管理器 eskew 所有不必要的功能,LXDE 试图在同一时间保持功能。
虽然我们现在知道 GUI 是由许多活动部件组成的,但是在使用它的时候,这基本上是透明的。实际上,将 LXDE 作为您的 Pi 的主要环境并没有什么坏处,如果您打算花大部分时间使用 GUI,那么我们认为将它作为操作系统的核心部分也没有什么坏处。你可以简单地使用它,并接受它是可用的。记住这一点,让我们继续探索我们在使用 LXDE 时实际拥有的东西。
这是什么?
一旦您安装并设置了您的 Pi,并且第一次启动了它,您应该会看到如图 2-1 所示的屏幕。
图 2-1。
First boot of your Pi
图标的布局实际上取决于您连接到 Pi 的屏幕。这应该是非常相似的,但可能唯一的真正区别是桌面图标本身的布局。
这里有一些关键区域很难在一个大的屏幕截图中看到,所以我们将分别分解每个部分。为了简单起见(更不用说它们已经成为常见的习惯用法了),我们将用大多数人熟悉的名称来指代各种 GUI 元素。因此,我们将讨论开始菜单和任务栏。我们从屏幕左下方开始,如图 2-2 。
图 2-2。
Start button and friends
开始菜单和任务栏的左上角
左上角的第一个按钮实际上是 Pi 标志,充当开始按钮。“下一步”按钮启动默认的 web 浏览器,在 Pi 的情况下恰好是 Epiphany。像其他应用程序一样,你会发现大多数应用程序都是轻量级和高效的。下一步按钮将启动 PCManFM,LXDE 文件管理器。当你需要移动一些文件或做一些一般的整理工作时,这是你需要的工具。
目前为止一切顺利。这些应用程序与您可能习惯在您的主计算机上运行的程序没有什么不同。下一个有点不同。这是启动 LXTerminal 的按钮,这是在 Pi 上使用命令行的最佳方式(至少在图形界面中)。
接下来的两个特别有趣,对 Pi 来说相对较新(或者至少在我们写第一本书的时候它们还不存在)。第一个是 Mathematica,它是最强大的计算软件包之一,但是你需要知道你在做什么。如果你对数学和创建模型(数学模型)感兴趣,你肯定想看看这个。旁边的图标启动 Wolfram,这是 Mathematica 中使用的编程语言。这类似于 Linux 中的命令行,因为它让您可以使用 Mathematica 的引擎。这是一个很酷的特性,但是,这可能不是大多数人会使用的东西。
最后,桌面上还有唯一的图标——垃圾桶。这不需要太多的解释(当然,除非你来自 Windows 3.11),它以你期望的方式工作。
在右手边…
在任务栏之后,我们还有一些图标,如图 2-3 所示。
图 2-3。
The right hand side of the task bar
第一个是代表您的网络的两台计算机的图片。在这种情况下,我们使用有线以太网,它是连接的,所以我们得到这个图标,但图标可以改变(例如,如果电缆被拔掉,图标上会有一个十字)。
下一个图标真的不需要介绍。扬声器控制您的 Pi 上的音量。像大多数设置一样,你也可以在这里静音,但是这个真的没有什么有趣的。
第三个图标看起来只是一个空框,但它实际上充当 CPU 监控器。你给你的圆周率做的越多,这个盒子就会变得越满。它就像一个图表,显示你的 CPU 是如何随着时间的推移而使用的。你实际上可以通过快速移动鼠标指针自娱自乐(至少几分钟)。你移动得越快,使用的 CPU 就越多,你就越能填满盒子。除了娱乐和游戏之外,这个显示器非常有用,因为如果你的 Pi 开始有点反应迟钝,快速看一下显示器就可以知道你是否正在最大限度地利用你的 CPU。
紧挨着 CPU 监控器的是时钟,它不需要太多的解释。在早期版本的 Pi 中,这个任务栏的远端有一个关机按钮。这是一个非常有用的功能,你仍然可以使用它,但你需要点击“菜单”按钮,然后选择“关机”(旁边有一个漂亮的退出标志)。这将调出熟悉的关机屏幕(图 2-4 ):
图 2-4。
Clicking the shut down button
点击“关机”将会像你期望的那样重启并注销。但是有一点值得记住,Pi 运行的是多用户操作系统 Linux。这意味着事情可能在你不知道的背景下发生。例如,有人可能正在从您的 Pi 中流式传输视频。如果您关机或重新启动,可以理解的是,您会断开连接到该 Pi 的任何其他人。很可能这对你来说现在还不是问题,但是你可能应该意识到这一点。
这就是你在屏幕上看到的。现在,让我们继续开始菜单的奥秘…
开始菜单
自从 Windows 95 引入开始菜单以来,开始菜单的概念在大多数操作系统中几乎无处不在(特别是 Mac)。虽然许多人可能会对此嗤之以鼻,并指出以前可能见过它的地方,或者坚持认为 Linux 中的开始菜单与 Windows 中的完全不同,但我们试图超越这一点。事实是,不管是谁想出来的,开始菜单的概念都非常好用,这也是它被广泛采用的原因。
肥皂箱说够了,让我们看看开始菜单能为我们提供什么(图 2-5 ):
图 2-5。
The Start Menu
和以前一样,这里没有什么真正突破性的东西。第一部分列出了我们可以使用的所有应用程序,它们被整齐地组合在一起。在这种情况下,编程、互联网、游戏和带有帮助和偏好的配件排在最后。很难决定我们应该先研究这些选项中的哪一个。在我们这样做之前,我们需要包装剩下的项目,因为只剩下两个,应该不会花我们很长时间。
我们已经讨论了关闭,这相当简单。我们将查看一些设置(首选项),稍后您可以对其进行调整。列表中的最后一项是 run 命令。这让我们无需从菜单中选择命令、点击图标或打开终端就能执行特定的命令。就像在 Windows 下一样,这个选项非常方便。它还具有自动完成功能(图 2-6 ):
图 2-6。
The run command and auto complete
在这里你可以看到我们输入了“gnom ”,它突出显示了所有符合这个模式的应用程序。这可以节省你很多时间,因为随着时间的推移,你会知道你需要输入多少个字符,自动完成功能才会产生正确的答案。通常命令名(尤其是 GUI 应用程序)会很长,所以这可以节省时间!
附件
现在,让我们来看看配件下面有什么。像所有其他菜单一样,这里的项目可以随着您安装更多软件而改变,在较新版本的 Raspbian 上,它可能看起来有点不同。在我们的 Pi 上,配件菜单是这样的(图 2-7 ):
图 2-7。
The accessories menu
xaarchiver(消歧义)
与 Image Viewer 相比,XArchiver 不太可能被直接调用,但它可能是一个在普通系统上使用相当多的应用程序。此工具允许您创建和解压缩各种格式的档案,这在您从互联网下载内容时是必不可少的。XArchiver 是这样的(图 2-8 ):
图 2-8。
XArchiver when it’s opened by hand
在这里,我们将文档下载到了 Erlang 平台(当我们需要演示 XArchiver 时,这是我们首先想到的)。双击文件后,XArchiver 自动打开。到目前为止,我们使用过的唯一按钮是“全部提取”按钮,从右边数第二个。点击这个将提取所有的存档内容,这往往是你真正想要做的。
计算器
如果圆周率不附带计算器,感觉就不太对了——毕竟它几乎是所有计算机化设备的标准应用程序。有人记得计算器手表吗?我们不会把这个截图放进去,因为它看起来像一个计算器,但它仍然可以很好地完成工作。
文件管理器
如前所述,LXDE 附带了 PCManFM 文件管理器。当然你可以从任务栏访问它,所以你不太可能从这里运行它。从极简设计运动中领先,这个文件管理器是轻量级的,简单易用,但仍然有你需要的所有功能。它的工作方式与微软的 Windows 资源管理器非常相似,所以如果你来自 Windows 背景,你会感觉在 PCManFM 上如鱼得水。如果没有,只需点击几下,你就可以轻松地找到它(图 2-9 ):
图 2-9。
The PCManFM File Manager
最初打开时,PCManFM 会将您放入您的家庭区域。它会在右下角显示你有多少可用空间(在 Pi 等存储空间相对有限的设备中总是有用的),并在左上角列出最常见的地方。浏览时,您只需点击浏览文件夹,还可以使用工具栏上的导航图标来帮助您快速浏览文件。如果你想获得更多的实践经验,我们会在第五章中介绍如何操作文件。
图像查看器
图像浏览器是你可能永远不会直接打开的应用程序之一。你几乎总是通过双击一个图像文件来打开它,默认情况下会为你打开图像浏览器。虽然图像查看器可能很简单,但它并不缺乏功能,并且拥有您所期望的所有基本工具(图 2-10 ):
图 2-10。
Image Viewer’s main interface
前两个按钮让您可以在一组图像中来回移动。这实际上是非常有用的,因为这些天,很多时候人们都在访问相册而不是特定的照片。为了帮助你做到这一点,还有一个幻灯片功能,你可以通过按下播放按钮来访问。
下一部分有控制你想要如何实际查看图像。前两个是传统的缩放控件。第三个图标是“适合屏幕”,第四个是全尺寸显示(如果是数码相机的照片,这意味着你几乎肯定要滚动),最后是全屏选项,以充分利用你刚刚得到的 60 英寸平板屏幕。
第三部分是改变图像本身的控件。前两个是旋转控件(分别向左和向右旋转),第二对控件允许您水平和垂直翻转图像。当你从一个奇怪的角度拍照,并且不想把你的头倾斜 90 度来看你的照片时,这是非常方便的。
下一组是文件控件。它们分别允许您打开、保存、另存为和删除文件。最后两个图标提供了对 preferences 面板(这里没有什么有趣的东西)的访问,并允许您退出程序。
PDF 查看器
你不太可能手动启动这个应用程序,而是当你双击一个 PDF 或者试图在网络浏览器中查看它时,它就会打开。截屏中没有太多东西可以显示(除了文档可能存在的大量灰色),所以我们把它省略了,但是如果你以前看过 PDF,你不会有任何问题。
任务管理器
正如您在图 2-11 中看到的,CPU 此刻实际上是空闲的。考虑到它运行的是一个完整的操作系统(而且是一个高级操作系统),看到 CPU 没有做任何繁重的工作可能会令人惊讶。虽然与高端英特尔处理器相比,Pi 中的 ARM 芯片并不令人印象深刻,但这确实证明了如果你小心的话,你可以用少得惊人的资源运行一台完美的台式机。我们的 RAM 使用情况讲述了一个类似的故事。诚然,我们目前没有太多的开放(尽管你可以从进程列表中看到我们正在运行 VNC 远程桌面会话),但我们的使用率仍远低于 50%,新型号 B 的内存容量为 512MB,这将允许更多的应用程序同时运行。
图 2-11。
The task manager
进程列表可以很好地显示机器上正在运行什么,以及每个进程消耗了多少资源。这在您的 Pi 表现有点古怪,并且您需要查看某个应用程序是否突然决定吃掉您的所有 RAM 或让您的 CPU 着火时非常有用。如果您确实发现某个应用程序变得有点过于贪婪,您可以右键单击其名称,然后选择“Kill”,这将强制关闭它,从而有望使我们的 Pi 完全恢复健康(图 2-11 )。
末端的
终端是一个 Linux 的终端模拟器,让您可以访问虚拟控制台。我们不打算深入探讨如何实际使用这一特定应用程序,因为我们将在下一章讨论细节。可以说,这个工具是用来让您直接通过命令行访问操作系统的。对许多人来说,这是一个天使不敢涉足的地方,但对经验丰富的管理者来说,这是他们称之为家的地方。不过要想知道命令行是否适合你,你必须等到第四章。
终端是一个简单的模拟器,但完成工作。它没有一些模拟器提供的所有花哨功能,但对大多数人来说非常好,看起来像这样(图 2-12 ):
图 2-12。
LXTerminal up and running
这里我们将简要提及的一件事是提示。当字体颜色为绿色并且提示符的末尾是一个美元符号时,您知道您正在以普通用户的身份运行,并且您没有 root 权限,也就是说,您不能执行任何可能真正损害系统的命令。我们将在下一章更深入地讨论这个问题,但是我们需要在这里提到这个区别,这样下一个程序才有意义。
文字编辑器
为了与极简主义主题保持一致,Leafpad 文本编辑器做了基本的工作,仅此而已。它非常类似于微软记事本的新版本,同样易于使用。这对于写信给 Maude 阿姨或委员会抱怨隔壁的狗没有太大的好处,但当你需要做一些轻松的文本编辑时,它是完美的。
尽管它很简单,但它仍然提供了一些最有用的工具,即能够进行查找和替换,以及启用和禁用自动换行。有了这些工具,你几乎可以完成任何事情。
如果你觉得 Leafpad 对你的口味来说功能有点不足,那么你可能想翻到第六章,在那里我们会向你展示一些更强大的原生文本编辑器,你可以得到它们。
在大多数情况下,Leafpad 完全按照它在 tin 上所说的那样做-它编辑文本,如果这就是你所需要做的,Leafpad 是一个极好的选择(图 2-13 )。
图 2-13。
Leafpad has a similar look and feel to Microsoft’s Notepad
比赛
游戏菜单只有两个项目,但它们仍然令人印象深刻,有一种发泄方式总是好的。对于一些轻松有趣的游戏,你不会发现 Pi 想要的。
《我的世界》
除非你过去几年一直住在月球上,否则《我的世界》对你来说并不陌生(图 2-14 )。事实上,对许多人来说,这是一个家喻户晓的名字。甚至还有怎么玩的书!无论如何,现在有一个版本的 Pi,但要注意,虽然它不需要太多的电力来运行它,但它会以令人不安的速度榨取你的生命!我们不会在这里讨论如何玩这个游戏,但是在谷歌上快速搜索《我的世界》会给你所有你需要的,甚至更多。祝你好运!
图 2-14。
Minecraft on your Pi!
圆周率游戏
对于那些年龄足够大,还记得像诺基亚 3310 这样的手机的人来说,你会记得它们曾经配备了一系列浪费时间(并且非常容易上瘾)的游戏。像《蛇》和《太空撞击》这样的经典作品可能非常有趣。Pi games 相当于 Raspberry Pi。所有这些游戏都很容易上手,但很难放下。带一些出去转一圈,看看你更喜欢哪一个(图 2-15 ):
图 2-15。
Pi games, say goodbye to your free time
互联网
不出所料,互联网菜单包含专门用于访问互联网的应用程序。在我们的 Pi 上,互联网菜单是这样的(图 2-16 ):
图 2-16。
The Internet menu
皮店
Pi Store 的目标是类似于 Android 的应用商店。我们实际上从来没有使用过它,因为我们想要的所有东西都可以通过标准库获得。也就是说,我们正在关注它,因为当应用程序首次出现在 Android 上时,它们并不那么有趣,但今天它们是整个手机体验的关键。所以试试这个吧,你可能会找到你真正喜欢的东西(图 2-17 )。
图 2-17。
Like the app store but for Pi
树莓资源
“Raspberry Pi Resources”基本上是一个链接到大量信息(也称为 Resources 咳咳)的网页,这些信息将为您提供有关 Pi 的信息以及大量学习、教学和制作东西的想法。如果你想探索你的 Pi 能做什么,还有一些文章和其他教程值得一读(图 2-18 )。
图 2-18。
Things to do with your Pi
网络浏览器
嗯,这个很标准,所以我们不会提供截图。Epiphany 是基于 webkit 的,所以你应该可以毫无困难地在 Pi 上享受所有你喜欢的网站。当然,正如我们之前提到的,你也可以从屏幕左上角的任务栏打开浏览器。
设计
编程菜单由四个项目组成,其中两个是我们在教育菜单下遇到的(图 2-19 ):
图 2-19。
The Programming menu
我们已经简单地介绍了 Mathematica 和 Wolfram,但是值得在这里重复一下,尽管这两个工具非常伟大,但是你确实需要知道你想用它们做什么。我们很高兴在这里看到他们,但不是数学家或需要做复杂的建模,我们真的不知道如何正确地为你演示。在任何情况下,它都有一个令人敬畏(也有些可怕)的标志(图 2-20 ):
图 2-20。
Firing up Mathematica
擦
Scratch 是由 Mitchel Resnik 领导的终身幼儿园小组在麻省理工学院媒体实验室开发的。目的是创造一种方法来教人们如何编程,而不必先教所有的细节。这使得 Scratch 中的触觉方法(可以拖放逻辑块)更容易掌握。
我们不能自称是 Scratch 的专家(事实上我们第一次遇到它是在玩 Pi 的时候),但是我们确信,随着 Pi 在整个水域的扩展,这些种类的应用程序将会产生巨大的影响。让人们接触技术,并为他们提供一个强大的系统,让他们不必先掌握所有的基础知识就可以开始工作,这在我们的书中绝对是一个赢家。
如果你不相信,看看这张截图,它肯定让我们再看一眼(图 2-21 ):
图 2-21。
Scratch programming environment
计算机编程语言
我们只剩下 Python 2 和 Python 3 了。实际上,这两者非常相似,因为它们都是 Python 编程语言的基于文本的接口。之所以有两个不同的版本,是因为有两个当前版本的 Python,由于各种原因,它们并不相互兼容。在许多方面,您可能为 Python 2 . x 版本编写的脚本在 3.x 中也能很好地工作,但是语言中有相当多的问题和变化,使得保证兼容性变得不可能。这就是为什么您会经常看到在任何给定的机器上安装了两个版本的 Python。
在撰写本文时,Python 2.x 仍然是大多数人使用的地方,许多项目仍然在使用它进行积极的开发。事实上,当我们编写新的 Python 脚本时,我们也使用 2.x,因为它有最多的库、文档、博客和论坛帖子的历史,并且通常有一个很大的社区。另一方面,Python 3.x 进行了许多调整和语言改进,但它们永远不会出现在 Python 2.x 上,当然所有的新想法和开发都集中在新系列上。最终,Python 3.x 是一条出路,如果你刚刚开始你的编程生涯,我们建议你从 Python 3.x 开始。它肯定不会有什么坏处,如果出于某种原因你需要使用它,你可以随时查看 Python 2.x,实际上从一个到另一个真的不是一个大问题。
由于的两个版本在使用方式上完全相同,我们将向您展示 Python 2(而不是 Python 3)(图 2-22 ):
图 2-22。
Firing up Python
偏好;喜好;优先;参数选择
我们不打算在这份菜单中深入探讨。这是一个非常简单明了的菜单,学习这些东西的最好方法就是摆弄它们。我们以前试图给出很好的选项覆盖面,但是我们覆盖的越多,我们似乎遗漏的就越多,我们甚至不能在我们自己之间就覆盖哪些选项达成一致。所以,这一次我们建议你挽起袖子玩一玩——毕竟,你什么都破不了!
帮助
最后但同样重要的是帮助菜单。在这里你可以找到 Debian 参考指南的快捷方式和一个专门介绍 Raspberry Pi 的帮助指南。
《Debian 参考指南》问世已久,积累了很多关于理解和使用 Debian 的智慧和知识。这里的一个额外好处是这个文档直接安装在 Pi 上。这意味着,即使您无法在线获得 Pi,您也可以获得它。显而易见,这非常有用。
Raspberry Pi 帮助基本上是基金会网站上帮助页面的链接。焦点显然是在 Pi 上,这使得当您有想要解决的特定问题时,它是一个很好的去处。因为它是一个网站,所以您需要在线才能访问这个资源(尽管如果 Pi 出现问题,您可以很容易地从另一台机器上访问它)。这里的好处是资源不断更新,你总是要起床做日期信息。
这两个资源将为您提供愉快地使用 Pi 所需的几乎所有东西。然而,网络上有大量的信息,因为 Pi 有大量的追随者。您可以找到教程、常见问题解答、项目和一般帮助。所以,如果你在文档中找不到你需要的东西,就去你最喜欢的搜索引擎看看。
摘要
这就是桌面旋风之旅的基本内容!我们真的只是触及了表面,目的只是让你对可以开始自己探索的东西感到足够舒服。请记住,Pi 存在的原因是为了让人们能够试验和学习更多关于计算的知识,所以弄脏自己的手(即使您偶尔会弄坏 Pi)真的没什么好担心的。
在这一章中,我们介绍了默认安装的,可以通过开始菜单访问的应用程序,并且我们浏览了一些对于 Linux 世界来说有些独特的界面特性。
在下一章中,我们开始真正严肃地(有点)带你回到命令行,在那里我们向你介绍一个界面,一旦你习惯了它,你会想没有它你是怎么生活的。
三、熟悉
通常我们不会以一个数字开始一章(从技术上来说,我们认为这次也没有),但我们会寻求一些老式的震撼和敬畏。看一下图 3-1 (维基百科提供)。
图 3-1。
TeleVideo 925 computer terminal
你可能想知道为什么我们认为有必要向你展示一些 80 年代早期的技术(在这个特殊的例子中是 1982 年末)。这本书第二部分的大部分内容都是关于命令行以及如何让你舒适地使用它。尽管在这几十年间情况有所改善,但技术基本上是一样的。
在这一章中,我们将快速回顾一下计算机界面的历史,以及为什么终端能够幸存下来。然后,我们将看看可供您使用的各种终端,以及您如何到达它们。然后,我们将快速解释命令提示符,并让您了解一个鲜为人知的关于可用的不同 shells 的秘密。
叶老电脑
虽然你现在可以花 25 美元买一台电脑,但在 70 年代,你可能会花至少 100,000 倍的钱来买一台具有强大处理能力的电脑。这种机器会占据整个房间(如果不是整个楼层的话),需要难以置信的大量电力,并且通常给路人留下非常深刻的印象。这些东西的所有者必须处理的一个关键问题是规模问题。
当你的电脑比它所在的建筑更值钱的时候,你要确保你能最大限度地利用它。解决这一挑战的一种方法是分时度假。这个想法是,与人类和电脑互动相比,电脑的速度快得令人难以置信。事实上,即使以今天的标准来看,它们微不足道,但它们仍能让真正想使用它们的人望尘莫及。所以这就引出了一个问题,如果计算机大部分时间都在等待操作员输入命令和数据,那么它在等待的同时会做其他事情吗?
没过多久,有人发现,如果计算机一直在等待输入,那么如果有多人输入数据,它可以得到更好的利用。这样,我们可以让多个人同时输入数据,这样我们就不再受限于一个人的速度。
好主意,但我们如何实施呢?为了让它工作,我们真的想在每个需要与计算机交谈的人面前放一个屏幕,而以现有的计算机技术,即使是一台非常基本的计算机也是不切实际的。话说回来,我们并不真的需要在他们的桌子上放一台电脑,我们只是需要一种方式让他们与楼下的大型电脑进行交流。实际上,我们只是想要一个键盘和一个有很长电缆的屏幕。
向愚蠢的终端问好
这就是哑终端出现的原因。它被称为哑终端,因为它实际上只是一个屏幕和键盘。使用从计算机本身传来的指令,它会把文本画到屏幕上。每当一个键被按下,这将被发送到服务器,然后服务器将回复更多的屏幕更新。哑终端没有任何真正的处理能力,它只是作为一个接口,这使得它们相对便宜,易于安装和维护。
随着时间的推移,技术确实得到了改善,哑终端变得更好,不那么哑了。增加了对不同颜色和亮度的支持,以及更好的重绘和管理屏幕的功能。然而,基本的概念,即哑终端只是一个远程机器的接口,从来没有真正改变太多。事实上,尽管当更现代的网络变得可用时,哑终端开始被取代(更不用说计算能力变得更便宜了),但这种方法本身继续在较新的系统中使用。这不仅仅是因为人们不得不继续使用大量的遗留系统(你在一些大型百货商店的黑屏上看到过旧的绿色吗?)但它实际上有一些非常有用的属性,甚至在今天仍然有用。
GUIS AND TUIS
你会经常听到人们提到 GUI(读作 gooeys)和 TUIs(读作 tooeys ),我们也会在整本书中提到它们。幸运的是,这对首字母缩写词非常简单,你很快就会自己使用它们(当然,假设你真的想使用它们)。
GUI 是图形用户界面的缩写。几乎所有的现代计算机系统都以某种形式使用一个。过去很容易发现 GUI,因为它几乎是任何使用鼠标的设备。近年来,由于 iPad 和 Android 智能手机等设备的出现,这些界限变得有些模糊,你可以拥有一个只用手指就能操作的 GUI。现在更容易知道 TUI 是什么,因为一般来说,任何不是 TUI 的东西都被认为是 GUI。
TUI 是基于文本的用户界面的缩写,通常与 CLI 或命令行界面互换使用。TUI 可以呈现基本的菜单系统,但是这些系统是通过键盘控制而不是鼠标来导航的。
简而言之,如果你从键盘上驱动它,并且没有鼠标指针,它就是一个 TUI。如果你可以点击,用手指指着它或者看到漂亮的图片,这就是一个图形用户界面。
现代码头
在我们刚刚谈到的哑终端和我们今天在现代 Linux 系统上使用的终端之间有相当多的进化史。为了保持你的理智(更不用说跨过无聊的门槛),我们将跳到现代,在你的 Pi 上展示远程终端是什么样子的(图 3-2 ):
图 3-2。
SSH connection to a Raspberry Pi
如你所见,我们仍然有一个基于文本的界面,我们运行的程序都将在远程服务器上运行。我们确实有一些更好的功能(首先是彩色的),我们可以把终端做得尽可能大(传统的终端往往是固定大小的)。在这个特殊的例子中,我们通过 TCP/IP 上的 SSH(Secure Shell——稍后将详细介绍)连接到 Pi。
那么为什么我们还会在意这些东西呢?
问得好!在 iPads、iPhones 和 Androids 的现代时代,我们为什么要使用基于文本的界面呢?对于大多数人来说,尤其是如果他们以前从未使用过,基于文本的界面听起来真的像是一种倒退,而不是他们特别想获得的技能。不用说,我们最喜欢古老的命令行,以下是我们认为您应该投入时间和精力掌握它的一些原因。
简单的
其中一个关键原因是简单。说到简单,基于文本的界面是很难超越的。实际上它所做的只是发送和接收文本。你不会使用终端来查看你的假日快照,但它确实给了你一个清晰的界面来给你的 Pi 发布命令。
快的
当我们这么说的时候,你可能现在不会相信我们,但是使用命令行界面将允许你更快地完成你的许多任务。这样做的原因是,你可以非常精确地在一行文本中表达大量的工作,这种事情需要多次点击或一个奇怪的复杂过程才能用鼠标表达。
轻量级选手
任何不幸试图通过慢速互联网连接远程控制台式电脑的人都会明白我们在这里的意思。通过互联网发送屏幕更新(特别是对于有很多颜色的高分辨率屏幕)本质上就是占用大量带宽。数据到达目的地也需要一段时间,这就是为什么远程会话给人无响应和阻塞的感觉。
基于文本的会话不会遇到这个问题,因为它们只发送文本。它们是为最大速度只有我们今天可用速度的一小部分的系统而设计的。因此,即使在非常慢的拨号链路上,远程终端会话也往往表现得非常好。
这也减轻了服务器的压力。维护图形界面意味着计算机必须做相当多的工作。有一个鼠标指针意味着计算机必须跟踪这个指针,并确保当它接触到一个应用程序窗口或当用户点击一个按钮时做出正确的反应。令人惊讶的大量工作在幕后进行,这就是为什么 Linux 服务器很少安装图形界面,更不用说运行了。
强大的
命令行给了你很大的权力。你可以表达复杂的思想,你可以用一种图形界面无法实现的方式发布命令。例如,您可以将命令串在一起,形成更复杂的链。您可以将一个命令的输出用作另一个命令的输入。这种技术使用了一种叫做管道的东西,我们将在下一章更全面地讨论这一点。
它总是可用的
尽管近年来情况有所好转,但 Linux 平台上最易变的软件之一往往是图形界面。它似乎总是第一件要做的事情,当你的服务器停止启动,你需要一个救援环境时,你就不太可能有图形界面可用了。
然而,终端是与 Linux(基本上是大多数其他 Unix 操作系统)对话的本地方式,因此,它是一种以某种形式随时可供您使用的工具。知道如何使用终端会让你摆脱困境,并处理那些如果你不习惯命令行就会完全难倒你的情况。
相信了吗?
希望这些亮点至少让您相信命令行还是有一些作用的。如果你不完全相信,那也没关系,除非你花时间亲自体验,否则很难真正感受到它的好处。在下一节中,我们将介绍如何真正使用命令行,解释您正在查看的内容的含义,并介绍一些基本的命令来帮助您开始您的旅程。
TERMINAL OR VIRTUAL TERMINAL?
在很大程度上,你不必担心两者之间的差异。您几乎总是会使用虚拟终端,也就是说,或者是 Linux GUI 本身内部的终端窗口,或者是通过 SSH 连接。终端和虚拟终端之间唯一真正的区别是,终端是一个单独的物理设备,如串行端口或直接连接到计算机的屏幕上(没有 GUI)。虚拟终端有一个分配给它的设备,但没有相应的物理设备。事实上,在 Linux 下,一个新的设备被创建并分配给每个新的虚拟终端。
我们之所以在这里提出这种区别,是因为一些文档(一般来说是旧的文档)可能会特别提到其中的一个。这些天来,虽然你的大部分时间将花在虚拟终端上,你不需要担心差异。
三个终端
有三种主要方法可以到达命令行。第一种是坐在机器前面,使用通常所说的控制台,第二种是在 GUI 中打开一个虚拟终端,第三种是使用 SSH 通过网络连接。
控制台
虽然控制台仅仅是另一个终端,但这个术语多年来已经获得了某种神秘的地位。当你在控制台上工作时,你是直接在机器上工作,因为它实际上是一个直接插入其中的键盘和显示器。
过去,管理员通常会限制某些用户(如 root 用户)只能坐在机器前面登录。由于计算机可能位于上锁的服务器机房,这提供了额外的安全级别。
大多数发行版都没有启用这种安全性,现在通过网络进行远程访问已经成为一种规范(有时管理员甚至没有物理访问权,或者机器在地球的另一边),这个特性就没那么有用了。
不过,如果你坐在你的 Pi 前面,你可以通过按住 control (ctrl)和 alt 键,然后按 F1 到 F6 来访问控制台。默认情况下,F7 是 GUI 所在的地方,所以一旦你使用完控制台,你就可以返回到你的 GUI。
你什么时候需要这样做?好吧,如果你不能通过网络连接到你的 Pi,并且你在使用 GUI 时遇到了麻烦,控制台将会是你新的最好的朋友。但是总的来说?你不会经常使用控制台,如果有的话。通过其他两种方法获得命令行更加容易和灵活,因为通常至少有一种方法可供您使用。
在 GUI 中打开虚拟终端
Raspbian 使用 LXDE,即“轻量级桌面环境”。顾名思义,它专注于轻量级,这正是你想要的,当你的电脑正好处于轻量级的时候!
LXDE 的本机终端称为 LXTerminal,幸运的是,它不仅是预装的,而且还出现在任务栏上,如下图所示(图 3-3 ):
图 3-3。
Finding LXTermianl
我们冒昧地双击了图标,您可以看到我们有一个只能被描述为工作终端的东西。当然,在这种情况下并没有太多东西要展示,因为根据定义,终端非常简单。如果你打算坐在 Pi 前,把它当作一台更传统的计算机,你可能会发现自己经常使用终端。如果您更多地考虑远程工作,那么您需要下一个部分,老实说,这要有趣得多…
通过 SSH 连接
SSH 是一种通过网络安全连接到您的 Pi 的好方法(参见“SSH 有什么特别之处?”).它给你虚拟终端的所有好处,但你可以从网络上的任何机器访问它。潜在地,这意味着你可以在家里从你的工作电脑连接到你的个人电脑,并在完全安全的情况下摆弄它。我们发现 SSH 是迄今为止我们与服务器交互的最常见的方式,并且由于大多数人将 Pi 用作无头设备(即,没有键盘或鼠标连接到它——甚至可能没有显示器),我们认为 SSH 也将是您的首选。
SSH 等式有两个部分。您需要一个 SSH 服务器和一个 SSH 客户机。幸运的是,这两者都是免费的,而且很容易安装。
在 Pi 上设置 SSH 服务器
这一点实际上非常简单,因为除非您在安装 Raspbian 时特别禁用了它,否则 SSH 服务器已经在运行了(Raspbian 默认启用它)。事实上,在这个阶段,你真正需要的是找出你的 Pi 的 IP 地址。
首先覆盖 Pi 的虚拟终端的好处之一是,我们现在可以使用它来计算我们的 IP 地址。Pi 利用 DHCP(动态主机配置协议)的优势,这意味着在绝大多数网络上,它将能够为自己挑选出一个 IP 地址。这不仅节省了我们的时间,也意味着您不需要想出如何选择一个合适的地址,然后配置它。现代技术的奇迹!
为了找到地址,我们将使用“sudo ifconfig”命令。这个命令(是“接口配置”的缩写)将(可能并不奇怪)显示您的网络接口的配置。这是它在我们的 Pi 上的样子(图 3-4 ):
图 3-4。
Running ifconfig on our pi
在这里,您可以看到我们有两个网络接口。本地环回设备(或其朋友的“lo ”)是一个虚拟接口,网络应用程序可以使用它在同一台机器上相互通信。由于不涉及硬件,使用 lo 接口更有效,因为它总是可用,并且以相同的方式配置。在 Linux 下,大多数系统服务(如打印甚至 GUI)都作为客户机/服务器应用程序运行,并大量使用这个接口。
现在,虽然我们对 lo 设备不太感兴趣,但我们对连接 Pi 和物理网络的网络接口更感兴趣。eth 0(0 号以太网设备的缩写——记住计算机往往从零开始计数)代表着我们与现实世界的联系。在这个阶段,我们不会用所有信息的含义来烦你,这也不是你经常会看到的东西。运行 ifconfig 最常见的原因是找出 IP 地址,这当然是我们在这里的原因。从上面的截图中,您可以看到:
inet addr: 192.168.1.132 Bcast: 192.168.1.255 Mask: 255.255.255.0
我们实际上只对 IP 或 inet 地址感兴趣,在本例中是 192.168.1.132。有了这些信息,我们应该能够从网络上的任何地方连接到 Pi。
整理 SSH 客户端
我们假设您从 Windows PC 或 Mac 进行连接。如果你用的是不同的操作系统,那么不要慌,大概有适合你下载的客户端。您仍然可以继续学习其他两个教程,因为无论您使用哪个客户端(或在哪个平台上),一般过程都是相同的。
窗户油灰
Putty 几乎是所有其他 SSH 客户机比较的标准,这是有充分理由的。它不仅功能丰富,而且碰巧是免费的。您可以从以下地址下载 Putty:
http://www.chiark.greenend.org.uk/∼sgtatham/putty/download.html
由于它对于输入来说有点长,所以您可以通过在谷歌上搜索“下载 Putty”来获得类似的结果。一旦你进入下载页面,你会想要得到页面上的第一个链接,putty.exe(图 3-5 ):
图 3-5。
Downloading Putty
Putty 是一个独立的工具,所以只要你下载了它就可以运行它,你不需要在你的机器上安装任何东西。这通常非常有用,因为这意味着您可以将它放在 u 盘上,随身携带,并且您通常可以在其他机器上运行它,而不需要管理员权限(即无需安装任何东西)。然而,如果你一直找不到 Putty(它是如此简单,令人惊讶),你可能需要下载“安装程序”版本,它会将它安装在你的机器上,并为你设置开始菜单和桌面快捷图标。
现在我们有了油灰,是时候点火了。双击图标,您可能会看到与此非常相似的内容(图 3-6 ):
图 3-6。
Windows getting excited
Windows 只是警告您该程序尚未经过数字签名。你可能以前遇到过这种情况,但是当你安装一些所谓的安全增强软件时,你最不想做的事情就是安装一些令人不快的东西。在这种情况下,Putty 的正式版本没有签名,您可以忽略此错误。如果你打算经常使用 Putty,你应该取消勾选“打开文件前总是询问”。相信我们,如果你现在不做,十次或十一次后你会做的。
在你说服 Windows 退出后,你会得到一个类似这样的连接框(图 3-7 ):
图 3-7。
Starting up Putty
默认设置可以连接到您的 Pi,您只需要提供我们之前发现的 IP 地址。将此输入“主机名(或 IP 地址)”框,然后单击打开。由于这将是这台特殊的机器第一次连接到您的 Pi,您将会得到一个类似于下面的警告(图 3-8 ):
图 3-8。
Security warning when connecting for the first time
别担心,这是宋承宪安全系统的一部分。它让你知道它以前没有见过这个特定的服务器(它不会见过,不是吗?)并向您展示密钥以供确认。我们不知道有谁记住了他们的 SSH 指纹(尽管记住前四位和后四位数字对确保你有正确的指纹有很大帮助),而且在任何情况下我们都希望看到这个警告。一旦 Putty 记住了密钥,它将在您以后每次连接时对照 IP 地址和主机名进行检查。如果远程服务器发回不同的指纹,Putty 会警告您可能有问题。通常情况下,当您重建或购买新服务器时会发生这种情况,因此您知道为什么密钥会发生变化。如果你看到一个警告,却想不出一个好的理由,那么在登录到那台机器之前要非常仔细地思考。在我们的特殊情况下,我们知道密钥将是新的,所以我们可以简单地选择“是,保存密钥”。
现在,您将回到一个有些熟悉的黑色屏幕,上面有一些文本。到目前为止只会是:
用户名:
由于我们还没有设置不同的用户帐户,我们将作为“pi”用户登录,所以只需输入 pi 并按 enter 键。目前为止一切顺利。现在我们只需要提供您在初始安装时设置的密码。现在我们知道你按照我们的建议更改了密码(你做得对吗?)但是以防万一你没有,默认密码是 raspberry。输入密码,按回车键,最后我们应该得到我们想要的命令提示符:
pi@raspberrypi ∼ $
如果您没有 Mac(或者对使用 SSH 不感兴趣),请跳到下一部分——命令提示符。
LOOK BEFORE YOU LEAP
这属于“显而易见,除非证明不是这样”的范畴,但是当你使用远程终端时,很容易迷失方向,并在错误的机器上运行命令。如果你试图重启你桌子上的 Pi,你不希望意外重启其他东西,比如公司服务器(你永远不知道你的新 Linux 技能会把你带到哪里!).
Mac 上的 SSH
如果你使用的是 Mac 而不是 PC,你将无法使用 Putty。这不成问题,因为由于它的 Unix 根,Mac 内置了一个很好的 SSH 客户端。我们需要做的就是打开一个终端窗口并运行 SSH 命令。
首先,让我们启动并运行终端。您可以在“应用程序”内的“实用程序”目录中找到它。也可以使用 Spotlight(菜单栏右上角的放大镜,输入“终端”来查找。
您会发现它与您在 Pi 上使用的终端没有太大的不同,这是有原因的。正如我们前面提到的,Mac 实际上是基于 Unix 的,就像 Linux(以及 Raspbian)一样。尽管 Mac 很好地隐藏了它的 Unix 部分(你可以使用 Mac 很多年,但永远不会碰到它),如果你喜欢 Linux 和命令行,你可能想更深入地了解它。
现在我们已经打开了终端,让我们将它连接到您的 Pi。我们将使用 ssh 命令,因为没有 GUI,所以我们必须在命令行上指定相关选项。基于我们之前的例子,你的终端应该是这样的(图 3-9 ):
图 3-9。
Connecting to your Pi over ssh
为了节省空间,上面的截图显示了整个过程,而不仅仅是一个空的终端窗口。我们现在最感兴趣的是:
$ ssh pi@192.168.1.132
命令本身是 ssh,但是我们提供了一些附加信息;我们要连接的用户和 IP 地址。可以将选项读作“服务器 192.168.1.132 上的用户 pi”。有点像电子邮件地址,这是一个很好的简洁的方式来显示我们想连接谁以及我们想连接到哪里。你当然应该用你的 Pi 地址替换我们的 IP 地址。
每当您连接到新机器时,都会看到第一个文本块:
主机’ 192.168.1.132 '的真实性无法建立。
ECDSA 密钥指纹为 B4:9a:a2:62:45:E5:70:F2:F3:F6:68:E0:B7:9a:ea:01。
您确定要继续连接吗(是/否)?是
警告:将“192.168.1.132”永久添加到已知主机列表中
pi@192.168.1.132 的密码
这只是 ssh 警告您它不能确定您是否正在连接到您认为正在连接的服务器的方式,并向您显示服务器用来识别自身的密钥。在这种情况下,你可以忽略警告,说是。如果您想了解更多关于它的含义,我们在 Windows 上的 SSH 一节中简要介绍了它。在您输入密码(raspberry 是默认的)之后,您应该会看到以下提示:
pi@raspberrypi ∼ $
现在您已经有了命令提示符,我们将看看它的实际含义。
WHAT’S SO SPECIAL ABOUT SSH?
SSH 或 Secure Shell 实际上是远程访问任何 Unix 类机器的标准。它甚至受到许多网络设备的支持,如打印机和高端交换机。它之所以如此受欢迎,是因为它加密了你的计算机和服务器之间的所有数据。如果有人在监听你的连接,他们得到的只会是垃圾。它还允许您验证服务器是否是您认为的服务器。
在我们有 SSH 之前,每个人都使用 telnet。这是一个非常简单的协议,没有任何加密。这意味着,如果任何人都可以看到你的流量(想想公共机器或 WIFI 接入点),就有可能以明文形式从网络上读取你的密码。Telnet 也无法确认您所连接的机器的身份,这意味着您永远无法确定您是否无意中向他人提供了您的用户名和密码。
仍然可以在 Linux 上安装 telnet 服务器,但是不鼓励这样做。没有什么好的理由比 SSH 更喜欢 telnet,所以当您在远程服务器上工作时,应该总是使用 SSH。
欢迎使用命令行
无论您选择哪条路线到达终端,最终结果都是一样的,也就是说,您最终会看到一个类似如下的命令提示符(或简单的提示符):
pi@raspberrypi ∼ $
这里实际上有相当多的信息,但它都意味着什么呢?你也许可以从我们到目前为止在书中所做的事情中猜出大部分,但是为了完整起见,这里是它是如何分解的。
第一部分(例子中的 pi)是用户名。当您只有一个 Pi 和一个用户时,这不是特别有用(或者令人敬畏)。然而,当您最终不得不管理许多用户或者当您有不同机器的各种帐户时,它是非常有用的。这就是第二部分的用武之地(示例中的 raspberrypi ),因为它告诉我们所连接的机器的主机名。总之,这让我们知道我们是谁,我们在哪里。同样,对于一个圆周率来说不是很有用,但是这些信息总有一天会派上用场。
Caution
我们已经在其他地方强调了这一点,但它非常重要,我们要再说一遍。当您打开多个终端时,很容易在错误的服务器上运行命令。有时,在您意识到自己的错误之前,您会运行多个命令。通常不会造成伤害,但是如果您在工作中意外地重启了一个关键服务器,而您实际上是想重启您的 Pi,那么您将成为 IT 部门的头号报复对象。
提示符的下一项(或波浪符号)实际上告诉我们当前在哪个目录中。波浪号是一个特例,因为它指的是当前用户的家庭区域。你可以把它想成简写,因为它就是简写。每当您引用您的主目录(在本例中是/home/pi)时,我们可以简单地用波浪号替换它。下面是一个简单的例子:
pi@raspberrypi ∼ $ pwd
/home/pi
pi@raspberrypi ∼ $ cd ∼
pi@raspberrypi ∼ $ pwd
/home/pi
pi@raspberrypi ∼ $
这里我们使用了“pwd”(打印工作目录的缩写),它打印出了我们当前所在目录的完整路径。在我们的例子中,它输出/home/pi,因为这是 pi 用户的主目录。然后,我们使用“cd”命令(change directory 的缩写)转到目录。我们再次使用“pwd ”,并能够验证在更改目录后,我们又回到了开始的地方。我们将在下一章更彻底地解释这些命令,但是这些命令行的东西难道不是至少有点意思吗?
当在一般讲话中提到’∾’时,你称它为“主目录”。因此,如果您在我们的示例中坐在提示符下,有人问您在哪个目录中,您会说您在自己的主目录中,或者如果您想明确一点,您会说您在 pi 用户的主目录中。如果你想得到真正具体的,你甚至可以提到主机名。你不会说你是在波浪号或“摆动线”目录。
然而,当你给某人一条进入的路径时,你会说颚化符。例如,如果您希望用户转到“∨/test/”,您可以说“键入 cd 空格符斜杠测试斜杠,然后按 Enter”。这是因为在这种情况下,代字号指的是您为了方便到达某个位置而使用的特定内容,而不是实际告诉某人该位置是什么。这也有助于防止相对路径的混淆,但同样,这是下一章的内容。
Note
我们听过 tilde 发音为“tilled”和“till-duh ”,所以你应该会在野外听到这两种发音。不过有趣的是,你可能会发现无论你使用哪一个,人们都很难理解你,这甚至适用于有经验的管理员。这不是因为你读错了,只是他们不知道“1 键左边的波浪线”实际上叫做波浪线。如果你发现自己处于这种情况,称之为“摇摆不定的线”似乎是一个相当安全的赌注。
命令提示符的最后一部分显示了您的访问级别。谈到系统特权,Linux 系统是非常基本的。这通常可以归结为你要么是根用户,要么不是。如果您是 root 用户,那么您可以不受限制地做任何事情。如果你是任何其他用户,预计会发现你的能力大幅削减。如今,这种情况已不像以前那样真实,因为有一些工具,如“sudo ”,允许管理员授予以 root 权限运行某些命令的能力,而无需该用户访问 root 帐户。当然,最终,sudo 以 root 用户身份运行,它只是决定是否运行您要求它运行的命令,所以实际上它仍然遵守全有或全无规则。
从提示的角度来看,如果您是普通用户,您会得到一个美元符号作为提示。我们以 pi 用户(显然不是根用户)的身份登录,因此我们也有$号。如果我们以 root 用户身份登录,我们将是特权用户,因此我们将获得散列符号(如果您不是来自英国,则为井号)。根提示符如下所示:
root@raspberrypi ∼ #
散列符号是一个标志(也是一个警告),表示您正在以提升的权限运行,因此您应该对键入的内容非常小心。提示符还显示用户名为 root,这提供了一个额外的指示。然而,这些微妙的提示很容易被忽略(人们不倾向于研究每个命令前的提示),所以再次强调,在按回车键之前,总是检查你是谁和你在哪里。
这就是提示的全部内容。大多数 shells 允许您定制它来显示不同的信息,偶尔一些管理员会更改这一点。根据我们的经验,大多数人都不会在意,我们也很少觉得有必要自己去改变它。我们在这里提出这个问题的原因是,如果你登录到另一台 Linux 机器上,而提示完全不同,那就不必担心了。终端的工作方式完全相同,只是提示符被定制了。
不同的 Shell
好吧,当我们说所有的终端都一样工作时,也许我们把事情简单化了。事实上,有一些细微的差别,特别是在它们支持的特性上,但是通常你不会注意到。事实上,当远程机器使用不同的 shell 时,很可能会发现这一点。shell 是一个和其他程序一样的程序,但它不是一个浏览网页或阅读电子邮件的工具,它提供了一个命令行让你和操作系统进行交互。它就像一个包裹着内核的包裹物,这就是它的名字——就像花生米一样包裹着内核。
到目前为止,我们一直在使用 BASH 或 Bourne Again Shell。它是目前最流行的 shell,在每个 Linux 发行版中都有。它通常也是默认的,这就是为什么你永远不用太担心你的系统运行的是哪一个 shell。
我们之所以在这里提出这个问题,是因为就像开源世界中的其他事情一样,对于什么是最好的 shell,人们有不同的看法。有些采用了一种简单的方法,只支持最基本的特性,而 BASH 这样的 shells 自带电池,拥有的特性比你摇一摇棍子能想到的还要多。尽管 BASH 很受欢迎,但可以想象,在您杰出的 Linux 职业生涯中的某个时刻,您可能会遇到其他事情,预先警告是有备无患的。
我们不打算花更多的时间来看不同的 Shell,因为老实说,你可能永远不需要担心它。即使一台机器使用不同的 shell,您也可以启动 BASH 来替换它(大多数系统都安装了 BASH,即使您登录时使用了不同的 shell)。因为无论您使用哪种 shell,系统命令都是相同的,所以即使您无法使用 BASH,您也可能会发现您可以做任何您通常会做的事情。事实上,大多数 shell 在很大程度上是可以互换的,即使您在使用另一个 shell,您也可能不知道!
摘要
这一章向你介绍了这个码头和它丰富的(如果不是非常迷人的)历史。然后,我们讨论了终端今天是如何使用的,以及它是如何适应我们的现代需求的。然后我们看了在 Pi 上访问终端的三种主要方式,主要是控制台、虚拟终端和通过 SSH 访问网络。接下来,我们快速描述了命令提示符,并提到了一些有趣的命令来强调一点(我们绝对保证在翻页时会解释这一点),最后,我们总结了这一章,向您介绍了不同的 shells,以及它们可能(但可能不会)如何让您出错。
在下一章中,你需要知道如何愉快地浏览你的 Pi,创建文件,修改文件,删除文件等等。这是我们开始真正认真对待命令行的地方,也是您开始获得一些实际技能的地方。
四、通向成功的文件路径
在这一章中,我们来看看什么是文件系统,以及不同的操作系统是如何理解它们的。我们解释了单独的根文件系统和统一的根文件系统之间的区别,以及为什么预先知道这一点会省去您很多麻烦。
然后,我们继续查看您的 Pi 上显示的文件系统。我们探索标准布局,并解释什么去哪里,它实际上做什么。我们还将展示一些简单的命令,强调 Unix“一切都是文件”的系统设计方法的一些好处。
接下来,我们将向您展示如何在系统中移动,您将了解完全限定路径和相对路径。我们将向您展示如何创建目录和文件(然后复制、移动和删除它们),以及如何创建相当于快捷方式的 Linux。
然后,我们将以对 Linux 文件权限的探索来结束这一章,并向您展示 Linux 如何决定谁可以对您的文件做什么。我们还将涉及用户和组,并向您展示如何设置您自己的文件的所有权和文件权限。
什么是归档系统?
我们实际上已经计划从字典定义开始这一部分,然后是我们的解释。不幸的是,我们能找到的大多数定义基本上都是说“归档系统是一个归档系统”,我们将不得不跳过这一部分,直接进入我们自己的定义。然而,这确实表明,尽管文件系统说起来容易,但定义起来却困难得多。但是对我们来说,我们认为归档系统是:
一种对数据进行排序和分类的方式,使查找更容易。
这个定义涵盖了一切,从简单的收件箱(至少你知道文件在哪里,即使你不能马上把手放在上面),到你在手机上查看联系人的方式(这是一个字母系统),一直到一些更奇特的系统,如杜威十进制系统,用于在当地图书馆对非小说内容进行分类。
实际上,图书馆是文件系统的一个有趣的用例,因为大多数图书馆至少同时运行两个。一般来说,图书馆倾向于按照作者的姓(然后是名)来排列虚构的作品,而非虚构的部分是根据他们的杜威十进制数来排序的。通过同时使用两个系统,他们解决了一个基本问题。如果你有一个最喜欢的作者,并想找到更多他们的书,按作者的名字存储书籍是很棒的。不过,说到非小说类,你可能想浏览某个特定主题的精选书籍,但往往你心里没有特定的作者。如果这些书按作者名分类,你可能永远也找不到任何东西。
一些图书馆更进了一步,首先根据流派(比如科幻或奇幻)对虚构书籍进行分类,然后在这一类别中,他们根据作者姓名进行分类。这有一些非常好的好处。你仍然可以直接找到你最喜欢的作者,因为你知道他的类型,但是你也可以浏览相同类型的类似书籍。如果你正在寻找奇幻类的下一个最佳作品,你可以简单地站在那个区域快速浏览。
目前为止一切顺利。归档系统使寻找东西变得更容易,我们可以看到使用正确的归档系统对任务的重要性,否则你可能会比没有归档系统更好。但是他和电脑有什么关系呢?任何计算机的主要任务之一是处理信息,这意味着它必须能够轻松地存储和检索信息。旧的计算机系统确实使用字母系统,而且运行得非常好,但是一旦你开始建立一些文件,它就开始变得非常混乱,找到你想要的就成了一个挑战。这个问题可以通过创建一个目录(现在通常称为文件夹)来解决,在这个目录中可以放置相关的文件。这很有帮助,但同样的老问题开始在人们身上蔓延。是的,你可以有一个账户目录和一个纳税申报表目录,但是如果你是一家会计公司,你有很多账户和很多纳税申报表,那该怎么办呢?很快,您又回到了开始的地方,因为您要么拥有包含大量文件的少量目录,要么拥有仅包含一两个文件的大量目录。
文件系统结构的最后一个变化是允许目录包含其他目录,这一点至今仍为人们所熟悉。这将允许您以最合适的方式灵活地存储内容。像往常一样,有多种方法来排列给定的文件集,但总的来说,这个系统为我们提供了很好的服务,借助现代搜索技术,找到我们想要的东西比以往任何时候都更容易。
不止一个文件系统
这就是我们使用这种方法遇到的一点障碍。文件系统位于某种形式的存储之上。它可以是硬盘、u 盘、DVD 或任何数量的存储介质。每个设备实际上相互独立。这是有意义的,因为你可以从你的笔记本电脑上拿一个 u 盘,然后在你的台式机上使用它。很明显,u 盘上的文件系统和你的笔记本电脑之间没有联系,否则你的电脑就没有找到文件所需的所有信息。
每个文件系统都有一个“根目录”。这是设备上的第一个目录,它包含所有其他文件和目录。像树根一样,所有的文件和目录都从这个中心位置分支。不过这确实带来了一点问题。如果每个设备都有自己的文件系统和根目录,如何轻松地将这种结构呈现给最终用户?事实证明,它们是解决这个问题的两种方法。第一个是单独的根,第二个是统一的文件系统。
分离根
这种方法早在 MSDOS 时代就被微软采用了,并且一直沿用到今天。方法很简单。每个设备都有自己的根条目,然后用户可以使用该条目来定位感兴趣的设备,然后可以像平常一样简单地导航文件系统来找到该文件。在 Windows 下,每个根目录都有自己的字母。由于历史原因,Windows 上的系统盘被称为“C:”你会经常听到人们称之为“c 盘”。软驱被分配给 A:和 B:(有硬盘的个人电脑倾向于有两个软驱)由于很少有人有一个以上的硬盘,光驱倾向于被分配给 D:。
这个系统真的很容易使用,从来没有任何混乱的特定文件在哪里,因为你可以告诉简单地看看驱动器号。然而,这种设计有几个问题。首先,由于根设备被分配给字母,字母表中只有 26 个字母,因此您只能使用 26 个设备。即使在今天,这对家庭用户来说也几乎不是问题,但是当企业使用大型主机时,他们可能有数百台这样的设备。
第二个问题是用户必须知道他们的文件的物理位置。这实际上会增加复杂性,因为它将文件的位置与文件所在的物理设备联系在一起。如果系统中添加了一个更大的磁盘,并且文件被移动到新的位置,那么它们的根设备将会改变。任何依赖于文件位置的人(或软件)都需要更新,这可不好玩。
简而言之,尽管 Windows 使用的系统简单而有效,但在非常大的分布式系统上,它会成为一个管理难题。现在有很多方法可以解决这个问题,新的技术已经出现,将这种结构隐藏在表面之下,所以对于今天的 Windows 系统来说,这真的不是一个大问题。然而,当 Unix 占据主导地位时,这些技术还不可用,它们采用了另一种方法,即统一文件系统。
统一文件系统
基于 Unix 的 Linux 有统一的文件系统。这意味着,与拥有多个根设备的 Windows 不同,Linux 系统只有一个根设备,并且总是安装在“/”上,这是 Unix 中的根目录。如果只有一个根目录,那么 Linux 如何处理额外的设备,我们知道这些设备都包含它们自己的文件系统?
解决方案是获取新设备的根目录,然后将其附加到树中的现有目录。这就是所谓的挂载文件系统。这允许 Linux 拥有几乎无限数量的设备,因为它可以将它们连接到现有树中的任何位置。这意味着您可以装载一个设备,然后在第一个设备内的目录中装载另一个设备。从用户的角度来看,他们可以在所有这些不同的目录中移动,就好像他们都在一个大设备上一样。物理结构(即所有磁盘和磁盘上的原始数据)对最终用户完全隐藏。他们没有办法知道他们已经从一个设备穿越到另一个设备。
这解决了分离根方法突出的问题,因为无论底层机制是什么,统一文件系统都是一致的。事实上,您可以将网络文件共享甚至虚拟文件系统挂载到树中。当然,分离根方法的优点现在已经变成了统一方法的缺点。要看清事情的走向不再容易,这又会让事情变得更加混乱。像 Windows 一样,Linux 系统也随着时间的推移而发展,所以这些问题不像在其他情况下那样明显。然而,这些好处大多是在 GUI 中看到的,在使用命令行时往往不太明显。
苹果电脑必须与众不同
作为一个有趣的对比,Mac 上的 OSX 同时使用了这两种方法。在幕后,OSX 是一个基于 Unix 的系统,所以它有一个统一的文件系统。然而,除非你使用命令行(大多数 Mac 用户不会这样做),否则你永远看不到这方面的证据。当你把 u 盘连接到 Mac 电脑上时,它会以与 Linux 类似的方式安装 u 盘,但它会以与 Windows 类似的方式向用户展示 u 盘,就好像它是自己的根设备一样。然而,Mac 并不分配驱动器号,它只是设置了一个唯一的名称。
把所有的东西放在一起
诚然,这是一个相当不错的理论,你可能想知道我们承诺向你展示的所有有趣的命令在哪里。你可能还想知道为什么我们会让你厌烦这些,以及这些信息什么时候(如果有的话)会有用。我们一开始就强调这一理论的原因是,当我们开始使用 Linux 时,许多事情使我们摆脱了使用其他操作系统的先入之见。大约 15 年前,当我们中的一个人第一次安装 Linux 时,他花了几个小时咒骂才弄明白“你需要一个根“/”设备是什么意思。这不仅仅是 Linux 的问题,对 BSD 操作系统家族及其处理磁盘的替代方式的涉猎导致我们擦除了错误的磁盘,因为我们考虑的是 Linux 而不是 BSD。
因此,希望这最后一节将把你从我们刚开始时所经历的痛苦中解救出来。你不需要记住所有的理论,但是如果你在阅读完这一部分后,意识到尽管有许多相似之处,但 Linux 不是 Windows 或 Mac,那么你将会领先于这个游戏。
所有东西都作为一个文件
现在,当我们讨论这个话题时,我们通常从谈论硬盘分区开始,因为大多数人都熟悉硬盘分区,并且在 Linux 呈现它们的方式和物理设备本身之间有一个很好的简单映射。由于 Pi 在技术上没有硬盘(它拉一些线使 SD 卡看起来和感觉上像一个硬盘),这个简单的例子在 Pi 上实际上是不可用的。问题是,这个例子太好了,不能错过,所以我们要坚持经典。所以,事不宜迟,下面是描述我们的一个服务器上的磁盘设置的文件:
/dev/sda
/dev/sda1
/dev/sda2
/dev/sdb
/dev/sdb1
如您所见,这些文件都位于/dev 目录中,这是 Linux 保存所有设备文件的地方。关于这一点还有很多要说的,但是我们稍后会回到这一点,相信我们,如果我们最后讨论它,会更有意义。所以现在,让我们忽略目录,专注于我们的文件集合。您会注意到,在这个示例中,所有文件都以“sd”前缀开头。这是因为它们都是“SCSI 磁盘”,并且共享相同的驱动程序。出于兴趣,对于具有基于 IDE 的磁盘的机器,前缀是“硬盘”的“hd”。
现在我们知道我们有一些基于 SCSI 的磁盘(SATA 磁盘也显示为 SCSI ),但是从这些文件中我们还能知道什么呢?你会注意到我们有 sda 和 sdb。系统上的第一个 SCSI 磁盘分配给 sda,第二个分配给 sdb。得知第三个磁盘最终将被分配给 sdc 时,可能不会感到意外。由于我们在示例中没有看到 sdc,我们可以假设这个系统上只有两个磁盘。
现在我们真的有所进展了。我们可以看到我们的系统上有两个 SCSI 磁盘,现在我们只剩下一件事要讨论了——名称末尾的数字。在这种情况下,编号是指驱动器上的分区号。第一个分区是 1,第二个分区是 2。很好,很简单,我们确信没有真正的惊喜。有了这些附加信息,我们不仅可以指定哪个磁盘,还可以指定该磁盘上的哪个分区。
这当然引出了你为什么要关心的问题。肯定有更简单的方法来找出系统连接了哪些磁盘吧?你可能是对的,但我们并不是通过这个来发现什么连接到系统,而是看我们如何指定我们想要访问的特定设备。请记住,Linux 中的一切都是文件,所以即使是物理设备也是以这种方式表示的。当我们想访问一个硬盘或我们想访问一个特定的部分,我们这样做是访问相关的文件。
一些真实世界的例子在这里会很有用。当你想改变硬盘上的分区表时,你可以使用“fdisk”工具。fdisk 工具当然需要知道您想在哪个磁盘上工作。假设您想要对第二个磁盘进行分区,该命令如下所示:
fdisk /dev/sdb
因为我们正在对驱动器本身进行分区,所以我们希望引用整个设备,而/dev/sdb 允许我们这样做。但是,假设我们已经完成了分区,并且我们有一个大分区,我们想格式化它以供 Linux 使用。命令是 mkfs.ext4(在现代 Linux 发行版上),和以前一样,您需要告诉命令您想要格式化什么。在这种情况下,我们希望第一个分区位于第二个磁盘上,因此命令如下所示:
mkfs.ext4 /dev/sdb1
同样,这是有意义的,因为我们指的是特定设备上的特定分区。这里没有大的信仰跳跃,但我们现在可以和你分享一个小秘密。mkfs.ext4 命令并不真正关心您给它取了什么文件名。如果你忘记在末尾加上“1 ”,它会很高兴地格式化整个设备。这是一个“一切都是文件”的例子——因为一切都是文件,文件都以同样的方式访问,我们的工具只是简单地读写文件——它们既不知道也不关心它们写的是什么!
这个概念需要更多的努力才能真正理解。在幕后,Linux 为我们管理所有这些不同的设备,每一个都有自己特定的需求和驱动程序。为了让应用程序开发人员(更不用说用户)简单,Linux 隐藏了所有这些复杂性,而是将每个设备作为一个特定的文件呈现给我们。这让我们很好地回到了/dev 目录(我们告诉过你它会出现)。该目录中的文件很特殊,因为它们并不真正存在,至少不是存储在任何地方的物理文件。Linux 创建一个虚拟文件系统,然后用给定计算机上可用设备的文件填充它。因为我们的 Pi 没有任何 SATA 或 SCSI 磁盘,所以您不会在您的 Pi 上找到任何/dev/sd 文件。
文件系统布局
好了,现在让我们看看文件系统是如何在您的 Pi 上布局的。你会发现它的结构与你在任何 Linux 系统上发现的非常相似,所以这不仅会帮助你掌握你的 Pi,而且你也能浏览服务器。所以让我们陷入…
/(根目录)
这是根目录(不要与根用户的主目录混淆),代表文件层次结构的顶层。所有东西都在这个目录中或目录下,没有例外。正如我们在本章前面所讨论的,Linux 有一个统一的层次结构,这是一切的起点。
/root
这是根用户的主目录,大部分时间都与根目录(即“/”)混淆。这可能会变得更加混乱,因为如果你在根目录中,有人让你“进入根目录”,他们实际上指的是哪一个?通常你可以很容易地从上下文中判断出来,但如果不能,不要害怕要求澄清;你会惊讶这个问题出现的频率。
/等等
/etc 可以说是系统中最重要的目录之一。它不仅包含您的系统的所有配置文件,还包含您可能已经安装的应用程序(比如 Apache web 服务器)。许多不熟悉 Linux 的用户小心翼翼地备份他们的应用程序,但是经常忘记存储在/etc 中的配置。在一天结束的时候,应用程序通常可以很容易地被替换,但是从头开始进行正确的配置却是一件非常头疼的事情。这是一个你想要非常小心的目录。
/proc
/proc 是一个虚拟文件系统,内核使用它来提供从用户空间工具的简单访问。您需要了解的关于系统状态或正在运行的进程的所有信息都可以在/proc 中找到。两个常见的例子是 CPU 配置(存储在/proc/cpuinfo 中)和内存使用(存储在/proc/meminfo 中)。这些信息大部分是只读的,这是有意义的,因为它只是一个虚拟的表示。然而,有些文件确实允许双向通信,你可以在机器运行时用它来调整内核和系统设置。
/var
/var 通常是您可以找到由您的应用程序和系统本身创建的文件的地方。例如,大多数应用程序将它们的日志存储在/var/log/中,许多应用程序将锁文件存储在/var/run/中。apache web 服务器过去使用/var/www/来存储网站文件。事实上,我们在前一本书里强调了这个特性。在现代发行版中,这种文件不再位于/srv/目录中。
/boot
传统上,/boot 目录实际上位于第一个硬盘上自己的小分区中。当时,大多数计算机都不能从一个大分区启动,所以看到这些分区分开是很常见的。在现代机器上,这不再是一个问题,所以这个目录通常直接包含在根目录中。顾名思义,它保存了引导系统所需的关键文件,包括引导装载程序和 Linux 内核本身。
/bin 和/sbin
这些位置分别存储用户和管理程序。通常,普通用户的路径中只有/bin,所以他们实际上看不到/sbin 中的应用程序。有些应用程序用户可以访问,尽管它们通常只由管理员使用,但是用户需要知道它们在哪里。通常这不会造成问题,你也不需要去寻找任何东西。
/开发
我们已经在“一切作为文件”一节中提到了这个目录。它包含当前系统上每个设备或子设备的文件,并为系统工具(当然还有用户)提供了一种方便地访问特定机器上的硬件的方法。除了我们前面提到的磁盘设备,还有显卡、声卡、虚拟终端等设备。
Note
您不会在/dev 目录中找到网卡,因为它们被视为特例。要查找网络接口的信息,您需要使用“sudo ifconfig -a”命令。这将列出 Linux 知道的所有网络设备。
/home
传统上,所有用户主目录都存储在/home 下,这通常是它自己的分区、磁盘或网络共享。这个想法是将用户数据与系统数据和应用程序分开。大多数基于 Unix 的系统仍然遵循这一规则,但是有时您会将一些主目录放在其他地方,例如根用户的主目录。例如,Mac 将主目录存储在/Users 中,一些企业会根据不同用户的需求将他们放在不同的位置。虽然/home 通常只包含主目录,但并不要求主目录实际驻留在这里。
/库
该目录包含各种应用程序所需的库文件。库允许将功能打包,然后由其他应用程序共享。数据库驱动程序就是一个很好的例子。为了让这些应用程序能够找到这些库,需要将它们安装在一个已知的位置,并使用一个已知的文件名。很少需要查看这个目录,但是如果您这样做,您应该小心,因为破坏这里的内容可能会影响系统的稳定性。
/丢失+找到
我们提到这一点是为了完整性,但它本身并不是文件系统结构的一部分。相反,它是当文件系统失去对文件的跟踪时,文件被放置的地方。例如,如果磁盘损坏,您需要运行磁盘修复。有些文件可以恢复,但由于各种原因,可能无法确定该文件的来源。如果发生这种情况,Linux 将把那些迷失的灵魂放在这个目录中。我们从来没有理由查看这个目录,而且很可能你也永远不需要查看那里。最后,这个目录可以出现在任何挂载的文件系统的根目录中,而不仅仅是在/中,因为每个文件系统都必须独立地跟踪它丢失的灵魂。
/媒体
这个目录对于 Linux 来说相对较新,添加它是为了明确区分挂载的外部设备(如/mnt 中的设备)和可移动介质(如 USB 棒、相机和媒体播放器)。在 Linux 下这些通常是自动处理的,所以通常你不会手动添加或删除这个目录中的任何东西。
/mnt
作为 mount 的缩写,/mnt 目录通常是您挂载附加文件系统的地方。如果您想要附加一个网络共享或一个外部硬盘,您应该在/mnt 中创建一个目录并挂载到那里。软盘和 cdrom 在这里通常也分别称为/mnt/floppy 和/mnt/cdrom。然而,在最近几年,这个目录大多已经半途而废。
/usr
这是机器上大部分软件的最终位置,因此它通常是服务器上最大的目录(至少如果不计算用户的主目录)。虽然知道软件在你机器上的位置是有用的,因为一切都是自动为你处理的,这里的一切都应该“正常工作”。
/opt
这个目录是万能的。在一些系统中,它装满了应用程序,而在另一些系统中,它完全是空的。它通常用于第三方软件和应用程序。例如,默认情况下,Oracle 数据库服务器安装在/opt/中。您可能找不到使用这个目录的理由,但是如果您这样做的话要小心,因为在进行备份等操作时,很容易忘记/opt/中的内容。
/srv
另一个相对较新的,/srv/目录是为服务文件的服务存储数据的指定位置。例如,这是 Apache web 服务器的新家。尽管这个目录似乎存在,但是一些应用程序仍然不使用它,或者出于习惯,或者仅仅是因为每个人都习惯于其他地方的内容。如果您正在寻找曾经在/var/中的东西,这可能是接下来要寻找的一个好地方。
/sys
这个目录包含系统信息,像/proc 一样,它只存储在内存中,因为它是一个虚拟系统。它似乎没有得到太多的使用,我们自己甚至从来没有看过这个目录。然而,我们有可靠的消息称/sys 非常有用,我们应该非常乐意拥有它。
/tmp
这个目录是计算机的暂存区,各种应用程序都在这个目录中创建文件。每当使用临时文件存储时(例如在处理过程中),都会使用它。历史上,这个目录应该在重启时清空,但实际上很少这样做。随着更新的发行版转移到 systemd,/tmp 几乎肯定会在重启时消失。如果你在这里放任何东西都要非常小心,因为它不太可能在你重启 Pi 后存活。
包装它
这基本上总结了 Linux 文件系统的关键领域。毫无疑问,当你环顾你的系统时,你可能会遇到其他小角落和缝隙,但它们可能是其中的一个子集。请记住,虽然大多数系统都遵循这种结构,但大多数并不一定意味着全部,您可能会遇到一些不同之处或目录以其他方式使用的地方。
让它发挥作用
到目前为止,我们在这一章中已经讲了很多。我们已经研究了文件系统如何工作,以及 Unix 系统(尤其是 Linux)如何采用统一的方法。我们看着“所有的东西都是一个文件”,我们展示了这些特殊的文件和文件系统如何适应事物的大计划。我们总结了所有这些,概述了文件系统上的内容以及它们的作用。我们还没有做的是实际上自己使用文件系统。
到目前为止,我们已经相当“解放双手”,但这一切都将改变这一部分。我们将从向您展示如何创建目录和在文件系统中移动开始。一旦我们给了你创造的能力,我们就给你毁灭的能力,你就可以随意删除文件和目录(这并不总是一个好主意)。我们将用一个关于 Linux 文件权限以及如何读取和设置它们的快速概述来结束这一节。让我们开始吧!
我们在哪里?使用 pwd
我们首先要向您展示的是如何找出您在系统中的位置。找到方向的最简单方法是查看命令提示符。我们在上一章谈到了这一点。作为快速复习,下面是我们在主目录中时命令提示符的样子:
[pi@raspberrypi ∼]$
波浪号(又名曲线)是当前用户主目录的缩写。当我们第一次介绍这个特性时,我们已经强调了它,所以我们不会再重复了,但是让我们看看当我们在/usr/lib 目录中时它是什么样子的:
[pi@raspberrypi lib]$
这可能会带来一个问题。我们知道我们在/usr/lib 中,但是提示只显示了路径的最后一部分。这实际上是一个好主意,因为尽管你可以设置你的提示来显示整个路径(这在当时看来是一个好主意),但是当路径占据了大部分屏幕时,你很快就会变得不耐烦。但这并没有解决问题。据我们所知,我们可能在/usr/lib 或/danger/lib 中。不用说,这可能会带来不愉快的后果。所以我们需要的是‘pwd’命令。我们在上一章中也提到了这个有用的工具,但是如果你错过了它,它又出现了:
[pi@raspberrypi lib]$ pwd
/usr/lib/
[pi@raspberrypi lib]$
这个工具对于告诉我们我们在哪里非常有用,但是它不能告诉我们在同一个位置有什么。就像被蒙上眼睛,告诉你站在厨房里;这是一个很好的开始,但你实际上仍然是盲人。您肯定想知道房间里有谁和什么,为此我们需要“ls”命令。这个命令有大量的选项,所以我们将只讨论最常见的选项,也就是我们每天都在使用的选项。实际上,你可以把它们记为食谱,因为你经常会一次又一次地传递相同的选项(或者至少我们是这样)。
首先,让我们回到我们的主目录:
[pi@raspberrypi lib]$ cd ∼
我们这里有什么?使用 ls
现在让我们看看这里有什么:
[pi@raspberrypi ∼]$ ls
Desktop python_games
[pi@raspberrypi ∼]$
虽然我们不能轻易在书中表现出来,但是 Desktop 和 python_games 都是深蓝色的。这告诉我们它们是目录。目前我们在这个目录中没有任何文件,是吗?实际上我们有,但是它们被认为是隐藏文件。在 Linux 下,任何以句点(或句号)开头的文件都被认为是隐藏的。文件本身没有什么特别的,它们通常是各种应用程序创建的各种配置或临时文件。我们通常不希望这些文件弄乱我们的显示,所以 ls 和朋友不会显示它们。但是,我们可以强制 ls 向我们显示那些带有’-a '标志的文件,如下所示:
[pi@raspberrypi ∼]$ ls
. .. .bash_history .bash_logout .bashrc .profile python_games
[pi@raspberrypi ∼]$
使用 Touch 创建要使用的文件
现在,我们将不再使用-a 标志,而是创建我们自己的文件来使用。由于我们还没有介绍如何创建和编辑文本文件(我们将在第七章中告诉你如何做),我们将向你介绍另一个叫做“触摸”的小工具。在 Linux 下,文件有两个时间戳——创建时间戳和最后修改时间戳。这些允许您查看文件的创建时间和最后更新时间。从管理的角度来看,这是很有用的,因为您可以看到哪些文件正在被使用,但是各种工具(如备份脚本)使用这个时间戳来判断自上次查看以来文件是否发生了更改。有时,能够在不改变文件内容的情况下更新时间戳是很有用的,这就是 touch 的用武之地。它会接触更新时间戳的文件,但是如果该文件当前不存在,那么 touch 会为您创建它。换句话说,这是一个创建空文件的好工具。因此,让我们从创建两个最初命名的文件开始:
[pi@raspberrypi ∼]$ touch raspberry
[pi@raspberrypi ∼]$ touch pi
[pi@raspberrypi ∼]$ ls
Desktop pi python_games raspberry
[pi@raspberrypi ∼]$
这就是全部了。正如你从后面的 ls 中看到的,我们现在有两个额外的文件。这次它们是灰色的,这告诉我们它们是普通文件。通过给条目着色,ls 让我们更容易看到我们在做什么。例如,任何可执行文件都将被标为绿色,但是我们将在本章的后面回到文件权限。
到目前为止,我们只有两个文件,但如果我们有十个或二十个,这里会变得有点拥挤。处理的方法当然是创建目录来存储我们的文件(可能还有其他目录),这是我们接下来要看的。
Note
目录和文件夹基本上是一回事。最初称为目录,微软开始称它们为文件夹,他们觉得这是一个更好的描述。虽然 Linux 过去使用目录这个术语,但是随着人们从 Windows 迁移过来,它已经变得更像一个桌面操作系统,文件夹这个术语也变得越来越普遍。
使用 Mkdir 来存储我们的文件
要创建目录,我们使用“mkdir”或“make directory”命令。不出所料,这将创建一个新目录。但是,如果存在同名文件或目录已经存在,您将得到一条错误消息。让我们创建一个名为“pifun”的目录来存储我们的文件:
[pi@raspberrypi ∼]$ mkdir pifun
[pi@raspberrypi ∼]$ mkdir pifun
mkdir: cannot create directory ’pifun’: File exists
[pi@raspberrypi ∼]$
如您所见,尝试创建目录两次将会导致错误。不要被“文件存在”分散注意力,这实际上可能指的是目录或文件。另一个快速 ls,我们会看到事情进展得非常顺利:
[pi@raspberrypi ∼]$ ls
Desktop pi pifun python_games raspberry
[pi@raspberrypi ∼]$
使用我们的新目录,使用 mv 命令
现在我们有了目录,让我们收拾一下我们制造的混乱。因为我们想要将文件移动到我们的新目录中(而不仅仅是创建它们的副本),我们需要使用’ mv ‘(或’ move ')命令。这个命令比我们之前讨论过的命令稍微复杂一点,因为它需要两个参数而不是一个。这是有意义的,因为我们不仅需要告诉 mv 我们想要移动的内容,还需要告诉它我们想要将文件移动到哪里。与 Linux 下的大多数文件命令一样,第一个参数是源,第二个参数是目的。让我们现在移动这些文件:
[pi@raspberrypi ∼]$ mv pi pifun
[pi@raspberrypi ∼]$ mv raspberry pifun
[pi@raspberrypi ∼]$ ls
Desktop pifun python_games
[pi@raspberrypi ∼]$
目前为止一切顺利。现在我们要确保我们的文件完整无缺地到达。有两种方法可以做到这一点。我们可以用“cd”进入 pifun 目录,然后运行 ls 命令,或者,我们可以简单地给 ls 我们想要查看的目录的路径。我们已经使用了第一种方法,所以让我们试试第二种方法:
[pi@raspberrypi ∼]$ ls pifun
pi raspberry
[pi@raspberrypi ∼]$
克隆的时间到了,如何使用 cp 命令
诚然,这不是很令人兴奋,但作为一名新上任的管理员,您将花费大量时间移动文件和检查东西的位置。到目前为止,你已经学会了如何移动一个文件,但是如果你只是想复制一个文件呢?当备份或选择一些文件准备发送给朋友时,您实际上想要保留原始文件。为此,我们使用“cp”命令,你可能已经猜对了,它是“copy”的缩写。让我们进入新目录,复制我们的一个文件:
[pi@raspberrypi ∼]$ cd pifun
[pi@raspberrypi pifun]$ cp pi pi2
[pi@raspberrypi pifun]$ ls
pi pi2 raspberry
[pi@raspberrypi pifun]$
这很好,我们现在有了 pi 和 pi2,正如我们所预期的。让我们再次尝试同样的事情,只是这一次,我们将复制一个目录:
[pi@raspberrypi pifun]$ mkdir moarpi
[pi@raspberrypi pifun]$ cp moarpi moarpi2
cp: ommiting directory ’moarpi’
[pi@raspberrypi pifun]$
那一次并没有完全按照计划进行。我们的复制尝试失败的原因是因为默认情况下“cp”将只复制单个文件。它不会复制整个目录。这背后的原因是,当您复制一个目录时,您复制了其中的所有内容,包括它的所有文件和目录。这可能是大量的数据,可能会占用大量的空间以及大量的时间来完成。强迫我们明确我们的意图(这将很快成为你的第二天性)意味着当我们想要复制一个文件,但不小心选择了一个目录时,我们将在任何复制发生之前被阻止。
这很好,但是如果您真的想要复制那个目录呢?当我们第一次看到 copy 命令时,我们提到了备份等任务,说实话,您更可能想要备份一个目录,而不是一系列特定的文件。我们可以通过告诉“cp”我们想要递归复制来获得我们想要的行为。这将把目录和目录中的任何内容复制到目的地。我们通过使用’-r '标志来指定这一点,如下所示:
[pi@raspberrypi pifun]$ cp -r moarpi moarpi2
[pi@raspberrypi pifun]$ ls
moarpi moarpi2 pi pi2 raspberry
[pi@raspberrypi pifun]$
与 copy 命令不同,当您移动一个目录时,不需要指定您要递归地这样做,这是因为移动一个没有内容的目录没有太大的意义。
毁灭的力量,使用 rm 命令
到目前为止,我们已经向您展示了如何创建文件和目录,以及如何复制和移动它们。现在,我们将向您展示如何使用 remove 或“rm”命令销毁这些文件。不言而喻,rm 命令是你的武器库中最危险的命令之一。如果你不小心的话,它很容易摧毁整个服务器,我们知道有人曾经不小心这样做过。
为了改变一下思路,让我们看看如何删除一个空目录。我们可以使用“rmdir”命令,这是“删除目录”的缩写。这个命令的问题是,它只会删除完全空的目录。如果里面只有一个文件,这个命令就会失败。这使得它使用起来非常安全,但并不实用,因为通常当你删除一个目录时,你还想删除它的所有内容。让我们一石二鸟:
[pi@raspberrypi pifun]$ rmdir moarpi2
[pi@raspberrypi pifun]$ rm moarpi
rm: cannot remove ’moarpi’: Is a directory
[pi@raspberrypi pifun]$
我们能够用’ rmdir ‘删除 moarpi2,因为目录本身是空的,但是当我们尝试使用 rm 命令时,它拒绝合作。这是因为 rm 命令是按照与 copy 命令相似的推理编写的。由于删除一个目录比简单地复制它要危险得多,这可能是一件好事。我们可以使用相同的’-r '标志来告诉 rm 递归删除:
[pi@raspberrypi pifun]$ rm -r moarpi
[pi@raspberrypi pifun]$
成功!现在,有时当您尝试这样做时,尤其是在有许多文件和子目录的大型目录上,您可能会遇到许多问题,导致 rm 放弃。例如,某些文件可能是写保护的。您可以通过使用’-f '标志来抑制这些错误。这意味着“力量”,类似于说“该死的鱼雷!全速前进!”。这听起来是个好主意,直到你停下来想想如果你运行这个命令会发生什么(你永远不应该这样做):
[pi@raspberrypi pifun]$ rm -rf /
如果您不小心运行了该命令,rm 将会删除您系统上的所有内容。如果你碰巧有一个 USB 硬盘,或者你已经安装了一些网络共享,那么你就真的有麻烦了,因为 rm 不会把自己限制在你的内部磁盘上——它会在整个树中爬行,删除它身后的所有东西。这就是为什么你应该在日常工作中使用普通用户帐号的原因之一。您自己的用户没有足够的权限删除任何对系统至关重要的内容,但即使这样,您仍然有可能损坏所有附加的介质。无论何时使用 rm 命令,您都需要非常非常小心,并且您最好反复检查它,因为 Linux 会假设您知道您在做什么,并且它不会要求确认!
“rm”命令还可以通过提供文件的路径来删除文件。对于此操作,您不需要使用’-r '标志,因此您可以简单地执行以下操作:
[pi@raspberrypi pifun]$ rm pi2
[pi@raspberrypi pifun]$ ls
pi raspberry
[pi@raspberrypi pifun]$
简而言之,这就是你如何移动和操作文件系统。
完全限定路径和相对路径
在 Linux 中,有两种方式来指定路径。您可以给出以正斜杠开头的完全限定路径,也可以给出以文件名、目录名、一个点或两个点开头的相对路径。虽然这听起来很奇怪,但它们都是为程序提供特定位置的方法。
当路径从固定的参考点(即根目录)开始时,它被认为是完全限定的。无论您在系统的哪个位置,完全限定路径总是指向同一个位置。这就像镇中心的旧钟楼,如果你以此为参考点给任何人指路,你和你的朋友就有了一个共同的支点,知道如何到达。
另一方面,相对路径取决于你当前的位置。您可以指定路径,使用./
表示当前目录,或者使用../
表示下一个目录。如果你有一个看起来像../../test.txt
的路径,这将只能从几个特定的位置工作。它又好又短,而且容易打字。可以使用/home/pi/test.txt 访问同一个文件。与相对路径不同,这个文件可以在文件系统的任何地方使用,不会有任何问题。
那么什么时候应该使用其中的一种呢?答案是,您应该使用最方便或对任务最有意义的选项。有时使用完全限定路径会更快或更容易。其他时候,您被深深地埋在树中,编写完全限定的路径在最好的情况下是乏味的,在最坏的情况下是完全混乱的。
用户和组
我们在这里只涉及用户和组的基础知识,这样你就有足够的知识来理解接下来的文件权限部分。用户和组是 Linux 保护您的文件的关键,在我们进入下一节之前,您需要了解它们。
在 Unix 的思维方式中,每个人都有自己的用户名。用户名标识特定系统上的特定个人或实体(例如,web 服务器可能有自己的用户名)。到目前为止,我们大部分时间都是作为“pi”用户,但我们也看到了我们可以成为“root”用户。您的用户名是 Linux 用来识别您身份的密钥。
团体也是同样的简单明了。每个用户属于一个主要组,但实际上可能是系统中任意多个组的成员。在大学系统中,一个学生的用户名可能有自己的私有组(目前在 Red Hat 和 Debian 系统中的标准做法),但是他们也可能属于一个学生组和一个研究组。他们也可能属于特定于他们部门的组。组对我们管理员来说很有用,因为我们可以将一组用户组合在一起,并将他们视为一个实体。这使得诸如文件权限之类的事情更容易管理。
当您在 Pi 上创建新用户时,您将自动创建一个同名的组。在某些系统中,用户会默认加入一个用户组——但是正如您将在下一节中看到的,这可能会导致意外地授予用户访问他们不应该拥有的文件的权限。因为根据定义,私有组是私有的,没有其他人会是成员,所以没有人可以访问你的文件,只是因为他们碰巧和你在同一个组。这就是为什么在现代系统中,您通常会看到文件的所有者和组恰好是相同的。
我们将在 BASH 的第八章中更深入地讨论用户和组。
文件权限
文件权限允许您表达您希望谁能够访问您的文件,以及他们可以对这些文件做什么。您可以设置三种不同的权限。第一个是是否有人可以阅读你的文件。第二个是他们是否可以写入你的文件,第三个是他们是否可以执行它(例如,像运行应用程序一样运行它)。
当然,仅仅能够在文件上设置这些权限并不是特别灵活。您可能希望只允许某一组人访问,而限制其他所有人。这就是用户和组发挥作用的地方。在 Linux 上,一个给定的用户实际上有三种角色。第一个是用户,指的是文件的所有者。第二个是 group,指的是拥有该文件的组。最后一个在技术上被称为世界,但它也经常被称为其他。
每个角色都有自己的权限组合,也就是说,您可以定义这三个角色中的任何一个是否可以读取、写入或执行您的文件。我们将向您展示如何做到这一点,但在此之前,我们需要向您展示如何查看哪些权限实际上是有效的,因此现在是向您展示如何对’ ls ‘命令使用’-lh '选项的好时机。让我们现在试着运行它:
[pi@raspberrypi pifun]$ ls -lh
-rw-r˗˗r˗˗ 1 pi pi 0 Oct 7 16:29 pi
-rw-r˗˗r˗˗ 1 pi pi 0 Oct 7 16:58 pi2
-rw-r˗˗r˗˗ 1 pi pi 0 Oct 7 16:29 raspberry
[pi@raspberrypi pifun]$
'-lh '参数指定我们希望 ls 向我们显示一个文件列表(-l),并且我们希望文件大小是人类可读的格式(-h)。如果没有人类可读标志,ls 将以字节为单位向我们显示所有大小,当您处理大文件时,这不是很容易阅读。在这个例子中这并不重要,因为我们的文件是空的。
就文件权限而言,我们真正感兴趣的有两件事。第一个描述了当前生效的权限,第二个显示了哪个用户和组拥有该文件。让我们来分析一下树莓文件:
-rw-r˗˗r˗˗ 1 pi pi 0 Oct 7 16:29 raspberry
文件权限部分是:
-rw-r˗˗r˗˗
列表中有 10 个可能插槽,现在,我们只对前 9 个感兴趣。如果缺少特定的权限(或者在第一个连字符是普通文件的情况下),ls 将显示一个连字符。普通文件总是在第一个槽中有一个连字符。如果它引用一个目录,第一个槽将是一个“d ”,以强调它不是一个文件。如果文件是一个链接(或快捷方式),这个槽也可以是一个“l ”,我们将在下一节向您展示如何使用它们。不过现在我们可以忽略第一个槽,而专注于最后九个槽。
剩下的九个位置三个一组,这样我们就有三组。这些分别对应于用户、组和世界角色。每个组中的三个槽分别代表一个特定的权限,读、写和执行。在设置了权限的地方,您会看到一个字母,但是在没有设置权限的地方,您会看到连字符。如果我们的 raspberry 文件设置了所有权限,它将如下所示:
-rwxrwxrwx
让我们把它分开一点,这样更容易阅读:
- rwx rwx rwx
因此,如果我们看一下前三个,我们可以看到所有者拥有读、写和执行权限。我们还可以看到,group 和 world 也拥有完全权限。为了解释这些权限的含义,我们确实需要知道谁真正拥有该文件。让我们看一下显示谁拥有该文件的那一行:
pi pi
嗯,那并不太痛苦。请记住,在现代的 Linux 机器上,用户有自己的私有组,这些组以用户的名字命名。这就是我们在这里看到的。第一个“pi”指的是所有者,当然也就是 pi 用户。默认情况下,创建文件时,组所有权设置为用户的默认组。在这种情况下,这将是我们的私有组,也称为“pi”。因此,如果我们查看原始文件条目:
-rw-r˗˗r˗˗ 1 pi pi 0 Oct 7 16:29 raspberry
我们可以理解为“pi 用户拥有读写权限。该组具有读取权限,而 world 也具有读取权限”。Linux 根据您的身份以特定的顺序应用这些权限。如果您的用户名与文件的所有者匹配,那么当您尝试访问该文件时,将应用用户权限。如果您不是所有者,但是您和文件在同一个组中,那么 Linux 会将组权限应用于您。如果您既不是所有者也不在同一个组中,Linux 将应用来自 world 角色的权限。在我们的例子中,world 和 group 的权限是相同的,所以如果您不是所有者,您将获得相同级别的访问权限。然而,只有所有者才能实际保存对文件的更改。然而,这个规则有一个例外——根用户。root 用户实际上不受文件权限的影响,可以更改系统上任何文件的权限和文件所有权,而不管所有者是谁。
“执行”权限允许您将文件作为程序执行。这是一项安全功能,因此您可以有效地阻止人们执行您不希望他们执行的命令。然而,你必须小心,因为如果一个用户可以读取你的文件,没有什么可以阻止他们复制到他们自己的文件,并使该文件可执行。对于目录,execute 位还有另一个用途。很明显,你不能执行一个目录,所以这个标志意味着用户(或者组或者世界)被允许浏览这个目录,也就是说,他们可以在这个目录上做一个“ls”。他们可能无法访问目录中的任何内容,但他们仍然可以拥有一个峰值,并查看其中隐藏的内容。如果您授予用户读取目录但不执行目录的权限,他们将能够读取目录中的文件,但不能浏览目录,他们必须事先知道文件名。
这就是事情的全部。有一个叫做“扩展文件属性”的特性,但是我们不打算在本书中讨论。它们比标准模型提供了更大的灵活性,但同样也更复杂。如果你习惯了 Windows 处理权限的方式,那么你会发现扩展文件属性更符合你的习惯。
设置文件权限
首先,我们将看看如何设置文件权限,为此,表 4-1 将非常有帮助。
表 4-1。
Setting Permissions
| 作用 | 如何申请 | 申请什么 | | --- | --- | --- | | u -用户 g -组 o -其他/世界 a -所有 | + - add - - remove = -明确设置 | r -读 w -写 x -执行 |我们将使用更改文件权限的 chmod 命令。您可以将权限指定为上述值的组合。这些可以以三种不同的方式结合起来。您可以添加权限、取消权限和显式设置权限。不同之处在于,前两者在完成他们的工作后,将保持所有其他权限不变。如果显式设置权限,任何未指定的权限都将被撤销。
让我们从删除每个人对 pi 文件的所有权限开始:
[pi@raspberrypi pifun]$ chmod a= pi
[pi@raspberrypi pifun]$ ls -lh
˗˗˗˗˗˗˗˗˗˗ 1 pi pi 0 Oct 8 03:52 pi
[pi@raspberrypi pifun]$
我们可以看到所有文件权限都已从文件中删除,但是该命令实际上是如何工作的呢?井权限由三部分指定。您希望将变更应用于谁,您希望如何应用变更,以及您希望变更是什么。在这种情况下,我们将更改应用于“a ”,这基本上是“ugo”的简写,即它将更改应用于每个人。我们使用了等号,这意味着我们希望显式地设置权限,但实际上我们没有提供任何权限。如果一个权限不存在,它就被认为没有被设置,因此在我们的例子中,通过不提供任何权限,我们有效地撤销了所有的权限,而不管它们以前是什么。
鉴于这是我们的文件,我们想给自己完全的权限。诚然,执行位在这种情况下用处不大(但是当你开始编写脚本时,你会发现它的价值不可估量——见第八章),但是无论如何我们还是要把它给自己。我们可以用这个命令来实现:
[pi@raspberrypi pifun]$ chmod u+rwx pi
[pi@raspberrypi pifun]$ ls -lh
-rwx˗˗˗˗˗˗ 1 pi pi 0 Oct 8 03:52 pi
[pi@raspberrypi pifun]$
让我们把这个命令拆开。我们指定我们只想要更改用户的权限,我们想要添加它们(在这种情况下这并不重要,因为我们已经事先删除了所有权限,所以等号可以完成相同的工作),我们想要读、写和执行权限。为了总结这个示例,让我们恢复对组和世界角色的读取权限:
[pi@raspberrypi pifun]$ chmod go+r pi
[pi@raspberrypi pifun]$ ls -lh
-rwxr˗˗r˗˗ 1 pi pi 0 Oct 8 03:52 pi
[pi@raspberrypi pifun]$
为了完整起见,让我们看一下最后一个例子。我们希望将权限应用于组和其他角色,我们希望将权限添加到已经存在的内容中,并且我们希望授予读取权限。这就是设置文件权限的大部分内容。还有一种替代样式,它使用数字而不是字母来指定您想要设置的权限。为了获得与我们已经获得的效果相同的效果(即没有任何效果),我们将使用:
[pi@raspberrypi pifun]$ chmod 744 pi
[pi@raspberrypi pifun]$ ls -lh
-rwxr˗˗r˗˗ 1 pi pi 0 Oct 8 03:52 pi
[pi@raspberrypi pifun]$
在这个系统中,每个权限都有自己的值。读取是 4,写入是 2,执行是 1。要设置权限,您需要将这些数字相加得到总数。例如,要设置所有权限,您需要将 4、2 和 1 相加得到 7。对于 read,你可以简单地做 4+0+0,当然得到 4。把它们放在一起,我们得到 744。该语法是大多数 Unix 系统上使用的原始语法。使用字母是一个相对较新的想法,但在一天结束时,他们都达到了相同的结果。新语法的主要好处是更清晰,更容易理解。就个人而言,我们倾向于使用数字风格,但那只是因为我们已经这样做了很长时间,它已经成为我们的第二天性。你可以随意使用你觉得最舒服的系统。
所以现在你可以像大师一样操作权限,但是我们仍然缺少第二部分,我们没有告诉你如何改变文件的所有权。这实际上比你想象的要少得多,远没有调整偶尔的文件权限那么常见。还有一个小问题。普通用户(除了 root 之外的任何人)实际上不能更改哪个用户拥有该文件。这样做的原因是,如果您不小心将该文件分配给了另一个用户,您就没有办法再取回该文件。当然,根用户可以改变系统中任何文件的所有权。
我们可以用 sudo 来模拟“根性”。如前所述,这个小命令充当某种过滤器。无论谁执行它,它总是以 root 用户身份运行,并代表他们以 root 用户身份执行命令。为了防止任何恶作剧,sudo 将根据批准的列表检查用户和他们试图运行的命令。如果您在这个列表中(pi 用户也是),您就可以执行各种各样的魔法,而无需在技术上成为 root 用户。
要使用 sudo,我们所要做的就是在命令前面加上“sudo”命令。差不多就是这样。当你第一次运行 sudo 时,它会要求你输入密码。这是您的特定用户的密码,而不是根用户的密码。目的是您可以证明您是 pi 用户,然后 sudo 将检查 pi 用户被允许做什么。这意味着,如果你的电脑上有很多用户,你想让他们执行一些更强大的命令,但不想给他们 root 访问权限,你可以设置 sudo,让他们执行特定的命令,而不必交出大厦的钥匙。
让我们首先尝试使用“chown”(或更改所有权)命令将文件交给 root 用户:
[pi@raspberrypi pifun]$ chown root pi
chown: changing ownership of ’pi’: Operation not permitted
[pi@raspberrypi pifun]$
不允许的操作是 Linux 告诉我们滚蛋的方式。要实现这一点,我们需要 root 权限,所以让 sudo 为我们工作,并再次运行命令:
[pi@raspberrypi pifun]$ sudo chown root pi
[pi@raspberrypi pifun]$ ls -lh
-rwxr˗˗r˗˗ 1 root pi 0 Oct 8 03:52 pi
[pi@raspberrypi pifun]$
成功!我们能够将所有者更改为根用户。这将适用于任何有效用户和任何您希望更改的文件或目录。还有另一个名为“chgrp”的命令,它允许您更改哪个组拥有某个特定文件,您对此不会感到惊讶。现在这个命令也有一点问题。虽然普通用户可以更改群组,但他们只能更改他们所属的群组。如果您的用户只是其私有组的成员,那么您也不能用这个命令做太多事情。
又一次是鲁特和须藤来营救了。由于 root 可以为所欲为,因此可以相应地更改组。碰巧的是,它看起来非常像我们的最后一个命令:
[pi@raspberrypi pifun]$ sudo chgrp root pi
[pi@raspberrypi pifun]$ ls -lh
-rwxr˗˗r˗˗ 1 root root 0 Oct 8 03:52 pi
[pi@raspberrypi pifun]$
就这样——文件现在属于根组和根用户。当您必须更改文件所有权时,更常见的情况是需要更改拥有该文件的用户和组。只更改组的情况相对较少(我们不记得上次使用 chgrp 命令是什么时候了)。chown 命令提供了一个快捷方式,允许我们同时设置新的所有者和新的组。现在让我们使用这个快捷方式将文件的所有权返回给我们的 pi 用户。当然,我们仍然需要使用 sudo:
[pi@raspberrypi pifun]$ sudo chown pi:pi pi
[pi@raspberrypi pifun]$ ls -lh
-rwxr˗˗r˗˗ 1 pi pi 0 Oct 8 03:52 pi
[pi@raspberrypi pifun]$
使用快捷方式,您只需指定用冒号分隔的用户和组。关于这些命令,我们需要注意的最后一点是,它们只对您提供的文件进行操作。如果您提供一个目录而不是一个文件,它将设置目录的权限,但这些更改不会过滤到所有文件。有时这是您想要的,但是更多的时候您想要传播更改。与使用-r 的 cp 和 rm 命令不同,这两个命令使用-R,(也就是说,它们使用大写字母而不是小写字母)。使用时要小心,因为通常文件权限是精确设置的,如果你在新版本中轻易地删除了它们,就没有办法挽回损失。像往常一样,在你按下回车键之前要仔细检查你输入的内容。
快捷方式和链接
Linux 允许使用 ln 命令(link 的缩写)创建链接(或快捷方式)。有两种链接,一种叫做硬链接,一种叫做软链接。软链接更像是使用“创建快捷方式”功能后在 Windows 系统上看到的内容。它创建一个文件,这个文件只是一个指向文件在磁盘上的真实位置的指针。然而,硬链接更有趣。当你使用一个硬链接时,你实际上为同一个文件创建了两个名字。这听起来像是语义,大多数现代应用程序都能够遵循软链接,很少需要使用硬链接。硬链接也仅限于单个文件系统,并且该文件系统必须支持它们(大多数 Linux 文件系统都支持)。硬链接的主要好处是硬链接与原始文件完全无法区分,它们只是指向同一位置的两个名称。为了避免混淆并允许链接跨文件系统工作,您应该使用软链接。
让我们做一个简单的例子来展示这一点:
[pi@raspberrypi pifun]$ ln pi pi1
[pi@raspberrypi pifun]$ ln -s pi pi2
[pi@raspberrypi pifun]$ ls -lh
-rw-rw-r˗˗ 2 miggyx miggyx 0 Oct 8 08:14 pi
-rw-rw-r˗˗ 2 miggyx miggyx 0 Oct 8 08:14 pi1
lrwxrwxrwx 1 miggyx miggyx 3 Oct 8 08:33 pi2 -> pi
[pi@raspberrypi pifun]$
让我们看看这里有什么。pi 和 pi1 在各方面都是相同的,但这并不奇怪,因为除了名字之外,它们是同一个文件。您会注意到,pi 和 pi1 的文件权限块后面的数字现在显示为“2”。这告诉我们,当前有两个文件名指向这个特定的文件。也没什么好惊讶的,因为是我们创建了第二个条目。更有趣的是我们用软链接创建的 pi2。首先,我们可以看到文件权限已经全部设置完毕。这不是问题,因为当 Linux 通过软链接访问真实文件时,真实文件的权限将用于定义谁可以访问该文件。软链接实际上只是指出了位置。我们还可以看到文件名本身有点不同。它显示了我们最初给软链接的文件名,但也显示了软链接指向的文件。在这种情况下,文件碰巧在同一个目录中,但它也可能在系统中的任何地方。
这就是创建链接的全部内容。当您想让一个目录或文件看起来位于新位置时,它们会很有用。例如,一个程序可能会写入一个数据目录,而您希望将该目录移动到一个更大的磁盘上。没问题,你可以把它移到更大的磁盘上,然后创建一个同名的软链接。应用程序可能甚至不会注意到。这真的可以帮你省去很多麻烦,尤其是当时间非常宝贵的时候(老实说,什么时候不是呢?).
摘要
这一章已经给了你关于文件系统的内幕消息。我们已经查看了历史,并展示了为什么我们的文件系统看起来是这样的。然后,我们讨论了它们是如何结合在一起的,以及 Linux 文件系统本身是如何构造的。然后我们继续很好地利用它,让你快速掌握创建、复制、移动和删除文件的所有基础知识。
然后,我们研究了文件权限以及它们是如何实施的,以及我们如何设置它们来满足我们的需求。我们还研究了更传统的设置文件权限的方法,如果你曾经遇到过的话。然后,我们向您展示了 Linux 如何应用这些权限,以及如何更改拥有特定文件的用户和组。然后,我们讨论了如何创建链接,以及软链接和硬链接之间的区别,从而圆满地完成了所有内容。
在下一章中,我们将向您展示您可以在 Pi 上找到的所有最常见的命令。这些命令将成为你经常使用的工具箱的一部分。事实上,我们在日常工作中使用所有这些命令。所以,向前看第五章!
五、基本命令
现在您已经有了这个不可思议的新的 Raspberry Pi,您已经安装并配置它来接受和运行一个版本的 Raspbian Linux。您已经登录,可以在系统中自由移动。你可以在你的 Pi 上做基础,但是现在觉得你已经准备好承担更多了。
这就是本章的目的:教你一整套命令,这样你就可以成为一个 Linux 用户。这些命令将涵盖一系列功能,从成为超级用户、检查磁盘空间、终止进程,到配置用户空间和监控环境变量。所有这些任务对于系统管理员来说都是常见的,并且会对系统的运行方式产生很大的影响。所以事不宜迟,我们开始吧。
成为老板
“根”是一个描述树的基部的词,其余的都是从基部生长出来的。在 Linux 和 UNIX 中,这个术语用来表示文件系统的起始点(正如我们在第四章中看到的那样)和表示系统上的主管理用户(在第三章的中有简要介绍)。要执行任何系统或管理功能,您需要被识别为 root 用户,以便拥有更改核心功能的权限。因此,root 是一把双刃剑:改变系统的无限权力和破坏系统功能的无限权力。关于在 Linux 环境中工作,我能说的最真实的事情之一就是,最终你会以 root 用户的身份发出一个命令,这个命令会破坏某些东西(如果不是所有东西的话),这会给你带来无穷无尽的麻烦,甚至可能需要你重新安装操作系统。由于这个原因(以及相关的安全原因),建议用户永远不要以 root 用户的身份登录到 shell。
为了解决这个问题,我们使用了sudo
,我们在第三章和第四章中已经看到了一点。如您所知,这个工具是您能想到的任何 shell 命令的包装器。这意味着,如果您在命令前面加上sudo (
,例如sudo ls)
,您将不再作为自己的用户执行该命令,而是作为超级用户。这确实使超级用户的工作稍微复杂了一些,但是风险也小了很多。事实上,许多 Linux 发行版不再设置 root 密码,而是在创建时赋予新用户sudo
的权力。这意味着所有的管理必须通过一个拥有sudo
命令的授权用户来完成,以发布所有必需的管理功能。
为了让您能够以 root 用户身份执行,sudo
会要求您输入用户密码,以验证您是否就是您所说的那个人,而不仅仅是一个拥有访问权限却忘了拿键盘的人。除了要求所有用户输入密码,sudo
还有一个控制文件,控制哪些用户和组可以访问sudo
命令,甚至可以限制他们可以通过sudo
执行哪些程序。有一个特殊的命令visudo
,用于编辑这个导向文件(称为 sudoers 文件),该文件必须以 root 身份运行(所以前缀为sudo
):
$ sudo visudo
这段代码启动了一个系统文本编辑器(通常是vi
或nano
)的特殊实例,其中已经加载了 sudoers 文件进行编辑。要快速浏览如何使用vi
和nano
,请查看第六章。
在 sudoers 文件中有许多控制sudo
环境如何工作的东西,包括一个PATH
变量(我们将在后面介绍)。然而,重要的是userauth
部分下面的一行,如下所示:
root ALL=(ALL:ALL) ALL
这一行表示所有主机上的 root 用户可以访问所有其他主机上的所有命令(主机是网络上的服务器)。这有点令人困惑,但它基本上向任何可以将自己标识为 root 的用户授予完全访问权限。还有另一句台词:
%sudo ALL=(ALL:ALL) ALL
这一行表示sudo
组的成员也可以做与根用户相同的事情:从网络上的所有主机访问可以在网络上的所有主机上执行的所有命令。您会注意到前导的%
用于表示这是一个组名。其中一行的基本格式如下:
<user> <From which hosts>=(<On which hosts>:<which commands>) < command options and commands >
这个语法一开始有点混乱,所以让我们看一下为您的pi
用户创建一组特定的权限作为例子。首先,我们需要创建一个新的基本用户权限集,它看起来就像根用户一样,但是它指的是我们的pi
用户。这一行看起来像:
pi ALL=ALL ALL
我已经删除了<on which hosts: which commands>
部分,用一个通用的ALL
代替它,使事情更容易理解。现在让我们假设我们不希望pi
用户被要求输入密码。为此,我们在代表命令的最后一个ALL
前添加了一个NOPASSWD:
。这给了我们一条新的线索:
pi ALL=ALL NOPASSWD: ALL
如果您现在添加这个,您可以作为pi
用户运行所有命令,甚至不需要提供密码。这是一个非常危险的命令,所以让我们稍微修改一下,使它成为唯一可以执行的visudo
命令。为此,我们将命令的最后一个ALL
替换为我们希望使用的命令,在本例中是visudo
。但是我们不能只写visudo
,我们需要提供应用的完整路径,也就是/usr/sbin/visudo
。因此我们得到以下结果:
pi ALL=ALL NOPASSWD: /usr/sbin/visudo
现在您应该知道在 sudoers 文件中可以做些什么来控制如何访问sudo
命令了。您可以有多个条目来控制这些命令如何运行、由谁运行以及在什么条件下运行。还有大量添加别名的功能,可以是命令、主机或用户的大量组合。这些命令的大部分语法可以从 sudoers 手册中获得。
最后,您需要注意的最后一个命令是su
命令,它是 switch user 的缩写。这个命令完全按照它的意思来切换您是哪个用户,如果您不是 root 用户,它会提示您输入希望切换到的用户的密码。获得根用户权限的最有效的欺骗手段之一是结合sudo
和su
来切换到根用户,只使用当前用户的密码而不是根用户的密码。这个命令是许多人绕过许多 Linux 发行版设置的“不知道根密码”限制的方法:
$ sudo su –
减号表示您希望获得对环境的登录,因为没有提供其他参数,所以它将尝试以超级用户的身份登录。您还可以通过在减号前添加给定用户的用户名来切换用户。您还可以使用带有–i
选项的sudo
命令来获得一个交互式 shell,它将实现同样的功能:
$ sudo –i
阅读各类手册
我最喜欢的来自技术世界的一句话是 RTFM,它是阅读燃烧手册的缩写。虽然我发现向别人寻求帮助是好的,但知道有一本手册可以阅读总是令人欣慰的,Linux 也不例外。大多数应用程序都有一个手动文档,可以通过使用man
命令来访问!这个命令将您希望获得的手册页作为它的第一个参数。因此,如果您想查看sudoers
命令的手册页,以便更好地了解如何编写 sudoers 文件,您可以键入:
$ man sudoers
然后手册页就会出现。导航手册页的方式与导航用less
打开的文档的方式相同(这是一个我们将在本章中进一步介绍的命令),所以导航是用箭头和 page up 和 page down 键来完成的。您也可以通过按下/
来搜索字符串,然后输入您想要搜索的内容。n
键将帮助你浏览文件。因此,如果您发现自己需要更多关于命令的信息,请记得阅读 Flaming Man 页面!
系统资源监控
系统管理员需要做的一件重要事情是监控系统上的资源使用情况。虽然这些命令中的一些对您的普通 Pi 用户来说用处不大,但是有些时候能够看到您的系统正在做什么将会派上用场。
需要注意的第一个系统命令是top
,这是一个用于显示系统中资源的当前使用情况以及显示哪些进程正在消耗什么级别的资源的命令。top
命令非常强大,可以显示关于系统资源使用情况的大量信息。top
的输出通常如图 5-1 所示。
图 5-1。
Top in action!
top
命令的输出是巨大的,如果你仔细观察,所有的值都会定期更新。让我们一行一行地检查一下top
的输出,这样你就能明白你在看什么了。
正常运行时间和平均负载
第一行给出了当前时间和系统正常运行时间的信息。然后显示系统上的用户数量,最后显示平均负载。负载平均是最难理解的事情之一;它是一个“元”变量,因为它指的是相对于系统的执行能力,系统内部正在发生什么。它包含 3 个值,给出当前分钟、过去 5 分钟和过去 15 分钟的平均值。平均负载代表实际计算使用和系统计算资源需求的平均值。
我所听到的认为平均负载的最好方式可能是高速公路。通常,CPU 使用率的百分比值表示当前可用计算资源的使用量。这类似于测量高速公路上目前的交通流量。平均负载比较正在使用的计算量和对 CPU 使用量的需求。这就像同时检查高速公路和它的匝道。当从“繁忙的午餐时间”的角度来看时,这两者之间的区别就来了,这意味着高速公路上有很多车,但正因为“这是一个繁忙的午餐时间”,每个人都可以上高速公路并使用它,没有人被困在匝道上等着,交通顺畅。
这就是为什么平均负载是如此强大的指标;它允许您实时查看对系统计算能力的需求,以便您可以看到需求何时开始激增,从而采取措施降低需求。
哇,一行就这么多!
任务
top
输出的第二行列出了系统当前正在执行的任务:
- 进程的总数
- 正在运行的进程的数量
- 在后台休眠的进程的数量
- 停止的进程数
- 僵尸进程的数量
这些过程中的大部分都是为了了解系统中正在发生的事情。但是僵尸进程可能是一个真正的问题。这些进程是已经完成执行,但仍然驻留在系统内存中的进程——通常是因为它们需要向产生它们的进程发送返回值,但还没有这样做,因此必须像活死人一样在那里等待,然后才能发送最后的消息并前往来世。
有一个长时间运行的僵尸进程可能表明用于产生它的应用程序(称为它的父进程)有问题。如果您在系统中看到僵尸进程,请查看是哪个进程产生了它们,并检查其运行状态和日志文件(日志文件是从写入磁盘的应用程序中输出的,因此您作为系统管理员可以看到它们在做什么),因为这可能表明存在更大的问题。
CPU 利用率百分比
top
命令的第三行是 CPU 利用率百分比值。这以百分比的形式显示了当前有多少计算资源分配给了系统的哪个域。这些值如下:
us
(用于用户应用)sy
(用于系统应用)ni
(对于已经被“改善”以便给予它们或多或少的 CPU 优先级的进程)id
(代表空闲)wa
(对于等待 I/O 完成的进程)hi
(用于等待硬件中断的进程)si
(用于等待软件中断的进程)st
(表示被虚拟机管理程序窃取的时间——虚拟机管理程序是运行 Xen 或 VMWare ESX 等虚拟化平台的软件)
在这些值中,通常分配给它的计算资源最多的是id
,它表示可以在其他地方使用的空闲可用计算。看到wa
、hi
、si
或st
的高值绝不是好迹象,因为它们表明您的系统正在等待某个特定的硬件或另一个函数完成处理。如果这些数字居高不下,您应该调查是哪些进程导致了它们,并查看是否有任何硬件问题。
内存使用
第 4 行和第 5 行代表系统的内存使用情况。第 4 行是实际的内存使用情况,第 5 行是交换空间使用情况。这两行将显示给定空间中的总内存、已用内存和空闲内存。这个最终值表示缓冲区和缓存的值。这两者是相互关联的,也是不熟悉 Linux 的用户非常担心的原因。这与 RAM 的分配方式有关。Linux 有时会占用所有可用的 RAM,并将其放入一个缓冲区,这意味着它被缓冲区占用,但以后仍可用于您的应用程序。Linux 会将这个 RAM 视为正在使用,但它只是坐在缓冲区中等待。buffers 值可能有点难以理解;这将导致另一个命令显示这些资源是如何使用的(我将在接下来介绍)。
过程表
在第五行之后是一个包含进程表的大部分,该表列出了所有正在运行的进程,并且在近乎实时的更新中,列出了哪些进程消耗了多少资源。下面显示了许多不同的列以及它们所代表的信息:
- PID:进程的 ID 号
- 用户:拥有流程的用户
- PR:流程的优先级
- 倪:这个过程值了
- VIRT:进程消耗的虚拟内存量
- RES:实际驻留虚拟内存的大小
- SHR:进程正在使用的共享内存量
- s:进程状态(例如,睡眠、运行、僵停)
- %CPU:消耗的 CPU 的百分比
- %MEM:消耗的内存百分比
- TIME+:任务自启动以来使用的总 CPU 时间
- 命令:命令的实际名称
top
也有许多按键动作,可以控制这些进程的显示顺序;您可以在top
的手册页中查看它们。
因此,top
是一个显示系统资源使用情况的极好的命令,也是深入了解系统本身正在做什么的最佳工具之一。
使用 free 查看内存分配
如前所述,有一种比使用top
更简单的方法来查看您的内存分配情况。执行此操作的命令是free
命令,您可以使用希望显示的单位调用该命令(–k
表示千字节,-m
表示兆字节,-g
表示千兆字节,等等)。为了我们的目的。兆字节是最好的,所以调用它如下:
$ free –m
您的输出应该如图 5-2 所示。
图 5-2。
Free as in free
由此,您可以看到改变used
和free
值的+/- buffers and cache
线。这是一个很好的方式来询问任何时候你的系统显示高达 100%的内存峰值,因为它可能只是大量的缓冲区和缓存在运行。从这两个实用程序中,您应该能够准确地了解系统中正在发生什么,以及它的资源是如何被使用的。
磁盘使用情况
既然我们已经了解了 CPU 和 RAM 的使用情况,它们是相当动态的,那么是时候了解一些更静态的东西了,即磁盘利用率。在大多数操作系统中,您可以快速方便地查看有多少可用存储空间正在使用,Linux 也不例外。显示整个系统磁盘当前使用情况的命令是df
,它是 disk free 的缩写,可以在命令行上使用,不带参数,以显示您需要的所有内容。如果这样做,您的输出将类似于图 5-3 。
图 5-3。
Disk free, ouch!
图 5-3 显示磁盘空闲,并显示安装在/
上的主rootfs
基本上 100%满——哎哟。您可以看到系统正在使用的 1 k 数据块的数量,但是这些值并不是很明显。您还会注意到在顶部有一个权限被拒绝的错误。
幸运的是,这两个问题都有解决方案。首先是用sudo
运行这个命令,这样它就可以以 root 用户身份访问整个系统。第二个是添加了–h
参数。这个论点是相当普遍的:要么是–h
求助,要么是–h
人类,也就是说人类可读的单元。所以我们运行这个命令:
$ sudo df -h
输出应该更容易被普通人理解(见图 5-4 )。
图 5-4。
df for humans
正如您所看到的,人类可读标志已经将那些Size
和Used
值改为人类可读的数字,在表示单元的末尾有一个漂亮的小标志。试验显示标志是帮助您理解来自 Linux 命令的一些复杂数据的好方法。通常情况下,您会在手册页中找到一个很大的部分,详细介绍了一个命令的所有标志。
我们已经看到了系统的全部磁盘利用率,但是假设我们想要找到一个文件夹中所有文件的详细利用率。我们可以使用另一个命令来做到这一点:du
,它是 disk usage 的缩写,用于总结每个文件的磁盘使用情况,递归地表示目录。如果您运行du
,它会告诉您这个文件夹中每个文件的估计使用量,以及每个子文件夹和其中每个项目及其子文件夹的估计使用量,等等。du
也将利用–h
获得曾经在df
的人类旗帜。因此,如果我们运行它,我们会得到如下输出:
$ du –h
4.0K ./.cache/dconf
12K ./.cache/menus
576K ./.cache/midori/web
4.0K ./.cache/midori/thumbnails
24K ./.cache/midori/icons
608K ./.cache/midori
4.0K ./.cache/openbox/sessions
12K ./.cache/openbox
640K ./.cache
12K ./.dbus/session-bus
16K ./.dbus
5.0M ./.tor
12K ./.ssh
1.8M ./python_games
8.0K ./.dillo
20K ./.vnc
4.0K ./.gvfs
124K ./.gnupg
8.0K ./.fltk/fltk.org
12K ./.fltk
48K ./Desktop
8.0K ./.config/lxpanel/LXDE/panels
16K ./.config/lxpanel/LXDE
20K ./.config/lxpanel
8.0K ./.config/pcmanfm/LXDE
12K ./.config/pcmanfm
8.0K ./.config/lxterminal
28K ./.config/midori
4.0K ./.config/enchant
28K ./.config/openbox
104K ./.config
76K ./.fontconfig
16K ./.netsurf
40K ./.local/share/gvfs-metadata
36K ./.local/share/webkit/icondatabase
40K ./.local/share/webkit
88K ./.local/share
92K ./.local
9.0M .
哇,对于这样一个简单的命令来说,这是一个很大的输出。它显示当前文件夹中每个文件夹的使用情况,并在底部显示总使用情况。这里我们可以利用另一个标志来缩短输出:代表 summary 的–s
标志。这样做只会打印该目录及其所有内容的总分配,而不是我们刚刚看到的所有内容。所以继续执行命令;您的输出应该看起来更加整洁:
$ du -sh
9.0M .
那好多了。您会注意到输出使用了.
值来表示当前目录,因为如果没有被告知去其他地方看的话,du
将在当前工作目录上工作。您可以通过在末尾添加一个目录来指定要使用的目录。下一个示例将查看保存所有系统日志的/var/log
,因此我们需要使用sudo
作为 root 运行该命令,因为其中一些日志文件受到保护:
$ sudo du -sh /var/log
9.8M /var/log
这就是了!使用这两个实用程序,您可以找出系统当前的磁盘使用情况,甚至可以计算出系统的哪些部分占用了最多的空间。
管理流程
在 Linux 环境中工作时,最重要的任务之一可能是知道如何管理正在运行的进程。毕竟,计算机只是一个处理系统,如果你不能管理它正在处理的东西,你怎么能真正好地利用你的机器呢?您应该知道的第一个命令是ps
命令。ps
命令是进程快照的缩写,可用于列出您的用户正在运行的所有当前进程;当被调用时,您应该得到如图 5-5 所示的输出。
图 5-5。
Current processes
是的,现在有点暗淡,因为我只运行两个进程:运行我的用户 shell 的bash
应用程序和ps
的副本。由于这是快照,应用程序将始终捕获自身。如果我想控制当前用户运行的那些进程,这是很有用的,但是如果我想做更多,我需要给我的ps
命令添加一些参数。在标准语法中显示系统中每个进程的参数是–ef
,所以继续运行它,看看你的输出如何变化(见图 5-6 )。
图 5-6。
ps –ef
哇,这是一个很大的输出,以至于它离开了屏幕的顶部!当您运行ps –ef
时,总是有大量的进程在您的系统上运行,因为它列出了所有的系统后台进程以及所有的用户进程。如果你想在列表中看到它们,你可以简单地在你的命令后面添加一个| less
,这将允许你上下移动和操作列表(我将在本章稍后解释less
命令实际上做什么):
$ ps -ef | less
ps
和top
很像,但是需要更少的资源,并且有一些其他的优势,我们将在本章后面介绍。现在,您只需要知道ps
中每一列的含义:
- UID:代表拥有该进程的用户
- PID:表示进程的 PID 号
- PPID:代表创建这个进程的 PID 号
- c:表示该进程的 CPU 利用率
- STIME:表示该流程的开始时间
- TTY:代表控制这个过程的终端
- 时间:该进程消耗的累计 CPU 时间
- CMD:该进程的命令行参数
所以你可能会说,“好吧。你已经展示了系统中的所有进程,但我现在可以用它们做什么?”这就是ps
的魔力所在;这使得我们很容易挑选出一个特定进程的 PID。PID 编号非常重要,因为它是每个流程的唯一编号,也是系统引用流程的方式。这将在我们的下一个命令中用到:kill
。
终止一个进程
顾名思义,kill
是用来杀死进程的。但是它也通过杀死进程的机制提供了许多其他有用的功能。在 Linux 和 UNIX 中,信号是从操作系统传递到应用程序的低级系统消息。信号除了是一个信号之外没有任何实际功能,应用程序需要以正确的方式响应它。并非所有信号都是如此,因为有些信号无法在应用程序中处理,但大多数信号都是如此。kill
命令的功能是向应用程序发送信号。Raspbian 上的kill
版本可以向应用程序发送 64 个信号。要列出它们,发出以下命令:
$ kill –l
我现在不会列出所有信号的功能,但您需要了解这些最常见的信号:
- 信号 1 (SIGHUP):挂机的简称。告诉应用程序挂起当前连接。通常用于使应用程序重新初始化自身。
- 信号 3 (SIGQUIT):表示该应用程序应该正常关闭并退出。
- 信号 6 (SIGABRT):表示程序正在中止;它将立即关闭。
- 信号 9 (SIGKILL):强制“拔掉”应用程序的信号。
这些信号是最常见的,因为它们用于执行应用程序关闭,其中九个是最常见的。kill
命令的格式如下:
kill –<signal> <PID>
因此,要用最大的力量终止一个进程,请执行以下命令:
$ kill -9 <PID>
这就是那些来自ps
命令的 PID 发挥作用的地方。这些 PID 数字是你将输入到kill
中的数字,以便指示来自kill
的信号。
正在读取/proc 中的信息
既然我们在玩 PID,那么重温一下/proc
文件系统可能会很好,这在第四章中首次讨论。这是操作系统的一部分,所有的进程信息都在其中。如果您使用ls /proc
,您将看到许多文件和一组编号目录。这些目录对应于每个进程 PID。如果您查看其中一个目录,您应该会看到与给定进程相关的一大堆文件。虽然您不应该随意编辑这些文件,但是这些目录中的一些文件非常有用。
可能最常用的是包含所有系统处理器信息的系统级文件。这是/proc/cpuinfo
文件。您可以使用cat
命令将文件的内容输出到屏幕,这是 concatenate 的缩写,通常用于将文件的内容放入缓冲区(在我们的例子中,是控制台屏幕)。继续发出这个:
$ cat /proc/cpuinfo
您的输出应该如下所示:
Processor : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS : 697.95
Features : swp half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xb76
CPU revision : 7
Hardware : BCM2708
Revision : 0003
Serial : 000000007a8a46ba
这是树莓 Pi 的处理器上的 Linux 内部信息。如果您对您的处理器的某些细节有疑问,这是值得考虑的地方。
除了cpuinfo
,在/proc
中还有另一个文件,您可以在诊断系统配置信息时加以利用。这是/proc/<pid>/cmdline
的文件。该文件列出了用于调用进程的完整命令行参数。如果您需要使用这里使用的命令,对这个文件执行cat
是最好的方法。
文件命令
如前所述,您可以使用cat
命令输出文件的内容。您可以使用许多其他工具来处理系统中的文件内容。第一个是前面提到的命令:less
命令。这是一个在屏幕上显示文件内容的命令,可以像文本编辑器一样移动和搜索。这是一个很棒的命令,用于处理日志文件或长命令的输出,如ps. less
允许你用箭头键或 page up 和 page down 键上下移动文件。您也可以通过键入/
然后输入您的搜索字符串,使用简单的单词搜索进行搜索。less
会高亮显示找到的表达式实例,你可以用n
键向下移动,用N
键向上移动。
除了能够在文件中搜索内容之外,less
还能够查看文件,并不断地在last
行显示任何新内容。这对于观察不断增长的日志文件非常有用,因为你可以在不需要重新打开文件的情况下获取新行,要让less
执行这个功能,只需按下F
键。除此之外,你还可以通过按下G
键自动导航到文件的结尾。这个过程还将获取任何已经添加到文件中的新行并显示它们。您也可以使用小写 g 来导航到特定的行号,因此如果您希望转到第一行,请按1g
。最后,less
能够在自身内部响应所有的命令行参数。这对于启用行号很有用,因为你可以简单地给less
命令–N<enter>
,它会在每行旁边显示数字。
在less
之后,提供惊人灵活性的命令之一是find
命令,用于查找文件。它通过检查给定目录及其所有子目录中的每个文件来做到这一点。find
本身是有用的,但是当与其他命令配合使用时,你将会看到它的非凡之处。它还有一个健康的选项缓存,可以互换,也可以组合。我将在这里介绍几个我认为非常有用的例子:
- 第一个是
–L
,它表示遵循符号链接,默认情况下find
不这么做。 - 第二个是
–maxdepth <number>
,它表示这个命令将搜索多少个目录深度。只有一个?就这个及其所有子目录? - 第三个是
–newer <file>
,它显示了比给定文件更新的任何内容。 - 第四个是
–empty
,顾名思义,它查找空文件。 - 第五个是
–atime <number>
,其中的数字表示自文件被访问以来已经过去的天数。 - 第六个是
–name <filename>
,它搜索与传入的名称完全相同的文件。 - 最后是
exec <command>
,它告诉find
在每个文件上执行给定的命令,这也是find
的真正威力所在。您可以使用此命令查找指定的文件,然后对它们执行命令。以这种方式,使用find
是执行清理旧的不需要的文件的一种奇妙的方式。我还建议,当你以这种方式使用find
时,你应该先测试并彻底测试,因为一次不正确的击键可能意味着你的系统或数据的毁灭。
将这些命令组合起来,您可以实现如下所示的效果:
$ find /mnt/Volume1 –empty –name fooBar –exec rm
该命令将找到/mnt/Volume1
中所有名为fooBar
的空文件,然后删除它们!在管理您的 Pi 时,您可以利用find
命令中的强大功能。
另一个具有重要但有限用途的命令是file
命令。file
命令用于遍历给定文件的内容,并确定文件的“种类”。种类在这里是一个有点松散的术语,因为file
只知道适度数量的不同文件类型。然而,当您想知道这个问题的答案时,它非常有用:“我可以在文本编辑器中安全地打开那个文件吗,或者它是一个二进制应用程序?”这个特殊的命令可以为您省去很多麻烦。您还可以使用file
来确定应用程序是以哪种归档格式编写的,这在您需要从归档文件中提取但不知道是哪种时非常有用!举例来说,如果您对一个二进制可执行文件如/bin/bash
运行file
,您应该会看到以下内容:
$ file /bin/bash
/bin/bash: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xe370a0be978f49569f115c9f41bc54688be9fe32, stripped
代码显示该文件是为 ARM 系统编译的 ELF 32 位 LSB 可执行文件,因此该文件应该与您的 Pi 兼容。这是诊断从互联网下载的应用程序可能存在的任何问题的好方法,因为它们可能是为 x86 编译的!
在这一节中,我为您准备的最后一个文件命令是那些许多人讨厌但更多人喜欢的命令之一:grep
。grep
是通用正则表达式解析器的缩写,最广为人知的是它是一个模式匹配器。像less
和find
,grep
既可以单独使用,也可以与其他命令结合使用。您可以使用grep
在给定文件中搜索包含给定文本字符串的任何行。grep
的基本格式是这样:
grep <pattern> <file>
这两个值都采用通配符格式,所以您可以使用grep
在整个目录中的每个文件中搜索一个字符串。例如,让我们在/etc/init.d
文件夹中查找单词 find:
$ grep find /etc/init.d/*
输出将是这样的:
/etc/init.d/checkfs.sh:# Include /usr/bin in path to find on_ac_power if /usr/ is on the root
/etc/init.d/checkroot.sh:# Include /usr/bin in path to find on_ac_power if /usr/ is on the root
/etc/init.d/kbd: LIST_CONSOLES=’cd /etc/init; find -name ’tty*.conf’ -printf ’%f ’ | sed -e ’s/[⁰-9 ]//g’’
/etc/init.d/kbd: # eventually find an associated SFM
/etc/init.d/nfs-common:# particularily heavy daemon, so we auto-enable it if we find an /etc/exports
/etc/init.d/rc:# Now find out what the current and what the previous runlevel are.
/etc/init.d/sudo: find /var/lib/sudo -exec touch -t 198501010000 ’{}’ \;
grep
也有一些很棒的命令行选项,包括–i
,它使得搜索不区分大小写。grep
也有–v
选项。它颠倒了搜索方向,返回所有与给定搜索字符串不匹配的内容!这应该让您了解当您希望找到一条给定的信息时,grep
是多么强大的一个工具,因此它是系统管理员的命令库中一个令人敬畏的部分。
组合命令
现在我们到了有趣的部分!组合命令的能力,以便您可以使用一个命令的输出,并将其交给另一个命令来处理。还有一些命令,我将在这里详细介绍,因为它们与其他命令结合使用时非常棒。但是首先你需要理解如何组合命令,谢天谢地,这是一件相当容易完成的事情。为了组合命令,我们使用管道符号(|
)。
是的,就这么简单。假设我们想要 grep 一些东西,但是想要以一种更易管理的方式输出。我们将简单地编写grep
,添加一个管道,然后添加一个less
。通过这样做,你会发现自己在less
中查看grep
的输出!这是乐趣真正开始的地方。想要搜索给定目录中的所有文件名吗?使用ls
列出文件,并将输出通过管道传输到grep
进行搜索。在这种情况下,您甚至不需要在文件名中包含grep
,因为管道将为grep
提供一个所谓的缓冲区,而grep
将把这个缓冲区视为文件内容!所以命令是这样的:
$ ls <directory> | grep <search string>
结合 ps 和 grep
现在,如果你想玩更多的东西,你可以把grep
和ps –ef
结合起来!这样,你可以搜索一个特定的应用程序;例如,为了搜索 SSH 应用程序sshd
,我们将运行:
$ ps –ef | grep sshd
这将生成以下输出:
root 1722 1 0 19:24 ? 00:00:00 /usr/sbin/sshd
root 1956 1722 0 19:43 ? 00:00:00 sshd: pi [priv]
pi 1963 1956 0 19:43 ? 00:00:01 sshd: pi@pts/0
pi 2030 1964 0 20:33 pts/0 00:00:00 grep ˗˗color=auto sshd
添加反向 grep
啊!有问题!我们似乎已经掌握了自己的指挥权。但这没问题,我们可以简单地再次连接到grep
并为grep
做一个–v
,这将返回给我们没有grep
的每一行。这给了我们命令:
$ ps –ef | grep sshd | grep –v grep
这给出了如下输出:
root 1722 1 0 19:24 ? 00:00:00 /usr/sbin/sshd
root 1956 1722 0 19:43 ? 00:00:00 sshd: pi [priv]
pi 1963 1956 0 19:43 ? 00:00:01 sshd: pi@pts/0
削减结果
好多了!现在你可以开始看到我们可以用管道完成什么,但是我还远远没有完成你可以用它来做的事情!下面介绍下一个命令:awk
。awk
是从一行文本中提取数据的工具。这样,您可以从正在运行的任何命令中提取各种信息。默认情况下,awk
将通过分割空白来提取每个元素,空白是字符之间的任何制表符或空格。您可以使用–F <delimiter>
参数设置要分割的角色。一旦你告诉awk
如何拆分你的文本,你将需要输出它。有一个完整的输出命令的语法,这是一种非常复杂的艺术形式。
然而,对于您的大多数需求,只需打印正确的字段就可以了。所有的awk
输出都用花括号{
和}
括起来,通常需要用单引号括起来,这样命令行就会忽略任何空格。这意味着基本语法如下所示:
$ awk ’{ <command> }’
对任何使用awk
的人来说,最有用的命令应该是print
命令,因为它用于显示分隔变量。这些变量中的每一个都被视为序列中的数字,因此第一个是$1
,第二个是$2
,依此类推。使用它,我们可以将前面的awk
和ps –ef
结合起来,打印出第二个空格分隔的字段,PID!这为我们提供了以下命令:
$ ps –ef | grep ssh | grep –v grep | awk ’{print $2}’
哇,这些命令越来越长了!但是请检查该命令的输出:
1722
1956
1963
啊哈!你们中最敏捷的人会意识到接下来会发生什么!我们可以用管道把这个传给kill
!以这种方式,我们可以使用一个ps
、grep
和awk
来只获取与给定模式匹配的进程的 PID,然后将它们传递出去进行终止!
xargs 处理每个结果
这是那些永不过时的魔术之一;然而,我们不能将 PID 列表直接传递给kill
,因为我们希望一次传递一个。为此,我们需要利用另一个命令xargs
,它的工作方式与find
中的–exec
相同。它允许您将之前命令的每一行输出视为另一个命令的单独参数。要使用 xargs,我们只需让它们以与sudo
相同的方式包装命令。因此,如果我们想通过kill
将这些 PID 中的每一个传递给xargs
,我们只需运行以下代码,就可以了:
$ ps –ef | grep ssh | grep –v grep | awk ’{print $2}’ | xargs kill –1
在这种情况下,我不会终止我的sshd
进程,因为我不想重启我的 Pi。但是您应该知道如何从一个命令获取输出,并将其传递给另一个命令,以便对这些命令进一步执行。
实际上,在进行这种“shell-fu”时,还有许多其他命令非常方便第一个是wc
,是字数的简称。默认情况下,wc
会给出给定文本块或文件的换行、字数和字节数,但它也有一些很好的参数,比如–l
,它会给出行数;–w
,会给你字符数;或者–m
,它会给你字数。
接下来是sort
,它对输出的每一行进行排序。你经常看到sort
和uniq
成对出现,后者是 unique 的简称。有了这两个,您可以通过管道将输出发送到sort
,然后发送到uniq
,在您给定的输出中,您将只有唯一的值!
使用大量命令时,最后需要注意的是输出操作符>
。这个操作符与 pipe 属于同一个系列,但是它不是用于将命令输出定向到另一个命令,而是用于将输出定向到一个文件。这是一种将命令输出保存到文件的好方法,这样您就可以在以后重新访问它,或者将它用作另一个命令的参数。到目前为止,您应该已经感受到了 shell 的强大,您可以通过将命令和管道结合起来进行各种复杂的操作!
用户环境
我们将暂时停止检查命令,看看构成您工作环境的一些东西。您的环境是在每次登录时启动的,每次都一样。这是因为许多文件和命令提供了关于如何构建简单 shell 环境以及如何运行的指令。执行这些任务所涉及的关键文件之一是您的系统主控制环境脚本/etc/profile
。该文件提供了作为每个用户会话基础的 shell 和环境变量的基础。
配置文件设置了许多变量,包括PATH
变量。这个变量是设置 shell 环境工作方式的关键变量之一。所以我们将深入研究一下。
PATH
是你整个环境中最重要的变量之一(如果不是最重要的话)。它代表系统搜索路径,基本上意味着它将在哪里寻找应用程序。举例来说,我相信您现在已经意识到,我们运行的所有命令都只是输入到 shell 中的文字,但实际上它们是位于操作系统中的全功能应用程序的名称。PATH
包含一个文件夹列表,您的 shell 将自动搜索并执行其中的任何命令。这意味着您并不总是在搜索命令的确切路径;您可以根据需要通过它的名称来运行它。这里的问题是你不能确定程序是从哪里运行的,或者如果你有多个版本,哪一个正在运行。有一个命令可以解决这个问题:which
命令。它输出您的 shell 用来执行给定命令的应用程序的路径。例如,让我们找到ssh
应用程序的路径,我们键入which ssh
,我们得到这样的结果:
$ which ssh
/usr/bin/ssh
是的,就这么简单。许多程序使用PATH
来查找它们需要的信息。您的 path 变量最初设置在/etc/profile
中,但是可以修改。但是在我们开始使用 path 变量之前,我们也应该了解一下它当前的设置。有两种方法可以做到这一点,首先是使用echo
命令打印变量。echo
将解释你给它的任何东西,然后打印到命令行,所以如果我们执行echo $PATH
,则echo
命令将输出PATH
变量的内容,如下所示:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
好了,这就是PATH
变量。路径是由冒号分隔的文件夹列表。这将我们带到查看PATH
变量的第二种方式:env
命令显示所有当前设置的环境变量。这是一个非常有用的命令,可以用来检查整个系统环境的当前状态。运行env
应该会得到如下输出:
$ env
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=eb95d80869be1ad62af36ec5502c41a1-1349772229.897557-1575821964
SSH_CLIENT=10.0.0.104 3643 22
SSH_TTY=/dev/pts/0
USER=pi
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
ALL_PROXY=SOCKS://localhost:9050
MAIL=/var/mail/pi
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
PWD=/home/pi
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/pi
LOGNAME=pi
SSH_CONNECTION=10.0.0.104 3643 10.0.0.56 22
_=/usr/bin/env
这里有许多变量,涵盖了一系列内容,包括我们正在使用的 shell(SHELL
)、管理我们执行ls
( LS_COLORS
)时显示的颜色的变量、路径、我的当前位置(PWD
)、我的主目录(HOME
)以及除了PATH
之外的用户名(USER
)。当试图诊断运行命令的问题时,所有这些信息都非常有用。
既然我们已经能够查看PATH
变量,我们应该考虑修改它。要修改一个变量,我们需要使用export
命令将它分配到我们的环境中。设置简单变量的语法如下:
$ export VARIABLE="SOMETHING"
如果您运行这个并再次运行env
,您应该会看到这个新变量出现在它的输出中,如下所示:
VARIABLE=SOMETHING
如果我们要对我们的PATH
变量这样做,我们会将它重置为我们设置的值,这不是我们想要的。我们也可以简单地重写整个路径,但这对于一个简单的改变来说是相当困难的。向PATH
变量添加内容的最简单方法是在赋值中包含PATH
变量。让我们来看一个例子:假设我们想要将/opt
目录包含到我们的路径中。我们将从export PATH=
开始,然后我们将使用当前的PATH
变量(因为我们将使用echo)
来显示它,所以我们编写"$PATH"
)。对于$PATH
,我们将添加一个冒号作为分隔符,并添加一个新目录/opt
,它给出了这个命令:
$ export PATH="$PATH:/opt"
运行时,这会将您的PATH
变量改为:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/opt
牛逼;/opt
被追加到末尾。这给我们带来了一个关键点;PATH
有顺序,从左到右。在PATH
变量左边的将在右边的之前使用。在我们的示例中,/opt
将是我们搜索任何给定文件的最后一个位置。
现在您已经了解了您的用户环境和PATH
是如何工作的,您应该了解您的主目录中的一个特殊文件。这是您的本地 shell 配置文件覆盖文件。在您的主目录中有许多以rc
结尾的隐藏文件。这些文件通常由您的 shell 或任何应用程序执行,以加载您的个人偏好。标准 Linux BASH shell 的文件是.bashrc
文件。这个文件负责我们之前看到的许多环境变量;这也是你的一些命令有颜色的原因。比如ls
指令,一般位于/bin/ls
(可以用which ls
检查)。如果你执行这个而不是正常的ls
,你将看不到颜色!这些颜色是由.bashrc
文件使用alias
命令特别添加的。
alias
顾名思义,用来给一个 shell 命令下的一个命令或者一组命令起别名,就像程序一样。在您的.bashrc
文件中,它使用了ls
命令来执行:
$ ls –-color=auto
这意味着每次你发出一个ls
命令,你就自动把颜色参数添加到ls
中。.bashrc
实现这一点的方法是添加下面这行代码:
alias ls=’ls ˗˗color=auto’
像.bashrc
这样的文件的伟大之处在于它们被设计成用户可修改的——毕竟,它们是你的本地系统变量。这样,您的本地环境由/etc/profile
给出的基本系统值和.bashrc
给出的附加值组成。
cron 命令
最后一个命令可能是系统管理员工具包中最强大和最有用的工具之一:cron
命令。cron
是一个计时应用程序,它根据导向文件传递给它的规则在给定的时间执行命令。cron
为每个用户提供了一个名为crontab
的导向文件,它会每分钟检查一次,看看是否需要执行另一个命令。要查看您当前的crontab
,您只需执行以下命令:
$ crontab –l
不幸的是,您一开始就没有,所以您将从这个命令中得到的是:
no crontab for pi
不要害怕,因为我们现在将回顾创建一个crontab
定时文件的基础知识。进入特殊 crontab 编辑器的命令如下:
$ crontab –e
这将打开系统标准编辑器的一个副本,并创建一个初始文件,其中包含一个漂亮的注释块,概述了一个crontab
条目是如何布局的。它提供了以下示例:
0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
该命令将在每周一早上 5 点对所有用户的主目录执行一次tar and zip
。回想一下,tar
为所有文档创建一个归档文件,z i
p 将压缩该文件——结果是一个包含所有文件的压缩文件。行首的五个数字控制时间;这些数字按以下顺序代表以下内容:
- 一小时中的分钟
- 一天中的小时(24 小时格式)
- 一月中的某一天
- 一年中的月份
- 星期几(星期日,0 到星期六,6)
从示例中可以看出,该命令在一年中的任何一个月中的任何一天的第五个小时的第零分钟运行,只要该天是星期一。通过这种组合,您可以设置任意数量的定时作业来执行系统管理功能。最棒的是,您可以使用我们之前讨论过的所有命令来为您执行这些任务!想在某个时间杀死一个进程?写下cron
计时结束的时间,然后使用ps
、grep
、awk
、xargs
和我们之前编写的kill
命令!有了cron
和我们之前提到的所有命令的组合,您可以完成的任务是无限的!
摘要
祝贺您,您现在应该已经走上了成为一名成熟的系统管理员的道路。你有超过 24 个单独的命令供你使用,并且有能力以新的方式组合它们来执行几乎任何你想要的任务。此外,您现在应该有了通过编辑您的crontab
文件来使用cron
自动执行这些命令的工具。所有这些工具构成了系统管理员管理 Linux 系统的基础,因为它们提供了编写健壮命令并自动执行它们的灵活性。