树莓派网络秘籍-全-
树莓派网络秘籍(全)
原文:
annas-archive.org/md5/84d5158bf703305f9eb8f27561a964af译者:飞龙
前言
一台树莓派 2,搭载 900MHz 四核处理器,比 1990 年代末期的网络服务器拥有更强的处理能力。作为一款旨在激发下一代程序员的教育工具,树莓派同样也是一款优秀的网络服务器。它可以用于文件共享、网站托管、创建互联网接入点以及分析网络流量。多个树莓派可以集群在一起,创建一个单一的、高可用且容错的超级计算机。本书将展示如何操作。
树莓派基金会意识到,计算机变得如此昂贵且难以理解,以至于父母不得不禁止孩子在计算机上进行编程实验。父母对计算机使用的限制导致了申请计算机科学专业的 A-Level 学生人数和技能水平逐年下降。因此,基金会决定开发一款“负担得起且足够强大的计算机,能够提供出色的多媒体功能,我们认为这是吸引那些最初对纯编程设备不感兴趣的孩子的关键”。
在发布的前两年,售出了 200 万台树莓派,这不仅仅局限于教育工作者和学生。爱好者们也非常兴奋地将这款便宜的基于 Linux 的计算机应用到他们的项目中。2015 年 2 月,树莓派 2 发布,配备了比原版更强大的四核处理器和更多的内存,这些内存和性能足以应对许多典型的服务器应用。
在本书中,你将找到一系列为树莓派设计的服务器端配方,包括设置文件服务器和 Web 服务器、创建安全的无线接入点和分析网络流量的配方。甚至还有一个创建高可用容错超级计算机的配方。
本书内容
第一章,安装与设置,提供了多个初级配方来将树莓派设置为网络服务器,包括如何下载并安装新的操作系统镜像、首次启动和正确关闭系统的说明。
第二章,管理,提供了更多初级配方来配置树莓派为网络服务器,其中包括如何执行特权命令、配置远程访问和管理用户帐户的说明。
第三章,维护,提供了中级和高级配方来维护树莓派服务器。你将学习如何更新软件、阅读内置文档和升级系统。
第四章,文件共享,提供了多个中级配方来共享文件。
第五章, 高级网络, 包含了一些高级配方,用于设置和监控网络应用,包括防火墙、Web 服务器、无线接入点和网络协议分析器。
第六章, 物联网 - 物联网, 包含了几个中级配方,用于将您的树莓派连接到物联网。
第七章, 集群, 包含了创建一个高可用的容错超级计算机的高级配方,该计算机由多个树莓派集群组成。
本书所需的设备
对于本书中的大多数配方,您需要的设备仅比基本的树莓派设置(树莓派和电源)稍多,并且已连接到局域网。
您可以选择使用显示器、键盘和鼠标与树莓派连接。然而,大多数配方已被编写为远程访问树莓派作为服务器。
需要互联网连接来下载软件并连接物联网。
本书适合的人群
本书适合学生、教育者、爱好者和计算机专业人士,他们希望将树莓派用作网络服务器。
之前有使用树莓派的经验不是必需的。完成本书中的初学者和中级配方后,您将获得完成高级配方所需的知识和经验。
各节
在本书中,您会发现几个经常出现的标题(准备工作、如何做、工作原理、更多内容、另见)。
为了清晰地指示如何完成配方,我们将使用以下各节:
准备工作
本节告诉您在执行配方时应预期的内容,并描述如何设置任何软件或为配方所需的初步设置。
如何操作…
本节包含了执行配方所需的步骤。
工作原理…
本节通常包含对上一节发生内容的详细解释。
更多内容…
本节包含了有关配方的附加信息,旨在使读者更了解该配方。
另见
本节提供了关于配方的其他有用信息的链接。
约定
在本书中,您会发现一些文本样式,它们用来区分不同种类的信息。以下是这些样式的一些示例及其含义解释。
文本中的代码词、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 用户名如下所示:“使用chown命令将目录(.)及其中的所有文件(*)的所有权授予用户pi。”
任何命令行输入或输出将如下所示:
pi@web1 /var/www/html $ sudo chown pi:www-data . *
新术语和重要词汇以粗体显示。屏幕上显示的单词,例如在菜单或对话框中,以如下方式出现在文本中:“按Tab键选择完成,然后按Enter键:”
注意
警告或重要说明以类似这样的框呈现。
提示
提示和技巧以这种方式呈现。
读者反馈
我们始终欢迎读者的反馈。让我们知道您对本书的看法——喜欢什么或者不喜欢什么。读者反馈对我们非常重要,因为它帮助我们开发出您能真正受益的书籍。
要向我们发送一般反馈,只需通过电子邮件发送至<feedback@packtpub.com>,并在邮件主题中提及书名。
如果您在某个领域具有专业知识,并且有兴趣为书籍写作或贡献内容,请参阅我们的作者指南:www.packtpub.com/authors。
客户支持
现在,您已经成为 Packt 书籍的骄傲拥有者,我们为您提供了一些帮助,以确保您能够充分利用您的购买。
下载本书的彩色图片
我们还为您提供了一个 PDF 文件,其中包含本书中使用的截图/图表的彩色图片。这些彩色图片将帮助您更好地理解输出中的变化。您可以从www.packtpub.com/sites/default/files/downloads/Raspberry_Pi_Networking_Cookbook_ColorImages.pdf下载该文件。
勘误
虽然我们已尽全力确保内容的准确性,但错误难免会发生。如果您在我们的书籍中发现任何错误——可能是文本或代码错误——我们将非常感谢您向我们报告。通过这样做,您可以帮助其他读者避免困扰,并帮助我们改进后续版本的书籍。如果您发现任何勘误,请通过访问www.packtpub.com/submit-errata报告,选择您的书籍,点击勘误提交表格链接,并填写勘误的详细信息。一旦您的勘误经过验证,您的提交将被接受,勘误将上传到我们的网站,或添加到该书的勘误部分的现有勘误列表中。
要查看之前提交的勘误,请访问www.packtpub.com/books/content/support并在搜索框中输入书名。所需信息将在勘误部分显示。
盗版
互联网盗版是所有媒体中持续存在的问题。在 Packt,我们非常重视版权和许可证的保护。如果您在互联网上发现任何形式的非法复制我们作品的内容,请立即提供该位置地址或网站名称,以便我们采取措施。
请通过 <copyright@packtpub.com> 联系我们,并提供涉嫌盗版材料的链接。
我们感谢您的帮助,帮助我们保护作者的权益,并维持我们为您提供有价值内容的能力。
问题
如果您在本书的任何方面遇到问题,您可以通过 <questions@packtpub.com> 联系我们,我们将尽力解决问题。
第一章:安装与设置
在本章中,我们将涵盖以下主题:
-
准备初次启动
-
下载新 SD 卡
-
使用 NOOBS 启动
-
Mac OS X 磁盘工具 – diskutil 和 dd
-
Windows 图像写入工具 – Win32DiskImager.exe
-
转换并复制到 Linux – dd
-
第一次启动 Raspbian Linux
-
关闭树莓派
介绍
本章介绍了树莓派。它首先列出了除了树莓派本身外,你还需要的组件,比如电源。
本章的核心教程描述了如何下载、安装和配置一些常见的树莓派操作系统。
最后两个教程描述了官方 Raspbian Linux 发行版的初次启动以及如何安全关机。
完成本章后,你将能够为你的树莓派下载、安装并配置操作系统,并首次启动树莓派。
准备初次启动
本教程解释了在首次开机前,除了树莓派外,还需要哪些组件才能启动。
树莓派基金会自 2012 年 6 月首次发布以来,发布了多个版本的树莓派,包括:树莓派 B(2012 年 4 月)、树莓派 A(2013 年 2 月)、树莓派计算模块(2014 年 4 月)、树莓派 B+(2014 年 7 月)以及树莓派 2 型号 B(2015 年 2 月)。
原始的树莓派型号 B 内存仅为 512MB,采用单核处理器和两个 USB 端口。而当前型号树莓派 2 型号 B 则配备了 1GB 内存、四核处理器和四个 USB 端口。
注意
本书中的示例以树莓派 2 型号 B 为例。
树莓派出厂时没有外壳和电源适配器,也没有键盘或显示器。根据你打算如何使用树莓派,你可能需要额外的组件。本书大多数教程仅需要电源、SD 卡和网线。
根据你打算如何使用树莓派,你可能希望连接其他外设。如果你打算将树莓派当作桌面电脑使用,则需要 HDMI 线、USB 键盘和 USB 鼠标。本教程列出了多个树莓派项目及其所需的外设。
完成本教程后,你将准备好进行树莓派的初次启动。
准备工作
为了开始本教程,你需要熟悉一些前提知识。
基本组件
以下是一些基本组件:
-
树莓派
-
一张 SD 卡
-
一个 5V 的 Micro USB 电源
树莓派通过一个 5V 的 Micro USB 电源供电,并且需要一张 SD 卡作为操作系统存储。尽管启动树莓派时不需要额外的组件,但本书中的许多网络解决方案会要求使用额外的硬件。
一张单一的 4GB SD Class 10 卡拥有足够的空间和速度来存储基础操作系统以及许多有用的应用程序。因为 SD 卡是树莓派存储操作系统的地方,所以操作系统的速度取决于 SD 卡的速度。Class 10 卡的性能要优于 Class 4 或 Class 6 卡。嵌入式 Linux Wiki 维护了一张 SD 卡兼容性表格,可以通过访问elinux.org/RPi_SD_cards来查看。
除了 SD 卡,树莓派还需要额外的组件来支持许多应用程序。对于本书中的大多数食谱,您只需要一个网络连接。对于某些应用,您可能还需要一个显示器以及键盘和鼠标。
以下是一些网络应用的示例及其所需的组件。
基本网络
基本网络指的是拥有网络连接。对于最简单的网络解决方案,树莓派所需的唯一附加组件就是网络连接——无论是直接的 TCP 电缆连接,还是无线网络 USB 加密狗。一旦网络配置完成,并且可以远程登录树莓派,就可以远程访问、更新和管理树莓派。
媒体中心
作为媒体中心的一部分,我们需要一个 HDMI 电视或显示器。
对于最简单的网络媒体解决方案,除了基本的网络组件,树莓派所需的唯一附加组件是 HDMI 连接。音频和视频都可以通过树莓派的 HDMI 连接进行流媒体播放。此外,SD 卡上有足够的空间来存储一小部分音乐和视频文件,以及操作系统。
台式计算机
如果您使用的是台式计算机,以下设备是必需的:
-
一台 HDMI 电视或显示器
-
一个 USB 键盘
-
一个 USB 鼠标
树莓派 2 拥有四个 USB 端口,能够提供足够的电力支持低功耗设备,如 USB 键盘或 USB 鼠标。它配备四核处理器,足以浏览网页、发送电子邮件、编辑文档或图像。由于运行 Linux 操作系统,树莓派还可以运行数百种教育、科学和商业程序。简而言之,树莓派可以运行许多有用的开源桌面应用程序。
网络集线器
对于网络集线器,我们需要以下设备:
-
一个带电 USB 集线器
-
一个 USB LAN 适配器
-
一个 USB WLAN 适配器(Wi-Fi 加密狗)
-
一个 USB 硬盘
-
一个 USB 打印机
当使用树莓派作为防火墙或无线接入点时,需要额外的 LAN 或 WLAN 网络适配器。如果网络适配器通过 USB 连接供电,还需要一个额外的带电 USB 连接器以确保适配器的可靠运行。
游戏主机
-
一个带电 USB 集线器
-
USB 游戏控制器
Raspberry Pi 是一个出色的游戏平台,如果你希望创建游戏,或玩单人控制台游戏或多人网络游戏。许多较老的基于文本的游戏可以仅通过键盘或远程登录在 Raspberry Pi 上运行。然而,也可以连接 USB 游戏控制器以进一步丰富多媒体动作游戏的游戏体验。
初始设置
-
Raspberry Pi
-
一张 SD 卡
-
一款 5V 微型 USB 电源适配器
-
一条网络连接
-
一台 HDMI 电视或显示器
-
一只 USB 键盘
-
一只 USB 鼠标
电源适配器、预格式化的 SD 卡、显示器、键盘和鼠标是初始设置所需的最基本组件。当通过 HDMI 连接电视时,电视将同时输出音频和视频。
如何操作…
执行以下步骤以启动 Raspberry Pi:
-
下载最新的磁盘映像。
-
将磁盘映像写入 SD 卡。
-
将格式化的 SD 卡插入 Raspberry Pi。
-
将显示器连接到 HDMI 接口。
-
将 USB 板和 USB 鼠标连接到 USB 端口。
-
将 5V 微型 USB 电源连接到 Raspberry Pi,设备便会启动。
-
最后,关闭 Raspberry Pi。
它是如何工作的…
在你能够启动 Raspberry Pi 之前,首先需要一张带有可启动磁盘映像的 SD 卡。官方的 Raspbian Linux 映像可以从 www.raspberrypi.org/downloads 下载。
下载磁盘映像后,需要将其写入 SD 卡(请参阅设置新 SD 卡的操作步骤)。
在 SD 卡准备好并插入 Raspberry Pi 后,可以连接显示器、键盘和鼠标。然后它就可以启动了(请参阅“启动 Raspbian Linux”的操作步骤)。
最后连接电源!Raspberry Pi 没有开关。当电源连接时,Raspberry Pi 会立即启动。因此,在连接电源之前,确保所有电缆都已连接,并且 SD 卡已插入。
当需要关闭 Raspberry Pi 时,必须先关闭操作系统,这与启动相反(请参阅关闭 Raspberry Pi的操作步骤)。
还有更多…
Raspberry Pi 2 是一款低成本的单板计算机(仅售 $35)。它是裸板出售的,使用之前需要电源、一个预格式化的 SD 卡来存储操作系统、键盘和显示器。然而,它确实拥有多种标准 I/O 接口和板载组件,可以使其连接到各种设备。
接口
Raspberry Pi 的标准连接器和接口如下:
-
电源(5V,800 mA(4.0 W)):Raspberry Pi 配有一个 Micro USB 电源连接口,应直接连接到电源适配器,而不是电脑的 USB 端口或 USB 集线器。
-
SD 卡:树莓派设计为从预格式化的 SD 卡启动(建议使用 4GB 或更大容量的 SD 卡;Class 10 SD 卡提供最佳性能)。
-
GPIO:用于模拟和数字输入/输出连接,用于扩展和实验。
-
音频输出(3.5 毫米接口——立体声):树莓派没有音频输入接口。不过,可以添加 USB 麦克风或声卡。音频输出支持 I2S 协议,可以连接数字音频设备。
-
LED 指示灯:这些指示灯用于显示磁盘、电源和网络流量的状态。当这些 LED 灯闪烁时,树莓派正在积极处理数据。关机后,等待 LED 灯停止闪烁再拔掉树莓派。
-
USB 2.0(四个端口):这些端口的电力有限。通过 USB 连接到树莓派的设备应当具有自己的电源供应,或者通过带电 USB 集线器连接。
-
网络(10/100 有线以太网 RJ45):请注意,板载网络与连接的 USB 设备竞争带宽。
-
HDMI(版本 1.3 和 1.4):可以用于视频和音频输出。支持分辨率从 640x350 到 1920x1200,包括 PAL 和 NTSC 标准。
板载组件
树莓派的主要板载组件如下:
-
SoC:即系统单芯片。我们需要的是 Broadcom BCM2836 媒体处理器。其特点如下:
-
CPU:900MHz 四核 ARM Cortex-A7
-
GPU:24 GFLOPS 计算能力
-
内存:1GB SDRAM
-
-
LAN9512
-
10/100 MB 以太网(自动 MDIX)
-
4x USB 2.0
-
推荐附件
除了电源外,建议配备以下附件:
-
机箱:这是树莓派的保护外壳。
-
带电 USB 集线器:该集线器有自己的电源供应,独立于树莓派电源。它提供足够的电力支持连接的设备。
电源问题
很难确定树莓派实际需要多少电力,因为所需电量取决于树莓派的工作负载和连接的外设。然而,已经有报告提到电力不足导致的一些问题。当树莓派的电源能够提供至少 5V、800mA 的电流,并且 USB 设备通过带电 USB 集线器间接连接时,这些问题会减少或消失。
症状
以下是一些症状:
-
屏幕右上角出现彩虹方块
-
网络连接不稳定
-
启动桌面 GUI 后,键盘无法使用
-
间歇性 SD 卡错误
原因
以下是导致问题的原因:
-
电源供应额定值低于 800mA
-
复杂键盘或带有内置 USB 集线器的键盘,例如 Apple Macintosh 键盘
-
USB 硬盘或超大 U 盘直接连接到树莓派,而不是通过一个带电的 USB 集线器间接连接
解决方案
以下是解决方案:
-
使用至少 700mA、5V 的稳压电源
-
仅将简单的 USB 设备直接连接到 Raspberry Pi
-
将 USB 设备连接到带电的 USB 集线器,并仅将集线器直接连接到 Raspberry Pi
另见
-
Wikipedia—Raspberry Pi (
en.wikipedia.org/wiki/Raspberry_Pi): 这篇关于 Raspberry Pi 的维基百科文章包括了所有 Raspberry Pi 型号的对比、每个 Raspberry Pi 组件的详细信息,以及 Raspberry Pi 的扩展历史。 -
MagPi (
www.raspberrypi.org/magpi): MagPi 是 Raspberry Pi 的官方杂志,每月期刊可以在线查看。 -
Raspberry Pi 官方网站 (
www.raspberrypi.org): Raspberry Pi 的官方网站提供了历史、新闻以及 Raspberry Pi 的文档,还包含了快速入门指南、论坛、维基和下载区域。 -
R-Pi Hub— eLinux.org (
elinux.org/R-Pi_Hub): R-Pi Hub 是一个为 Raspberry Pi 用户提供的嵌入式 Linux 社区维基页面。该页面包含了购买指南、初学者指南、验证过的外设列表以及比官方网站上更多的 Raspberry Pi 发行版列表。它拥有丰富且井然有序、更新及时的信息。 -
Raspberry Pi 硬件历史 (
elinux.org/RPi_HardwareHistory): 嵌入式 Linux 社区已经记录了 Raspberry Pi 的硬件历史,包括每个版本的详细规格和图像。
下载新的 SD 卡
以下步骤说明了如何使用 Win32DiskImager.exe、dd 和 diskutil 从下载的磁盘镜像创建可启动的 SD 卡。
Raspberry Pi 没有预装操作系统。在 Raspberry Pi 启动之前,需要一张安装了操作系统的 SD 卡。可以购买预装操作系统的 SD 卡。然而,下载并安装操作系统镜像并不困难。
完成此步骤后,你将知道如何下载 Raspberry Pi 操作系统。接下来的步骤将展示如何将操作系统写入 SD 卡。
如何操作……
执行以下步骤将镜像写入 SD 卡:
-
下载 Raspberry Pi 镜像。
-
将镜像写入 SD 卡。
它是如何工作的……
最简单的入门方式是从 Raspberry Pi 基金会官网下载 NOOBS(New Out Of Box Software)发行版,可以通过访问 www.raspberrypi.org/downloads 查看。该发行版的文件可以直接复制到格式化的 SD 卡中。无需额外的磁盘工具即可创建可启动镜像(参考 Booting with NOOBS 步骤)。
NOOBS 附带了树莓派基金会推荐的操作系统分发版——Raspbian Linux。在下载页面,你还可以找到 Raspbian Linux 镜像的链接。还有许多其他第三方操作系统的链接。想要获取更多树莓派镜像,请访问嵌入式 Linux 社区的 wiki 页面 (elinux.org/RPi_Distributions)。
与 NOOBS 不同,一旦下载了这些单独的操作系统镜像,你需要使用特定的磁盘工具将其写入 SD 卡。
如果你使用的是 Mac OS 操作系统,使用 diskutil 和 dd 将操作系统镜像写入 SD 卡(请参阅 Mac OS 磁盘工具配方)。如果你是在 Windows 计算机上写入 SD 卡,请使用 Win32DiskImager.exe(请参阅 Windows 图像写入工具 配方)。如果你使用的是 Linux 操作系统来将镜像写入 SD 卡,请使用 dd 命令行工具(请参阅 Linux 转换与复制 配方)。
另见
-
树莓派网站—下载页面 (
www.raspberrypi.org/downloads): 树莓派网站的下载页面是你可以找到推荐版本的树莓派操作系统分发版的地方。当前,树莓派基金会提供了以下操作系统分发版的链接:-
NOOBS 和 NOOBS Lite
-
Raspbian(Jessie 和 Wheezy)
-
Ubuntu Mate(Linux 桌面版)
-
Snappy Ubuntu Core(开发者版分发)
-
Windows 10 IoT Core(开发者版分发)
-
开源媒体中心(OSMC)
-
开源嵌入式 Linux 娱乐中心(OpenELEC)
-
PINET(课堂版分发)
-
RISC OS(非 Linux 分发版)
Raspbian Linux 分发版是树莓派基金会推荐的操作系统分发版,也是本书中使用的操作系统分发版。
-
-
树莓派的嵌入式 Linux 分发版 (
elinux.org/RPi_Distributions): 嵌入式 Linux 社区维护了一个关于树莓派操作系统分发版的优秀 wiki 页面。该页面提供了一个对比表格,并链接到可下载的镜像文件。许多这些分发版是针对特定用途而定制的,如渗透测试;作为家庭影院、防火墙或廉价桌面 PC 使用;或者用于软件开发。 -
Windows 10 IoT—下载 (
ms-iot.github.io/content/Downloads.htm): 用于 IoT 的 Windows 以及你开发 Windows IoT 设备(如树莓派)所需的其他工具可以在这个网站上找到。截至本修订版本,Windows 10 IoT 分发版没有用户界面。它被标记为 Windows 10 IoT Core Insider Preview。与 IoT Core 交互所需的工具可以从 Windows 10 IoT 的下载页面获取。
使用 NOOBS 启动
本步骤介绍了如何使用树莓派基金会的 NOOBS 工具安装树莓派操作系统。
NOOBS 不是一个操作系统发行版,而是一个用来安装操作系统的工具。通过使用 NOOBS,你可以为树莓派选择操作系统。
这是开始使用树莓派的最简单方式。无需特殊的磁盘工具,因此,只要你的计算机有 SD 卡写入功能,都可以使用这个方法。
完成这个过程后,你将能够使用 NOOBS 为树莓派选择操作系统。
准备工作
配料:
-
一台带有 SD 卡写入功能的计算机
-
为树莓派进行初始设置(参见准备首次启动的步骤)
-
格式化后的 SD 卡—4 GB 或更大(class 10 的速度最好)
-
NOOBS ZIP 文件
在 SD 卡上安装 NOOBS 并不依赖于特定的操作系统。
从树莓派官网(www.raspberrypi.org/downloads/noobs/)下载 NOOBS ZIP 文件(NOOBS_v1_4_2.zip)。
如何操作...
复制 NOOBS 到 SD 卡的步骤如下:
-
将格式化后的 SD 卡插入计算机。
-
将 NOOBS ZIP 文件解压到 SD 卡中。
-
弹出 SD 卡。
-
将 SD 卡插入树莓派并开启电源。
-
选择并安装操作系统。
工作原理...
NOOBS 的安装过程与操作系统无关。NOOBS ZIP 文件中的文件仅需解压到一个全新格式化的 SD 卡上。
文件解压到 SD 卡后,SD 卡可以安全地从计算机中弹出并插入树莓派。
在将 SD 卡牢固地插入树莓派并连接所有其他组件(HDMI 显示器、网络连接、USB 键盘和 USB 鼠标)后,你可以连接电源并启动树莓派。确保电源在最后连接,否则树莓派将无法正常启动。
当树莓派完成 NOOBS 启动后,你将看到一系列操作系统供选择。按空格键或用鼠标点击列表顶部的Raspbian [推荐]。点击安装 (i)或按I键来安装 Raspbian Linux 操作系统。
注意
Raspbian Linux 是本书中使用的操作系统。
NOOBS 会提取 Raspbian Linux 操作系统并重新启动树莓派。当 NOOBS 正在提取操作系统时,屏幕上会显示一些关于如何使用树莓派的提示,包括默认的用户名和密码(默认用户名是pi,默认密码是raspberry)。
树莓派重启后,你将能够使用raspi-config命令来完成安装(参见首次启动 Raspbian Linux的步骤)。
还有更多...
NOOBS 是开始使用树莓派的最简单方法。它是一个安装工具,而不是完整的操作系统。
在本食谱中,你使用 NOOBS 安装了 Raspbian Linux 操作系统。NOOBS 还可以用于安装其他多个操作系统,包括 Arch、OpenELEC、Pidora 和 RaspBMC。
通过使用 NOOBS,Raspbian Linux 可以配置为直接启动到一个名为Scratch的易用编程环境。NOOBS 还具有内置配置编辑器,专家可以使用它来对启动配置进行额外的调整。
另见
- NOOBS(即新盒子软件)可在
github.com/raspberrypi/noobs下载
NOOBS 旨在使选择和安装树莓派操作系统变得更加容易,无需担心手动为 SD 卡创建镜像。
Mac OS X 磁盘工具 – diskutil 和 dd
本食谱解释了如何使用 Mac OS X 计算机上的diskutil和dd磁盘工具,在 SD 卡上安装树莓派操作系统镜像。
你应该已经下载了一个树莓派的磁盘镜像,并且准备好将镜像写入 SD 卡。
完成这个步骤后,你将能够从 Mac OS X 计算机将 SD 卡写入。
准备工作
材料:
-
一台运行 Mac OS X 的计算机和一台 SD 卡写入器
-
一个 4GB 或更大的 SD 卡(Class 10 卡性能最好)
-
一个树莓派操作系统镜像文件
diskutil和dd磁盘工具命令在 Mac OS X 操作系统中默认安装。diskutil命令用于管理磁盘设备,dd命令用于将数据复制到磁盘设备或从磁盘设备复制数据。
dd命令需要管理员权限。使用sudo命令可以临时给予用户管理员权限。
如何操作...
在 Linux 电脑上,将磁盘镜像写入 SD 卡需要执行以下步骤:
-
打开终端。
-
使用以下命令确定 SD 卡驱动器的名称:
diskutil list -
使用以下命令卸载已挂载的 SD 卡:
diskutil unmountdisk /dev/disk2 -
使用
dd将磁盘镜像复制到 SD 卡(这需要sudo),如下所示:sudo dd bs=1M if=raspbian.img of=/dev/rdisk2
注意
小心选择磁盘!确保不要擦除错误的磁盘!
下面是一个 Terminal 会话示例,展示如何使用diskutil和dd命令来发现 SD 卡的磁盘驱动器名称,卸载 SD 卡,并将树莓派操作系统镜像写入 SD 卡:
macosx:~ $ diskutil list
/dev/disk0
#: TYPE NAME SIZEIDENTIFIER
0: GUID_partition_scheme*500.3 GB disk0
1: EFI EFI209.7 MB disk0s1
2: Apple_CoreStorage499.4 GB disk0s2
3: Apple_Boot Recovery HD 650.0 MB disk0s3
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: Apple_HFS Macintosh HD *499.1 GB disk1
/dev/disk2
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme NO_NAME *4.0 GB disk2
1: DOS_FAT_32 NO_NAME 4.0 GB disk2s1
macosx:~ $ diskutilumountdisk /dev/disk2
macosx:~ $ cd Downloads
macosx:Downloads $ dd bs=1M if=raspbian.img of=/dev/rdisk2
它是如何工作的...
diskutil命令用于查找 SD 卡的名称并卸载磁盘。
该命令首先与list子命令一起使用,以显示每个已挂载磁盘驱动器的信息。
插入 SD 卡后,SD 卡会出现在此列表中,路径为/dev/disk2。
现在我们知道 SD 卡磁盘设备的路径是/dev/disk2,可以使用unmountdisk子命令来卸载 SD 卡。
最后,使用dd命令将 Raspberry Pi 磁盘镜像写入 SD 卡:
-
每个写入的磁盘块为 1MB(
bs=1M) -
输入文件(
if)是raspbian.img -
输出文件(
of)是 SD 卡磁盘设备(/dev/rdisk2)
注意,输出文件被命名为/dev/rdisk2,而不是/dev/disk2。额外的r要求 Mac OS X 在写入磁盘时使用原始模式。原始模式比默认模式更快,如果你需要写入的话。
还有更多内容…
diskutil命令工具是一个功能丰富的工具,用于在 Mac OS X 上修改、验证和修复磁盘。有关diskutil命令的更多信息可以通过使用内置的 man 页面(man diskutil)查看。
在前面的示例中,镜像文件在复制到 SD 卡之前,需要先卸载磁盘(diskutil unmountdisk)。在格式化或覆盖磁盘之前,卸载磁盘非常重要。
当使用dd命令复制镜像时,
-
if=指定输入文件(raspbian.img) -
of=指定输出文件(/dev/rdisk2) -
bs=指定写入磁盘的块大小
dd工具也可以用作备份工具。只需交换输入文件(if=)和输出文件(of=)即可。
使用以下命令从前面的示例中的磁盘创建备份:
dd bs=1M if=/dev/rdisk2 of=backup-2015-06-20.img
在dd命令运行时,按下Ctrl + T会使命令报告其进度。
有关dd命令的更多信息可以在其 man 页面(man dd)中找到。
另见
-
磁盘工具 (
en.wikipedia.org/wiki/Disk_Utility):diskutil命令可以用来卸载系统中的磁盘。这篇维基百科文章详细解释了diskutil命令的所有功能。 -
diskutil – 修改、验证和修复本地磁盘 (
developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/diskutil.8.html):diskutil命令是 Mac OS X 操作系统的一部分。Apple 的 man 页面描述了diskutil命令及其选项。 -
dd – 转换和复制文件 (
developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dd.1.html):dd命令可以用来将镜像文件复制到磁盘或从磁盘复制。Apple 的 man 页面为dd命令提供了详细的信息和选项。
Image Writer for Windows – Win32DiskImager.exe
本教程展示了如何使用开源的 Windows 图像写入工具Win32DiskImager.exe将 Raspberry Pi 操作系统镜像安装到 SD 卡上。
你应该已经下载了 Raspberry Pi 磁盘镜像,并准备好使用 Windows PC 将镜像写入 SD 卡。
要完成此教程,你还需要连接互联网来下载 Windows 版的 Image Writer。
完成此步骤后,您将能够从 Windows 计算机将树莓派映像写入 SD 卡。
准备开始
以下是所需的组件:
-
一台运行 Windows 的计算机,带有 SD 卡读卡器
-
4GB 或更大的 SD 卡(class 10 具有最佳性能)
-
一个树莓派操作系统的映像文件
-
预编译的
Win32DiskImager二进制文件
预编译的Win32DiskImager二进制文件作为 ZIP 文件分发,可以从launchpad.net/win32-image-writer下载。
如何操作...
以下步骤是将磁盘映像写入 SD 卡到 Windows 计算机所需的步骤:
-
从
launchpad.net/win32-image-writer下载Win32DiskImager的 ZIP 文件。 -
将 ZIP 文件解压到硬盘上的文件夹中,例如
C:\Win32DiskImager。 -
从安装文件夹运行
Win32DiskImager.exe。 -
选择下载的树莓派磁盘映像作为源映像文件,并选择 SD 卡写入设备作为目标设备。
-
点击写入按钮将映像文件复制到 SD 卡中。
将映像写入磁盘大约需要 5 分钟,适用于 2GB 的映像文件。映像写入 SD 卡后,可以弹出 SD 卡并用来启动树莓派。
它是如何工作的...
首先,您需要下载并安装 Windows 版本的 Image Writer(Win32DiskImager)。Win32DiskImager是一个独立的可执行文件,可以安装到计算机上的任何文件夹中。
双击扩展后的Win32DiskImager可执行文件启动应用程序。
一旦应用程序启动,选择下载的树莓派磁盘映像作为源映像文件,然后选择 SD 卡写入设备的位置作为目标设备。当您点击写入按钮时,Win32DiskImager会将树莓派磁盘映像写入 SD 卡。
还有更多...
Win32DiskImager也是一个优秀的备份工具!在启动并配置好树莓派后,可以进行备份,以防 SD 卡损坏或丢失时保存映像。
要创建备份,请执行以下步骤:
-
运行
Win32DiskImager.exe。 -
选择 SD 卡作为源设备,选择一个新的映像文件作为目标。
-
点击读取按钮将 SD 卡中的内容读取到新的映像文件中。
从 SD 卡备份树莓派磁盘映像所需的步骤与写入映像的步骤类似。唯一的区别是在备份过程中,SD 卡是源文件,磁盘上的新映像文件是目标。
每次更新树莓派操作系统、应用程序软件或配置后,都应创建新的备份。
另请参见
- Windows 图像写入工具 (
launchpad.net/win32-image-writer): 该工具最初是为了读取和写入特定 Linux 发行版的磁盘镜像而编写的。然而,现在它已被泛化,成为许多开发项目中流行的工具,如 Raspberry Pi。Windows 图像写入工具的主页提供了该磁盘镜像工具的详细信息。
转换并复制到 Linux – dd
本教程说明了如何使用 dd 标准 Linux 工具将操作系统镜像安装到 SD 卡上。
你应该已经下载了 Raspberry Pi 的磁盘镜像,并且现在准备使用 Linux 电脑将该镜像写入 SD 卡。
大多数版本的 Linux 和 Mac OS 都已安装 dd 命令。这个强大的复制命令版本(cp)可以用来将数据块写入设备,如 SD 卡。
完成此教程后,你将能够从 Linux 计算机写入 SD 卡。
准备工作
这里是所需的材料:
-
一台运行 Linux 的计算机和一个 SD 卡读写器
-
容量为 4 GB 或更大的 SD 卡(Class 10 具有最佳性能)
-
一个 Raspberry Pi 操作系统镜像文件
dd 工具通常默认安装在大多数 Linux 发行版中。如果没有安装,可以使用适当的 Linux 安装工具进行安装。
本示例中的所有命令都作为特权用户(root)执行。
操作步骤...
在 Linux 计算机上将磁盘镜像写入 SD 卡的步骤如下:
-
使用
df命令来确定 SD 驱动器的名称。df -
使用
umount卸载已挂载的磁盘分区,如下所示:umount /dev/mmcblk0p1 -
使用
dd将磁盘镜像复制到 SD 卡,如下所示:dd bs=1M if=rasbian.img of=/dev/mmcblk0
下面是一个终端会话的示例,显示了使用 df 命令来查找 SD 卡驱动器的名称,使用 umount 命令卸载 SD 卡,以及使用 dd 命令将 Raspberry Pi 镜像写入 SD 卡:
user@host ~ $ df –vh
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 9.1G 7.3G 1.4G 85% /
udev 992M 0 992M 0% /dev
/dev/sda3 9.1G 4.9G 3.8G 57% /sys1
/dev/sda4 9.1G 4.2G 4.4G 49% /sys2
/dev/mmcblk0p 3.8G 1.2G 2.6G 32% /media/A181-918F
user@host ~ $ umount /dev/mmcblk0p1
user@host ~ $ dd bs=1M if=raspbian.img of=/dev/mmcblk0
它是如何工作的...
使用 df 命令发现 SD 驱动器的名称。
df 命令显示每个已挂载磁盘驱动器的可用空间。插入 SD 卡后,SD 卡的主分区(p1)将出现在此列表中,显示为 /dev/mmcblk0p1。因此,SD 卡磁盘设备是 /dev/mmcblk0(注意,p1 丢失了)。
现在我们知道 SD 卡磁盘设备是 /dev/mmcblk0,通过使用 umount 命令卸载 SD 卡(注意 umount 中没有 n)。
最后,使用 dd 命令将 Raspberry Pi 镜像写入 SD 卡:
-
每个写入的磁盘块为 1 MB(
bs=1M) -
输入文件(
if)是raspbian.img -
输出文件(
of)是 SD 卡磁盘设备(/dev/mmcblk0)
在 dd 命令运行时按 Ctrl + T,将使命令报告进度。
还有更多...
dd工具是大多数 Linux 发行版中常见的核心 Gnu 工具之一。它是一个低级工具,简单地将数据块从一个文件复制到另一个文件。
前面的示例展示了如何使用df命令来确定 SD 卡磁盘驱动器的名称。SD 磁盘的第一个分区/dev/mmcblk0p1被挂载在/media/A1B1-918F。磁盘镜像覆盖整个磁盘,而不仅仅是一个分区。因此,前述示例中的磁盘驱动器的正确名称是/dev/mmcblk0(注意没有p1)。
在将镜像复制到前述示例中的 SD 卡之前,需要卸载磁盘分区。格式化或覆盖磁盘之前,最好先卸载所有磁盘分区。
当使用dd命令复制镜像时,
-
if=指定输入文件(raspbian.img) -
of=指定输出文件(/dev/mmcblk0) -
bs=指定写入磁盘的块大小
dd工具也可以作为备份工具使用,只需交换输入文件(if=)和输出文件(of=)。
使用以下命令创建备份,使用前述示例中的磁盘:
dd bs=1M if=/dev/mmcblk0 of=backup-2015-06-20.img
另请参见
-
dd (Unix)(
en.wikipedia.org/wiki/Dd_(Unix)):这篇维基百科文章解释了dd命令的原始应用。 -
dd – 转换并复制文件(
manpages.debian.net/cgi-bin/man.cgi?query=dd):Debian 的dd命令手册页面描述了该命令及其选项。 -
dd(gnu - coreutils)(
www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html):GNU 操作系统手册中的dd参考文档,提供了详细描述。
第一次启动 Raspbian Linux
本步骤解释了如何启动官方的 Raspbian Jessie Linux 发行版,并使用raspi-config命令远程完成树莓派的安装。
当树莓派第一次启动时,它会自动进入图形用户界面(GUI)模式——树莓派桌面。树莓派还会在首次启动时启动一个安全外壳服务器。因此,可以在没有显示器连接到树莓派的情况下完成安装。
在此步骤中,raspi-config命令通过远程外壳(SSH 或 PuTTY)运行,以完成树莓派的安装。有关raspi-config的使用详细信息,请参见第二章,管理。
注意
树莓派的安装也可以通过 GUI 使用树莓派配置工具完成,该工具可以在首选项菜单中找到。
一旦此步骤完成,您将第一次启动树莓派。
准备工作
这里是所需材料:
-
树莓派的基本网络设置(请参见准备初次启动步骤)
-
格式化为 Raspbian Linux 镜像的 SD 卡
-
网络连接
对于此操作,SD 卡应已经格式化为 Raspbian Jessie 磁盘镜像,或者使用 NOOBS 选择了 Raspbian 操作系统,并且树莓派应已连接到本地网络,另一台计算机用于远程连接树莓派。
如何操作...
执行以下步骤以首次启动树莓派:
-
将 SD 卡插入树莓派并接入电源。树莓派应开始启动。
-
在短暂的初始启动后,树莓派将通过
raspberrypi.local主机名在本地网络上宣布自己。 -
使用安全外壳登录树莓派。用户名为
pi的用户的默认密码为 raspberry(第二章, 管理,中有两个远程访问的操作步骤)。golden-macbook:~ rick$ ssh pi@raspberrypi.local The authenticity of host 'raspberrypi.local (fe80::ba27:ebff:fe57:796d%en5)' can't be established. RSA key fingerprint is da:2a:c1:d4:93:f8:02:2c:36:71:ae:6b:9e:83:a6:d4. Are you sure you want to continue connecting (yes/no)? yes pi@raspberrypi.local's password: The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Thu Sep 24 15:33:00 2015 pi@raspberrypi ~ $ -
使用
raspi-config命令更新操作系统。此命令需要管理员权限,执行时需要加上sudo前缀。有关执行带有权限的命令的更多信息,请参见第二章, 管理。pi@raspberrypi ~ $ sudo raspi-config -
请注意,
raspi-config主菜单有多个选项用于更新树莓派操作系统:┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐ │ │ │ 1 Expand Filesystem Ensures that all of the SD card s │ │ 2 Change User Password Change password for the default u │ │ 3 Boot Options Choose whether to boot into a des │ │ 4 Internationalisation Options Set up language and regional sett │ │ 5 Enable Camera Enable this Pi to work with the R │ │ 6 Add to Rastrack Add this Pi to the online Raspber │ │ 7 Overclock Configure overclocking for your P │ │ 8 Advanced Options Configure advanced settings │ │ 9 About raspi-config Information about this configurat │ │ │ │ │ │ │ │ <Select> <Finish> │ │ │ └──────────────────────────────────────────────────────────────────────────────┘ -
以下是主要的配置选项:
-
扩展文件系统:将根分区调整大小以填充 SD 卡(如果你使用了 NOOBS,则无需此操作)
-
更改用户密码:更改默认密码(这应该是你做的第一件事)。
-
启动选项:选择以文本模式或桌面 GUI 模式启动树莓派(本书仅使用文本模式)。
-
国际化选项:更改显示语言和默认键盘布局(默认语言为英语(英国),默认键盘布局为英国)
-
启用相机:启用树莓派相机的使用
-
添加到 Rastrack:将树莓派添加到树莓派基金会的使用统计中
-
超频:将树莓派置于 Turbo 模式(最新型号,树莓派 2,仅有一个速度选项)
-
高级选项:为高级用户提供其他配置选项(如过扫描、SSH、内存分配和音频)
-
关于 raspi-config:提供有关
raspi-config的信息
-
-
选择1 扩展文件系统,将 SD 卡上的文件系统扩展,以便使用 SD 卡上的所有可用空间。第二章, 管理,中有关于扩展文件系统大小的详细说明。
-
选择2 更改用户密码以更改默认密码。
-
选择完成以完成配置并重启系统。
工作原理...
启动时,树莓派会将其主机名(raspberrypi.local)注册到本地 多播域名服务器(mDNS)。大多数家庭网关和局域网都包括一个 mDNS,为动态连接到网络的移动设备和计算机提供域名注册服务。
一旦树莓派启动并注册其主机名,可以使用安全外壳客户端通过 raspberrypi.local 主机名连接到树莓派,用户名为 pi,密码为 raspberry。第二章,管理,有两个远程访问食谱,一个用于 Windows(PuTTY),一个用于 Mac OS X 和 Linux(SSH)。
Raspbian Linux 操作系统发行版包含 raspi-config 工具。此配置工具应在首次启动操作系统时运行,用于扩展文件系统并更改默认密码。
raspi-config 命令具有管理员权限,需要在前面加上 sudo 前缀才能运行。有关 以管理员权限执行命令 的更多信息,请参见 第二章,管理。
当 raspi-config 主菜单出现时,你可以使用键盘的箭头键、Tab 键、空格键或 Return 键来导航菜单。
第二章,管理,有一些使用 raspi-config 命令配置树莓派的食谱。现在,只需使用 扩展文件系统 和 更改用户密码 菜单项,以及 扩展文件系统大小 和 更改登录密码 食谱。
注意
如果你使用了 NOOBS,则不需要扩展文件系统,因为 NOOBS 已经扩展了文件系统。
从主菜单选择 Finish 将使树莓派重新启动。
一旦重新启动,树莓派就可以使用了!
另见
- 多播 DNS (
en.wikipedia.org/wiki/Multicast_DNS):这篇维基百科文章描述了 mDNS 如何在小型局域网中解析主机名为 IP 地址。
关闭树莓派
本食谱展示了如何安全地关闭树莓派。
在关闭树莓派之前,首先关闭操作系统非常重要,这样树莓派上的所有应用程序和服务才有机会完成任何正在进行的磁盘写入操作,并为下次启动做准备。
外部设备,如硬盘,也需要时间来关闭并刷新它们的缓冲区。shutdown 命令还为连接到树莓派的设备提供了一个清理并为下次启动做好准备的机会。
完成此步骤后,你将能够安全地关闭树莓派。
准备就绪
这是我的材料:
-
树莓派的初始设置(参考 准备启动初始化 食谱)
-
使用官方 Raspbian Linux 镜像格式化的 SD 卡
在执行此操作之前,树莓派应该已经开机并完成启动。
如何操作...
执行以下步骤以关闭树莓派:
-
如果你尚未登录,请以
pi用户身份登录到树莓派(默认密码为raspberry):Raspbian GNU/Linux 7raspberrypi tty1 Raspberrypi login: pi Password: Last Login: Sun Jun 21 19:45:35 UTC 2015 on tty1 Linux raspberrypi 3.18.11-v7+ #781SMP PREEEMPT Tue Apr 21 18:07:59 BST 2015armv7l The programs included with the Debian GNU/Linux system are free software;The exact distribution terms for each program are described in the individual files in /user/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. pi@raspberrypi ~ $ -
关闭并停止(
-h)操作系统。此命令需要管理员权限。使用sudo前缀以管理员身份运行关机命令,如下所示:pi@raspberrypi ~ $ sudo shutdown –h now Broadcast message from root@raspberrypi (pts/0) (Sun Jun 21 19:53:03 2015): The system is going down for system halt NOW! -
在执行
shutdown命令后,树莓派将开始其关机过程,显示应用程序、设备和服务的消息,展示它们在清理并准备下次启动时的状态。 -
一旦操作系统关闭,树莓派将停止,只有一个红色 LED 灯会亮起(只要 LED 灯还在闪烁,树莓派仍在忙于关机)。
-
电源现在可以从树莓派上拔下。
它是如何工作的...
如果你尚未登录到树莓派,在关机之前,你需要先登录到树莓派。
默认用户是pi。你应该在第一次启动时已经更改了默认用户的密码(参见首次启动 Raspbian Linux的操作)。如果你没有更改密码,默认密码是raspberry。
登录后,执行带有–h选项的shutdown命令,这将告诉树莓派在操作系统关闭后停止。
shutdown命令是特权命令。因此,sudo命令用于临时授予权限。有关以特权身份执行命令的更多信息,请参见第二章,管理部分。
还有更多...
shutdown命令还可以用来重启系统。只需使用–r重启选项代替–h关机选项。
当你以pi用户身份登录时,可以通过以下命令重启系统:
pi@raspberrypi ~ $ sudo shutdown –r now
shutdown命令的同义词包括poweroff和reboot。
为了关闭系统,你也可以使用以下命令代替shutdown –h:
pi@raspberrypi ~ $ sudo poweroff
除了使用shutdown –r,你还可以使用以下命令:
pi@raspberrypi ~ $ sudo reboot
有关这些命令的更多信息,请查阅它们的手册页面。
另请参见
-
halt, reboot, poweroff – 停止系统 (
manpages.debian.net/cgi-bin/man.cgi?query=halt):shutdown命令有替代选项。Debian 的 halt、poweroff 和 reboot 手册页面详细描述了这些命令。 -
shutdown – 关闭系统 (
manpages.debian.net/cgi-bin/man.cgi?query=shutdown):shutdown命令可以用来停止系统(-h)或重启系统(-r)。Debian 的shutdown手册页面详细描述了该命令及其所有选项。
第二章:用户管理
在本章中,我们将覆盖以下主题:
-
使用特权执行命令(
sudo) -
扩展文件系统大小(
raspi-config) -
配置内存使用(
raspi-config) -
配置远程访问(
raspi-config) -
通过 SSH 获得远程访问
-
通过使用 PuTTY 获得远程访问
-
修改登录密码(
passwd) -
添加用户(
adduser) -
授予用户 sudo 特权(
id和usermod)
介绍
本章中的配方用于树莓派的基本管理。本章从一个配方开始,展示如何使用sudo命令执行其他需要超级用户权限的命令。接下来的三个配方使用raspi-config命令行工具完成以下三项初始配置任务:
-
扩展文件系统以使用 SD 卡上的所有空间
-
更改内存分配以提高性能
-
启用树莓派的远程访问
以下两个配方展示了如何远程访问树莓派:
-
从 Linux 或 Mac OS X 计算机使用
SSH命令行客户端 -
从 Windows 计算机使用 PuTTY 客户端
本章的最后三个配方如下所示,专门用于用户管理:
-
如何修改默认用户用户名为
pi的密码 -
如何创建一个新的用户登录
-
如何将用户添加到特权
sudo用户组
一旦你完成了本章内容,你将能够通过网络连接远程管理树莓派,而无需键盘或显示器。
使用特权执行命令(sudo)
本配方展示了如何使用sudo执行特权命令。
默认的树莓派用户(pi)是普通用户,而非超级用户。sudo命令用于临时授予普通用户超级用户的权限。
完成本配方后,你将能够通过使用sudo作为命令前缀来执行具有超级用户权限的命令。
准备工作
本配方需要以下配料:
-
你需要为已开机的树莓派进行初始设置或基本的网络设置。你还需要以用户名为
pi的用户身份登录(有关如何启动和登录的说明,请参阅第一章,安装与设置,并参考本章稍后的配方以了解如何远程登录)。 -
网络连接是可选要求。
如果树莓派已启用远程访问,本配方可以通过 SSH 或 PuTTY 远程完成(参阅本章稍后给出的远程访问(SSH)和远程访问(PuTTY)配方)。
如何操作...
本配方首先不带特权地执行命令,然后使用特权执行:
-
首先,尝试作为普通用户执行一个需要特权的命令,例如
reboot,如下所示:pi@raspberrypi ~ $ reboot reboot: must be superuser. pi@raspberrypi ~ $ -
然后,再次尝试以超级用户权限执行该命令,如下所示:
pi@raspberrypi ~ $ sudo reboot Broadcast message from root@raspberrypi (pts/0) (Sat Jun 27 21:16:19 2015): The system is going down for reboot NOW!
它是如何工作的...
sudo 命令是为非特权用户提供的,允许临时授予另一个命令超级用户权限(就像超级用户会做某事一样)。
在这个操作中,特权命令 reboot 最初是由普通用户 pi 执行的,而没有超级用户权限。然后,reboot 命令报告了一个错误,提示“必须是超级用户”。普通用户不能执行 reboot 命令。
最后,sudo 命令被用作超级用户前缀,暂时将普通用户 pi 提升为超级用户权限。然后,系统按要求重新启动。
还有更多...
以下是一些可以使用的其他命令。
切换用户(sudo –u)
sudo 命令实际上是一个 切换用户 和 执行某事 的命令。
默认情况下,sudo 命令会临时切换到 root 用户,root 是超级用户。当以 root 用户身份运行命令时,命令将拥有 root 用户的所有权限。
使用 –u 命令行参数执行时,sudo 可以临时以任何系统用户的身份执行命令,从而赋予该命令另一个用户的所有权限。
有关为 Raspberry Pi 创建额外用户的更多信息,请参阅本章末尾的 添加用户 章节。
这是一个示例,展示如何使用 sudo 命令切换到 Raspberry Pi 上已经存在的另一个用户,该用户的用户名为 nobody。用户 nobody 没有任何权限(这是它的目的——没有权限;这是一个安全特性),但我们可以使用 nobody 来演示 sudo 命令的工作原理。这个示例创建并删除了两个文件——一个属于用户 pi,另一个属于用户 nobody:
pi@raspberrypi ~ $ ls -l /tmp
total 0
pi@raspberrypi ~ $ touch /tmp/i-belong-to-pi
pi@raspberrypi ~ $ ls -l /tmp
total 0
-rw-r--r-- 1 pi pi 0 Jun 27 21:54 i-belong-to-pi
pi@raspberrypi ~ $
请注意,现在临时目录中只有一个文件,并且该文件属于用户 pi(ls –l 命令的输出中的第三列显示文件的所有者):
pi@raspberrypi ~ $ sudo -u nobody touch /tmp/i-belong-to-nobody
pi@raspberrypi ~ $ ls -l /tmp
total 0
-rw-r--r-- 1 nobody nogroup 0 Jun 27 21:55 i-belong-to-nobody
-rw-r--r-- 1 pi pi 0 Jun 27 21:54 i-belong-to-pi
pi@raspberrypi ~ $
现在 /tmp 目录中有两个文件。一个文件 i-belong-to-pi 属于用户 pi,另一个文件 i-belong-to-nobody 属于用户 nobody。
现在,让我们尝试从临时目录中删除我们创建的两个文件,如下所示:
pi@raspberrypi ~ $ rm /tmp/i-belong-to-pi
pi@raspberrypi ~ $ ls -l /tmp
total 0
-rw-r--r-- 1 nobody nogroup 0 Jun 27 21:55 i-belong-to-nobody
pi@raspberrypi ~ $
删除 i-belong-to-pi 文件成功。目录中只剩下一个文件:
pi@raspberrypi ~ $ rm /tmp/i-belong-to-nobody
rm: remove write-protected regular empty file `/tmp/i-belong-to-nobody'? y
rm: cannot remove `/tmp/i-belong-to-nobody': Operation not permitted
pi@raspberrypi ~ $
删除 i-belong-to-nobody 文件没有成功,因为该文件属于用户 nobody。
如果你想删除 i-belong-nobody 文件,首先需要使用 sudo 命令切换到用户 nobody,如下所示:
pi@raspberrypi ~ $ sudo -u nobody rm /tmp/i-belong-to-nobody
pi@raspberrypi ~ $ ls -l /tmp
total 0
pi@raspberrypi ~ $
使用 sudo –u nobody 成功了!现在 /tmp 目录中没有剩余文件。
密码
Raspbian Linux 发行版的默认配置对于 sudo 组中的用户在使用 sudo 时无需输入密码。
如果你使用的是其他 Linux 发行版,使用sudo时可能需要输入密码。如果需要输入密码,请使用登录 Raspberry Pi 时所用的相同密码。
sudo 组
如果你已向树莓派添加了额外的用户,并且希望这些用户能够使用特权命令(如shutdown和reboot)或更改配置目录(/etc)中的文件,则还需要将他们添加到sudo用户组中。没有加入sudo组的用户将无法执行特权命令或更改特权文件。
本章末尾的配方提供了更多关于用户管理的信息,包括如何将用户添加到sudo用户组。
另请参见
-
sudo, sudoedit – 以其他用户身份执行命令 (
manpages.debian.net/cgi-bin/man.cgi?query=sudo):切换用户命令暂时以其他用户身份执行命令。Debian 的sudo命令手册页描述了它的所有功能和选项。 -
touch – 更改文件时间戳 (
manpages.debian.net/cgi-bin/man.cgi?query=touch):touch命令如果文件不存在,则会创建一个文件。Debian 的touch命令手册页描述了它的所有功能和选项。
扩展文件系统的大小(raspi-config)
本配方展示了如何使用raspi-config命令扩展树莓派的文件系统,使其使用 SD 卡上所有可用的磁盘空间。
树莓派的操作系统映像经过压缩,以尽可能减少磁盘空间的使用。操作系统映像大小的缩减有助于提高下载映像的速度。当这些压缩后的映像复制到 SD 卡时,SD 卡很可能会仍然有剩余空间。较大的 SD 卡(大于 8GB)通常会是空的!
注意
如果你使用 NOOBS 安装了树莓派,则无需扩展文件系统。NOOBS 已经为你扩展了文件系统。
本配方使用raspi-config命令行工具扩展操作系统映像的文件系统,使其包括 SD 卡上所有可用的空间。
完成本配方后,你的树莓派存储使用的文件系统将扩展,包含 SD 卡上所有可用的空间。
准备工作
此配方需要以下材料:
-
你需要为已开机的树莓派进行初步设置或基本的网络配置。你还需要以用户
pi登录(有关如何启动和登录的说明,请参考第一章,安装与设置,本章后续的配方将介绍如何远程登录)。 -
网络连接是可选的要求。
如果树莓派已启用远程访问,本配方可以通过 SSH 或 PuTTY 远程完成(有关远程访问(SSH)和远程访问(PuTTY)的配方,请参阅本章后续部分)。
本食谱示例中使用的 SD 卡存储容量为 32 GB。
如何操作...
使用以下步骤来扩展树莓派的文件系统:
-
使用
df命令查看可用的磁盘空间,操作如下:pi@raspberrypi ~ $ df –h Filesystem Size Used Avail Use% Mounted on /dev/root 3.9G 3.1G 596M 84% / devtmpfs 459M 0 459M 0% /dev tmpfs 463M 0 463M 0% /dev/shm tmpfs 463M 13M 451M 3% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 463M 0 463M 0% /sys/fs/cgroup /dev/mmcblk0p1 56M 20M 37M 36% /boot tmpfs 93M 0 93M 0% /run/user/1000 pi@raspberrypi ~ $ -
请注意,根文件系统(
/dev/root)的大小(第二列)仅为3.9 G,即使实际磁盘大小要大得多。 -
执行
raspi-config命令来扩展根文件系统的大小,操作如下:pi@raspberrypi ~ $ sudo raspi-config -
然后会显示
raspi-config主菜单:┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐ │ │ │ 1 Expand Filesystem Ensures that all of the SD card s │ │ 2 Change User Password Change password for the default u │ │ 3 Boot Options Choose whether to boot into a des │ │ 4 Internationalisation Options Set up language and regional sett │ │ 5 Enable Camera Enable this Pi to work with the R │ │ 6 Add to Rastrack Add this Pi to the online Raspber │ │ 7 Overclock Configure overclocking for your P │ │ 8 Advanced Options Configure advanced settings │ │ 9 About raspi-config Information about this configurat │ │ │ │ <Select> <Finish> │ │ │ └──────────────────────────────────────────────────────────────────────────────┘ -
按下Enter键选择第一个菜单项,
Expand Filesystem。使用上下箭头键更改选择。 -
稍等片刻,屏幕会显示如下内容:
┌──────────────────────────────────────────────────────────┐ │ │ │ Root partition has been resized. │ │ The filesystem will be enlarged upon the next reboot │ │ │ │ <Ok> │ │ │ └──────────────────────────────────────────────────────────┘ -
按下Enter键,您将返回到主菜单。
-
按下Tab键选择完成,然后按下Enter键:
┌──────────────────────────────────────────────────────────┐ │ │ │ Would you like to reboot now? │ │ │ │ <Yes> <No> │ │ │ └──────────────────────────────────────────────────────────┘ -
按下Enter键选择是。树莓派将重新启动。
-
重新登录后,使用
df –h命令检查根文件系统(/)上的可用磁盘空间,操作如下:pi@raspberrypi ~ $ df –h / Filesystem Size Used Avail Use% Mounted on /dev/root 29G 3.1G 24G 12% / pi@raspberrypi ~ $
工作原理...
本食谱开始时会显示树莓派上可用的磁盘空间。df命令显示可用的磁盘空间(df 是磁盘空闲的缩写)。–h命令行参数要求df以人类可读的格式显示结果。命令的输出显示,/dev/root文件系统的总大小为 3.9 GB,84%的文件系统已被使用,仅剩下 596 MB 可用。
然后,运行raspi-config命令来扩展根文件系统。raspi-config命令主菜单中的第一个命令,Expand Filesystem,用于调整树莓派的根分区(/dev/root)大小。
在调整根文件系统大小后,树莓派需要重新启动。重新启动后,根文件系统的大小会再次被检查。此时,剩余的磁盘空间为 24 GB!
还有更多...
扩展根文件系统的最佳时机是在安装后立即进行——在安装新软件或需要额外磁盘空间之前。
raspi-config工具用于配置树莓派的许多基本组件。可以在名为配置远程访问和配置内存使用的食谱中找到它的使用示例。
参见
-
Raspi-config(www.raspberrypi.org/documentation/configuration/raspi-config.md): 树莓派基金会文档中可以找到raspi-config命令的参考页面。 -
RPi raspi-config(elinux.org/RPi_raspi-config): 该文档位于嵌入式 Linux 网站,介绍了raspi-config脚本如何帮助你配置树莓派。
配置内存使用(raspi-config)
本食谱展示了如何使用raspi-config工具更改树莓派的内存分配,以最大化可供 CPU 使用的内存量。
本书提供的解决方案不需要显示器。其中许多解决方案将受益于显示器使用的额外内存。
然而,如果你将树莓派作为桌面电脑使用,可能希望最大化视频内存的容量。浏览器中显示的互联网内容,如图像和视频,以及计算机游戏,都将受益于高视频内存。
完成此步骤后,你可以根据需要选择在视频核心和 CPU 之间分配内存的平衡。
准备工作
此步骤所需的准备工作是已经开机的树莓派的初始设置或基础网络设置。你还需要以用户pi身份登录(请参考第一章中的食谱,安装与设置,了解如何启动并登录)。
如何操作...
按照以下步骤配置树莓派的内存使用:
-
执行
raspi-config命令,如下所示:pi@raspberrypi ~ $ sudo raspi-config -
接着会显示
raspi-config主菜单:┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐ │ │ │ 1 Expand Filesystem Ensures that all of the SD card s │ │ 2 Change User Password Change password for the default u │ │ 3 Boot Options Choose whether to boot into a des │ │ 4 Internationalisation Options Set up language and regional sett │ │ 5 Enable Camera Enable this Pi to work with the R │ │ 6 Add to Rastrack Add this Pi to the online Raspber │ │ 7 Overclock Configure overclocking for your P │ │ 8 Advanced Options Configure advanced settings │ │ 9 About raspi-config Information about this configurat │ │ │ │ <Select> <Finish> │ │ │ └──────────────────────────────────────────────────────────────────────────────┘ -
使用上下箭头键更改选择,然后按Enter键选择高级选项。
-
显示高级选项菜单,如下所示:
┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐ │ │ │ A1 Overscan You may need to configure oversca │ │ A2 Hostname Set the visible name for this Pi │ │ A3 Memory Split Change the amount of memory made │ │ A4 SSH Enable/Disable remote command lin │ │ A5 Device Tree Enable/Disable the use of Device │ │ A6 SPI Enable/Disable automatic loading │ │ A7 I2C Enable/Disable automatic loading │ │ A8 Serial Enable/Disable shell and kernel m │ │ A9 Audio Force audio out through HDMI or 3 │ │ A0 Update Update this tool to the latest ve │ │ │ │ <Select> <Back> │ │ │ └──────────────────────────────────────────────────────────────────────────────┘ -
从菜单中选择内存划分来更改内存划分。
-
系统提示你输入 GPU 的内存量:
┌────────────────────────────────────────────────────────────────────┐ │ How much memory should the GPU have? e.g. 16/32/64/128/256 │ │ │ │ 16________________________________________________________________ │ │ │ │ <Ok> <Cancel> │ │ │ └────────────────────────────────────────────────────────────────────┘ -
输入
16并按下Enter键,为树莓派的 GPU 分配最小内存量。 -
系统返回到
raspi-config的主菜单。 -
从主菜单中选择完成并重启树莓派。
它是如何工作的...
在raspi-config配置工具的高级选项菜单中,有一个选择项允许你指定视频处理的图形处理单元(GPU)和用于通用处理的 CPU 之间的内存划分。在本食谱中,你输入了 16 MB,这是 GPU 的最小值。
树莓派将其总内存(树莓派 2 为 1 GB)中的 256 MB 分配给其 CPU 和 GPU。内存可以通过以下五种不同的方式进行划分:
-
GPU 16 MB,CPU 1008 MB
-
GPU 32 MB,CPU 992 MB
-
GPU 64 MB,CPU 960 MB
-
GPU 128 MB,CPU 896 MB
-
GPU 256 MB,CPU 768 MB
对于本书中的许多食谱,GPU 只需要最低 16 MB 的内存。这些食谱不需要显示,如果最大内存分配给 CPU(1008 MB),将有助于提高 CPU 的整体性能。
对于需要显示的解决方案,应为 GPU 分配更多内存。多媒体解决方案,如 OMXPlayer 或 XBMC 发行版,将受益于最大 256 MB 的视频核心内存。
即使将最大内存分配给 GPU,Raspberry Pi 2 仍会留下 768 MB 的内存供 CPU 使用。为了实验本书中的配方,768 MB 的内存已经足够。然而,对于更高性能或长期使用,不需要显示器的配方将从将全部 1008 MB 内存分配给 CPU 中受益。
还有更多...
raspi-config 工具用于配置 Raspberry Pi 的许多基本组件。其使用示例可以在本章中名为 扩展文件系统大小 和 配置远程访问 的配方中找到。
配置远程访问(raspi-config)
本配方展示了如何使用 raspi-config 工具配置 Raspberry Pi 的远程访问。
对于大多数网络应用程序,不需要图形用户界面(GUI 桌面)。创建 GUI 桌面所耗费的内存和处理能力可以用于提升网络应用程序的性能。本书中的大部分配方都是为远程使用而编写的,无需图形用户界面。
注意
如果你安装了 Raspbian Linux 发行版(如 第一章,安装与设置 中所推荐的那样),则已经启用了通过 SSH 协议进行安全远程访问。
Raspbian Linux 默认启用通过 SSH 的远程访问。
完成本配方后,你的 Raspberry Pi 将可以通过 安全外壳(SSH)协议在本地网络中从另一台 PC 安全访问。
准备工作
本配方所需的材料如下:
-
对于已经开机的 Raspberry Pi,进行初步设置或基本网络设置。你还需要以
pi用户身份登录(有关如何启动和登录的说明,请参阅 第一章,安装与设置,有关如何远程登录的说明,请参阅本章后续部分的配方)。 -
网络连接是可选的要求。
如果 Raspberry Pi 已启用远程访问,可以通过 SSH 或 PuTTY 远程完成本配方(有关 SSH 和 PuTTY 远程访问的配方,请参阅本章后面的部分)。
如何操作...
按照以下步骤配置远程访问到 Raspberry Pi:
-
执行
raspi-config命令,如下所示:pi@raspberrypi ~ $ sudo raspi-config -
raspi-config主菜单随即显示:┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐ │ │ │ 1 Expand Filesystem Ensures that all of the SD card s │ │ 2 Change User Password Change password for the default u │ │ 3 Boot Options Choose whether to boot into a des │ │ 4 Internationalisation Options Set up language and regional sett │ │ 5 Enable Camera Enable this Pi to work with the R │ │ 6 Add to Rastrack Add this Pi to the online Raspber │ │ 7 Overclock Configure overclocking for your P │ │ 8 Advanced Options Configure advanced settings │ │ 9 About raspi-config Information about this configurat │ │ │ │ <Select> <Finish> │ │ │ └──────────────────────────────────────────────────────────────────────────────┘ -
使用上下箭头键更改选择项,然后按 Enter 键选择 高级选项。
-
高级选项菜单显示:
┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐ │ │ │ A1 Overscan You may need to configure oversca │ │ A2 Hostname Set the visible name for this Pi │ │ A3 Memory Split Change the amount of memory made │ │ A4 SSH Enable/Disable remote command lin │ │ A5 Device Tree Enable/Disable the use of Device │ │ A6 SPI Enable/Disable automatic loading │ │ A7 I2C Enable/Disable automatic loading │ │ A8 Serial Enable/Disable shell and kernel m │ │ A9 Audio Force audio out through HDMI or 3 │ │ A0 Update Update this tool to the latest ve │ │ │ │ <Select> <Back> │ │ │ └──────────────────────────────────────────────────────────────────────────────┘ -
从 高级选项 菜单中选择 SSH 以启用远程访问。
-
以下屏幕出现:
┌──────────────────────────────────────────────────────────┐ │ │ │ Would you like the SSH server enabled or disabled? │ │ │ │ <Enable> <Disable> │ │ │ └──────────────────────────────────────────────────────────┘ -
使用 Tab 键选择选项,然后按 Enter 键或选择 启用。
-
稍等片刻后,SSH 服务器被启用:
┌──────────────────────────────────────────────────────────┐ │ │ │ SSH server enabled │ │ │ │ <Ok> │ │ │ └──────────────────────────────────────────────────────────┘ -
点击 确定 返回主菜单。
-
从主菜单中点击完成,然后点击是以重启树莓派并启用远程访问。
它是如何工作的...
raspi-config主菜单中的一个选项是启用 Open SSH 安全外壳服务器。Open SSH 服务器可以通过网络连接实现对树莓派的安全访问。启用后,每次树莓派启动时,SSH 服务器将自动启动。
若要禁用远程访问,请禁用 Open SSH 服务器。可以使用与本菜谱中相同的步骤通过raspi-config工具禁用服务器,不同的是当工具询问“您是否希望启用或禁用 SSH 服务器?”时,应该选择禁用。
安全外壳服务器在树莓派上运行。可以使用客户端程序——例如 Mac OS X 或 Linux 上的 SSH,或 Windows 上的 PuTTY——来连接到安全外壳服务器。客户端程序是一个虚拟终端,一旦连接,允许用户远程与树莓派交互,就像直接连接了键盘和显示器一样。虚拟终端无法直接运行 X Windows。因此,您需要使用另一个工具来远程查看树莓派的 GUI 桌面。
还有更多...
该raspi-config工具用于配置树莓派的许多基本组件。更多使用示例可以在名为扩展文件系统大小和配置内存使用的菜谱中找到。
本章中的远程访问(SSH)和远程访问(PuTTY)方法提供了如何使用 SSH 客户端从 Mac OS X、Linux 和 Windows 进行远程连接的说明。
在第五章,高级网络配置,远程连接桌面方法展示了如何远程访问树莓派的 GUI 桌面。
另见
-
Secure Shell (
en.wikipedia.org/wiki/Secure_Shell): 这篇关于 Secure Shell 的 Wikipedia 文章介绍了它作为一种安全数据通信的网络协议。文章概述了该协议的历史,解释了其架构和漏洞,并包含了当前实现的链接。 -
OpenSSH (
www.openssh.org/): Open SSH 是 SSH1 和 SSH2 协议的实现,最初是作为 FreeBSD 项目的一部分设计的。现在,它是大多数 Linux 发行版的一部分,包括 Raspbian Linux。
使用 SSH 获取远程访问
本菜谱展示了如何使用ssh命令远程访问树莓派。
在树莓派配置为每次启动时自动启动安全外壳服务器后(请参见本章之前名为配置远程访问的菜谱),可以使用安全外壳客户端ssh远程访问树莓派。
ssh 命令是当前版本的 Mac OS X 操作系统中内置的,并且也适用于大多数 Linux 发行版。对于 Microsoft Windows 操作系统,则需要使用其他工具(请参见名为 远程访问(PuTTY) 的食谱)。
本食谱从直接登录 Raspberry Pi 开始,使用附加的键盘和显示器来发现 Raspberry Pi 的 IP 地址。知道 IP 地址后,本食谱展示如何通过另一台计算机使用 SSH 登录 Raspberry Pi。
完成本食谱后,你将不再需要直接通过附加键盘登录 Raspberry Pi,也不需要显示器。你将能够从同一网络上的另一台 PC 远程管理你的 Raspberry Pi。
准备工作
本食谱所需的配料如下:
-
你需要对已开机的 Raspberry Pi 进行初始设置。你还需要以用户
pi身份登录(有关如何启动和登录的说明,请参见第一章,安装和设置部分)。 -
需要网络连接。
-
还需要一台运行 Mac OS X、Linux 或其他 Unix 基础操作系统的 PC。
如何操作…
执行以下步骤通过 ssh 命令远程访问 Raspberry Pi:
-
在 Max OS X 或 Linux 电脑上,使用
ssh命令以用户pi身份登录名为raspberrypi.local的主机,方法如下:golden-macbook:~ rick$ ssh pi@raspberrypi.local The authenticity of host 'raspberrypi.local (192.168.2.10)' can't be established. RSA key fingerprint is f3:de:d3:58:eb:66:1e:23:2c:6e:cf:c9:12:0c:e3:e2. -
由于这是你首次通过安全 shell 远程连接到 Raspberry Pi,因此 Raspberry Pi 会分享其安全指纹用于以后识别。
-
当提示时,回答
yes以继续连接,询问如下:Are you sure you want to continue connecting (yes/no)?。Are you sure you want to continue connecting (yes/no)? yes -
输入
yes后,你会看到提示,告诉你 Raspberry Pi 的安全指纹已永久添加到已知主机列表中。然后,系统会提示你输入密码:Warning: Permanently added 'raspberrypi.local' (RSA) to the list of known hosts. pi@raspberrypi.local's password: -
输入 Raspberry Pi 上用户
pi的密码(如果你还没有更改密码,默认密码是raspberry)。随后,你将看到登录信息和命令提示符:The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Mon Nov 23 00:43:40 2015 from fe80::12dd:b1ff:feee:dfc6%eth0 pi@raspberrypi ~ $ -
输入
exit退出登录:pi@raspberrypi ~ $ exit logout Connection to raspberrypi.local closed. golden-macbook:~ rick$
它是如何工作的…
本食谱从使用ssh命令通过默认用户名pi和默认主机名raspberrypi.local登录 Raspberry Pi 开始。默认密码是raspberry。
ssh 命令的登录参数格式为user@hostname。示例中显示pi@raspberrypi.local,因为我们希望以用户pi身份登录本地网络上的raspberrypi主机。
由于这是我们第一次从 golden-macbook 计算机登录到 Raspberry Pi,golden-macbook 计算机表示它无法验证 Raspberry Pi 的真实性。因此,Raspberry Pi 共享了其安全数字指纹(f3:de:d3:58:eb:66:1e:23:2c:6e:cf:c9:12:0c:e3:e2)。一旦我们同意接受来自这台新计算机的连接,golden-macbook 计算机会表示它将永久存储此指纹。
数字指纹
安全数字指纹是 SSH 协议的一部分。每台计算机都有其独特的数字指纹,就像人类的指纹对于每个人都是唯一的。golden-macbook 计算机存储了 Raspberry Pi 的指纹,以防止欺骗攻击,这是其他计算机可以实施的。其他计算机不应与 Raspberry Pi 的数字指纹相同。
在接受并存储 Raspberry Pi 的指纹后,系统会提示我们输入raspberrypi.local主机上pi用户的密码。输入密码后,我们将看到 Raspberry Pi 的登录信息、上次登录日期和命令提示符。
对于这个操作,已经没有其他事情需要做了。所以,我们将在命令提示符下输入exit,此时与 Raspberry Pi 的远程连接会被关闭。
主机名
使用默认主机名raspberrypi.local并不总是能成功登录。有时,你需要先找出 Raspberry Pi 的 IP 地址才能登录。
如果你已将 Raspberry Pi 连接到键盘和显示器,可以使用hostname命令发现 Raspberry Pi 的 IP 地址。–I选项要求命令显示 Raspberry Pi 的所有 IP 地址:
pi@raspberrypi ~ $ hostname –I
192.168.2.12
pi@raspberrypi ~ $
在发现 IP 地址(192.168.2.12)后,可以使用该地址远程登录到 Raspberry Pi,如下所示:
golden-macbook:~ rick$ ssh pi@192.168.2.12
pi@192.168.2.12's password:
还有更多...
让我们看一下远程登录的其他要求。
查找 Raspberry Pi 的 IP 地址
在远程登录之前,必须知道 Raspberry Pi 的网络地址。可以通过连接的键盘和显示器使用hostname命令直接从 Raspberry Pi 发现 IP 地址。也可以通过本地网络网关或 DSL 路由器的配置界面发现 IP 地址。以下截图展示了在 DSL 路由器的配置界面中,名为raspberrypi的设备的 IP 地址是如何显示的:

设备(如 Raspberry Pi)的 IP 地址是设备网络接口的永久硬件地址(b8:27:eb:29:aa:5a)与其在本地网络拓扑中的当前地址(192.168.1.79)之间的映射。在之前的示例中,为名为raspberrypi的设备分配的网络 ID 是79,并位于本地网络的 192.168.1 子网中。
大多数家庭和小型办公室网络尝试将网络 ID 半永久性地分配给相同的设备(硬件地址)。因此,一旦被发现,树莓派的 IP 地址不太可能发生变化。
欺骗安全指纹
SSH(安全外壳工具)使用加密技术确保树莓派与网络上其他计算机之间的通信保持安全。在首次启动时,安全外壳服务器会生成一个唯一的安全密钥,像指纹一样,可以用来唯一标识该特定的安全外壳服务器。首次连接到指定 IP 地址的安全外壳客户端时,客户端会提示用户验证该服务器是否具有正确的指纹。然后,它会存储密钥,以便下次连接时识别该服务器。
安全外壳客户端将阻止使用相同 IP 地址但不同安全密钥的机器登录。这有助于防止黑客通过窃取设备的 IP 地址来伪造设备。以下示例展示了 SSH 在怀疑有黑客攻击时的处理情况。在这个例子中,实际上只是树莓派的新安装:
golden-macbook:~ rick$ ssh pi@192.168.2.10
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
f3:de:d3:58:eb:66:1e:23:2c:6e:cf:c9:12:0c:e3:e2.
Please contact your system administrator.
Add correct host key in /Users/A601012/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/A601012/.ssh/known_hosts:58
RSA host key for 192.168.2.10 has changed and you have requested strict checking.
Host key verification failed.
golden-macbook:~ rick$
每次新安装都会创建新的数字指纹
每次新的计算机安装都会生成新的数字指纹。因此,树莓派的数字指纹会发生变化。金色 MacBook 刚接收到的数字指纹已经与它所存储的指纹不匹配。因此,无法访问树莓派。防止黑客成功进行中间人攻击的相同安全检查,也会阻止登录到重新安装的树莓派。
树莓派的旧的无效数字指纹仍然保存在金色 MacBook 中,并可以使用 ssh-keygen 命令的 –R 选项将其删除,如以下代码所示:
golden-macbook:~ rick$ ssh-keygen -R 192.168.2.10
# Host 192.168.2.10 found: line 3 type RSA
/Users/golden/.ssh/known_hosts updated.
Original contents retained as /Users/golden/.ssh/known_hosts.old
golden-macbook:~ rick$
一旦旧的无效数字指纹被删除,ssh将不再阻止对该 IP 地址的访问。使用 ssh 的下一次登录与第一次登录相同。树莓派将共享其新的数字指纹,并将其存储以防止未来的攻击。
另见
-
hostname – 显示或设置系统的主机名 (
manpages.debian.net/cgi-bin/man.cgi?query=hostname):hostname命令可用于显示树莓派的 IP 地址。Debian 的 hostname 手册页面描述了该命令的所有选项,并附有如何更改系统主机名的说明。 -
ssh – OpenSSH SSH 客户端(远程登录程序) (
manpages.debian.net/cgi-bin/man.cgi?query=ssh): Debian 的 SSH 手册页面详细介绍了该命令及其选项。 -
ssh-keygen – 密钥生成、管理和转换 (
manpages.debian.net/cgi-bin/man.cgi?query=ssh-keygen):通过使用–R选项,ssh-keygen可用于从known_hosts文件中移除旧的数字指纹。Debian 手册页面提供了关于该命令及其如何支持安全外壳(SSH)协议的信息。
使用 PuTTY 获取远程访问
本教程展示了如何通过使用 PuTTY(一款最常用的 Windows 安全外壳客户端)来创建与树莓派的安全连接。
PuTTY,Windows 平台的安全外壳(SSH)客户端,并未内置于 Windows 操作系统中。然而,它是一个常用的第三方工具,用于安全通信。在开始此教程之前,您需要从互联网下载 PuTTY 并将其安装在 Windows 电脑上(下载网址在下一节中提供)。
注意
PuTTY 也有适用于 Mac OS X 和 Linux 的版本。
完成本教程后,您将能够从 Windows PC 远程管理树莓派。
准备工作
本教程使用以下材料:
-
您需要为已开机的树莓派进行初始设置或基本的网络配置。您还需要以
pi用户身份登录(有关如何启动和登录的说明,请参阅第一章,安装与设置部分)。 -
需要网络连接。
-
您需要一台已安装 PuTTY 的 Windows PC。
您可以在www.chiark.greenend.org.uk/~sgtatham/putty/找到 PuTTY 的下载链接以及安装说明。
操作方法…
按照以下步骤使用 PuTTY 命令远程访问树莓派:
-
双击
PuTTY.exe,在 Windows PC 上启动 PuTTY。 -
启动 PuTTY 时,会显示 PuTTY 配置屏幕,如下图所示:
![操作方法]()
在截图中,PuTTY 的配置窗口正在配置以连接到 IP 地址为 192.168.1.79 的树莓派。
-
在主机名字段中输入树莓派的 IP 地址,然后点击打开以连接到树莓派。
![操作方法]()
-
第一次远程连接树莓派时,PuTTY 会显示一条警告信息,表示树莓派的数字指纹(或主机密钥)尚未在 PuTTY 中注册,因为这是 PuTTY 首次看到树莓派的数字指纹。
-
单击是按钮接受树莓派的数字指纹并继续。
-
在接受安全警告后,系统会提示你输入用户名和密码。输入
pi作为用户名,然后输入在安装过程中为用户名pi配置的密码(默认密码为raspberry)。下图显示了使用 PuTTY 成功登录的画面:![如何操作...]()
-
输入
exit以注销。
它是如何工作的...
本教程从启动 PuTTY 客户端开始。
将 Raspberry Pi 的 IP 地址输入到 Host Name 字段中,然后点击 Open 按钮以建立与 Raspberry Pi 的安全连接。
在连接建立之前,PuTTY 会显示一个 Security Alert 警告框,提示 Raspberry Pi 的数字指纹(或主机密钥)尚未注册,并且 无法保证该服务器就是你认为的计算机。这个警告是正常的,并且是首次连接新计算机时预期的行为。点击 Yes 清除警告并将 Raspberry Pi 添加到 PuTTY 的已知主机列表中。
清除安全警告后,PuTTY 终端窗口会打开,系统会提示输入用于登录 Raspberry Pi 的用户名(login as:)和密码。输入用户名和密码后,欢迎信息和上次登录时间将显示,然后是命令提示符。
在这个教程中没有其他操作需要进行。因此,我们将使用 exit 命令来关闭连接。
还有更多内容...
每当重新安装 Raspberry Pi 时,它将生成一个新的数字指纹。PuTTY 在首次使用该新指纹时不会识别它。当 PuTTY 尝试连接到重新安装的 Raspberry Pi 时,会显示一条警告,指出发生了 POTENTIAL SECURITY BREACH(潜在的安全漏洞)(请参见下方截图)。
如果你刚刚重新安装了 Raspberry Pi,请不要慌张。PuTTY 尚未识别 Raspberry Pi 的新数字指纹。只需点击 Yes 按钮接受新的指纹即可。
如果你并非刚刚重新安装 Raspberry Pi,而这个警告突然出现,可能真的存在安全漏洞。因此,请检查你的网络连接,确保不存在中间人攻击的可能:

另见
-
PuTTY (
www.chiark.greenend.org.uk/~sgtatham/putty/): PuTTY 是一款免费的 Windows SSH 客户端。它也是一个 Telnet 客户端和 Xterm 模拟器。 -
Man-in-the-middle attack (
en.wikipedia.org/wiki/Man-in-the-middle_attack): 维基百科提供了有关中间人攻击的更多信息,其中攻击者秘密地转发并可能篡改两个看似直接通信的各方之间的通信。
更改登录密码(passwd)
本配方演示了如何更改登录密码。
一旦启用了 Raspberry Pi 的远程访问,任何知道正确用户名和密码的本地网络用户都可以远程登录。为了防止未经授权的访问 Raspberry Pi,安装完成后应立即更改默认安装密码。
raspi-config工具可以用来更改登录密码。然而,本配方使用的是passwd命令。passwd命令是一个标准的 GNU 工具,大多数 Linux 发行版都自带此命令,即使raspi-config不可用,通常也可以使用它。
经常更改登录密码可以有效防止未经授权的访问。您应该定期使用此配方来保护对 Raspberry Pi 的访问。
完成本配方后,您将能够更改登录密码。
准备工作
完成本配方所需的以下要素:
-
您需要为已开机的 Raspberry Pi 进行初始设置或基本网络设置。同时,您需要以
pi用户登录(有关如何启动并登录的说明,请参考第一章,安装与设置,以及本章前面的配方,了解如何远程登录的说明)。 -
网络连接是可选要求。
如果 Raspberry Pi 已启用远程访问,则可以使用 SSH 或 PuTTY 远程完成此配方(请参考远程访问(SSH)和远程访问(PuTTY)配方)。
如何操作...
执行以下步骤来更改登录密码:
-
使用
passwd命令来更改用户pi的密码,如下所示:pi@raspberrypi ~ $ passwd Changing password for pi. (current) UNIX password: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully pi@raspberrypi ~ $ -
输入当前的 Unix 密码,即登录时使用的密码。
注意
密码输入时不会显示。
-
输入新密码。
-
第二次输入新密码以进行验证。
-
命令会返回
passwd: password updated correctly。 -
登录密码已成功更改!
原理...
passwd命令首先会提示输入当前的登录密码,以确保尝试更改密码的用户确实被授权进行此操作。
为了保护密码不被旁人看到,输入时密码不会显示。如果当前密码输入错误,系统会要求重新输入密码。
一旦用户被授权,命令会提示输入新的 Unix 密码。同样,新密码不会显示。命令会要求你重新输入新密码,以确保密码输入正确。如果两次输入的密码不一致,将要求重新输入。
在新密码输入正确后,系统会通知您一条消息:“密码更新成功”。定期更改登录密码有助于防止未授权访问树莓派。
另见
- passwd - 更改用户密码 (
manpages.debian.net/cgi-bin/man.cgi?query=passwd):Debian 的passwd手册页面提供了该命令及其用法的详细信息。
添加用户(useradd)
本食谱演示如何在树莓派上添加一个新的用户登录。
为不同用户(或不同目的)创建独立的登录有助于提高树莓派的安全性,并通过为每个用户提供一个主目录来组织树莓派文件系统的使用,用户可以在该目录中整理自己的文件。
完成本食谱后,您将能够在树莓派上添加新用户。
准备工作
本食谱需要以下材料:
-
您需要先进行初始设置或基本的网络设置,以便树莓派通电后使用。您还需要以
pi用户身份登录(参见第一章,安装与设置,了解如何启动和登录,并参考本章之前的食谱,了解如何远程登录)。 -
网络连接是一个可选要求。
如果树莓派启用了远程访问,可以通过 SSH 或 PuTTY 远程完成此食谱(参见远程访问(SSH)和远程访问(PuTTY)食谱)。
如何操作...
执行以下步骤以添加新用户:
-
使用
ls命令显示已经拥有主目录的用户,具体如下:pi@raspberrypi ~ $ ls -l /home total 8 drwxr-xr-x 3 pi pi 4096 Jun 28 05:00 pi pi@raspberrypi ~ $ -
执行
adduser命令以添加用户名为golden的用户,具体如下:pi@raspberrypi ~ $ sudo adduser golden Adding user `golden' ... Adding new group `golden' (1002) ... Adding new user `golden' (1001) with group `golden' ... Creating home directory `/home/golden' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for golden Enter the new value, or press ENTER for the default Full Name []: Rick Golden Room Number []: rick@golden-garage.net Work Phone []: +1 (650) 555-1212 Home Phone []: +1 (650) 555-1212 Other []: Is the information correct? [Y/n] Y -
adduser命令会提示输入新 Unix 密码,但在输入时不会显示密码。因此,系统会要求您重新输入新 Unix 密码,以便验证该密码。 -
输入密码后,系统会提示输入新用户的全名、房间号、工作电话及其他信息。这些信息都不是必填项,您可以留空。
-
当新用户信息完全输入后,系统会提示
信息正确吗?[Y/n]。键入Y并按Enter键即可将新用户添加到树莓派中。 -
使用
ls命令显示新用户的主目录,具体如下:pi@raspberrypi ~ $ ls -l /home total 8 drwxr-xr-x 2 golden golden 4096 Jun 29 04:12 golden drwxr-xr-x 3 pi pi 4096 Jun 28 05:00 pi pi@raspberrypi ~ $ -
最后,注销并重新以新用户身份登录!
如何操作...
首先,列出当前用户的主目录。列表中只有一个用户的主目录,即用户名为pi的用户的主目录。
新用户golden已被添加到系统中。新用户已设置密码和用户信息。当所有新用户信息输入完成后,系统将接受并认为这些信息是正确的,用户名为golden的新用户将被创建。
添加新用户后,再次列出用户的主目录。此时,列出了两个用户主目录,分别是 golden 和 pi。
最后,我们可以注销并重新以 golden 用户身份登录。
参见
-
useradd - 创建新用户或更新默认新用户信息
(
manpages.debian.net/cgi-bin/man.cgi?query=useradd): Debian 手册页为useradd命令提供了详细的功能和选项说明,并提供了有关如何在 Raspbian Linux 发行版中管理用户和组的背景信息。
给用户赋予 sudo 权限(id 和 usermod)
本配方展示了如何将用户添加到特权的 sudo 组。
当用户创建时,默认赋予他们普通的用户权限。用户可以登录到 Raspberry Pi,创建和删除自己的用户目录中的文件,执行任何不需要超级用户权限的命令。如果你希望新用户执行特殊命令,如 shutdown、reboot 和 raspi-config,你需要将该用户添加到 sudo 用户组。
完成本配方后,你将能够通过将用户添加到 sudo 用户组,为普通用户赋予超级用户权限。
准备工作
本配方使用了以下配料:
-
你需要为已启动的 Raspberry Pi 进行初始设置或基础网络设置。你还需要以用户
pi登录(参考 第一章,安装与设置 配方,了解如何启动和登录,以及本章前面的配方,了解如何远程登录)。 -
网络连接是可选要求。
如果 Raspberry Pi 启用了远程访问功能,则可以通过 SSH 或 PuTTY 远程完成此配方(参考 远程访问(SSH) 和 远程访问(PuTTY) 配方)。
如何操作...
执行以下步骤将用户添加到 sudo 组:
-
使用
id命令查看用户名为golden的用户当前属于哪些组,如下所示:pi@raspberrypi ~ $ id golden uid=1001(golden) gid=1002(golden) groups=1002(golden) pi@raspberrypi ~ $ -
然后,使用
usermod –a -G命令将用户名为golden的用户添加到sudo用户组,如下所示:pi@raspberrypi ~ $ sudo usermod -a -G sudo golden pi@raspberrypi ~ $ -
使用
id命令验证用户是否确实已被添加到sudo组:pi@raspberrypi ~ $ id golden uid=1001(golden) gid=1002(golden) groups=1002(golden),27(sudo) pi@raspberrypi ~ $ -
现在,用户名为
golden的用户是27(sudo)组的成员,可以执行需要超级用户权限的命令并修改文件!
它是如何工作的...
首先,id 命令列出用户名为 golden 的用户当前所属的组。
然后,使用 usermod 命令将 sudo 组(-G sudo)添加到该用户(-a)。
最后,再次使用 id 命令查看 golden 属于哪些组。
现在,用户名为 golden 的用户可以通过在命令前加上 sudo 命令来执行需要超级用户权限的命令。本章的第一个实例,以特权执行命令,提供了更多关于 sudo 命令及其使用的信息。
参见
-
id - 打印真实有效的用户和组 ID (
manpages.debian.net/cgi-bin/man.cgi?query=id):Debian 手册页为id命令列出了相关选项。 -
usermod - 更改用户密码 (
manpages.debian.net/cgi-bin/man.cgi?query=usermod):Debian 手册页为usermod命令提供了该命令及其用法的详细信息。
第三章:维护
本章将涵盖以下主题:
-
更新操作系统(
apt-get) -
使用
sources.list从wheezy升级到jessie的 Raspbian -
搜索软件包(
apt-cache) -
安装软件包(
apt-get) -
包管理(
aptitude) -
阅读内置文档(
man) -
阅读内置文档(
info)
介绍
本章中的配方是关于树莓派的基本维护。
前几个配方展示了如何更新 Raspbian 操作系统并安装新软件包,而最后两个配方则展示了如何访问树莓派上已内置的文档。
注意
本章中的配方适用于基于 Debian 的操作系统,如 PiNet、Raspbian(树莓派基金会推荐)和 Ubuntu MATE。
其他操作系统,如 Pidora 和 RISC OS,拥有自己独立的更新和安装机制。有关如何在这些操作系统上更新和安装软件的说明,请访问它们各自的官方网站。该配方末尾的另见部分提供了相关参考链接。
完成本章配方后,你将能够更新树莓派,并更好地理解内置文档。
更新操作系统(apt-get)
本配方演示了如何使用 apt-get 命令更新树莓派。
树莓派及其上运行的操作系统,如 Raspbian Linux 发行版,正在迅速发展。每周甚至每天都有新的更新和安全补丁可以下载和安装。
本配方使用名为 apt-get 的高级包管理工具命令行实用程序,将树莓派上已安装的软件更新到最新版本。此配方不安装新软件,只是升级已安装的软件。配方搜索软件包和安装软件包分别展示了如何搜索和安装新软件包。
完成本配方后,你将能够使用 apt-get 高级包管理工具更新 Raspbian 操作系统。
准备工作
材料:
-
你需要为已开机的树莓派进行初始设置或基础网络配置。你还需要以用户名为
pi的用户身份登录(可以参考第一章中的配方,安装与设置,了解如何启动和登录,并参考第二章中的配方,管理,了解如何远程登录)。 -
你还需要一个网络连接。
树莓派需要连接到互联网,以便访问更新服务器,从中获取软件更新和安全修复。
如果树莓派已启用远程访问,则可以使用SSH或 PuTTY(参见第二章中的远程访问食谱)在远程完成此操作。
如何操作...
按照以下步骤更新树莓派的操作系统:
-
直接或远程登录到树莓派。
-
执行
apt-get update命令来更新本地软件包数据库,如下所示:golden@raspberrypi ~ $ sudo apt-get update Get:1 http://mirrordirector.raspbian.org jessie InRelease [15.0 kB] Get:2 http://archive.raspberrypi.org jessie InRelease [13.3 kB] Get:3 http://mirrordirector.raspbian.org jessie/main armhf Packages [8,961 kB] Get:4 http://archive.raspberrypi.org jessie/main Sources [31.2 kB] Get:5 http://archive.raspberrypi.org jessie/ui Sources [5,197 B] Get:6 http://archive.raspberrypi.org jessie/main armhf Packages [101 kB] Get:7 http://archive.raspberrypi.org jessie/ui armhf Packages [7,639 B] Ign http://archive.raspberrypi.org jessie/main Translation-en_GB Ign http://archive.raspberrypi.org jessie/main Translation-en Ign http://archive.raspberrypi.org jessie/ui Translation-en_GB Ign http://archive.raspberrypi.org jessie/ui Translation-en Get:8 http://mirrordirector.raspbian.org jessie/contrib armhf Packages [37.5 kB] Get:9 http://mirrordirector.raspbian.org jessie/non-free armhf Packages [70.2 kB] Get:10 http://mirrordirector.raspbian.org jessie/rpi armhf Packages [1,356 B] Ign http://mirrordirector.raspbian.org jessie/contrib Translation-en_GB Ign http://mirrordirector.raspbian.org jessie/contrib Translation-en Ign http://mirrordirector.raspbian.org jessie/main Translation-en_GB Ign http://mirrordirector.raspbian.org jessie/main Translation-en Ign http://mirrordirector.raspbian.org jessie/non-free Translation-en_GB Ign http://mirrordirector.raspbian.org jessie/non-free Translation-en Ign http://mirrordirector.raspbian.org jessie/rpi Translation-en_GB Ign http://mirrordirector.raspbian.org jessie/rpi Translation-en Fetched 9,243 kB in 37s (245 kB/s) Reading package lists... Done pi@raspberrypi ~ $ -
执行
apt-get –y dist-upgrade命令来升级系统,如下所示:golden@raspberrypi ~ $ sudo apt-get dist-upgrade -y Reading package lists... Done Building dependency tree Reading state information... Done Calculating upgrade... Done -
可升级的软件包列表的计算方式如下:
The following packages will be upgraded: cups-bsd cups-client cups-common fuse libcups2 libcupsimage2 libfuse2 libsqlite3-0 libssl1.0.0 openssl raspi-config 11 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 3,877 kB of archives. After this operation, 455 kB disk space will be freed. -
每个软件包下载时,都会显示状态信息,如下所示:
Get:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main libssl1.0.0 armhf 1.0.1e-2+rvt+deb7u17 [1,053 kB] Get:2 http://archive.raspberrypi.org/debian/ jessie/main raspi-config all 20150131-4 [13.2 kB] … Get:11 http://mirrordirector.raspbian.org/raspbian/ jessie/main openssl armhf 1.0.1e-2+rvt+deb7u17 [702 kB] Fetched 3,877 kB in 3s (1,060 kB/s) -
在下载可升级软件包后,它们将被预配置并准备好安装:
Preconfiguring packages ... (Reading database ... 77851 files and directories currently installed.) Preparing to replace libssl1.0.0:armhf 1.0.1e-2+rvt+deb7u16 (using .../libssl1.0.0_1.0.1e-2+rvt+deb7u17_armhf.deb) ... Unpacking replacement libssl1.0.0:armhf ... Preparing to replace libsqlite3-0:armhf 3.7.13-1+deb7u1 (using .../libsqlite3-0_3.7.13-1+deb7u2_armhf.deb) ... Unpacking replacement libsqlite3-0:armhf ... … -
在软件包预配置并准备好安装后,它们将被安装:
Processing triggers for man-db ... Processing triggers for initramfs-tools ... Setting up libssl1.0.0:armhf (1.0.1e-2+rvt+deb7u17) ... Setting up libsqlite3-0:armhf (3.7.13-1+deb7u2) ... Setting up libcups2:armhf (1.5.3-5+deb7u6) ... Setting up libcupsimage2:armhf (1.5.3-5+deb7u6) ... Setting up cups-common (1.5.3-5+deb7u6) ... Setting up cups-client (1.5.3-5+deb7u6) ... Setting up cups-bsd (1.5.3-5+deb7u6) ... Setting up libfuse2:armhf (2.9.0-2+deb7u2) ... Setting up fuse (2.9.0-2+deb7u2) ... udev active, skipping device node creation. update-initramfs: deferring update (trigger activated) Setting up openssl (1.0.1e-2+rvt+deb7u17) ... Setting up raspi-config (20150131-4) ... golden@raspberrypi ~ $ -
当
apt-get dist-upgrade命令完成时,树莓派上当前可升级的软件将被完全安装和配置,所有当前的安全修复也将被应用。 -
为确保树莓派使用所有可升级的软件包,重启系统。使用
reboot命令来重启树莓派,如下所示:pi@raspberrypi ~ $ sudo reboot Broadcast message from root@raspberrypi (pts/0) (Sun Jul 5 12:24:10 2015): The system is going down for reboot NOW! pi@raspberrypi ~ $ Connection to 192.168.2.8 closed by remote host. Connection to 192.168.2.8 closed. golden-macbook:~ rick$ -
当树莓派重启后,升级完成!
它是如何工作的...
登录到树莓派后,使用apt-get更新命令来更新本地软件包数据库,该数据库是当前可用软件包的本地副本。
在本地软件包数据库更新后,使用apt-get dist-upgrade命令来确定哪些软件包可以升级,下载可升级的软件包,并预配置和安装这些软件包。
当apt-get dist-upgrade命令完成时,树莓派会重启,以确保它使用所有新升级的软件包和安全修复。
还有更多内容…
Raspbian Linux 发行版,像大多数树莓派的操作系统发行版一样,是作为一系列软件包的集合进行组织的。每个软件包包含一个或多个应用程序及其配置文件和支持库。每个软件包还会标明其当前版本以及对其他软件包的依赖关系。高级软件包工具(apt)及其支持工具,如apt-get,用于管理 Raspbian Linux 发行版的软件包。
另见
-
apt – 高级软件包工具 (
manpages.debian.net/cgi-bin/man.cgi?query=apt): 这是 Debian 对apt的手册页面。 -
apt-get – APT 软件包管理 (
manpages.debian.net/cgi-bin/man.cgi?query=apt-get): 这是 Debian 对apt-get的手册页面。
使用 sources.list 将 Raspbian 从 wheezy 升级到 jessie
本食谱展示了如何将树莓派 2 从 Raspbian Linux 发行版的jessie版本升级到stretch版本。
目前,有三个版本的 Raspbian 操作系统可供树莓派 2 使用,分别是wheezy、jessie和stretch。这些发行版的源地址在mirrordirector.raspbian.org/raspbian。
wheezy发行版基于 Debian 7,jessie基于 Debian 8,而stretch基于 Debian 9。目前的stable版本是jessie。默认的wheezy版本被认为是oldstable发行版。下一个计划发布的版本是testing,即stretch。
提示
如果你计划将操作系统从一个版本升级到另一个版本,包括从jessie到stretch,你应该在安装其他软件包之前进行升级,因为这样将大大简化整体升级过程。
树莓派基金会为wheezy和jessie版本的操作系统提供了默认镜像。本食谱中的说明适用于你想保持现有wheezy配置但尝试升级到jessie的情况。或者,当你想尝试stretch,即 Raspbian 操作系统的下一个版本时,也可以使用这些说明。
目前,Raspbian 没有升级操作系统版本的工具。升级一个版本到另一个版本(比如从wheezy到jessie,即从old stable到stable)的唯一方法是按照本食谱中的说明进行操作。
注意
这次升级将修改超过一千个软件包。升级需要至少 4 小时!
将操作系统从一个版本升级到另一个版本是有风险的。中断版本升级可能会使系统处于不稳定状态。然而,如果你想尝试最新的操作功能或升级已经配置好的操作系统,这个风险可能是值得的。
注意
小于 8 GB 的 SD 卡空间不足以完成升级。如果在升级之前已经安装了额外的包,那么升级会需要更长的时间。
完成本食谱后,你将把 Raspbian 从一个版本升级到另一个版本:从wheezy到jessie,或者从jessie到stretch。
准备工作
材料:
-
你需要一个已启动的树莓派,且该设备已进行初始设置或基本网络配置。同时,你还需要以用户名为
pi的用户登录(可以参考第一章中的食谱,安装与设置,了解如何启动和登录,以及参考第二章中的食谱,管理,了解如何远程登录)。 -
还需要一个网络连接。
Raspberry Pi 需要连接互联网,才能访问更新服务器以拉取软件更新和安全修复。
如果 Raspberry Pi 已启用远程访问,可以使用 ssh 或 PuTTY 远程完成此操作(可以查看 第二章中的 远程访问 配方,管理)。
注意
本配方使用 vi 文本编辑器修改配置文件。也可以使用其他文本编辑器。Raspberry Pi 上可用的另一个编辑器是 nano 文本编辑器。
关于编辑器使用的文档可以在编辑器本身中找到(在 vi 中输入 :help 或在 nano 中按
如何操作...
执行以下步骤,将 Raspbian Linux 从一个版本升级到另一个版本:
-
直接或远程登录到 Raspberry Pi。
-
使用 vi(或其他编辑器)修改
/etc/apt/sources.list。从 wheezy 升级到 jessie 时,将每行第三个字段的值从 wheezy 改为 jessie。 从 jessie 升级到stretch时,将第三个字段的值改为stretch,如下所示:pi@raspberrypi:~$ sudo vi /etc/apt/sources.list deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi # Uncomment line below then 'apt-get update' to enable 'apt-get source' #deb-src http://archive.raspbian.org/raspbian/ stretch main contrib non-free rpi ~ ~ ~ "/etc/apt/sources.list" 3 lines, 234 characters -
使用
vi(或其他编辑器)修改/etc/apt/sources.list.d/raspi.list。从wheezy升级到jessie时,将每行第三个字段的值从wheezy改为jessie。从jessie升级到stretch时,此次不要修改此文件:pi@raspberrypi:~$ sudo vi /etc/apt/sources.list.d/raspi.list deb http://archive.raspberrypi.org/debian/ jessie main # Uncomment line below then 'apt-get update' to enable 'apt-get source' #deb-src http://archive.raspberrypi.org/debian/ jessie main ~ ~ ~ "/etc/apt/sources.list.d/raspi.list" 3 lines, 187 characters -
如果你从
wheezy升级到jessie,请使用rm命令删除collabora.list配置文件。如果你从jessie升级到stretch,此文件不存在。因此,你需要 跳过此步骤:pi@raspberrypi ~ $ sudo rm /etc/apt/sources.list.d/collabora.list pi@raspberrypi ~ $ -
现在,按照前面的配方更新操作系统(更新操作系统)。
提示
请注意,此更新可能会超过 4 小时!
它是如何工作的...
登录 Raspberry Pi 后,会更改 apt 的 sources.list 配置。
/etc/apt/sources.list 文件已被修改,使其引用下一个版本的 Debian。例如,如果前一个版本是 wheezy,则改为 jessie;如果前一个版本是 jessie,则改为 stretch。
/etc/apt/sources.list.d/raspi.list 文件只有在前一个版本为 wheezy 时才会被修改。即使你升级到 stretch,该文件应引用 Debian 版本,也就是 jessie。
注意
在写这本书时,如果你从 jessie 升级到 stretch,raspi.list 文件无需更改。如果你在 2016 年春季后使用此配方,你需要查看 Debian 仓库 archive.raspberrypi.org/debian/dists/ 以检查是否有 stretch 发行版文件夹。如果有该文件夹,更新此文件的第三个字段为 stretch。
从 wheezy 升级到 jessie 时,使用 rm 命令删除 collabora.list 配置文件。对于 jessie 版本的 Raspbian 操作系统,此文件不存在。因此,可以跳过此步骤。
更改源之后,使用之前的食谱(更新操作系统)来更新操作系统。
还有更多……
apt-get update 命令用于从 /etc/apt/sources.list 文件中配置的软件分发站点和位于 /etc/apt/sources.list.d 目录中的文件中获取当前的软件目录。
sources.list 和 sources.list.d
位于 /etc/apt 目录中的 sources.list 文件指向来自 raspbian.org 的基础操作系统分发,而位于 /etc/apt/sources.list.d 目录中的文件(raspi.list)则指向附加的 Raspberry Pi 软件包位置。
在以下终端会话中,使用 cat 命令显示 wheezy 版本的 Raspbian Linux 分发的源文件内容:
pi@raspberrypi ~ $ cat /etc/apt/sources.list
deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspbian.org/raspbian/ wheezy main contrib non-free rpi
pi@raspberrypi ~ $ ls /etc/apt/sources.list.d/
collabora.list raspi.list
pi@raspberrypi ~ $ cat /etc/apt/sources.list.d/collabora.list
deb http://raspberrypi.collabora.com wheezy rpi
pi@raspberrypi ~ $ cat /etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ wheezy main
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspberrypi.org/debian/ wheezy main
pi@raspberrypi ~ $
这些配置文件中的每个文件描述了一个或多个软件包仓库的位置。每个文件中优先列出最受推荐的仓库。sources.list 文件优于 sources.list.d 目录中的文件。
sources.list 文件格式
这些文件的格式很简单。每一行描述了一个软件分发库中的软件包集合,提供集合的类型、集合名称以及集合包的位置。
每行中的第一项定义了集合的类型。对于基于 Debian 的分发,如 Raspbian Linux 分发,定义为 deb 或 deb-src。deb-src 目录包含源代码和已编译的二进制文件。
每行中的第二项是软件分发库的根位置。sources.list 文件指向位于 mirrordirector.raspbian.org 网站上的 raspbian 操作系统分发的根目录。collabora.list 文件指向由 Collabora 提供的位于 raspberrypi.collabora.com 网站上的软件包。此外,raspi.list 文件指向由 Raspberry Pi 基金会提供的附加 Raspberry Pi 特定软件包,这些软件包位于 archive.raspberrypi.org 网站上。
每行中的第三项是你想使用的 Debian 操作系统版本的名称。所有文件应指定相同的版本。在撰写本书时,jessie 被认为是当前稳定版的 Debian。一个新的版本,名为 stretch,将很快发布。
该行的其余部分是一个分发组件列表。基本发行版的配置文件命名为 source.list,它指向 Raspbian Linux 发行版,并定义了多个组件。每个二级配置文件,即 collabra.list 和 raspi.list,指向更小的 Raspberry Pi 特定包的发行版。每个二级配置文件只有一个组件,即 collabra.list 为 rpi,raspi.list 为 main。
Debian 操作系统的标准软件包集合如下:
-
main:这是由核心团队支持的基础发行版。 -
contrib:包含由外部人员贡献给 Debian 的包,这些包由核心团队以外的人员支持。 -
non-free:包含不属于开源或有某些版权限制的包,这些包也由核心团队以外的人员支持。 -
rpi:包含 Raspberry Pi 特定的包,这些包由 Raspberry Pi 社区支持。 -
rpi2:包含专为新的 Raspberry Pi 2 芯片组设计并由 Raspberry Pi 社区支持的 Raspberry Pi 包。
另见
-
sources.list – APT 包资源列表 (
manpages.debian.net/cgi-bin/man.cgi?query=sources.list): Debian 的sources.list手册页面描述了配置文件的格式。 -
vim – VI 改进版 (
manpages.debian.net/cgi-bin/man.cgi?query=vi): Debian 的vi手册页面描述了文本编辑器的基本使用方法。 -
cat – 连接文件并打印到标准输出 (
manpages.debian.net/cgi-bin/man.cgi?query=cat): Debian 的 cat 手册页面描述了如何将文件打印到标准输出。 -
Debian – 通用操作系统 (
www.debian.org/): Raspbian Linux 操作系统发行版基于 Debian。 -
Debian 发行版 (
www.debian.org/releases/): Debian 发行版的命名规则在这里进行了说明。 -
Raspberry Pi 基金会论坛 (
www.raspberrypi.org/forums/): 你可以在 Raspberry Pi 基金会的论坛上报告 bug、错误或其他软件缺陷,或提出改进建议。 -
Pidora 是为 Raspberry Pi 优化的 Fedora Remix 版本 (
pidora.ca/): Pidora 不是基于 Debian 的操作系统。它基于 Fedora,这是 Red Hat Linux 企业版的开源版本。 -
RISC OS – 一款快速且易于定制的 ARM 设备操作系统 (
www.riscosopen.org/content/): RISC OS 是为 ARM 设备设计的原始操作系统,诞生于 1980 年代。 -
Collabora (
www.collabora.com/): Collabora 支持多个开源项目,包括专门为 Raspberry Pi 做出的贡献。
搜索软件包(apt-cache)
这个教程展示了如何使用 apt-cache 搜索软件包。
Raspbian Linux 发行版的完整软件目录包含了大量预构建的软件包,这些软件包可以直接下载和安装。通过 apt-cache 命令,可以通过关键词搜索这个庞大的软件目录。
这个教程特别针对在 Raspbian Linux 发行版的所有软件包名称中搜索关键字“fortune”。如果你想搜索其他软件包,可以将“fortune”关键字替换为你感兴趣的关键字。
完成此教程后,你将能够通过使用 apt-cache search 命令搜索关键字来定位软件包。
准备工作
配料:
-
你需要为已开机的 Raspberry Pi 设置 初始设置 或 基础网络设置,并且需要以用户名为
pi的用户身份登录(有关如何启动和登录的信息,请参见第一章的教程,安装和设置部分;有关如何远程登录的信息,请参见第二章的教程,管理部分)。 -
你还需要一个网络连接。
Raspberry Pi 需要连接到互联网,以便访问更新服务器,从而下载软件更新和安全修复。
如果 Raspberry Pi 启用了远程访问功能,可以通过 ssh 或 PuTTY 在远程完成这个教程(请参见第二章的远程访问教程,管理部分)。
如何操作...
执行以下步骤来搜索 Raspbian Linux 软件包:
-
直接或远程登录到 Raspberry Pi。
-
使用
apt-get update命令更新软件目录,如本章第一个教程中所述(更新操作系统),如下所示:pi@raspberrypi ~ $ sudo apt-get update -
执行
apt-cache search --names-only fortune命令。搜索缓存不需要超级用户权限:pi@raspberrypi ~ $ apt-cache search -–names-only fortune fortune-mod - provides fortune cookies on demand fortunes - Data files containing fortune cookies fortunes-min - Data files containing selected fortune cookies fortunes-off - Data files containing offensive fortune cookies fortune-zh - Chinese Data files for fortune fortunes-bg - Bulgarian data files for fortune fortunes-bofh-excuses - BOFH excuses for fortune fortunes-br - Data files with fortune cookies in Portuguese fortunes-cs - Czech and Slovak data files for fortune fortunes-de - German data files for fortune fortunes-debian-hints - Debian Hints for fortune fortunes-eo - Collection of esperanto fortunes. fortunes-eo-ascii - Collection of esperanto fortunes (ascii encoding). fortunes-eo-iso3 - Collection of esperanto fortunes (ISO3 encoding). fortunes-es - Spanish fortune database fortunes-es-off - Spanish fortune cookies (Offensive section) fortunes-fr - French fortunes cookies fortunes-ga - Irish (Gaelige) data files for fortune fortunes-it - Data files containing Italian fortune cookies fortunes-it-off - Data files containing Italian fortune cookies, offensive section fortunes-mario - Fortunes files from Mario fortunes-pl - Polish data files for fortune fortunes-ru - Russian data files for fortune libfortune-perl - Perl module to read fortune (strfile) databases golden@raspberrypi ~ $ -
该命令显示了一个包含fortune名称的软件包列表。
工作原理...
登录到 Raspberry Pi 后,使用本章中的第一个教程更新 Raspbian Linux 软件目录,即 更新操作系统。
一旦软件目录更新完成,使用 apt-cache search 命令可以搜索包含 fortune 关键字的软件包名称(--names-only)。
搜索返回的一个软件包,fortune-mod,是一个命令行工具,可以按需提供幸运饼干。
以 fortunes- 开头的软件包包含了 fortune 命令行工具在显示幸运饼干时从中选择的命运集合。
还有更多…
在这个食谱中,我们在 Raspbian Linux 软件目录中搜索了包名包含 "fortune" 的软件包。由于指定了 --names-only 选项,搜索仅限于包名。当没有使用 --names-only 选项时,apt-cache 命令会在软件包的摘要中也搜索指定的关键词。
apt-cache search 命令接受多个关键词作为参数。如果给定多个关键词,结果会缩小到只包含所有关键词的软件包。以下是如何搜索德国语言的幸运语句的示例:
pi@raspberrypi:~$ apt-cache search fortunes german
fortunes-de - German data files for fortune
pi@raspberrypi:~$
安装 fortune 包的详细步骤请参见下一个食谱。
另见
- apt-cache – 查询 APT 缓存 (
manpages.debian.net/cgi-bin/man.cgi?query=apt-cache)apt-cache命令可以从本地 Debian 软件目录的元数据中生成有趣的输出。Debian 的apt-cache手册页描述了该命令及其选项。
安装软件包(apt-get)
本食谱演示了如何使用 apt-get install 命令安装新的软件包。
除了更新软件包目录和升级已经安装的软件包外,apt-get 命令还可以用来安装新的软件包。
在这个食谱中,fortune-mod 软件包是通过 apt-get install 命令安装的。其他软件包也可以使用这个食谱安装;只需将 fortune-mod 包替换为你想要安装的软件包即可。
提示
在开始安装新的软件包之前,最好先使用 apt-get update 命令更新软件包目录,然后使用 apt-get dist-upgrade 命令升级现有的软件包(有关更多信息,请参考 更新操作系统 食谱)。
完成这个食谱后,你将能够使用 apt-get install 命令安装新的软件包。
准备工作
配料:
-
你需要为已开机的树莓派准备 初始设置 或 基本网络设置。同时,你还需要以用户名为
pi的用户身份登录(查看第一章中的食谱,了解如何启动和登录,及第二章中的食谱,学习如何远程登录)。 -
还需要一个网络连接。
树莓派需要访问互联网,才能从更新服务器获取软件更新和安全修复。
如果树莓派启用了远程访问功能,可以通过 ssh 或 PuTTY 远程完成这个食谱(参见第二章中的 远程访问 食谱,管理)。
如何操作…
执行以下步骤以安装软件包:
-
直接或远程登录到树莓派。
-
使用
apt-get update命令更新软件目录,正如本章第一条配方中所述(更新操作系统):golden@raspberrypi ~ $ sudo apt-get update -
使用
apt-get install –y命令安装fortune-mod软件包。该命令的–y选项会自动对所有安装问题回答“是”:golden@raspberrypi:~$ sudo apt-get install -y fortune-mod -
该命令计算包的依赖关系以及该包和其配置文件将使用的额外空间:
Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: fortunes-min librecode0 Suggested packages: fortunes x11-utils The following NEW packages will be installed: fortune-mod fortunes-min librecode0 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 599 kB of archives. After this operation, 1,588 kB of additional disk space will be used. -
该命令随后下载必要的软件包,即 fortunes-mod、fortunes-min 和 librecode0:
Get:1 http://ftp.debian.org/debian/ jessie/main librecode0 armhf 3.6-21 [477 kB] Get:2 http://ftp.debian.org/debian/ jessie/main fortune-mod armhf 1:1.99.1-7 [47.4 kB] Get:3 http://ftp.debian.org/debian/ jessie/main fortunes-min all 1:1.99.1-7 [74.3 kB] Fetched 599 kB in 2s (252 kB/s) -
下载的文件被解压并预配置:
Selecting previously unselected package librecode0:armhf. (Reading database ... 19391 files and directories currently installed.) Preparing to unpack .../librecode0_3.6-21_armhf.deb ... Unpacking librecode0:armhf (3.6-21) ... Selecting previously unselected package fortune-mod. Preparing to unpack .../fortune-mod_1%3a1.99.1-7_armhf.deb ... Unpacking fortune-mod (1:1.99.1-7) ... Selecting previously unselected package fortunes-min. Preparing to unpack .../fortunes-min_1%3a1.99.1-7_all.deb ... Unpacking fortunes-min (1:1.99.1-7) ... -
然后,软件包及其依赖项被安装,并且命令执行完成:
Processing triggers for man-db (2.7.0.2-5) ... Setting up librecode0:armhf (3.6-21) ... Setting up fortune-mod (1:1.99.1-7) ... Setting up fortunes-min (1:1.99.1-7) ... Processing triggers for libc-bin (2.19-18) ... golden@raspberrypi:~$ -
最后,测试
fortune命令,检查它是否正常工作:golden@raspberrypi:~$ fortune You single-handedly fought your way into this hopeless mess. golden@raspberrypi:~$ fortune Your best consolation is the hope that the things you failed to get weren't really worth having. golden@raspberrypi:~$ fortune Q: How many hardware engineers does it take to change a light bulb? A: None. We'll fix it in software. Q: How many system programmers does it take to change a light bulb? A: None. The application can work around it. Q: How many software engineers does it take to change a light bulb? A: None. We'll document it in the manual. Q: How many tech writers does it take to change a light bulb? A: None. The user can figure it out. golden@raspberrypi:~$
它是如何工作的……
登录到树莓派后,使用本章第三章中的第一条配方更新 Raspbian Linux 软件目录,更新操作系统。
一旦软件目录更新完成,就使用 apt-get install 命令安装 fortune-mod 软件包。
该命令首先计算包的依赖关系,确定在安装 fortune-mod 包之前需要安装哪些其他包。
apt-get install 命令继续下载 fortunes-mod 包以及它所依赖的两个包(fortune-min 和 librecode0)。
然后,命令解压并预配置这三个包。最后,apt-get install 命令安装软件包。安装完成后,测试 fortune 命令。
还有更多…
apt-get install 命令使用与 apt-cache search 命令相同的本地软件目录。这两个命令都依赖于 apt-get update 命令来下载更新的包信息。
另见
- fortune – 从文件中获取示例行 (
manpages.debian.net/cgi-bin/man.cgi?query=fortune) Debian 手册页面列出了fortune命令的所有选项。
包管理(aptitude)
本配方使用 aptitude 前端查找并安装 pianobar 应用程序。
有许多 Advance Package Tool(apt)的前端,它们提供了丰富的用户界面。这些前端背后仍然调用 apt-get 命令和 apt-cache 命令,但它们将所有 apt 工具的功能整合到一个用户界面中。
提示
如果你的树莓派上没有安装 aptitude 应用程序,使用上一条配方中的说明(安装软件包)安装 aptitude 软件包及其依赖项。
完成本食谱后,你将能够使用aptitude应用程序查找并安装软件包。
准备工作
配料:
-
你需要为已开启的树莓派准备初始设置或基础网络配置。你还需要以用户名为
pi的用户身份登录(请参阅第一章,安装与设置中的食谱,了解如何启动和登录,以及第二章,管理中的食谱,了解如何远程登录) -
还需要网络连接。
树莓派需要访问互联网,以连接更新服务器,下载新的软件包、软件更新和安全修复。
如果树莓派启用了远程访问,则可以使用ssh或 PuTTY 远程完成此食谱(请参阅第二章,管理中的远程访问食谱)。
如何做...
执行以下步骤以使用aptitude管理软件包:
-
登录到树莓派,可以是直接登录或远程登录。
-
执行
aptitude命令。该命令需要以管理员身份运行:golden@raspberrypi:~$ sudo aptitude -
显示
aptitude应用程序的主屏幕:Actions Undo Package Resolver Search Options Views Help C-T: Menu ?: Help q: Quit u: Update g: Download/Install/Remove Pkgs aptitude 0.6.11 --- New Packages (1) --- Installed Packages (317) --- Not Installed Packages (49041) --- Virtual Packages (7075) --- Tasks (216) These packages have been added to Debian since the last time you cleared the list of "new" packages (choose "Forget new packages" from the Actions menu to empty this list). This group contains 1 package. -
按u更新本地软件包目录缓存。屏幕将显示正在下载的状态信息。
-
输入/pianobar搜索
pianobar软件包。然后,按键跳转到第一个找到的包: Actions Undo Package Resolver Search Options Views Help C-T: Menu ?: Help q: Quit u: Update g: Download/Install/Remove Pkgs aptitude 0.6.11 p pianobar-dbg <none> 2014.06.08-1+b p pianobooster-dbg <none> 0.6.4b-2 p pidgin-dbg <none> 2.10.11-1 p pidgin-microblog-dbg <none> 0.3.0-3 p pidgin-mra-dbg <none> 20100304-1 p ┌───────────────────────────────────────────────────────────────────┐ p │Search for: │ p │pianobar │ co│ [ Ok ] [ Cancel ] │ pi└─────────────────────────────────────────────────── ───────────────┘ Pandora, supporting all important features the official Flash™ client has: * Create, delete, rename stations and add more music * Rate and temporary ban tracks as well as move them to another station * "Shared stations" -
按n直到选择pianobar软件包。每次按下‘n’键时,搜索将继续到下一个符合条件的
pianobar软件包。搜索将循环经过最后一个符合pianobar的包并继续寻找第一个符合条件的包。 -
按+选择要安装的软件包。字母“i”出现在软件包名称旁边,表示已选择该软件包进行安装:
Actions Undo Package Resolver Search Options Views Help C-T: Menu ?: Help q: Quit u: Update g: Download/Install/Remove Pkgs aptitude 0.6.11 Will use 59.7 MB of disk space DL Size: 18.8 MB pi pianobar +119 kB <none> 2014.06.08-1+b p picard <none> 1.2-2+b8 p plait <none> 1.6.2-1 p playmidi <none> 2.4debian-10 p pmidi <none> 1.6.0-5 p pms <none> 0.42-1 p poc-streamer <none> 0.4.2-3 p pocketsphinx <none> 0.8-5 p pocketsphinx-hmm-en-hub4wsj <none> 0.8-5 p pocketsphinx-hmm-en-tidigits <none> 0.8-5 console based player for Pandora radio pianobar is a cross-platform console client for the personalized web radio Pandora, supporting all important features the official Flash™ client has: * Create, delete, rename stations and add more music * Rate and temporary ban tracks as well as move them to another station * "Shared stations" -
按g预览所选软件包的安装。依赖包的列表将显示:
Actions Undo Package Resolver Search Options Views Help C-T: Menu ?: Help q: Quit u: Update g: Download/Install/Remove Pkgs Packages Preview aptitude 0.6.11 Will use 59.7 MB of disk space DL Size: 18.8 MB --\ Packages being automatically installed to satisfy dependencies (55) piA libao-common +49.2 kB <none> 1.1.0-3 piA libao4 +113 kB <none> 1.1.0-3 piA libavcodec56 +7,131 kB <none> 6:11.4-1~deb8u piA libavfilter5 +324 kB <none> 6:11.4-1~deb8u piA libavformat56 +1,254 kB <none> 6:11.4-1~deb8u piA libavresample2 +131 kB <none> 6:11.4-1~deb8u piA libavutil54 +226 kB <none> 6:11.4-1~deb8u piA libdrm-freedreno1 +75.8 kB <none> 2.4.58-2 piA libdrm-nouveau2 +84.0 kB <none> 2.4.58-2These packages are being installed because they are required by another package you have chosen for installation. This group contains 55 packages. If you select a package, an explanation of its current state will appear in this space. -
第二次按g键以完成安装。
-
aptitude应用程序下载所选的软件包pianobar及其依赖项。然后,它清除屏幕并运行apt-get install命令以完成安装。安装完成后,按键返回 aptitude:Setting up libao-common (1.1.0-3) ... Setting up libao4 (1.1.0-3) ... Setting up pianobar (2014.06.08-1+b1) ... Setting up va-driver-all:armhf (1.4.1-1) ... Processing triggers for libc-bin (2.19-18) ... Processing triggers for systemd (215-17+deb8u1) ... Press Return to continue. -
返回到
aptitude后,按q然后按y退出。
它是如何工作的…
登录到树莓派后,启动aptitude应用程序。
启动aptitude应用程序时,应用程序会首先花一些时间进行初始化,然后显示应用程序的主屏幕。
主屏幕顶部有一个工具栏,包含菜单项列表、常用命令列表(包括?: 帮助和q: 退出—按'?'获取帮助,按'q'退出)以及应用程序的版本号,版本是aptitude 0.6.11。
该应用程序通过以下命令键进行导航和控制:
-
要获取应用程序的帮助,按?(问号)
-
使用箭头键浏览包。
-
按u(小写字母 u)来更新包缓存。
-
按U(大写字母 U)选择已更新的包。
-
按/(斜杠)搜索包。
-
要进入下一个找到的包,按n(小写字母 n)。
-
要返回到上一个找到的包,按p(小写字母 p)
-
通过按+(加号)选择单个包;按-(减号)取消选择高亮的包。
-
按g(小写字母 g)来安装选定的包。
-
按
激活菜单。 -
按q退出应用程序。
应用程序初始化完成后,按u(小写字母 u)更新包缓存。当本地软件包缓存下载并更新时,会显示Downloading状态信息。
缓存更新完成后,输入/pianobar。按/进入搜索模式,pianobar是搜索字符串。在输入搜索字符串时,aptitude 会逐步搜索该字符串。按
如果没有选择pianobar包,按n进入下一个匹配搜索字符串的包,或按p返回上一个匹配搜索字符串的包。
当选择了pianobar包时,按+来选择该包。如果错误地选择了一个包,按-来取消选择该包。
选择pianobar包后,按g计算依赖包并准备安装选定的包及其依赖项。
再次按g来安装pianobar包及其依赖项。此时,aptitude应用程序会启动apt-get install命令,开始安装pianobar包及其依赖项。
屏幕上充满了来自apt-get install命令的安装信息(有关apt-get install命令的更多信息,请参见安装包部分)。安装完成后,系统会提示按回车继续,按
最后,按q退出aptitude应用程序,并按y确认退出。
提示
虽然安装后不一定需要重启,但通常重启是个好主意。可以使用以下命令来重启:
sudo reboot
还有更多内容...
aptitude 软件包管理器是一款将 apt-cache 和 apt-get 命令的功能与一个复杂的终端用户界面结合起来的软件应用程序,仍然可以通过 ssh 等命令远程使用。
aptitude 应用程序提供的基于终端的用户界面简化了搜索和安装软件包的过程。通过简单的键盘操作,可以找到、安装和更新软件包。
aptitude 应用程序的终端用户界面适用于交互式使用。然而,命令行界面更适合用于脚本和自动化。
命令行界面
aptitude 应用程序还提供一组命令,可以作为 apt-cache 和 apt-get 命令功能的替代前端(有关使用 apt-cache 和 apt-get 命令查找和安装软件包的说明,请参阅名为 查找软件包 和 安装软件包 的教程)。
aptitude update 命令可用于更新软件包目录。它提供与 apt-get update 命令相同的功能:
pi@raspberrypi ~ $ sudo aptitude update
Hit http://archive.raspberrypi.org jessie InRelease
Hit http://mirrordirector.raspbian.org stretch InRelease
Hit http://archive.raspberrypi.org jessie/main Sources
...
aptitude full-upgrade 命令可用于完全升级已安装的软件包。它提供与 apt-get dist-upgrade 命令类似的功能:
pi@raspberrypi ~ $ sudo aptitude full-upgrade
The following NEW packages will be installed:
raspberrypi-sys-mods{a}
The following packages will be upgraded:
bluej dhcpcd5 epiphany-browser epiphany-browser-data fonts-opensymbol
gir1.2-gdkpixbuf-2.0 gir1.2-gtk-3.0 gstreamer1.0-omx krb5-locales
libfreetype6 libfreetype6-dev libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-common
...
可以使用 aptitude search 命令来搜索软件包,如下所示:
pi@raspberrypi ~ $ sudo aptitude search pianobar
p pianobar - console based player for Pandora radio
p pianobar-dbg - console based player for Pandora radio - d
pi@raspberrypi ~ $
aptitude install 命令用于安装软件包。它与 apt-get install 命令的功能相同:
pi@raspberrypi ~ $ sudo aptitude install pianobar
The following NEW packages will be installed:
libao-common{a} libao4{a} libavfilter5{a} libpiano0{a} pianobar
0 packages upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
Need to get 246 kB of archives. After unpacking 546 kB will be used.
Do you want to continue? [Y/n/?]
...
有关 aptitude 软件包管理器命令行使用的更多信息,请参阅 aptitude 手册页(man aptitude)。
另见
-
aptitude – 包管理的高级界面 (
manpages.debian.net/cgi-bin/man.cgi?query=aptitude) Debian 的aptitude手册页包含关于该命令及其选项的详细信息。 -
pianobar – 个性化在线广播客户端 (
6xq.net/projects/pianobar/)pianobar应用程序是一个开源的基于控制台的 Pandora 客户端。
阅读内置文档(man)
本教程展示了如何使用 man 命令来显示内置文档。
Raspbian Linux 发行版内置了大量本地文档。这些文档主要有三种来源:man 手册页、Info 文档和 /usr/share/docs 目录。
本教程使用 man 命令来显示 fortune 命令的手册页文档。
本章的下一个教程展示了如何使用 info 命令在存储为 info 页的文档中进行浏览。
注意
有关安装 fortune 命令的说明,请参阅本章前面讨论的名为 安装一个软件包 的教程。
完成此操作后,您将能够使用man命令阅读 Raspbian Linux 发行版的内置手册文档。
准备工作
配料:
-
您需要一个初始设置或基本网络设置的树莓派,已经开机,并且以
pi用户名登录(参考第一章中的相关操作,了解如何启动和登录,以及第二章中的远程登录方法)。 -
网络连接是可选的要求。
本应用程序不需要树莓派连接到互联网。
如果树莓派启用了远程访问,可以使用ssh或 PuTTY(参见第二章中的远程访问章节,管理)完成此操作。
如何操作...
执行以下步骤使用man阅读内置文档:
-
直接或远程登录到树莓派。
-
执行
man命令以阅读fortune命令的内置文档:pi@raspberrypi:~$ man fortune -
显示
fortune命令的 man 页面如下:FORTUNE(6) UNIX Reference Manual FORTUNE(6) NAME fortune - print a random, hopefully interesting, adage SYNOPSIS fortune [-acefilosuw] [-n length] [ -m pattern] [[n%] file/dir/all] DESCRIPTION When fortune is run with no arguments it prints out a random epigram. Epigrams are divided into several categories, where each category is sub-divided into those which are potentially offensive and those which are not. Options The options are as follows: -a Choose from all lists of maxims, both offensive and not. (See the -o option for more information on offensive fortunes.) -c Show the cookie file from which the fortune came. -e Consider all fortune files to be of equal size (see discussion below on multiple files). Manual page fortune(6) line 1 (press h for help or q to quit) -
按下<空格>以翻页。按h以获取用于阅读和搜索的关键命令列表。按q退出阅读 man 页面。
工作原理...
登录树莓派后,使用man命令显示fortune命令的内置文档。
还有更多...
大多数命令行实用程序都有一个 man 页面。配置文件和软件库也有 man 页面。所有 man 页面都可以通过man命令访问。
欲了解更多信息,请使用man命令阅读其自身的手册页,即使用man man命令。
可以使用apropos命令搜索 man 页面库。apropos命令会在 man 页面数据库中搜索关键字并返回一组 man 页面。man命令也有一个适用的形式,即man –k。
下面是一个使用apropos命令搜索关键字“music”的简短终端会话:
pi@raspberrypi:~$ apropos music
pianobar (1) - console pandora.com music player
pi@raspberrypi:~$
提示
可使用aptitude软件包管理应用程序安装pianobar控制台音乐播放器(参见名为软件包管理的操作指南)。
另请参阅
-
apropos - 搜索 手册页名称和描述 (
manpages.debian.net/cgi-bin/man.cgi?query=apropos) Debianapropos命令的手册页面包含有关该命令及其选项的信息。 -
man – 在线参考手册的接口 (
manpages.debian.net/cgi-bin/man.cgi?query=man) Debianman命令的手册页面可以在线或本地找到。
阅读内置文档(info)
这篇教程展示了如何使用info命令读取 Info 页。
Info 页是另一种文档来源,已经随基础的 Raspbian Linux 发行版一起安装。info命令用于显示作为 Info 页存储的文档。
完成此教程后,你将能够使用info命令读取作为 Info 页存储的内置文档。
准备就绪
材料:
-
你需要一个已开机的 Raspberry Pi,并且需要进行初始设置或基础网络配置。你还需要以用户名为
pi的用户登录(请参考第一章中的教程,了解如何启动和登录,并参考第二章中的教程,了解如何远程登录)。 -
网络连接是可选要求。
这个应用程序不需要 Raspberry Pi 连接互联网。
如果 Raspberry Pi 已启用远程访问,可以通过ssh或 PuTTY 远程完成此教程(请参考第二章中的远程访问教程,管理部分)。
如何操作……
执行以下步骤以使用info读取内置文档:
-
直接或通过远程方式登录 Raspberry Pi。
-
执行
info命令,如下所示:pi@raspberrypi:~$ info -
Info 页的主屏幕显示如下:
File: dir, Node: Top This is the top of the INFO tree This (the Directory node) gives a menu of major topics. Typing "q" exits, "?" lists all Info commands, "d" returns here, "h" gives a primer for first-timers, "mEmacs<Return>" visits the Emacs manual, etc. In Emacs, you can click mouse button 2 on a menu item or cross reference to select it. * Menu: Basics * Common options: (coreutils)Common options. * Coreutils: (coreutils). Core GNU (file, text, shell) utilities. -----Info: (dir)Top, 174 lines --Top-------------------------------------------- -
按空格键逐页浏览文档。这是从上到下阅读文件的最简单方式。
-
使用箭头键将光标移至菜单项旁边的*符号,然后按
键跳转到文件中的该位置。 -
按h(小写字母 h)了解有关
info命令的更多信息。按H(大写字母 H)开始关于如何使用info的教程。 -
按q退出。
它是如何工作的……
登录到 Raspberry Pi 后,info应用程序会启动。
还有更多……
info命令读取特别格式化的文件和 Info 页,并在文本浏览器中显示它们。Info 页结构清晰,具有菜单层级,可以通过概念浏览文档。它们看起来非常像网页。输入info命令而不带参数时,会显示所有 Info 页的根目录:info。
Coreutils - Raspbian Linux 中最常用的工具
Info 页文档中的Coreutils部分涵盖了 Raspbian Linux 发行版中最常用的命令行工具,包括所有应用程序都应理解的常见选项:
File: coreutils.info, Node: Common options, Next: Output of entire files, Pr\
ev: Introduction, Up: Top
2 Common options
****************
Certain options are available in all of these programs. Rather than
writing identical descriptions for each of the programs, they are
described here. (In fact, every GNU program accepts (or should accept)
these options.)
Normally options and operands can appear in any order, and programs
act as if all the options appear before any operands. For example,
'sort -r passwd -t :' acts like 'sort -r -t : passwd', since ':' is an
option-argument of '-t'. However, if the 'POSIXLY_CORRECT' environment
variable is set, options must appear before operands, unless otherwise
specified for a particular command.
A few programs can usefully have trailing operands with leading '-'.
With such a program, options must precede operands even if
'POSIXLY_CORRECT' is not set, and this fact is noted in the program
description. For example, the 'env' command's options must appear
before its operands, since in some cases the operands specify a command
--zz-Info: (coreutils.info.gz)Common options, 73 lines --Top--------------------
在 Info 页中,有关于文件权限、访问模式及其他在管理 Raspberry Pi 时有用的概念的文档。与 man 页不同,Info 页文档不仅提供总结,还包含选项列表,解释命令背后的概念及其预期用途。
具有讽刺意味的是,info命令的手册页面在 Raspbian Linux 发行版中默认并不包含。相反,可以使用man info命令来阅读关于info命令的更多内容。
搜索信息
你可以使用info命令的–k选项来搜索信息页面。当你记不住命令的名称时,可以尝试搜索(-k) man 和 info,并使用诸如“permission”、“access”或“download”等关键词。
当你在信息页面中搜索“permissions”时,你会得到以下内容:
golden@raspberrypi:~$ info -k permissions
"(coreutils)chmod invocation" -- access permissions, changing
"(coreutils)Setting Permissions" -- adding permissions
"(coreutils)chmod invocation" -- changing access permissions
"(coreutils)Copying Permissions" -- copying existing permissions
"(coreutils)Umask and Protection" -- giving away permissions
"(coreutils)Setting Permissions" -- group, permissions for
"(coreutils)Multiple Changes" -- multiple changes to permissions
"(coreutils)Setting Permissions" -- other permissions
"(coreutils)Setting Permissions" -- owner of file, permissions for
"(coreutils)install invocation" -- permissions of installed files, setting
"(coreutils)chmod invocation" -- permissions, changing access
"(coreutils)Copying Permissions" -- permissions, copying existing
"(coreutils)touch invocation" -- permissions, for changing file timestamps
"(coreutils)What information is listed" -- permissions, output by 'ls'
"(coreutils)chmod invocation" -- recursively changing access permissions
"(coreutils)Setting Permissions" -- removing permissions
"(coreutils)Setting Permissions" -- setting permissions
"(coreutils)Setting Permissions" -- subtracting permissions
"(coreutils)chmod invocation" -- symbolic links, permissions of
"(gnupg1)GPG Esoteric Options" -- preserve-permissions
"(wget)FTP Options" -- file permissions
golden@raspberrypi:~$
你已经拥有了关于 Linux、Debian 以及安装在树莓派上的 Raspbian Linux 操作系统的详细信息。info命令让你可以访问存储为信息页面的资料。
另见
- info – 阅读信息文档 (
manpages.debian.net/cgi-bin/man.cgi?query=info)。该链接指向 Debian 的info命令手册,描述了该命令及其选项。
第四章. 文件共享
本章内容包括:
-
挂载 USB 硬盘(
pmount) -
访问其他计算机的文件(
smbclient) -
从其他计算机共享文件夹(
mount.cifs) -
在启动时自动挂载 USB 硬盘(
/etc/fstab) -
在启动时自动挂载共享文件夹
-
创建文件服务器(Samba)
-
分享附加的 USB 硬盘(Samba)
简介
本章中的树莓派配方用于与同一局域网中的其他计算机共享文件。
本章从挂载连接到树莓派的 USB 硬盘的配方开始。接下来的配方展示了如何使用 SMB(CIFS)协议与其他计算机交换文件。然后,有两个配方展示了如何在启动时自动挂载磁盘。本章以几个配方结束,介绍如何将树莓派设置为文件服务器。
完成本章的配方后,你将能够自动挂载本地 USB 硬盘,并使用 SMB(CIFS)协议在树莓派和其他计算机之间交换文件。
挂载 USB 硬盘(pmount)
本配方安装并应用pmount命令,该命令以与桌面文件管理器相同的方式挂载直接连接到树莓派的 USB 硬盘。
如果通过 USB 端口将磁盘连接到树莓派,使用树莓派的图形用户界面(GUI)时,桌面文件管理器会请求用户许可来挂载磁盘。然而,当远程使用树莓派(或树莓派以文本模式启动时),没有图形界面来询问是否挂载文件。
本配方不依赖树莓派的 GUI 或桌面文件管理器来挂载磁盘。相反,使用命令行工具pmount以与 GUI 相同的方式挂载 USB 驱动器——在 /media 目录中。
完成本配方后,你将能够使用大型 USB 存储设备和小型 USB 闪存驱动器与其他计算机交换文件,而无需依赖树莓派的图形用户界面或桌面文件管理器。
准备工作
这里是本配方使用的配料:
-
树莓派的初始设置或基本网络设置,已开启电源。你还需要以
pi用户登录(有关如何启动和登录的信息,请参见第一章,安装与设置,以及第二章,管理中的远程登录配方)。 -
一个带电的 USB 集线器(推荐)。
-
至少需要一个 USB 硬盘驱动器。
本配方不需要桌面 GUI,可以在基于文本的控制台或 LXTerminal 中运行。
如果树莓派的安全外壳服务器正在运行,则可以通过安全外壳客户端远程完成此配方(参见第二章中的远程访问(SSH)配方,管理)。
本配方中的示例使用了两个 USB 驱动器:一个 32 GB 的闪存驱动器和一个 500 GB 的磁盘。
注意
小心!树莓派有电力限制。
树莓派没有足够的内部电力来可靠地驱动直接连接到树莓派 USB 端口的大型 USB 磁盘。
为确保树莓派持续良好运作,任何需要电力的设备(包括 USB 磁盘)都应该通过带电源的 USB 集线器间接连接到树莓派。
带电源的 USB 集线器提供足够的电力来运行多个大型 USB 驱动器,而不需要额外从树莓派获取电力。
如果你看到图形用户界面右上角有一个大而五颜六色的方块闪烁,那是一个警告,表示你的树莓派电力不足。
怎么做...
挂载 USB 磁盘的步骤如下:
-
直接或远程登录到树莓派。
-
使用
apt-get来安装pmount命令。pi@raspberrypi ~ $ sudo apt-get install pmount [sudo] password for pi: -
apt-get install命令下载并安装pmount。Reading package lists... Done Building dependency tree Reading state information... Done Suggested packages: cryptsetup The following NEW packages will be installed: pmount 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 98.0 kB of archives. After this operation, 727 kB of additional disk space will be used. Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main pmount armhf 0.9.23-2 [98.0 kB] Fetched 98.0 kB in 1s (93.3 kB/s) Selecting previously unselected package pmount. (Reading database ... 89035 files and directories currently installed.) Unpacking pmount (from .../pmount_0.9.23-2_armhf.deb) ... Processing triggers for man-db ... Setting up pmount (0.9.23-2) ... pi@raspberrypi ~ $ -
将一个或多个 USB 磁盘连接到树莓派。示例中包括两个磁盘:一个 32 GB 的闪存驱动器和一个 500 GB 的磁盘。
-
使用
fdisk –l命令列出当前连接到树莓派的磁盘。pi@raspberrypi ~ $ sudo apt-get install pmount -
fdisk命令显示有关连接到树莓派的磁盘的信息。Disk /dev/mmcblk0: 31.9 GB, 31914983424 bytes 4 heads, 16 sectors/track, 973968 cylinders, total 62333952 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: 0x0009bf4f Device Boot Start End Blocks Id System /dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA) /dev/mmcblk0p2 122880 62333951 31105536 83 Linux Disk /dev/sda: 128 MB, 128974848 bytes 2 heads, 63 sectors/track, 1999 cylinders, total 251904 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: 0x002d7aa3 Device Boot Start End Blocks Id System /dev/sda1 * 32 251903 125936 6 FAT16 Disk /dev/sdb: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders, total 976773168 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: 0x002317d5 Device Boot Start End Blocks Id System /dev/sdb1 2048 976773167 488385560 7 HPFS/NTFS/exFAT -
上述命令输出显示了三个磁盘:
-
/dev/mmcblk0:31.9 GB 的 SD 卡(启动磁盘)有两个分区:/dev/mmcblk0p1和/dev/mmcblk0p2 -
/dev/sda:128 MB 的闪存驱动器有一个分区 -
/dev/sdb:500.1 GB 的磁盘也有一个分区
-
-
使用新安装的
pmount命令来挂载闪存驱动器的主分区(/dev/sda1)和 USB 磁盘的主分区(/dev/sdb1)。无需使用sudo命令。pi@raspberrypi ~ $ ls -l /media total 0 pi@raspberrypi ~ $ pmount /dev/sda1 pi@raspberrypi ~ $ pmount /dev/sdb1 pi@raspberrypi ~ $ ls -l /media total 20 drwx------ 4 pi pi 16384 Dec 31 1969 sda1 drwxr-xr-x 6 pi pi 4096 May 30 12:23 sdb1 pi@raspberrypi ~ $ -
上述命令输出显示了在使用
pmount命令挂载两个磁盘之前和之后/media目录的内容。执行pmount命令后,每个磁盘都出现在/media目录中。 -
df –h命令也可以用来显示当前挂载的磁盘及其挂载点。在以下命令输出中,两个磁盘/dev/sda1和/dev/sdb1分别挂载在/media/sda1和/media/sdb1:pi@raspberrypi ~ $ df –h Filesystem Size Used Avail Use% Mounted on rootfs 30G 4.2G 24G 15% / /dev/root 30G 4.2G 24G 15% / devtmpfs 484M 0 484M 0% /dev tmpfs 98M 252K 98M 1% /run tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 195M 0 195M 0% /run/shm /dev/mmcblk0p1 56M 19M 37M 34% /boot /dev/sdb1 459G 172G 264G 40% /media/sdb1 /dev/sda1 123M 71M 53M 58% /media/sda1 pi@raspberrypi ~ $
工作原理...
登录到树莓派后,安装pmount命令,连接两个磁盘驱动器,使用命令fdisk –l显示连接到树莓派的磁盘的分区表。在示例中,显示了三个磁盘:
-
/dev/mmcblk0是启动磁盘 -
/dev/sda是 128 MB 的闪存驱动器 -
/dev/sdb是 500 GB 磁盘
闪存驱动器有一个分区(/dev/sda1),磁盘也有一个分区(/dev/sdb1)。文件存储在磁盘分区中。
pmount命令用于挂载磁盘分区。磁盘分区挂载在/media目录下。使用ls –l命令在挂载前后显示磁盘分区挂载的位置。
/media目录中的挂载点被赋予了与已挂载磁盘分区相对应的名称。闪存驱动器的磁盘分区/dev/sda1被挂载在/media/sda1,而 500 GB 磁盘的磁盘分区/dev/sdb1则被挂载在/media/sdb1。
最后,使用df -h命令展示了另一种查看磁盘分区已挂载位置的方法。df命令还显示了每个已挂载磁盘上可用的空闲磁盘空间。-h选项告诉df以字节为单位显示每个磁盘的大小,而不是以磁盘块为单位。500 GB 磁盘已使用 40%,还有 264 GB 可用。闪存驱动器已使用 58%,只剩下 53 MB 可用。
还有更多…
让我们更多地了解一下磁盘。
设备文件
当每个磁盘或磁盘分区被挂载时,会为其创建一个设备文件并存储在/dev目录下。这些设备文件的名称会随着磁盘的挂载顺序依次分配。
USB 驱动器的分配名称都以sd开头。第一个 USB 磁盘驱动器被分配了设备文件/dev/sda,第二个则是/dev/sdb,依此类推。
SD 卡驱动器的分配名称以mmcblk开头,并为每个唯一的设备添加一个数字,从0开始。树莓派中的唯一 SD 卡驱动器(启动磁盘)的设备文件位于/dev/mmcblk0。
对于在磁盘分区表中发现的每个磁盘分区,也会创建一个设备文件。每个磁盘分区的设备文件与磁盘的设备文件名称相同,并附加一个数字,表示其在分区表中的位置。
在这个例子中,32 GB SD 卡被分配了设备文件/dev/mmcblk0。它有两个分区:/dev/mmcblk0p1和/dev/mmcblk0p2。如果 SD 卡还有另一个分区,那么第三个分区的设备文件将是/dev/mmcblk0p3。
当磁盘具有分区表时,每个分区需要单独挂载。使用pmount命令时,应使用分区的设备文件,而不是磁盘的设备文件。在示例中,500 GB 磁盘有一个分区,可以使用命令pmount /dev/sdb1来挂载它。
当磁盘没有分区表时,使用pmount命令时应使用分配给磁盘驱动器的设备文件。
挂载点
当磁盘分区被挂载时,默认情况下会在/media目录下为每个分区创建一个挂载点。默认挂载点的名称与用于挂载磁盘分区的设备文件名称相同。
128 MB 闪存驱动器的唯一分区被分配了设备文件/dev/sda1,因此默认的挂载点是/media/sda1。500 GB 磁盘也只有一个分区/dev/sdb1,被挂载在/media/sdb1。
若要在/media目录下创建一个与默认名称不同的挂载点,您需要将所需的挂载点作为第二个参数传递给pmount命令,如以下示例所示:
pi@raspberrypi ~ $ pmount /dev/sdb1 mydisk
pi@raspberrypi ~ $ ls -l /media
total 20
drwx------ 4 pi pi 16384 Dec 31 1969 sda1
drwxr-xr-x 6 pi pi 4096 May 30 12:23 mydisk
pi@raspberrypi ~ $
卸载磁盘
使用 pumount 命令卸载磁盘(命令名中没有 n)。磁盘卸载后,它们的挂载点会从 /media 目录中删除。
pi@raspberrypi ~ $ ls -l /media
total 20
drwx------ 4 pi pi 16384 Dec 31 1969 sda1
drwxr-xr-x 6 pi pi 4096 May 30 12:23 mydisk
pi@raspberrypi ~ $ pumount /dev/sda1
pi@raspberrypi ~ $ ls -l /media
total 4
drwxr-xr-x 6 pi pi 4096 May 30 12:23 mydisk
pi@raspberrypi ~ $ pumount /media/mydisk
pi@raspberrypi ~ $ ls -l /media
total 0
pi@raspberrypi ~ $
如前面的示例所示,pumount 命令接受磁盘设备(/dev/sda1)或挂载点(/media/mydisk)作为参数。
plugdev 组
使用 pmount 命令不需要超级用户权限,但仍然需要一定的权限。执行 pmount 命令的权限仅限于 plugdev 系统组的成员。不在 plugdev 组中的用户无法执行 pmount 命令。
Here is an example of how to add a user to the plugdev group:
pi@raspberrypi ~ $ groups golden
golden : golden sudo
pi@raspberrypi ~ $ adduser golden plugdev
pi@raspberrypi ~ $ groups golden
golden : golden sudo plugdev
pi@raspberrypi ~ $
注意
在 Raspbian 上,默认用户 pi 已经是 plugdev 组的成员。
其他挂载命令
系统命令 mount 需要超级用户权限。在启动过程中,mount 命令会自动挂载像树莓派启动所用的 SD 卡这样的磁盘。下一个食谱将展示如何配置树莓派,使其在启动时自动挂载附加的驱动器。
包含在树莓派桌面中的文件管理器 PCManFM 也会在 /media 目录中挂载磁盘。然而,PCManFM 文件管理器使用磁盘的标签作为挂载点的名称,而不是磁盘的设备名称。
磁盘性能
Class 10 SD 卡的传输速率为每秒 10 MB,而外部硬盘可以以每秒 300 MB 的速度向计算机传输数据。硬盘的速度几乎比 SD 卡快了 30 倍!
尽管 SD 卡的容量越来越大,但它们并不是高性能的最佳选择。即便是超高速 SD 卡,30 MB/sec 的速度也比硬盘慢 10 倍。本书中的大多数食谱如果依赖的数据存储在外部硬盘上,会表现得更好。
树莓派的电力是有限的
没有独立电源的外部磁盘和闪存驱动器通过树莓派的 USB 连接来获取电力。没有自供电的设备所需的电力由树莓派提供。树莓派的电力是有限的;如果设备没有独立电源,它无法可靠地支持较大的 USB 设备。
外部 USB 设备所需的电力可能会轻易超过树莓派提供的电力。如果从树莓派提取的电力过多,其他 USB 设备,包括网络接口(内部使用 USB 总线)可能无法正常工作,甚至可能完全失效。
为了获得最佳的性能和可靠性,建议将所有 USB 设备(包括外部硬盘驱动器和闪存驱动器)通过一个有电源的 USB 集线器间接连接到树莓派,而不是直接连接到树莓派。
一个带电源的 USB 集线器是所有连接到它的 USB 设备的电源来源。只有数据会传输到树莓派,而带电源的 USB 集线器不会从树莓派获取电力。相反,它保护树莓派免受其他设备的电力消耗影响。通过带电源的 USB 集线器间接连接 USB 设备,可以确保树莓派以最佳性能和可靠性运行。
另见
-
硬盘驱动器 (
en.wikipedia.org/wiki/Hard_disk_drive): 这篇维基百科文章提供了关于磁盘驱动器的更多信息。 -
USB 闪存驱动器 (
en.wikipedia.org/wiki/USB_flash_drive): 这篇维基百科文章提供了关于 USB 闪存驱动器的详细信息。 -
SD 卡 (
en.wikipedia.org/wiki/Secure_Digital): 这篇维基百科文章介绍了安全数字(SD)卡格式。 -
mount (Unix) (
en.wikipedia.org/wiki/Mount_(Unix)): 这篇维基百科文章介绍了mount命令。 -
df – 报告文件系统磁盘空间使用情况 (
manpages.debian.net/cgi-bin/man.cgi?query=df): Debian 的df手册页提供了关于该命令及其选项的更多信息。 -
fdisk – Linux 分区表操作工具 (
manpages.debian.net/cgi-bin/man.cgi?query=fdisk): Debian 的fdisk手册页提供了关于该命令的更多信息。 -
pmount – 以普通用户身份挂载任意热插拔设备 (
manpages.debian.net/cgi-bin/man.cgi?query=pmount): Debian 的pmount手册页提供了关于该命令的更多信息。 -
pumount – 卸载任意热插拔设备 (
manpages.debian.net/cgi-bin/man.cgi?query=pumount): Debian 的pumount手册页提供了关于该命令的更多信息。 -
udev – Linux 动态设备管理 (
manpages.debian.net/cgi-bin/man.cgi?query=udev): Debian 的udev手册页更详细地解释了设备如何挂载。
访问另一台计算机的文件(smbclient)
本教程的目标是通过smbclient命令在树莓派和其他计算机之间传输文件。
本教程展示了如何列出可用的网络共享文件夹、复制单个文件,并使用smbclient命令将整个文件夹的文件从共享文件夹的计算机复制到树莓派。
完成本教程后,你将能够列出本地网络上可用的文件共享,并使用 SMB(CIFS)协议直接在另一台计算机和树莓派之间传输文件。
准备中...
以下是本教程的材料:
-
树莓派已经开机并完成初始设置或基础网络设置。你也已经以用户
pi登录(请参阅第一章中的配方,安装与设置,了解如何启动和登录,以及第二章中的配方,管理,了解如何远程登录)。 -
一个网络连接。
-
一台与树莓派连接到相同网络的客户端 PC。
本配方不需要桌面图形界面,可以在基于文本的控制台或 LXTerminal 中运行。
如果树莓派的安全外壳服务器正在运行,则可以使用安全外壳客户端远程完成此配方(请参阅第二章中的配方远程访问(SSH),管理)。
本配方中的示例将树莓派连接到本地网络计算机 golden-macbook 和家庭文件服务器terragolden。使用 SMB(CIFS)协议的其他计算机配置将类似。
如何操作……
访问另一台计算机文件的步骤如下:
-
直接或通过远程登录到树莓派。
-
使用命令
apt-get install下载并安装smbclient软件包。pi@raspberrypi ~ $ sudo apt-get install smbclient -
使用命令
smbclient列出家庭文件服务器terragolden上的服务(-L)。无需密码(-N)即可进行游客访问。pi@raspberrypi ~ $ smbclient -N -L terragolden -
显示来自家庭文件服务器
terragolden的 SMB(CIFS)服务列表。Anonymous login successful Domain=[GOLDEN] OS=[Unix] Server=[Samba 3.2.5] Sharename Type Comment --------- ---- ------- IPC$ IPC IPC Service (Golden Family Media Drive) backups Disk livemusic Disk photos Disk public Disk Anonymous login successful Domain=[GOLDEN] OS=[Unix] Server=[Samba 3.2.5] Server Comment --------- ------- TERRAGOLDEN Golden Family Media Drive Workgroup Master --------- ------- GOLDEN pi@raspberrypi ~ $ -
使用命令
smbclient列出家庭计算机 golden-macbook 上的服务(-L)。访问需要有效的用户名(-U)和密码。pi@raspberrypi ~ $ smbclient –U golden -L golden-macbook –-signing=off Enter golden's password: -
显示来自 golden-macbook 的 SMB(CIFS)服务列表。
Domain=[GOLDEN-MACBOOK] OS=[Darwin] Server=[@(#)PROGRAM:smbd PROJECT:smbx-276.92.2] Sharename Type Comment --------- ---- ------- IPC$ IPC Macintosh HD Disk xfer Disk golden Disk pi@raspberrypi ~ $ -
现在,使用
mkdir命令在树莓派上创建一个新目录(xfer),使用cd命令切换到新目录,然后使用ls命令显示新创建的目录(~/xfer)中没有文件。pi@raspberrypi ~ $ mkdir xfer pi@raspberrypi ~ $ cd xfer pi@raspberrypi ~/xfer $ ls -l total 0 pi@raspberrypi ~/xfer $ -
使用
smbclient命令与家庭文件服务器terragolden进行文件共享livemusic的对话。pi@raspberrypi ~/xfer $ smbclient -N //teragolden/livemusic smb: \> -
显示命令提示符
smb: \>,表示smbclient命令已准备好与terragolden进行对话。 -
使用
ls命令列出terragolden上livemusic共享的文件和文件夹。smb: \> ls . D 0 Fri Oct 28 15:45:43 2011 .. D 0 Tue Oct 9 22:03:55 2012 catalog.txt A 5119 Mon Jul 24 18:04:30 2017 dso040424 D 0 Wed Mar 9 19:46:22 2011 dtb2005-03-04 D 0 Wed Mar 9 19:43:35 2011 franti2010-06-11.flac16 D 0 Fri Mar 25 08:43:13 2011 garaj2005-04-10_16bit_64kb_mp3 D 0 Wed Mar 9 19:50:28 2011 JackJohnson2010-07-17 D 0 Mon Mar 14 14:04:25 2011 JasonMraz-FarmAid D 0 Thu Apr 28 16:03:48 2011 JasonMrazGrandRex_vbr_mp3 D 0 Thu Apr 28 16:04:59 2011 jgb2008-07-19_64kb_mp3 D 0 Wed Mar 9 19:41:06 2011 jj2010-12-13.aud.flac16 D 0 Wed Mar 2 11:46:06 2011 MF2010-10-06_Nak30016BitFlac D 0 Fri Mar 25 10:31:05 2011 mFranti2006-11-13 D 0 Wed Mar 9 19:55:00 2011 mfs2005-01-15 D 0 Wed Mar 9 19:48:50 2011 particle2010-04-15 D 0 Fri Mar 25 09:13:14 2011 particle2010-10-30 D 0 Fri Mar 25 08:45:00 2011 skb2005-10-01matrix_64kb_mp3 D 0 Mon Mar 14 14:12:01 2011 Soulive2011-03-08 D 0 Fri Mar 25 08:33:21 2011 Soulive2011-03-10 D 0 Fri Mar 25 08:34:11 2011 tenaciousd2005-09-22.flac16_64kb D 0 Wed Mar 9 20:32:06 2011 um2007-04-21 D 0 Wed Mar 9 19:47:59 2011 ymsb2001-02-02 D 0 Wed Mar 9 09:23:13 2011 ymsb2007-06-22 D 0 Wed Mar 9 19:50:18 2011 .DS_Store AH 6148 Fri Oct 28 15:45:43 2011 ._.DS_Store AH 4096 Fri Oct 28 15:45:43 2011 59356 blocks of size 16777216\. 4490 blocks available smb: \> -
使用
get命令将catalog.txt文件从terragolden下载到树莓派。smb: \> get catalog.txt getting file \catalog.txt of size 5119 as catalog.txt (208.3 KiloBytes/sec) (average 208.3 KiloBytes/sec) smb: \> -
现在,使用
mget命令从terragolden下载整个目录particle2010-04-15到树莓派。mget命令首先要求设置tarmode、recurse和prompt选项。smb: \> tarmode tarmode is now full, system, hidden, noreset, verbose smb: \> recurse smb: \> prompt smb: \> mget particle2010-04-15 getting file \particle2010-04-15\particle2010-04-15.ffp of size 594 as particle2010-04-15.ffp (11.8 KiloBytes/sec) (average 11.8 KiloBytes/sec) getting file \particle2010-04-15\particle2010-04-15t01.flac of size 70373980 as particle2010-04-15t01.flac (8086.2 KiloBytes/sec) (average 8039.9 KiloBytes/sec) getting file \particle2010-04-15\particle2010-04-15t02.flac of size 58391723 as particle2010-04-15t02.flac (8070.1 KiloBytes/sec) (average 8053.6 KiloBytes/sec) getting file \particle2010-04-15\particle2010-04-15t03.flac of size 100964559 as particle2010-04-15t03.flac (4672.9 KiloBytes/sec) (average 6110.7 KiloBytes/sec) getting file \particle2010-04-15\particle2010-04-15t04.flac of size 82562641 as particle2010-04-15t04.flac (8648.2 KiloBytes/sec) (average 6624.5 KiloBytes/sec) getting file \particle2010-04-15\particle2010-04-15t05.flac of size 115649970 as particle2010-04-15t05.flac (5859.4 KiloBytes/sec) (average 6398.7 KiloBytes/sec) getting file \particle2010-04-15\particle2010-04-15t06.flac of size 57681372 as particle2010-04-15t06.flac (4870.3 KiloBytes/sec) (average 6168.8 KiloBytes/sec) getting file \particle2010-04-15\particle2010-04-15t07.flac of size 46807245 as particle2010-04-15t07.flac (8770.2 KiloBytes/sec) (average 6333.9 KiloBytes/sec) getting file \particle2010-04-15\text.txt of size 491 as text.txt (10.0 KiloBytes/sec) (average 6346.5 KiloBytes/sec) smb: \> -
使用
quit命令结束与家庭文件服务器terragolden的 SMB(CIFS)对话,并返回到树莓派命令提示符。smb: \> quit pi@raspberrypi ~/xfer $ -
使用
ls –l命令显示树莓派当前目录的内容。pi@raspberrypi ~/xfer $ ls –l total 20 -rw------- 1 pi pi 13564 Jul 19 13:52 catalog.txt drwxr-xr-x 2 pi pi 4096 Jul 19 13:45 particle2010-04-15 pi@raspberrypi ~/xfer $
它是如何工作的……
登录树莓派后,使用apt-get install命令安装软件分发包smbclient。有关apt-get命令如何工作的更多信息,请参见第三章,维护。
注意
你的软件分发包可能已经安装了smbclient。
smbclient软件分发包包含命令行应用程序smbclient。该应用程序用于通过 SMB 协议与其他计算机进行通信。
在软件分发包安装完成后,使用smbclient命令列出名为terragolden的主文件服务器上的可用服务。–N选项告诉命令不需要远程计算机的密码,而–L选项则告诉命令仅列出可用的共享和打印机。
为了对比,smbclient命令还用于列出另一台连接到本地网络的计算机(golden-macbook)上的可用服务。这次,访问该计算机需要提供用户名(-U golden)和密码(没有–N选项),并且smbclient命令还需要使用--signing=off选项,以关闭该计算机不支持的安全功能。
在使用smbclient命令与terragolden开始会话之前,首先使用mkdir命令创建一个传输目录(xfer)以接收传输的文件,并通过ls –l命令显示其(空的)内容。–l选项告诉ls命令使用长格式列出文件,其中包含文件总数(0)。
命令smbclient –N //terragolden/livemusic用于启动树莓派与远程计算机terragolden之间的会话,使用的是名为livemusic的文件共享。命令提示符会变为smb: \>,表示会话已开始。
smbclient的ls命令用于列出主文件服务器上的文件。也可以使用dir命令,返回的结果与ls命令相同。
命令get catalog.txt用于将文件catalog.txt从文件服务器传输到树莓派。smbclient命令报告该文件的大小为 5119 字节,并以每秒 208.3 KB 的速率完成传输。
在catalog.txt文件传输完成后,设置三个选项以准备进行多文件传输。tarmode选项被重置为默认设置,确保所有文件都能传输。recurse选项被切换,以便即将执行的mget命令也能复制子目录和文件。而prompt选项被切换,以便即将执行的mget命令在传输每个文件之前不会提示进行验证。
设置好传输选项后,使用mget命令将particle2010-04-15目录中的文件传输到树莓派。每当传输一个文件时,会显示该文件的大小及其传输速率。
所有文件传输完成后,quit 命令用于告诉 smbclient 应用程序与远程计算机 terragolden 的会话已经结束。
命令提示符返回到 pi@raspberrypi ~ $,显示会话已完成。
还有更多内容...
smbclient 应用程序拥有一套丰富的命令,用于通过 SMB 协议与远程计算机进行通信。
help
可以使用 help 命令来列出从 smb: \> 提示符处可用的命令。
smb: \> help
? allinfo altname archive blocksize
cancel case_sensitive cd chmod chown
close del dir du echo
exit get getfacl geteas hardlink
help history iosize lcd link
lock lowercase ls l mask
md mget mkdir more mput
newer open posix posix_encrypt posix_open
posix_mkdir posix_rmdir posix_unlink print prompt
put pwd q queue quit
readlink rd recurse reget rename
reput rm rmdir showacls setea
setmode stat symlink tar tarmode
translate unlock volume vuid wdel
logon listconnect showconnect .. !
smb: \> help help
HELP help:
[command] give help on a command
smb: \>
每个 smbclient 应用程序的命令都有自己的帮助页面,可以使用 help 命令显示。键入 help 后跟命令名称,以显示关于该命令的更多信息。
更改远程目录
smbclient 中的 cd 命令可以用来像在 Raspberry Pi 上使用 cd 更改目录一样,在远程计算机上更改目录。注意,当前的远程目录路径会显示在 smbclient 命令提示符中。
smb: \> ls golden/stuff/astrology
. D 0 Wed Jun 29 22:20:25 2011
.. D 0 Wed Oct 26 13:49:49 2011
astrolog data DR 0 Mon Dec 12 07:13:40 2005
ephall-astrolog DR 0 Mon Jan 10 08:01:24 2005
ephcom-1.0 DR 0 Thu Apr 7 00:39:03 2005
experiments DR 0 Mon Jan 10 21:45:51 2005
jpl DR 0 Fri Mar 4 03:48:43 2005
SwissEphemeris DR 0 Thu Apr 7 06:03:14 2005
zodiac DR 0 Thu Apr 7 00:34:28 2005
59356 blocks of size 16777216\. 4490 blocks available
smb: \ > cd golden/stuff/astrology/zodiac
smb: \golden\stuff\astrology\zodiac\> ls
. DR 0 Thu Apr 7 00:34:28 2005
.. D 0 Wed Jun 29 22:20:25 2011
.classpath AHR 236 Thu Apr 7 00:33:05 2005
.project AHR 382 Thu Apr 7 00:33:05 2005
classes DR 0 Wed Apr 20 10:14:10 2005
src DR 0 Thu Apr 7 00:34:28 2005
59356 blocks of size 16777216\. 4490 blocks available
smb: \golden\stuff\astrology\zodiac\>
获取单个文件
如果已经知道远程计算机中文件的位置,可以通过一个 smbclient 命令直接获取该文件。
pi@raspberrypi ~/xfer $ smbclient –N //terragolden –c 'get /livemusic/Seeed/03-seed-aufstehen.mp3'
getting file \livemusic\Seeed\03-seed-aufstehen.mp3 of size 650317 as \livemusic\Seeed\03-seed-aufstehen.mp3 (10414.8 KiloBytes/sec) (average 10414.8 KiloBytes/sec)
pi@raspberrypi ~/xfer $
/ 与 \
注意,SMB (CIFS) 协议使用 \ 作为路径分隔符,而不是 /。
路径分隔符是 Windows 操作系统与基于 Linux 的操作系统(如 Raspberry Pi 使用的 Raspbian Linux)之间的主要区别之一。
在 smbclient 应用程序中,两个字符都可以使用,只要一致使用。不过,使用 / 更加方便,因为它是 Raspberry Pi 上的路径分隔符。
另请参见
-
cd – 更改工作目录 (
manpages.debian.net/cgi-bin/man.cgi?query=cd): Debian 的cd手册页面提供了更多关于该命令及其选项的信息。 -
smbclient – 用于访问服务器上的 SMB/CIFS 资源的客户端 (
manpages.debian.net/cgi-bin/man.cgi?query=smbclient): Debian 的smbclient手册页面提供了更多关于该命令的信息。
从其他计算机共享文件夹(mount.cifs)
这个食谱展示了如何挂载从另一台计算机共享的文件夹。
最近的 Linux 内核,包括 Raspberry Pi 上使用的 Raspbian Linux 内核,内置支持使用 SMB (CIFS) 协议挂载共享文件夹。这是 Windows 计算机和家庭文件共享设备常用的文件共享协议。在 OS X 上共享文件时也使用该协议。
这是在 Raspberry Pi 上通过命令行挂载共享文件夹的最简单方法。
完成这个食谱后,你将能够使用 SMB (CIFS) 协议与同一网络上的其他计算机共享文件。
注意
SMB 和 CIFS 是同一种文件共享协议的同义词。
准备工作
这是这个食谱所需的配料:
-
对于已开机的树莓派,需进行初步设置或基本网络设置。你还需要以
pi用户身份登录(请参阅第一章中的配方,安装与设置,了解如何启动和登录,以及第二章中的配方,管理,了解如何远程登录)。 -
一个带电源的 USB 集线器(推荐)。
-
至少需要一个 USB 磁盘驱动器。
此配方不需要桌面 GUI,可以从基于文本的控制台或 LXTerminal 中运行。
如果树莓派的安全外壳(SSH)服务器正在运行,可以通过安全外壳客户端远程完成此操作(请参阅第二章中的远程访问(SSH)配方,管理)。
本配方中的示例将树莓派连接到名为terragolden的家庭文件服务器,该服务器共享一个名为livemusic的文件夹,并配置为访客访问。
如何操作...
从其他计算机共享文件夹的步骤如下:
-
登录到树莓派,直接登录或远程登录均可。
-
使用
mkdir命令为共享文件夹创建一个挂载点:pi@raspberrypi ~ $ sudo mkdir /media/livemusic -
使用
mount命令和guest及uid=pi选项(-o)将远程文件共享//terragolden/livemusic挂载到本地目录/media/livemusic。pi@raspberrypi ~ $ sudo mount -o guest,uid=pi //terragolden/livemusic /media/livemusic -
使用
ls –l命令列出/media/livemusic文件夹中的文件。pi@raspberrypi ~ $ ls -l /media/livemusic total 0 drwx------ 2 pi nogroup 0 Mar 9 2011 dso040424 drwx------ 2 pi nogroup 0 Mar 9 2011 dtb2005-03-04 drwxrwxrwx 2 pi nogroup 0 Mar 25 2011 franti2010-06-11.flac16 drwx------ 2 pi nogroup 0 Mar 9 2011 garaj2005-04-10_16bit_64kb_mp3 drwx------ 2 pi nogroup 0 Mar 14 2011 JackJohnson2010-07-17 drwx------ 2 pi nogroup 0 Apr 28 2011 JasonMraz-FarmAid drwx------ 2 pi nogroup 0 Apr 28 2011 JasonMrazGrandRex_vbr_mp3 drwx------ 2 pi nogroup 0 Mar 9 2011 JGB2007-06-15 drwx------ 2 pi nogroup 0 Mar 9 2011 jgb2008-07-19_64kb_mp3 drwx------ 2 pi nogroup 0 Mar 2 2011 jj2010-12-13.aud.flac16 drwxrwxrwx 2 pi nogroup 0 Mar 25 2011 MF2010-10-06_Nak30016BitFlac drwx------ 2 pi nogroup 0 Mar 9 2011 mFranti2006-11-13 drwx------ 2 pi nogroup 0 Mar 9 2011 mfs2005-01-15 drwxrwxrwx 2 pi nogroup 0 Mar 25 2011 particle2010-04-15 drwxrwxrwx 2 pi nogroup 0 Mar 25 2011 particle2010-10-30 drwx------ 2 pi nogroup 0 Mar 14 2011 skb2005-10-01matrix_64kb_mp3 drwx------ 2 pi nogroup 0 Mar 25 2011 Soulive2011-03-08 drwx------ 2 pi nogroup 0 Mar 25 2011 Soulive2011-03-10 drwx------ 2 pi nogroup 0 Mar 9 2011 tenaciousd2005-09-22.flac16_64kb drwx------ 2 pi nogroup 0 Mar 9 2011 um2007-04-21 drwx------ 5 pi nogroup 0 Mar 9 2011 ymsb2001-02-02 drwx------ 2 pi nogroup 0 Mar 9 2011 ymsb2007-06-22 pi@raspberrypi ~ $
它是如何工作的...
在登录到树莓派后,使用mkdir命令在/media目录中为共享文件夹创建一个挂载点。挂载点是一个空目录(/media/livemusic),作为文件系统中的占位符。
然后,从家庭文件服务器terragolden共享的文件//terragolden/livemusic被挂载到新创建的挂载点(/media/livemusic)。mount命令的选项(–o guest,uid=pi)告诉命令以无需用户名或密码(guest)的方式访问共享,并且挂载的文件将属于用户pi(uid=pi)。
最后,使用ls -l命令列出挂载点(/media/livemusic)中的文件,以验证它们是否与家庭文件服务器上的文件完全相同。
还有更多...
让我们看看与共享文件夹相关的其他方面。
受保护的共享需要用户名和密码
如果文件共享受密码保护,则mount命令中的选项需要扩展,添加username=USER和password=PASS选项。USER和PASS应分别替换为有权访问该共享的用户的用户名和密码。
pi@raspberrypi ~/xfer $ sudo mount -o uid=pi,user=golden //golden-macbook/xfer /media/xfer
Password:
pi@raspberrypi /media/xfer $ ls -l /media/golden-macbook/
total 8200
drwxr-xr-x 2 pi root 0 Jul 17 16:58 Applications
drwxr-xr-x 2 pi root 0 Jul 9 09:33 bin
drwxr-xr-x 2 pi root 0 Aug 24 2013 cores
drwxr-xr-x 2 pi root 0 Jul 14 18:06 dev
-rwxr-xr-x 1 pi root 0 Mar 11 09:23 etc
-rwxr-xr-x 1 pi root 0 Mar 11 09:26 HGN.flag
drwxr-xr-x 2 pi root 0 Jul 14 18:06 home
drwxr-xr-x 2 pi root 0 Mar 27 10:35 Library
-rwxr-xr-x 1 pi root 8394688 Mar 18 16:20 mach_kernel
drwxr-xr-x 2 pi root 0 Jul 14 18:06 net
drwxr-xr-x 2 pi root 0 Aug 24 2013 Network
drwxr-xr-x 2 pi root 0 Mar 18 08:53 opt
drwxr-xr-x 2 pi root 0 Mar 11 09:35 private
drwxr-xr-x 2 pi root 0 Jul 9 09:33 sbin
drwxr-xr-x 2 pi root 0 Mar 11 09:30 System
-rwxr-xr-x 1 pi root 0 Mar 11 09:23 tmp
drwxr-xr-x 2 pi root 0 Mar 27 14:48 Users
drwxr-xr-x 2 pi root 0 Mar 11 09:23 usr
-rwxr-xr-x 1 pi root 0 Mar 11 09:23 var
drwxr-xr-x 2 pi root 0 Jul 19 11:18 Volumes
pi@raspberrypi /media/xfer $
卸载磁盘
使用umount命令卸载磁盘(命令名称中没有n)。
pi@raspberrypi /media/xfer $ sudo umount /media/golden-macbook
pi@raspberrypi /media/xfer $ ls -l /media/golden-macbook
total 0
pi@raspberrypi /media/xfer $
在磁盘卸载后,挂载点会保留在/media目录下;然而,它们会再次变为空目录。umount命令需要特权(使用sudo)。
另见
-
文件系统 (
en.wikipedia.org/wiki/Filesystem):维基百科关于文件系统的文章更详细地解释了它们的区别。 -
服务器消息块 (
en.wikipedia.org/wiki/Server_Message_Block):维基百科关于服务器消息块(SMB)协议的文章讨论了该协议的使用及其历史。 -
统一命名约定 (
en.wikipedia.org/wiki/Uniform_Naming_Convention):维基百科关于统一命名约定(UNC)协议的文章展示了它如何支持 SMB(CIFS)协议。 -
mount – 挂载文件系统 (
manpages.debian.net/cgi-bin/man.cgi?query=mount):Debian 的mount手册页面解释了该命令及其选项。 -
mount.cifs – 使用 CIFS 文件系统挂载 (
manpages.debian.net/cgi-bin/man.cgi?query=mount.cifs):Debian 的mount.cifs手册页面更详细地解释了该命令。 -
umount – 卸载文件系统 (
manpages.debian.net/cgi-bin/man.cgi?query=umount):Debian 的umount手册页面展示了该命令及其选项。
在启动时自动挂载 USB 磁盘(/etc/fstab)
本食谱展示了如何配置树莓派,以便它在启动过程中自动挂载附加的 USB 磁盘驱动器。
本食谱的目标是在启动时使用与pmount命令相同的配置挂载示例磁盘。
本食谱的前几个步骤使用pmount和mount命令来发现两个示例磁盘驱动器的正确文件系统表配置参数。发现正确的配置参数后,文件系统表配置文件(/etc/fstab)将被更新,以便在树莓派启动时挂载这些磁盘。
本食谱不提供每个配置参数的详细含义,而是重用了pmount命令中使用的相同配置。有关配置参数的更多细节可以在mount命令的手册页中找到。
完成本食谱后,树莓派将在启动时使用与pmount工具一致的配置挂载 USB 磁盘驱动器。
准备工作
以下是本食谱的配料:
-
树莓派的初步设置或基本网络设置已经完成,并且已登录为用户
pi(有关如何启动和登录的信息,请参见第一章,《安装与设置》;有关如何远程登录的信息,请参见第二章,《管理》)。 -
一个已供电的 USB 集线器(推荐)。
-
至少需要一个 USB 磁盘驱动器。
本配方不需要桌面 GUI,可以在基于文本的控制台或在 LXTerminal 中运行。
如果 Raspberry Pi 的安全外壳服务器正在运行,则可以使用安全外壳客户端远程完成此配方(参见第二章,管理中的配方远程访问(SSH))。
本配方中的示例使用了两块 USB 驱动器:一块 128 MB 的闪存驱动器和一块 500 GB 的磁盘。
pmount命令应该已经安装(参见配方挂载 USB 磁盘)。
注意
小心!一个损坏的/etc/fstab可能会导致系统无法启动。在重启之前,请确保已经测试过配置!
如何操作...
自动挂载 USB 磁盘的步骤如下:
-
直接或远程登录到 Raspberry Pi。
-
使用
pmount命令将 128 MB 闪存驱动器的主分区/dev/sda1挂载到/media目录中的挂载点thumbdrive。pi@raspberrypi /media/xfer $ pmount /dev/sda1 thumbdrive -
使用
pmount命令将 500 GB 磁盘的主分区/dev/sdb1挂载到/media目录中的挂载点bigdisk。pi@raspberrypi /media/xfer $ pmount /dev/sdb1 bigdisk -
使用
ls -l命令显示磁盘是否已挂载。pi@raspberrypi ~ $ ls -l /media total 20 drwxr-xr-x 6 pi pi 4096 May 30 12:23 bigdisk drwx------ 4 pi pi 16384 Dec 31 1969 thumbdrive pi@raspberrypi ~ $ -
使用
mount命令显示挂载这两个磁盘的配置。pi@raspberrypi ~ $ mount -
mount命令显示文件系统表,包括每个磁盘(或磁盘分区)所需的挂载参数。/dev/root on / type ext4 (rw,noatime,data=ordered) devtmpfs on /dev type devtmpfs (rw,relatime,size=494800k,nr_inodes=123700,mode=755) tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=99820k,mode=755) tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=199620k) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) /dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro) /dev/sda1 on /media/thumbdrive type vfat (rw,nosuid,nodev,noexec,relatime,uid=1001,gid=1004,fmask=0177,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,quiet,utf8,errors=remount-ro) /dev/sdb1 on /media/bigdisk type ext4 (rw,nosuid,nodev,noexec,relatime,errors=remount-ro,data=ordered) pi@raspberrypi ~ $ -
在显示磁盘配置参数后,使用
pumount命令卸载这两个磁盘。pi@raspberrypi ~ $ pumount /media/thumbdrive pi@raspberrypi ~ $ pumount /media/bigdisk pi@raspberrypi ~ $ ls -l /media total 0 -
使用
cp命令复制当前的文件系统配置。只有特权用户才能在/etc目录中创建(或复制到)文件(因此请使用sudo)。pi@raspberrypi ~ $ sudo cp /etc/fstab /etc/fstab.orig -
使用
vi命令编辑文件系统配置表fstab。pi@raspberrypi ~ $ sudo vi /etc/fstab -
vi 编辑器显示
/etc/fstab配置文件的内容。有关如何使用编辑器的说明,请参见 vi 手册页面。在第二章,管理中查阅“阅读内置文档”的配方。proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, so no using swapon|off from here on, use dphys-swapfile swap[on|off] for that ~ ~ ~ "/etc/fstab" 4 lines, 322 characters -
将每个磁盘的配置参数添加到配置文件的底部。每个磁盘的参数可以从
mount命令的输出中复制。注意
每个磁盘配置应为一行,字段之间用空格或制表符分隔。示例不适合页面宽度。
proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, so no using swapon|off from here on, use dphys-swapfile swap[on|off] for that /dev/sda1 /media/thumbdrive vfat rw,nosuid,nodev,noexec,relatime,uid=1001,gid=1004,fmask=0177,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,quiet,utf8,errors=remount-ro 0 2 /dev/sdb1 /media/bigdisk ext4 rw,nosuid,nodev,noexec,relatime,errors=remount-ro,data=ordered 0 2 ~ ~ "/etc/fstab" 6 lines, 605 characters -
输入每个磁盘的配置参数后,保存文件并退出编辑器。
pi@raspberrypi ~ $ -
在磁盘可以挂载之前,需要先为其创建挂载点。使用
mkdir命令创建挂载点。pi@raspberrypi ~ $ sudo mkdir /etc/thumbdrive pi@raspberrypi ~ $ sudo mkdir /etc/bigdisk pi@raspberrypi ~ $ ls –l /media total 8 drwxr-xr-x 2 root root 4096 Jul 19 19:14 bigdisk drwxr-xr-x 2 root root 4096 Jul 19 19:15 thumbdrive pi@raspberrypi ~ $ ls -l /media/thumbrioe/ total 0 pi@raspberrypi ~ $ ls -l /media/bigdisk/ total 0 -
使用
mount -a命令挂载所有已配置的磁盘。pi@raspberrypi ~ $ sudo mount -a pi@raspberrypi ~ $ ls -l /media total 20 drwxr-xr-x 6 pi staff 4096 May 30 12:23 bigdisk drwx------ 4 pi pi 16384 Dec 31 1969 thumbdrive pi@raspberrypi ~ $ ls -l /media/bigdisk/ total 24 drwxrwsr-x 11 pi pi 4096 Apr 26 2012 archive drwxrws--- 20 pi pi 4096 Jan 23 2010 Live drwx------ 2 pi pi 16384 Oct 4 2010 lost+found pi@raspberrypi ~ $ ls -l /media//thumbdrive/ total 71278 -rw------- 1 pi pi 72988392 Mar 7 00:34 docker.tgz pi@raspberrypi ~ $ -
使用
reboot命令重启系统,然后重新登录,使用ls -l命令显示两个挂载点/media/thumdrive和/media/bigdisk的内容。pi@raspberrypi ~ $ sudo reboot Broadcast message from root@raspberrypi (pts/2) (Sun Jul 19 18:40:55 2015): The system is going down for reboot NOW! pi@raspberrypi ~ $ Connection to 192.168.2.7 closed by remote host. Connection to 192.168.2.7 closed. golden-macbook:~ golden$ ssh pi@raspberrypi.local Linux raspberrypi 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Jul 19 18:44:50 2015 from 192.168.2.1 pi@raspberrypi ~ $ ls -l /media total 20 drwxr-xr-x 6 pi staff 4096 May 30 12:23 bigdisk drwx------ 4 pi pi 16384 Dec 31 1969 thumbdrive pi@raspberrypi ~ $ ls -l /media/bigdisk total 24 drwxrwsr-x 11 pi staff 4096 Apr 26 2012 archive drwxrws--- 20 pi staff 4096 Jan 23 2010 Live drwx------ 2 pi staff 16384 Oct 4 2010 lost+found pi@raspberrypi ~ $ ls -l /media/thumbdrive total 71278 -rw------- 1 pi pi 72988392 Mar 7 00:34 docker.tgz pi@raspberrypi ~ $ -
现在磁盘在启动时会自动挂载!
它是如何工作的...
登录树莓派后,使用个人挂载命令pmount挂载两个示例磁盘(有关pmount命令的更多信息,请参见食谱挂载 USB 磁盘)。
128 MB 闪存驱动器(/dev/sda1)挂载在/media/thumbdrive。
500 GB 磁盘(/dev/sdb1)挂载在/media/bigdisk。
系统的mount命令用于显示附加到树莓派的所有磁盘的文件系统表配置参数,包括bigdisk和thumbdrive。
配置参数显示后,使用pumount命令卸载两个 USB 磁盘(/dev/sda1和/dev/sdb1)。/media目录再次变为空。
在对文件系统配置进行任何更改之前,使用cp命令创建/etc/fstab的备份副本。
然后使用 vi 编辑器将每个磁盘的配置参数添加到文件系统表配置文件(/etc/fstab)的底部。
在磁盘可以挂载之前,必须首先在文件系统中创建挂载点。使用mkdir命令为每个 USB 磁盘在/media/thumbdrive和/media/bigdisk下创建挂载点。
一旦挂载点创建完成,可以使用mount all disks命令,mount –a,来挂载示例磁盘。
在磁盘挂载后,可以使用ls –l命令显示磁盘的内容。
一切看起来都很正常,因此使用reboot命令重启树莓派。
当树莓派重启完成后,用户可以使用ssh命令重新登录到树莓派。
最后,再次使用ls –l命令列出两个磁盘挂载点/media/thumbdrive和/media/bigdisk的内容。
磁盘在启动过程中已成功挂载!
还有更多内容…
我们将看看如何从错误中恢复。
错误恢复
如果mount命令显示错误,请再次编辑/etc/fstab文件,检查是否有拼写错误和多余的空格。修正任何错误并重试。
如果仍然存在错误,请使用以下命令将配置文件替换为其原始版本:
pi@raspberrypi ~ $ sudo cp –f /etc/fstab.orig /etc/fstab
fstab 文件格式
fstab配置文件的每一行都用于配置某个磁盘(或磁盘分区)的挂载位置。每行有六个字段,用空格(或制表符)分隔:
-
第一个字段是设备文件。设备文件会自动分配给每个磁盘,并且可以使用
fdisk –l命令发现(请参阅之前的食谱)。128 MB 的thumbdrive有一个分区,其可挂载的设备文件是/dev/sda1。500 GB 磁盘也有一个分区,其可挂载的设备文件是/dev/sdb1。 -
第二个字段是挂载点。挂载点可以位于文件系统中的任何位置;然而,当前的惯例是将它们放在
/media目录下。128 MB 闪存驱动器的挂载点是/media/thumbdrive,500 GB 磁盘的挂载点是/media/bigdisk。 -
第三个字段是设备的文件系统类型。128 MB 的闪存驱动器使用
vfat文件系统,而 500 GB 的硬盘使用ext4文件系统。 -
第四个字段是一个以逗号分隔的配置参数列表。这些参数应该从
mount命令输出中的括号列表复制过来。此字段中不应有空格,也不应包含括号。 -
第五个字段是转储标志。通常为零(
0),表示文件系统不需要转储。两个磁盘在此字段中都是0。 -
第六个字段选择磁盘将被挂载的启动阶段。作为根文件系统(
/)挂载的磁盘在第一阶段挂载;所有其他磁盘应该在第二阶段挂载。示例中的磁盘不会作为根文件系统挂载,因此它们在此字段中都有2。
对于 128 MB 的闪存驱动器,配置参数如下:
-
设备文件:
/dev/sda1 -
挂载点:
/media/thumbdrive -
文件系统类型:
vfat -
挂载选项:
rw,nosuid,nodev,noexec,relatime,uid=1001,gid=1004,fmask=0177,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,quiet,utf8,errors=remount-ro -
转储选项: (
0) -
启动阶段: (
2)
对于 500 GB 的 USB 硬盘,配置参数如下:
-
设备文件:
/dev/sdb1 -
挂载点:
/media/bigdisk -
文件系统类型:
ext4 -
挂载选项:
rw,nosuid,nodev,noexec,relatime,errors=remount-ro,data=ordered -
转储选项: (
0) -
启动阶段: (
2)
另请参阅
- fstab – 静态文件系统信息 (
manpages.debian.net/cgi-bin/man.cgi?query=fstab): Debian 手册页面为fstab命令提供了关于命令及其选项的详细信息。
在启动时自动挂载共享文件夹
本配方的目标是在启动时挂载来自另一台计算机的共享文件夹。
上一个配方展示了如何配置/etc/fstab以挂载 USB 磁盘。这个配方展示了如何使用类似的配置,在启动时自动挂载 Windows 共享(或使用 SMB(CIFS)协议共享的任何其他文件集)。
在家里或办公室,常见的本地网络中会有某种形式的网络附加存储(NAS)作为共享文件夹,通过 SMB(CIFS)协议供网络用户使用。这个配方展示了如何配置树莓派,使其在启动时自动挂载共享文件夹。
完成此配方后,每次树莓派启动时,来自另一台计算机的共享文件夹将自动附加到根文件系统。
准备工作
以下是所需的组件:
-
已开机的 Raspberry Pi 进行的初步设置或基本网络设置。你还以
pi用户身份登录(有关如何启动和登录的说明,请参见 第一章,安装与设置;有关如何远程登录的说明,请参见 第二章,管理)。 -
一个网络连接。
-
一台与 Raspberry Pi 处于同一网络的客户端计算机。
本食谱不需要桌面 GUI,可以从基于文本的控制台或 LXTerminal 中运行。
如果 Raspberry Pi 的 Secure Shell 服务器正在运行,可以使用 Secure Shell 客户端远程完成此食谱(参见 第二章,管理 中的食谱 远程访问(SSH))。
本食谱中的示例将 Raspberry Pi 连接到一个名为 terragolden 的家庭文件共享设备。这个文件服务器有多个共享文件夹,包括备份。共享文件夹已配置为访客访问,因此不需要用户名或密码。
使用 SMB(CIFS)协议的其他计算机配置将类似。
如何操作...
自动挂载共享文件夹的步骤如下:
-
直接或远程登录到 Raspberry Pi。
-
使用
cp命令将/etc/fstab配置文件备份为名为/etc/fstab.orig的副本。文件只能由具有特权的用户在/etc目录中创建(或复制到该目录)(因此使用sudo)。pi@raspberrypi ~ $ sudo cp /etc/fstab /etc/fstab.orig -
执行以下命令:
nano /etc/fstab编辑文件系统配置表
fstab。fstab文件只能由特权用户修改(使用sudo)。 -
使用
vi命令编辑文件系统配置表fstab。pi@raspberrypi ~ $ sudo vi /etc/fstab -
vi 编辑器显示
/etc/fstab配置文件的内容。使用编辑器的说明可以在 vi 手册中找到。请参阅 第二章,管理 中的食谱 读取内置文档。proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, so no using swapon|off from here on, use dphys-swapfile swap[on|off] for that //terragolden/backups /media/backups cifs guest,uid=pi 0 2 ~ ~ "/etc/fstab" 4 lines, 322 characters -
对于示例中的家庭文件服务器,配置如下:
-
网络位置为
//terragolden/backups -
挂载点为
/media/backups -
文件系统类型为
cifs -
挂载选项为
guest,uid=pi -
dump 选项为
0 -
启动阶段为
2
-
-
输入文件共享的配置参数后,保存文件并退出编辑器。
pi@raspberrypi ~ $ -
在文件共享被挂载之前,需要创建挂载点。使用
mkdir命令在/media/backups创建挂载点。pi@raspberrypi ~ $ sudo mkdir /etc/backups pi@raspberrypi ~ $ ls –l /media total 4 drwxr-xr-x 2 root root 4096 Jul 19 19:15 backups pi@raspberrypi ~ $ ls -l /media/thumbdrive/ total 0 pi@raspberrypi ~ $ ls -l /media/bigdisk/ total 0 -
使用
mount –a命令挂载所有已配置的磁盘。pi@raspberrypi ~ $ sudo mount -a pi@raspberrypi ~ $ ls -l /media total 0 drwxrwxrwx 14 pi 254 0 Jul 24 2017 backups pi@raspberrypi ~ $ ls -l /media/backups total 3072 drwxrwxrwx 44 pi nogroup 0 Oct 28 2011 0 - live music drwxr-xr-x 9 pi nogroup 0 Oct 26 2011 1 - family video drwxr-xr-x 4 pi nogroup 0 Oct 1 2011 3 - golden studios drwxrwxrwx 5 pi nogroup 0 Mar 29 2012 8 - software drwxrwxrwx 2 pi nogroup 0 May 19 2011 9 - virtual machines drwxrwxrwx 8 pi nogroup 0 May 11 2011 Alex drwxrwxrwx 21 pi nogroup 0 Jan 20 2012 Barbara drwxrwxrwx 4 pi nogroup 0 Feb 19 19:53 Michael drwxrwxrwx 2 pi nogroup 0 May 19 2011 Patrick drwxr-xr-x 30 pi nogroup 0 Apr 2 2012 Richard drwxr-xr-x 4 pi nogroup 0 Dec 10 2011 xfer pi@raspberrypi ~ $ -
使用
reboot命令重启系统。pi@raspberrypi ~ $ sudo reboot Broadcast message from root@raspberrypi (pts/2) (Sun Jul 19 18:40:55 2015): The system is going down for reboot NOW! -
重新登录 Raspberry Pi,然后使用
ls –l命令显示文件共享 /media/backups 的内容。pi@raspberrypi ~ $ ls -l /media/backups total 3072 drwxrwxrwx 44 pi nogroup 0 Oct 28 2011 0 - live music drwxr-xr-x 9 pi nogroup 0 Oct 26 2011 1 - family video drwxr-xr-x 4 pi nogroup 0 Oct 1 2011 3 - golden studios drwxrwxrwx 5 pi nogroup 0 Mar 29 2012 8 - software drwxrwxrwx 2 pi nogroup 0 May 19 2011 9 - virtual machines drwxrwxrwx 8 pi nogroup 0 May 11 2011 Alex drwxrwxrwx 21 pi nogroup 0 Jan 20 2012 Barbara drwxrwxrwx 4 pi nogroup 0 Feb 19 19:53 Michael drwxrwxrwx 2 pi nogroup 0 May 19 2011 Patrick drwxr-xr-x 30 pi nogroup 0 Apr 2 2012 Richard drwxr-xr-x 4 pi nogroup 0 Dec 10 2011 xfer pi@raspberrypi ~ $ -
远程文件共享现在已在启动时自动挂载!
它是如何工作的...
登录 Raspberry Pi 后,对文件系统表配置文件 /etc/fstab 进行备份。配置文件被复制到 /etc/fstab.orig。
使用 vi 编辑器将共享文件夹的配置参数添加到配置文件的底部。
示例中使用的配置如下:
-
第一个字段是网络位置:
//terragolden/xfer。第二个字段是挂载点:/media/backups。 -
第三个字段是文件系统的类型:
cifs。这是文件服务器用来共享文件夹的协议。 -
第四个字段是一个以逗号分隔的选项列表:
guest,uid=pi。其他选项包括user=和password=,用于指定共享文件夹受保护时的用户名和密码。 -
第五个字段是一个转储标志。它被设置为零(
0),表示共享文件夹在启动时不需要转储。 -
第六个字段选择了磁盘挂载的启动阶段。作为根文件系统(
/)挂载的磁盘在第一阶段挂载;所有其他磁盘应在第二阶段(2)挂载。
一旦文件系统表配置文件(/etc/fstab)被更新,配置会在重启系统前进行测试。使用mount all disks命令,即mount -a,来挂载示例磁盘。
如果没有错误,系统可以重启。
如果挂载命令显示错误,请再次编辑/etc/fstab文件,检查是否有拼写错误或多余的空格。修正错误后重新尝试。
如果仍然存在错误,请使用以下命令将配置文件替换为原始版本:
pi@raspberrypi ~ $ sudo cp –f /etc/fstab.orig /etc/fstab
另请参见
- 网络附加存储 (
en.wikipedia.org/wiki/Network_Attached_Storage):这是关于网络附加存储(NAS)的一个有趣的维基百科文章。
创建文件服务器(Samba)
本步骤展示了如何将树莓派配置为局域网上的文件服务器。
树莓派,配备附加的文件存储,作为文件服务器运行良好。这样的文件服务器可以用作共享文件和文档的中心位置、存储其他计算机的备份文件,并存储大容量媒体文件,如照片、音乐和视频文件。
本步骤安装并配置了 samba 和 samba-common-bin。Samba 软件包包含一个用于设置共享驱动器或共享文件夹的 SMB(CIFS)协议服务器,这是现代计算机使用的协议。samba-common-bin 软件包包含一组用于管理共享文件访问的小工具。
本步骤包括为登录用户设置文件共享密码,并为用户主目录中的文件提供读/写权限。然而,它并没有设置新的文件共享,也没有显示如何共享 USB 磁盘。下一个步骤将展示如何操作。
完成此步骤后,局域网上的其他计算机可以与树莓派交换文件。
准备工作
以下是此步骤所需的配置信息:
-
为已开机的 Raspberry Pi 完成初始设置或基本的网络设置。你还需要作为用户
pi登录(请参阅 第一章,安装与设置 中的配方,了解如何启动并登录,以及 第二章,管理 中的配方,了解如何远程登录)。 -
一个网络连接。
-
一台与 Raspberry Pi 连接到同一网络的客户端 PC。
本配方不需要桌面图形界面,可以在基于文本的控制台或 LXTerminal 中运行。
如果 Raspberry Pi 的安全外壳服务器正在运行,则可以使用安全外壳客户端远程完成此配方(请参见 第二章,管理 中的 远程访问(SSH) 配方)。
如何操作...
创建文件服务器的步骤如下:
-
直接或远程登录到 Raspberry Pi。
-
使用
apt-get install命令安装软件包 samba 和 samba-common-bin。pi@raspberrypi ~ $ sudo apt-get install –y samba samba-common-bin Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: tdb-tools Suggested packages: openbsd-inetd inet-superserver smbldap-tools ldb-tools ctdb The following NEW packages will be installed: samba samba-common-bin tdb-tools 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 6,119 kB of archives. After this operation, 36.1 MB of additional disk space will be used. Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main samba armhf 2:3.6.6-6+deb7u5 [3,356 kB] Get:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main samba-common-bin armhf 2:3.6.6-6+deb7u5 [2,737 kB] Get:3 http://mirrordirector.raspbian.org/raspbian/ wheezy/main tdb-tools armhf 1.2.10-2 [25.9 kB] Fetched 6,119 kB in 2s (2,236 kB/s) Preconfiguring packages ... Selecting previously unselected package samba. (Reading database ... 89348 files and directories currently installed.) Unpacking samba (from .../samba_2%3a3.6.6-6+deb7u5_armhf.deb) ... Selecting previously unselected package samba-common-bin. Unpacking samba-common-bin (from .../samba-common-bin_2%3a3.6.6-6+deb7u5_armhf.deb) ... Selecting previously unselected package tdb-tools. Unpacking tdb-tools (from .../tdb-tools_1.2.10-2_armhf.deb) ... Processing triggers for man-db ... Setting up samba (2:3.6.6-6+deb7u5) ... Generating /etc/default/samba... Adding group `sambashare' (GID 110) ... Done. update-alternatives: using /usr/bin/smbstatus.samba3 to provide /usr/bin/smbstatus (smbstatus) in auto mode [ ok ] Starting Samba daemons: nmbd smbd. Setting up samba-common-bin (2:3.6.6-6+deb7u5) ... update-alternatives: using /usr/bin/nmblookup.samba3 to provide /usr/bin/nmblookup (nmblookup) in auto mode update-alternatives: using /usr/bin/net.samba3 to provide /usr/bin/net (net) in auto mode update-alternatives: using /usr/bin/testparm.samba3 to provide /usr/bin/testparm (testparm) in auto mode Setting up tdb-tools (1.2.10-2) ... update-alternatives: using /usr/bin/tdbbackup.tdbtools to provide /usr/bin/tdbbackup (tdbbackup) in auto mode pi@raspberrypi ~ $ -
使用
vi命令编辑 Samba 配置文件 (/etc/samba/smb.conf)。pi@raspberrypi ~ $ sudo vi /etc/samba/smb.conf -
vi 编辑器显示
/etc/samba/smb.conf文件的内容。使用编辑器的说明可以在 vi 手册页中找到;请参见 第二章,管理 中的 阅读内建文档。# # Sample configuration file for the Samba suite for Debian GNU/Linux. # # # This is the main Samba configuration file. You should read the # smb.conf(5) manual page in order to understand the options listed # here. Samba has a huge number of configurable options most of which # are not shown in this example # "/etc/samba/smb.conf" 333 lines, 12173 characters -
更改
= user的安全行,取消该行的注释。(移除行首的井号#。)# "security = user" is always a good idea. This will require a Unix account # in this server for every user accessing the server. See # /usr/share/doc/samba-doc/htmldocs/Samba3-HOWTO/ServerType.html # in the samba-doc package for details. security = user -
将
read only = yes行更改为read only = no。[homes] comment = Home Directories browseable = no # By default, the home directories are exported read-only. Change the # next parameter to 'no' if you want to be able to write to them. read only = no -
保存(
:w)并退出(:q)vi 编辑器。 -
使用
/etc/init.d/samba初始化脚本,告诉 Samba 服务器重新加载其配置文件。pi@raspberrypi ~ $ sudo /etc/init.d/samba reload [ ok ] Reloading /etc/samba/smb.conf: smbd only. -
使用
smbpasswd –a命令为已登录的用户pi创建一个 SMB(CIFS)密码。输入密码(两次)。pi@raspberrypi ~ $ sudo smbpasswd -a pi New SMB password: Retype new SMB password: Added user pi. pi@raspberrypi ~ $ -
现在,Raspberry Pi 作为文件服务器可以访问!
-
在 Windows 计算机上,使用 映射网络驱动器 将 Raspberry Pi 挂载为网络磁盘。
![如何操作...]()
上面的截图展示了在 Windows 7 上将网络驱动器映射到 Raspberry Pi。
-
输入 UNC 地址
\\raspberrypi\pi作为网络文件夹。选择一个合适的驱动器字母。以下示例使用R:驱动器。选择 使用不同的凭据连接。点击 完成。![如何操作...]()
上面的截图完成了将网络驱动器映射到 Raspberry Pi。
-
使用新配置的 SMB(CIFS)密码登录(见步骤 7)。
![如何操作...]()
在截图中,显示了一个对话框,提示使用 SMB(CIFS)用户名和密码登录到 Raspberry Pi。
-
现在,Raspberry Pi 作为 Windows 共享可以访问!此时,仅用户
pi的主目录可以访问。下一步的操作是配置 USB 磁盘作为共享驱动器使用。
如何操作...
登录树莓派后,配方通过 apt-get install 命令安装两个软件包:samba 和 samba-common-bin。
samba 包包含 服务器消息块(SMB)协议的实现(也称为 公共互联网文件系统,CIFS)。用于共享文件和打印机时,Microsoft Windows 计算机使用 SMB(CIFS)协议。
安装完软件包后,Samba 配置文件 /etc/samba/smb.conf 会被更新。该文件被更新以启用用户安全(security = user)并允许将文件写入用户的主目录(readonly = no)。
配置文件更新后,Samba 服务器会使用服务器的初始化文件 /etc/init.d/samba 重新加载其配置。
此时,树莓派应该能被使用 SMB 协议的本地网络中的其他计算机看到。然而,授权用户的密码尚未配置。
smbpasswd 命令用于将用户 pi 添加(-a)到授权与树莓派使用 SMB 协议共享文件的用户列表中。文件共享的密码与用于直接或远程登录树莓派的登录密码是分开管理的。
在为用户 pi 添加密码后,树莓派应该可以从本地网络中任何配置为 SMB 协议的机器访问。
配方的最后步骤配置了从 Windows 7 PC 使用映射的网络驱动器访问树莓派。文件共享的 UNC 名称 \\raspberrypi\pi 也可以直接在 Windows 资源管理器中访问共享。
还有更多...
这是一个非常简单的文件共享配置。它为登录到树莓派的用户启用文件共享。然而,它仅允许共享用户主目录中的文件。下一个配方描述了如何添加新的文件共享。
除了 SMB 协议服务器 smbd,Samba 软件包还包含一个 NetBIOS 名称服务器 nmbd。NetBIOS 名称服务器为使用 SMB 协议的计算机提供命名服务。nmbd 服务器将树莓派的配置名称 raspberrypi 广播到本地网络中的其他计算机。
除了文件共享,Samba 服务器还可以用作 主域控制器(PDC)——一个用于为局域网上所有计算机提供登录和安全性的中央网络服务器。关于将 samba 包用作 PDC 的更多信息可以在以下链接中找到。
另见
-
Samba(软件) (
en.wikipedia.org/wiki/Samba_(software)):关于 Samba 软件套件的 Wikipedia 文章。 -
nmbd – NetBIOS 通过 IP 命名服务 (
manpages.debian.net/cgi-bin/man.cgi?query=nmbd):nmbd的 Debian 手册页面。 -
samba – 用于 Unix 的 Windows SMB/CIFS 文件服务器 (
manpages.debian.net/cgi-bin/man.cgi?query=samba): Debian 的 samba 手册页。 -
smb.conf – Samba 套件的配置文件 (
manpages.debian.net/cgi-bin/man.cgi?query=smb.conf): Debian 的smb.conf手册页。 -
smbd – 提供 SMB/CIFS 服务给客户端的服务器 (
manpages.debian.net/cgi-bin/man.cgi?query=smbd): Debian 的smbd手册页。 -
smbpasswd – 更改用户的 SMB 密码 (
manpages.debian.net/cgi-bin/man.cgi?query=smbpasswd): Debian 的smbpasswd手册页。 -
System initialization (
www.debian.org/doc/manuals/debian-reference/ch04.en.html): Debian 参考手册中关于系统初始化的文章。 -
Samba.org (
www.samba.org): Samba 软件官网。
共享连接的 USB 硬盘(Samba)
本食谱扩展了默认的 Samba 配置,以包括共享 USB 硬盘。
上一个食谱展示了如何安装 Samba 并设置基本的文件共享。然而,之前使用的 Samba 配置仅共享用户的主目录中的文件。其他目录尚未通过 SMB(CIFS)协议开放。
本食谱扩展了之前食谱中使用的 Samba 配置,加入了一个新的文件共享定义,指向挂载在 Raspberry Pi 上的 USB 硬盘。
完成此食谱后,Raspberry Pi 可以作为文件服务器,供任何计算机通过 SMB(CIFS)协议共享文件(例如 Windows、Mac 和 Linux 计算机)。
准备工作
配料:
-
Raspberry Pi 的初始设置或基本网络设置,设备已经开机,并且你已作为用户
pi登录(有关如何启动和登录的详细步骤,请参见 第一章 安装与设置,以及 第二章 管理 中的远程登录教程)。 -
一个网络连接(可选)。
-
一台与 Raspberry Pi 连接到同一网络的客户端 PC(可选)。
-
一个有电的 USB 集线器(推荐)。
-
至少一个 USB 硬盘驱动器(本示例使用 500 GB 的 USB 硬盘)。
本食谱不需要桌面 GUI,可以从基于文本的控制台或 LXTerminal 中运行。
如果 Raspberry Pi 的安全外壳(Secure Shell)服务器正在运行,并且它有网络连接,可以通过安全外壳客户端远程完成此食谱(见前文)。
本食谱中的示例使用了一个挂载在 /media/bigdisk 的 USB 硬盘(请参见本章开头的食谱 挂载 USB 硬盘)。
本配方中的示例还包括从本地网络中的另一台计算机(golden-macbook)测试访问新的文件共享。
树莓派应该已经安装了 Samba(请参见前一个配方)。
如何操作...
分享附加的 USB 磁盘的步骤如下:
-
直接或远程登录到树莓派。
-
使用
ls –l命令列出已经挂载在/media目录下的磁盘驱动器。pi@raspberrypi ~ $ ls –l /media total 4 drwxr-xr-x 6 pi staff 4096 May 30 12:23 bigdisk pi@raspberrypi ~ $ -
使用 vi 编辑器编辑 Samba 配置文件
/etc/samba/smb.conf。pi@raspberrypi ~ $ vi /etc/samba/smb.conf -
vi 编辑器显示配置文件的内容。关于如何使用编辑器的说明可以在 vi 手册页中找到;请参阅第二章中的配方阅读内建文档,管理。
# # Sample configuration file for the Samba suite for Debian GNU/Linux. # # # This is the main Samba configuration file. You should read the # smb.conf(5) manual page in order to understand the options listed "/etc/samba/smb.conf" 333 lines, 12173 characters -
将新的共享配置添加到文件的底部:
[bigdisk] comment = A really big disk! path = /media/bigdisk valid users = pi admin users = pi read only = No#======================= Share Definitions ======================= [bigdisk] comment = A really big disk! path = /media/bigdisk valid users = pi admin users = pi read only = no [homes] comment = Home Directories browseable = no "/etc/samba/smb.conf" 340 lines, 12294 characters -
保存并退出 vi 编辑器。
-
使用
/etc/init.d/samba reload命令通知 Samba 服务器重新加载其配置文件。pi@raspberrypi ~ $ sudo /etc/init.d/samba reload [ ok ] Reloading /etc/samba/smb.conf: smbd only. pi@raspberrypi ~ $ -
现在,可以从本地网络访问文件共享
\\raspberrypi\bigdisk!请以用户pi身份连接。golden-macbook:~ golden$ smbutil view //pi@raspberrypi Password for 192.168.2.7: Share Type Comments ------------------------------- print$ Disk Printer Drivers pi Disk Home Directories IPC$ Pipe IPC Service (raspberrypi server) bigdisk Disk A really big disk! 4 shares listed golden-macbook:~ golden$
它是如何工作的...
登录到树莓派后,配方列出了已经挂载在/media目录下的磁盘。这是树莓派桌面(GUI)在自动挂载 USB 磁盘时使用的目录,也是pmount命令(以及配方在启动时自动挂载 USB 磁盘)使用的目录。
然后,使用 vi 编辑器修改 Samba 配置文件smb.conf。新共享[bigdisk]的配置被添加到文件中。
-
[bigdisk]在config文件中启动一个新部分,并设置共享的名称为bigdisk。 -
Comment =一个非常大的磁盘!定义了在其他计算机浏览共享时显示的注释。 -
Path = /media/bigdisk是树莓派上文件的位置。 -
valid users = pi声明只有用户pi可以访问这些文件。 -
admin users = pi授予用户pi对文件的管理员访问权限。 -
read only = no允许向共享中写入和删除文件。
配置保存并退出 vi 编辑器后,使用命令/etc/init.d/samba reload通知 Samba 服务器重新加载其配置。
一旦配置文件重新加载,Samba 服务器就准备好通过文件共享bigdata在 UNC 地址\\raspberrypi\bigdata上共享/media/bigdata目录中的文件。
最后,在另一台计算机(golden-macbook)上使用smbutil命令验证新的 bigdisk 共享是否可以从本地网络访问。
还有更多...
新共享中的文件是受保护的,要求其他计算机上的用户通过pi用户的 Samba 密码连接到共享。
注意
请记住:用户的 Samba 密码与登录密码是分开维护的。
使用smbpasswd命令创建和管理 Samba 密码(请参见前一个配方,为示例创建文件服务器)。
第五章:高级网络
本章将涵盖:
-
配置静态 IP 地址
-
使用
ufw创建防火墙 -
远程访问桌面会话(
xrdp) -
远程访问监视器(
x11vnc) -
安装一个 web 服务器(
apache,lighttpd,nginx) -
安装一个 wiki(
mediawiki) -
使用
hostapd创建无线接入点 -
安装网络追踪工具
-
安装网络协议分析器
-
启用 IPv6 网络协议
介绍
本章中的高级网络配方并不限于树莓派。然而,它们展示了树莓派的一些高级功能。
本章中的配方通常适用于任何 Linux 计算机。然而,安装说明是针对基于 Debian 的 Linux 操作系统,例如本书中使用的 Raspbian Linux 发行版。
完成本章配方后,您将为树莓派配置静态 IP 地址;学习如何用防火墙保护树莓派;远程连接到树莓派桌面;安装了 web 服务器和 wiki;设置了无线接入点;并分析了网络数据包。
配置静态 IP 地址
此配方配置树莓派,使其具有静态 IP 地址。
静态 IP 地址与 DHCP(动态主机配置协议)服务器提供的动态地址不同,它不会变化。使用有线网络连接的网络服务器(例如,web 服务器、wiki 和无线接入点)通常具有静态 IP 地址,以便为网络客户端(例如,web 浏览器、手机和其他互联网设备)提供一致的电话号般的参考。具有静态 IP 地址的服务器更容易被找到。
完成此配方后,您将能够配置静态网络 IP 地址。
准备工作
配料:
树莓派开机后的初始设置或基本网络设置。您也已以 pi 用户身份登录(请参阅 第一章,安装和设置 中的配方,了解如何启动和登录,并查阅 第二章,管理 中的配方,了解如何远程登录)。
此配方不需要桌面 GUI,可以从文本控制台或 LXTerminal 中运行。
如果树莓派的安全外壳(Secure Shell)服务器正在运行,可以使用安全外壳客户端远程完成此配方。
如何操作…
配置静态 IP 地址的步骤如下:
-
直接或远程登录到树莓派。
-
使用
hostname –I命令显示树莓派的当前 IP 地址。pi@raspberrypi ~ $ hostname -I 192.168.2.13 pi@raspberrypi ~ $ -
使用
route命令的输出,通过awk命令过滤,来确定默认网络网关的 IP 地址。pi@raspberrypi ~ $ route -n | awk '/⁰/ { print $2 }' 192.168.2.1 pi@raspberrypi ~ $ Use the output of the route command filtered through the awk command to determine the network mask for the local network. pi@raspberrypi ~ $ route -n | awk '/^[1-9]/ { print $3 }' 255.255.255.0 pi@raspberrypi ~ $ -
使用
vi命令编辑网络接口配置文件(/etc/network/interface)。pi@raspberrypi ~ $ sudo vi /etc/network/interfaces -
vi编辑器显示配置文件的内容。有关使用该编辑器的说明,请参阅vi的手册(请参见第二章,管理中的食谱 阅读内置文档)。auto lo iface lo inet loopback auto eth0 allow-hotplug eth0 iface eth0 inet manual auto wlan0 allow-hotplug wlan0 iface wlan0 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf auto wlan1 allow-hotplug wlan1 iface wlan1 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf ~ ~ "/etc/network/interfaces" 17 lines, 295 characters -
将以
iface eth0开头的行末尾的 manual 改为static。iface eth0 inet static -
在以
iface eth0开头的行后添加以下几行,使用第 2、3 和 4 步中的当前 IP 地址(192.168.2.13)、默认网络网关(192.168.2.1)和网络掩码(255.255.255.0):address 192.168.2.13 netmask 255.255.255.0 gateway 192.168.2.1 -
编辑后,文件应类似于以下内容:
auto lo iface lo inet loopback auto eth0 allow-hotplug eth0 iface eth0 inet static address 192.168.2.13 netmask 255.255.255.0 gateway 192.168.2.1 auto wlan0 allow-hotplug wlan0 iface wlan0 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf auto wlan1 allow-hotplug wlan1 iface wlan1 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf ~ ~ "/etc/network/interfaces" 20 lines, 370 characters -
保存文件并退出编辑器(
:wq)。 -
最后,重启树莓派以使用新的静态 IP 地址!
pi@raspberrypi ~ $ sudo reboot Broadcast message from root@raspberrypi (pts/0) (Mon Aug 10 23:23:29 2015): The system is going down for reboot NOW! pi@raspberrypi ~ $ Connection to 192.168.2.13 closed by remote host. Connection to 192.168.2.13 closed.
工作原理...
登录树莓派后,本食谱首先发现配置静态 IP 地址所需的网络配置参数,然后使用这些参数修改网络接口配置文件。
hostname -I 命令用于显示树莓派当前的 IP 地址(192.168.2.13)。
通过 awk 命令过滤后的 route 命令输出显示了默认网络网关的 IP 地址(192.168.2.1)和本地网络的网络掩码(255.255.255.0)。route 命令的输出通过管道(|)传递给 awk,以便 awk 提取与本食谱相关的信息并丢弃其他内容。
默认情况下,route 命令显示的信息比本食谱所需的更多。
pi@raspberrypi ~ $ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.1 0.0.0.0 UG 202 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
pi@raspberrypi ~ $
awk 命令 '/⁰/ { print $2 }' 限制其输出为以 0 开头的行(/⁰/),并为这些行打印第二个字段($2)。结果是默认网关的 IP 地址(192.168.2.1)。
awk 命令 '/[1]/ { print $3 }' 限制已通过管道传输(|)的输出为以非零数字开头的行(/[2]/),并为这些行打印第三个字段($3)。结果是本地网络的网络掩码(255.255.255.0)。
关于 awk 和 awk 命令语言的更多信息,可以在 awk 的手册中找到(请参见第二章,管理中的食谱 阅读内置文档)。
在发现当前的 IP 地址、默认网关和网络掩码后,本食谱修改了网络接口配置文件(/etc/network/interfaces),以包括已发现的参数。
有线网络接口(iface eth0)被设置为 static,并使用之前发现的参数值添加了配置参数 address、gateway 和 netmask。
配置文件保存后,树莓派会重新启动并使用新的 IP 地址。
还有更多...
在大多数网络中,无论是家庭网络还是工作网络,都会使用(DHCP)服务器来动态分配 IP 地址给客户端计算机和设备。由于 DHCP 服务器负责 IP 地址分配,因此它们通常需要额外的配置来保留静态 IP 地址,以避免这些地址被意外分配给其他客户端设备或计算机。
为了配置 DHCP 服务器,你需要 Raspberry Pi 有线网络接口的硬件地址。ifconfig命令可以用来显示大量有用的网络信息。结合使用ifconfig和awk过滤器,可以仅显示网络接口的硬件地址。
pi@raspberrypi ~ $ ifconfig | awk '/^eth0/ { print $5 }'
b8:27:eb:3f:aa:0c
pi@raspberrypi ~ $

在上面的截图中,正在配置本地家庭网络网关,设置保留 IP 地址为192.168.2.13,仅供raspberry-pi计算机使用。
MAC 地址 (b8:27:eb:3f:aa:0c) 是分配给此特定 Raspberry Pi 网络接口的唯一编号。
保存此配置后,IP 地址192.168.2.13将被保留,专门供raspberry-pi计算机使用。
另见
-
动态主机配置协议 (
en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol): 这篇维基百科文章介绍了 DHCP 协议、其历史以及工作原理。 -
hostname – 显示或设置系统主机名(
manpages.debian.net/cgi-bin/man.cgi?query=hostname): Debian 的hostname手册页面描述了该命令及其选项。 -
route – 显示/操作 IP 路由表(
manpages.debian.net/cgi-bin/man.cgi?query=route): Debian 的route手册页面描述了该命令及其选项。 -
ifconfig – 配置网络接口 (
manpages.debian.net/cgi-bin/man.cgi?query=ifconfig): Debian 的ifconfig手册页面描述了该命令及其选项。 -
interfaces – 网络接口配置文件(用于 ifup 和 ifdown) (
manpages.debian.net/cgi-bin/man.cgi?query=interfaces): Debian 的interfaces手册页面描述了配置文件及其参数。 -
awk – 模式驱动的扫描和处理语言 (
manpages.debian.net/cgi-bin/man.cgi?query=awk): Debian 的awk手册页面描述了该命令及其awk命令语言。
使用 ufw 创建防火墙
本配方使用了一个简单而强大的命令行工具(ufw)来配置防火墙。
本食谱可用于完全阻止 Raspberry Pi 的网络访问。它还可以配置 Uncomplicated Firewall (ufw),允许通过防火墙访问特定应用程序(例如,Web 服务器)。
完成本食谱后,你将能够通过防火墙保护 Raspberry Pi 的网络访问。
准备工作
材料:
初始设置或已开机的 Raspberry Pi 的基础网络设置。你也已经以用户 pi 登录(请参见 第一章,安装和设置,了解如何启动和登录;以及 第二章,管理,了解如何远程登录)。
本食谱不需要桌面 GUI,可以从基于文本的控制台或 LXTerminal 中运行。
如果 Raspberry Pi 的 Secure Shell 服务器正在运行,本食谱可以通过使用 Secure Shell 客户端远程完成。
如何操作...
创建一个防火墙的步骤如下:
-
直接或远程登录 Raspberry Pi。
-
使用
apt-get install命令安装ufw软件包。pi@raspberrypi ~ $ sudo apt-get install ufw Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: ufw 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 166 kB of archives. After this operation, 708 kB of additional disk space will be used. Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main ufw all 0.31.1-2 [166 kB] Fetched 166 kB in 2s (65.6 kB/s) Preconfiguring packages ... Selecting previously unselected package ufw. (Reading database ... 83839 files and directories currently installed.) Unpacking ufw (from .../archives/ufw_0.31.1-2_all.deb) ... Processing triggers for man-db ... Setting up ufw (0.31.1-2) ... Creating config file /etc/ufw/before.rules with new version Creating config file /etc/ufw/before6.rules with new version Creating config file /etc/ufw/after.rules with new version Creating config file /etc/ufw/after6.rules with new version pi@raspberrypi ~ $ -
apt-get install命令下载并安装ufw。ufw的安装包含一组默认的防火墙规则。 -
使用
ufw allow命令将ssh协议添加到防火墙规则中允许的协议列表。pi@raspberrypi ~ $ sudo ufw allow ssh Rules updated pi@raspberrypi ~ $ -
使用
ufw enable命令开启防火墙。pi@raspberrypi ~ $ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup pi@raspberrypi ~ $ -
防火墙规则会立即启用,并且在启动时也会启用!
它是如何工作的...
在登录 Raspberry Pi 后,本食谱使用 apt-get install 命令下载并安装 Uncomplicated Firewall (ufw)。
然后,定义一条防火墙规则,允许使用 Secure Shell(ssh)协议远程访问 Raspberry Pi(ufw allow ssh)。
最后,防火墙被启用(ufw enable)。
还有更多...
Uncomplicated Firewall (ufw) 是一个用于定义防火墙规则的命令行工具。ufw 命令实际上不是防火墙。没有安装额外的防火墙服务器。Linux 内核可以作为防火墙使用。
ufw 命令仅用于配置防火墙规则。规则定义存储在 /etc/ufw 目录中;然而,这些定义文件不应直接修改。正确修改这些文件是 ufw 命令的目的。
别忘了启用远程访问。
在前面的食谱中,ufw 命令安装后,在启用防火墙之前,会向规则定义中添加一条新的防火墙规则,允许 SSH 访问(ufw)allow ssh。没有此规则,下次通过 ssh 远程连接时将失败。
golden-imac:~ golden$ ssh pi@192.168.2.13
ssh: connect to host 192.168.2.13 port 22: Operation timed out
golden-imac:~ golden$
在此示例中,ssh 命令失败,因为没有防火墙规则允许使用 Secure Shell 访问 Raspberry Pi。
禁用防火墙
使用ufw定义的防火墙规则不会阻止用户通过直接连接到 Raspberry Pi 的键盘和显示器本地登录。
如果ufw阻止了远程访问,直接登录到 Raspberry Pi,然后使用命令:ufw disable来禁用防火墙规则。
pi@raspberrypi ~ $ sudo ufw disable
Firewall stopped and disabled on system startup
pi@raspberrypi ~ $
允许文件服务器通过防火墙
如果 Raspberry Pi 已设置为文件服务器(参见第四章, 文件共享),则使用防火墙规则ufw allow cifs来允许 SMB(CIFS)协议通过防火墙。
pi@raspberrypi ~ $ sudo ufw allow cifs
Rules updated
pi@raspberrypi ~ $
允许网页服务器通过防火墙
类似地,如果 Raspberry Pi 已设置为本地网页服务器(参见本章的下一个教程),则使用防火墙规则ufw allow http来允许 HTTP 协议通过防火墙。
pi@raspberrypi ~ $ sudo ufw allow http
Rules updated
pi@raspberrypi ~ $
应用规则
除了网络协议之外,简单防火墙还为许多应用协议预定义了规则。当前ufw识别的应用可以通过命令ufw app list显示。
pi@raspberrypi ~ $ sudo ufw app list
Available applications:
AIM
Bonjour
CIFS
DNS
Deluge
IMAP
IMAPS
IPP
KTorrent
Kerberos Admin
Kerberos Full
Kerberos KDC
Kerberos Password
LDAP
LPD
MSN
MSN SSL
Mail submission
NFS
OpenSSH
POP3
POP3S
PeopleNearby
SMTP
SSH
Socks
Telnet
Transmission
Transparent Proxy
VNC
WWW
WWW Cache
WWW Full
WWW Secure
XMPP
Yahoo
qBittorent
svnserve
pi@raspberrypi ~ $
使用命令ufw allow启用前述应用程序的所有已定义网络连接,使用命令ufw deny禁用它们。
ufw app info命令将显示应用的配置。
pi@raspberrypi ~ $ sudo ufw app info "WWW Full"
Profile: WWW Full
Title: Web Server (HTTP,HTTPS)
Description: Web Server (HTTP,HTTPS)
Ports:
80,443/tcp
pi@raspberrypi ~ $ sudo ufw allow "WWW Full"
Rule added
pi@raspberrypi ~ $
前面的示例表明,"WWW Full"的应用配置包括了HTTP端口(80)和HTTPS端口(443)。通过使用"WWW Full"应用配置文件,可以通过一个防火墙规则允许(拒绝或拒绝)对这两个网页服务器端口的网络访问。
重置防火墙规则
默认情况下,ufw规则会拒绝所有网络访问到 Raspberry Pi。然而,默认情况下,防火墙规则并未启用。
使用命令ufw reset将防火墙规则恢复到默认状态——禁用防火墙时,完全无法进行远程访问。
重置默认规则后,可以使用命令ufw enable重新启用防火墙。
另见
-
简单防火墙(ufw) (
en.wikipedia.org/wiki/Uncomplicated_Firewall):这篇关于简单防火墙的维基百科文章解释了它的工作原理。 -
ufw – 管理网络过滤防火墙的程序 (
manpages.debian.net/cgi-bin/man.cgi?query=ufw):Debian 的ufw手册页描述了该命令及其选项。 -
iptables – IPv4 包过滤和 NAT 管理工具 (
manpages.debian.net/cgi-bin/man.cgi?query=iptables):Debian 的iptables手册页更详细地描述了如何配置 Linux 内核内建的防火墙。
远程访问桌面会话(xrdp)
这个教程启用通过xrdp远程访问 Raspberry Pi 桌面会话。
使用xrdp,教师、支持工程师和爱好者可以从另一台计算机远程在 Raspberry Pi 上创建新的桌面会话。新创建的桌面会话与当前连接到 Raspberry Pi 的显示器上显示的桌面会话是分开的。这种私密会话非常适合安装更新或执行其他不应打断当前 Raspberry Pi 显示器上桌面会话的后台任务。
完成此食谱后,您将能够使用xrdp在 Raspberry Pi 上创建新的远程桌面会话。
准备就绪
配料:
已启动的 Raspberry Pi 的初始设置或基本网络设置。您还已经以用户pi登录(请参阅第一章中的食谱,安装和设置如何启动和登录以及第二章中的食谱,管理如何远程登录)。
运行此应用程序需要桌面图形用户界面。使用raspi-config配置 Raspberry Pi 以自动启动桌面 GUI(参见第二章,管理)。
此食谱的安装部分不需要桌面,可以从基于文本的控制台(或从 LXTerminal 内部)运行。
如果 Raspberry Pi 的 Secure Shell 服务器正在运行,则可以使用 Secure Shell 客户端远程完成此食谱。
如何做...
连接到 Raspberry Pi 桌面的步骤是:
-
直接或远程登录到 Raspberry Pi。如果您使用 Raspberry Pi 桌面,请打开一个 LXTerminal 窗口。
-
使用
apt-get install命令安装xrdp软件包。pi@raspberrypi ~ $ sudo apt-get install -y xrdp Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: tightvncserver xfonts-base Suggested packages: tightvnc-java The following NEW packages will be installed: tightvncserver xfonts-base xrdp 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 7,219 kB of archives. After this operation, 11.5 MB of additional disk space will be used. Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main tightvncserver armhf 1.3.9-6.4 [786 kB] Get:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main xfonts-base all 1:1.0.3 [6,181 kB] Get:3 http://mirrordirector.raspbian.org/raspbian/ wheezy/main xrdp armhf 0.5.0-2 [252 kB] Fetched 7,219 kB in 3s (2,000 kB/s) Selecting previously unselected package tightvncserver. (Reading database ... 83956 files and directories currently installed.) Unpacking tightvncserver (from .../tightvncserver_1.3.9-6.4_armhf.deb) ... Selecting previously unselected package xfonts-base. Unpacking xfonts-base (from .../xfonts-base_1%3a1.0.3_all.deb) ... Selecting previously unselected package xrdp. Unpacking xrdp (from .../xrdp_0.5.0-2_armhf.deb) ... Processing triggers for man-db ... Processing triggers for fontconfig ... Setting up tightvncserver (1.3.9-6.4) ... update-alternatives: using /usr/bin/tightvncserver to provide /usr/bin/vncserver (vncserver) in auto mode update-alternatives: using /usr/bin/Xtightvnc to provide /usr/bin/Xvnc (Xvnc) in auto mode update-alternatives: using /usr/bin/tightvncpasswd to provide /usr/bin/vncpasswd (vncpasswd) in auto mode Setting up xfonts-base (1:1.0.3) ... Setting up xrdp (0.5.0-2) ... [....] Generating xrdp RSA keys...... Generating 512 bit rsa key... ssl_gen_key_xrdp1 ok saving to /etc/xrdp/rsakeys.ini done (done). [ ok ] Starting Remote Desktop Protocol server : xrdp sesman. pi@raspberrypi ~ $ -
apt-get install命令下载并安装xrdp。安装软件包包括启动xrdp服务。 -
使用RDP(远程桌面协议)客户端(例如 Microsoft 的 Remote Desktop Connection)通过其 IP 地址(192.168.2.13)连接到 Raspberry Pi。
![如何做...]()
以上截图显示了如何使用 Microsoft 的 Remote Desktop Connection for Mac 连接到 Raspberry Pi。
-
连接后,
xrdp会话管理器(sesman)显示登录屏幕。![如何做...]()
以上图像显示了如何使用
xrdp在 Raspberry Pi 上启动远程桌面会话。 -
登录到
xrdp会话:选择sesman-Xvnc作为模块。使用与您通过控制台(或通过 ssh)登录相同的用户名(pi)和密码(raspberry)。 -
成功登录后,将显示 Raspberry Pi 桌面。
![如何做...]()
以上截图显示了通过 RDP 连接(客户端分辨率设置为 640x480)远程连接到 Raspberry Pi 桌面。
工作原理...
登录到树莓派后,xrdb软件包通过apt-get install进行下载和安装。安装过程中会启动xrdb和桌面会话管理器(sesman)。
在sesman启动后,可以从另一台安装了 RDP 客户端的计算机创建到树莓派的远程会话。
示例中使用的是 Microsoft 的 Mac 版远程桌面连接。Microsoft RDP 客户端会提示输入计算机。输入树莓派的 IP 地址(192.168.2.13)以建立远程连接。
远程连接建立后,RDP 会话会通过使用与直接通过ssh或通过 GUI 桌面直接登录树莓派时相同的用户名和密码登录xrdp来创建(登录到 xrdp)。
一旦用户名和密码正确输入,一个新的桌面会话就会被创建。这个新桌面会话与直接连接到树莓派的显示器上的会话不同。它是一个新的桌面会话。
还有更多...
远程桌面协议(RDP)是微软开发的一种客户端-服务器协议。xrdp客户端用于显示由 RDP 服务器发送的图形用户界面。Microsoft RDP 客户端(mstsc.exe)自 XP 以来包含在每个 Windows 版本中。
xrdp软件包还包括 TightVNC 服务器(tightvncserver),它通过虚拟网络计算(VNC)协议进行通信——这也是一种图形桌面共享协议。RDP 和 VNC 远程桌面协议都有许多开源和专有客户端,包括移动设备和平板电脑的客户端。
远程桌面连接以与树莓派直接连接显示器时类似的方式显示树莓派桌面。但也有一些例外。
无法播放视频流(或 Minecraft)
远程显示的最明显的限制是无法显示视频流。大多数视频流应用程序直接将视频流传输到视频帧缓冲区,即与显示器共享的内存部分。因此,视频直接流向显示器,并绕过桌面。因为视频绕过桌面,它也不会被发送到远程桌面。
树莓派上的 Minecraft 游戏也直接访问视频帧缓冲区。因此,与视频流一样,Minecraft 无法通过远程桌面会话进行播放。
这不是显示
每个远程桌面会话都是一个独立的桌面会话。它与直接连接到树莓派显示器上的桌面会话不同。
另见
-
远程桌面协议(
en.wikipedia.org/wiki/Remote_Desktop_Protocol):这篇维基百科文章描述了远程桌面协议(RDP)。 -
远程桌面软件比较(
en.wikipedia.org/wiki/Comparison_of_remote_desktop_software):这篇维基百科文章比较了远程桌面软件。 -
xrdp – 一个远程桌面协议(RDP)服务器(
manpages.debian.net/cgi-bin/man.cgi?query=xrdp):Debian 手册页提供了有关xrdp命令及其选项的更多信息。 -
sesman – 一个 xrdp(8)会话管理器(
manpages.debian.net/cgi-bin/man.cgi?query=sesman):Debian 手册页提供了有关sesman命令及其选项的更多信息。 -
xrdp – 一个开源的远程桌面协议(rdp)服务器(
www.xrdp.org/):xrdp 网站提供了有关这个 RDP 服务器的更多信息。
远程访问显示器(x11vnc)
本食谱启用通过xrdp远程访问树莓派的显示器。
使用x11vnc,教师、支持工程师和爱好者可以访问当前显示在树莓派显示器上的桌面会话。教师可以通过远程桌面帮助学生完成作业。远程支持工程师可以帮助树莓派用户调试、安装或配置软件。而爱好者可以使用xrdp从其他房间访问连接到客厅电视的树莓派。
完成本食谱后,你将能够使用xrdp远程访问当前显示在树莓派显示器上的桌面会话。
准备工作
材料:
树莓派已开机并完成初始设置或基本网络设置。你还需要以pi用户身份登录(有关如何启动和登录的食谱,请参见第一章,安装与设置;如何远程登录,请参见第二章,管理)。
运行此应用程序需要桌面 GUI。使用raspi-config配置树莓派,使其能够在启动时自动加载桌面 GUI(请参见第二章, 管理)。
本食谱的安装部分不需要桌面环境,可以从基于文本的控制台(或在 LXTerminal 中)运行。
如果树莓派的安全外壳(Secure Shell)服务器正在运行,本食谱的安装部分也可以通过使用安全外壳客户端远程完成(请参见第二章, 管理中的ssh食谱)。
如何操作...
远程连接到树莓派桌面的步骤如下:
-
直接或远程登录到树莓派。如果你使用的是树莓派桌面环境,打开 LXTerminal。
-
使用
apt-get install命令安装x11vnc包。pi@raspberrypi ~ $ sudo apt-get install -y x11vnc Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: libvncserver0 tcl tk x11vnc-data Suggested packages: libvncserver0-dbg The following NEW packages will be installed: libvncserver0 tcl tk x11vnc x11vnc-data 0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded. Need to get 0 B/1,841 kB of archives. After this operation, 3,192 kB of additional disk space will be used. Selecting previously unselected package libvncserver0:armhf. (Reading database ... 84404 files and directories currently installed.) Unpacking libvncserver0:armhf (from .../libvncserver0_0.9.9+dfsg-1+deb7u1_armhf.deb) ... Selecting previously unselected package tcl. Unpacking tcl (from .../archives/tcl_8.5.0-2.1_all.deb) ... Selecting previously unselected package tk. Unpacking tk (from .../archives/tk_8.5.0-2.1_all.deb) ... Selecting previously unselected package x11vnc-data. Unpacking x11vnc-data (from .../x11vnc-data_0.9.13-1_all.deb) ... Selecting previously unselected package x11vnc. Unpacking x11vnc (from .../x11vnc_0.9.13-1_armhf.deb) ... Processing triggers for man-db ... Processing triggers for desktop-file-utils ... Setting up libvncserver0:armhf (0.9.9+dfsg-1+deb7u1) ... Setting up tcl (8.5.0-2.1) ... update-alternatives: using /usr/bin/tclsh-default to provide /usr/bin/tclsh (tclsh) in auto mode Setting up tk (8.5.0-2.1) ... update-alternatives: using /usr/bin/wish-default to provide /usr/bin/wish (wish) in auto mode Setting up x11vnc-data (0.9.13-1) ... Setting up x11vnc (0.9.13-1) ... pi@raspberrypi ~ $ -
apt-get install命令会下载并安装x11vnc。 -
从远程计算机使用安全外壳隧道(
ssh)启动一个在 Raspberry Pi 上运行的x11vnc实例。只要连接处于开启状态,它就会继续运行。golden-macbook:~ A601012$ ssh -t -L 5900:localhost:5900 pi@192.168.2.13 'x11vnc -q -localhost -display :0 -passwd pass1234' pi@192.168.2.13's password: The VNC desktop is: localhost:0 PORT=5900 -
使用 VNC 客户端(如 TightVNC)通过 ssh 隧道从本地计算机连接到远程 Raspberry Pi(127.0.0.1)。
![如何操作...]()
前面的截图展示了如何使用 TightVNC 连接到 Raspberry Pi。远程主机实际上是本地主机(127.0.0.1),这是由于
ssh隧道的缘故。端口是默认的 VNC 端口(5900)。![如何操作...]()
在前面的截图中,TightVNC 客户端请求用户输入认证密码。输入前一步中指定的密码(pass1234)。
-
一旦连接,TightVNC 会显示显示器上的内容。
![如何操作...]()
前面的截图显示了如何通过 TightVNC 客户端远程连接到 Raspberry Pi 的桌面(客户端分辨率为 50%)。
它是如何工作的...
登录 Raspberry Pi 后,使用apt-get install命令下载并安装x11vnc软件包。
安装完成后,x11vnc服务器通过远程计算机使用安全外壳隧道(ssh)启动。
SSH 隧道启动x11vnc服务器,并将远程 Raspberry Pi 上的 VNC 连接转发到本地主机的相同端口(-L 5900:localhost:5900)。
使用显示在显示器上的桌面会话(-display :0)启动x11vnc服务器,且以静默模式启动(-q)。服务器只允许本地连接(-localhost)。设置认证密码(-passwd pass1234)。
只要有客户端连接,x11vnc服务器就会持续运行。
接下来,配方使用 TightVNC Java 客户端连接到 Raspberry Pi。TightVNC 客户端提示输入远程主机和端口。由于配方使用了 SSH 隧道,因此输入本地主机的 IP 地址(127.0.0.1)来使用 SSH 隧道。
在 Raspberry Pi 桌面显示之前,VNC 客户端请求输入启动服务器时指定的VNC 认证密码(pass1234)。
一旦正确输入密码,VNC 客户端就会显示 Raspberry Pi 显示器上显示的桌面会话。
只要远程桌面会话处于连接状态,x11vnc服务器就会继续运行。远程连接关闭时,x11vnc服务器退出。
还有更多...
VNC 客户端显示与 Raspberry Pi 显示器上相同的桌面会话。然而,也有一些例外。
无视频流(或 Minecraft)
直接写入视频帧缓冲区的应用程序(例如,视频流和 Minecraft)仍然不会通过 VNC 显示(有关更多信息,请参见前面的配方)。
另见
-
虚拟网络计算 (
en.wikipedia.org/wiki/Vnc):这篇 Wikipedia 文章介绍了虚拟网络计算(VNC)的历史和功能。 -
x11vnc (
en.wikipedia.org/wiki/X11vnc):这篇 Wikipedia 文章介绍了 x11vnc 的使用和配置。 -
x11vnc – 允许 VNC 连接到真实的 X11 显示器 (
manpages.debian.net/cgi-bin/man.cgi?query=x11vnc):Debian 的x11vnc手册页描述了该命令及其选项。 -
TightVNC 软件 (
tightvnc.com/):TightVNC 软件网站提供了下载和安装客户端的说明。
安装 web 服务器(Apache、lighttpd、Nginx)
本食谱安装 Apache HTTP web 服务器。lighttpd 和 Nginx web 服务器的安装差异在本食谱末尾有说明。
Apache web 服务器是 GNU Linux 平台(如 Raspberry Pi 使用的 Raspbian Linux 发行版)上最常用的 web 服务器之一。Apache 是一个成熟且可扩展的 web 服务器,可以用于托管各种应用程序;代理访问内部和外部网站;以及托管静态网页和图像。
完成本食谱后,Raspberry Pi 将能够从 SD 卡启动盘和外部硬盘提供静态和动态网页。
准备工作
配料:
需要为已开机的 Raspberry Pi 进行初步设置或基本网络配置。你还需要以pi用户登录(请参阅第一章,安装与设置部分,了解如何启动和登录;以及第二章,管理部分,了解如何远程登录)。
本食谱不需要桌面 GUI,可以通过文本控制台或在LXTerminal中运行。
如果 Raspberry Pi 的安全外壳(Secure Shell)服务器正在运行,可以通过安全外壳客户端远程完成本食谱。
本食谱中的示例还使用了挂载在/media/bigdisk的外部硬盘(详情请参阅第四章,文件共享部分)。
安装 Apache web 服务器的步骤如下:
-
直接或远程登录到 Raspberry Pi。
-
使用
apt-get install命令下载并安装 Apache HTTP web 服务器(apache2)。pi@raspberrypi ~ $ sudo apt-get install -y apache2 Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert ... Setting up apache2.2-common (2.2.22-13+deb7u5) ... Enabling site default. Enabling module alias. Enabling module autoindex. Enabling module dir. Enabling module env. Enabling module mime. Enabling module negotiation. Enabling module setenvif. Enabling module status. Enabling module auth_basic. Enabling module deflate. Enabling module authz_default. Enabling module authz_user. Enabling module authz_groupfile. Enabling module authn_file. Enabling module authz_host. Enabling module reqtimeout. Setting up apache2-mpm-worker (2.2.22-13+deb7u5) ... [....] Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName . ok Setting up apache2 (2.2.22-13+deb7u5) ... Setting up ssl-cert (1.0.32) ... pi@raspberrypi ~ $ -
apt-get install命令用于下载并安装apache2。注意
如果已安装
ufw防火墙(请参见前面的创建防火墙食谱),使用ufw allow http命令创建规则,允许 HTTP(web 服务器)协议通过防火墙。pi@raspberrypi ~ $ sudo ufw allow http Rules updated pi@raspberrypi ~ $ -
使用另一台计算机(或设备)上的 web 浏览器测试与 Raspberry Pi 的 HTTP 连接。
![准备工作]()
在上面的图像中,另一台计算机上的网页浏览器用于访问运行在树莓派上的 Apache Web 服务器的默认网页。Web 服务器正常工作!
-
使用命令
ls -l列出 Web 服务器根目录/var/www的内容。pi@raspberrypi ~ $ ls -l /var/www total 4 -rw-r--r-- 1 root root 177 Aug 12 20:11 index.html pi@raspberrypi ~ $Web 服务器的根目录中有一个文件,index.html。
-
使用命令
ls -l列出存储在外部磁盘/media/bigdisk/MyWebsite/上的网站内容。pi@raspberrypi ~ $ ls -l /media/bigdisk/MyWebsite/ total 4 -rw-r--r-- 1 root root 92 Aug 11 20:13 hello.html pi@raspberrypi ~ $外部磁盘目录中有一个文件,
hello.html。 -
使用命令
ln -s在外部磁盘目录(/media/bigdisk/MyWebsite)和 Web 服务器的根目录(/var/www/)之间创建一个符号链接。pi@raspberrypi ~ $ ln –s /media/bigdisk/MyWebsite /var/www/MyWebsite pi@raspberrypi ~ $ ls –l /var/www total 4 -rw-r--r-- 1 root root 177 Aug 12 20:11 index.html -rw-r--r-- 1 root root 24 Aug 12 20:48 MyWebsite -> /media/bigdisk/MyWebsite pi@raspberrypi ~ $ ls –l /var/www/MyWebiste/ total 4 -rw-r--r-- 1 root root 92 Aug 11 20:13 hello.html pi@raspberrypi ~ $Web 服务器根目录(
/var/www)现在有一个指向存储在外部磁盘上的网站(/media/bigdisk/MyWebsite)的符号链接。 -
使用另一台计算机(或设备)上的网页浏览器测试与树莓派的 HTTP 连接。外部磁盘上的网站现在可以访问!!准备就绪
上面的图像展示了如何通过另一台计算机上的网页浏览器访问存储在连接到树莓派外部磁盘上的网页。
-
使用
vi命令在/usr/lib/cgi-bin目录中创建一个动态网页(timestamp)。pi@raspberrypi ~ $ sudo vi /usr/lib/cgi-bin/timestamp -
将以下行添加到新的动态网页中:
#!/bin/sh echo "Content-Type: text/plain" echo "" echo $(date) -
保存文件并退出(
:wq)。 -
使用命令
chmod a+rx使动态网页/usr/lib/cgi-bin/timestamp可执行。pi@raspberrypi ~ $ sudo chmod a+rx /usr/lib/cgi-bin/timestamp pi@raspberrypi ~ $ ls -l /usr/lib/cgi-bin total 4 -rwxr-xr-x 1 root root 68 Aug 12 21:21 timestamp pi@raspberrypi ~ $动态网页
/usr/lib/cgi-bin/timestamp现在是可执行的。 -
使用另一台计算机上的网页浏览器显示动态网页(
http://192.168.2.13/cgi-bin/timestamp)。该动态网页会在每次刷新页面时显示当前时间!!准备就绪上面的图像展示了动态网页的实际运行情况——每次刷新页面时,时间戳会更新为当前时间。树莓派现在可以显示动态页面!
-
使用
ls -l命令显示 Web 服务器日志文件目录的内容(/var/log/apache2/)。pi@raspberrypi ~ $ ls -l /var/log/apache2/ total 8 -rw-r----- 1 root adm 1483 Aug 12 21:30 access.log -rw-r----- 1 root adm 325 Aug 12 21:01 error.log -rw-r--r-- 1 root root 0 Aug 12 20:11 other_vhosts_access.log pi@raspberrypi ~ $上面的示例展示了如何使用
ls -l命令显示 Apache Web 服务器日志文件目录的内容。
工作原理……
登录到树莓派后,本教程从使用apt-get install命令开始,下载并安装 Apache HTTP 服务器软件包 apache2。apache2 软件包包括 Apache HTTP 服务器和相关的实用工具。
Apache HTTP 服务器在安装后会自动启动。然而,如果树莓派被防火墙保护(请参见本章中的创建防火墙部分),需要配置防火墙以允许 HTTP 连接。ufw allow http 命令添加了一个防火墙规则,允许其他计算机通过 HTTP 协议进行连接。
配置好防火墙后,可以通过另一台计算机上的网页浏览器使用树莓派的 IP 地址(192.168.2.13)连接到树莓派。
将外部磁盘的文件添加到 Web 服务器的最简单方法是,先将外部磁盘挂载到/media目录(请参见第四章,文件共享),然后在 Web 服务器的根目录(/var/www)下创建一个指向外部磁盘的符号链接。符号链接不会复制文件,它只是指向文件所在的位置。
在这个示例中,外部磁盘上的网站目录(/media/bigdisk/MyWebsite)通过符号链接(ln –s)指向 Web 服务器的根目录/var/www/MyWebsite。示例网站只有一个文件,实际位于外部磁盘/media/bigdisk/MyWebsite/hello.html。创建符号链接后,该文件也会象征性地位于/var/www/MyWebsite/hello.html,并且可以通过浏览器访问 URL http://192.168.2.13/MyWebsite/hello.html。
接下来的步骤是创建一个简单的动态网页,显示当前时间。使用vi编辑器在/usr/lib/cgi-bin/目录下创建文件timestamp。该目录是受保护的,因此使用sudo命令作为前缀,暂时授予用户创建和编辑文件的权限。
timestamp动态网页使用 Bash 脚本语言(#!/bin/bash)。网页首先输出一个描述网页内容的头部,作为纯文本(echo "Content-Type: text/plain"),然后输出一个空行(echo ""),以将 HTTP 响应头与网页内容分开。网页的唯一一行通过执行 GNU date实用程序来显示当前时间(echo "$(date)")。
为了使脚本能够动态调用,需要使用chmod命令设置文件模式的执行位(chmod a+rx)。由于文件位于受保护的目录中,因此再次使用sudo命令,暂时授予权限。
在另一台计算机的浏览器中查看动态网页(http://192.168.2.13/cgi-bin/timestamp),可以看到每次刷新浏览器时网页都会动态更新。
最后,显示了 Web 服务器日志文件目录(/var/log/apache2/)的内容。每个发送到 Apache HTTP Web 服务器的请求都会记录在access.log文件中——每个请求占一行。错误消息会附加到error.log文件的末尾。如果动态网页没有显示——或显示不正常,可以查看错误日志末尾的消息,了解原因。该目录下的所有日志文件应定期删除(或归档),以释放磁盘空间。
还有更多内容…
配置文件、静态内容和动态页面
服务器的配置文件位于/etc/apache目录中。然而,不需要更改配置,因为默认配置已经足够用于从/var/www目录提供静态网页以及从/usr/lib/cgi-bin目录提供基于 CGI 的动态网页。
/var/www目录是静态网页的默认位置,还包括图像、字体、视频和声音等静态内容。任何位于该目录下的文件都可以通过 Raspberry Pi 的 URL 加文件名(或文件路径)在 Web 浏览器中显示。最初,该目录中只有一个文件index.html,在示例中其 URL 为http://192.168.2.13/index.html。由于/var/www目录受到保护,因此需要使用sudo命令来添加、修改或删除该目录中的文件。
在默认的 Apache HTTP Web 服务器配置中,动态网页使用公共网关接口(CGI),并位于/usr/lib/cgi-bin目录下。
其他服务器
Apache HTTP Web 服务器并不是唯一在 Raspberry Pi 上运行的 Web 服务器;然而,它可能是当今最著名且功能最全的开源 Web 服务器。从 2009 年以来,超过一亿个网站通过 Apache HTTP Web 服务器托管。尽管功能强大且完整,但 Apache HTTP Web 服务器也比较占用资源,消耗的内存和计算能力超过其他服务器。
lighttpd
lighttpd Web 服务器比 Apache 占用的资源更少,且具有扩展到更高请求数的潜力。
lighttpd 最初设计作为一个概念验证系统,用于处理单个服务器上的 10,000 个并行连接,此后成为了一个流行的 Web 服务器。
可以通过命令apt-get install lighttpd来安装 lighttpd Web 服务器。
pi@raspberrypi ~ $ sudo apt-get install -y lighttpd
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
libfam0 libterm-readkey-perl libterm-readline-perl-perl spawn-fcgi
...
尽管 lighttpd 使用/var/www作为 Web 服务器的根目录,但默认情况下并不会运行 CGI 动态网页。
命令lighty-enable-mod cgi用于启用 lighttpd 的 CGI 模块。
pi@raspberrypi ~ $ sudo lightly-enable-mod cgi
Enabling cgi: ok
Run /etc/init.d/lighttd force-reload to enable changes
pi@raspberrypi ~ $ sudo /etc/init.d/lighttd force-reload
[ ok ] Reloading web server configuration: lighttpd.
pi@raspberrypi ~ $
上述示例展示了如何使用命令lighty-enable-mod来启用 CGI 动态网页。
lighttpd CGI 模块要求cgi-bin目录位于 Web 服务器的根目录下,而不是位于/usr/lib目录中。可以使用命令ln –s从 Web 服务器的根目录创建一个符号链接,指向动态网页的默认位置(/usr/lib/cgi-bin)。
pi@raspberrypi ~ $ sudo ln –s /usr/lib/cgi-bin /var/www/cgi-bin
pi@raspberrypi ~ $
lighttpd Web 服务器的配置文件存储在/etc/lighttpd目录下,日志文件则写入/var/log/lighttpd目录。
Nginx
另一个流行的现代 Web 服务器是 Nginx。
采用事件驱动方式处理请求,Nginx 在高负载下能提供比 Apache Web 服务器更可预测的性能。Nginx 还提供了多种部署 Web 应用的选项,包括对流行的 Web 框架 Ruby on Rails 的模块化支持。
可以通过命令apt-get install nginx来安装 Nginx Web 服务器。
pi@raspberrypi ~ $ sudo apt-get install -y nginx
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
nginx-common nginx-full
...
Nginx Web 服务器默认不使用与 Apache HTTP 或 lighttpd Web 服务器相同的根目录;相反,静态网页默认存储在/usr/share/nginx/www目录中。Nginx Web 服务器也不支持 CGI;然而,Nginx Web 服务器也可以使用 FastCGI 或 Ruby Passenger 生成动态网页。
Nginx Web 服务器的配置文件存储在/etc/nginx目录中,其日志文件写入/var/log/nginx目录。
除了 Apache、lighttpd 和 Nginx,Raspberry Pi 还可以运行许多较不知名的 Web 服务器,包括 AOL Web 服务器、monkey 和 yaws。
pi@raspberrypi ~ $ apt-cache search httpd |grep -i server |grep -v '^lib'
aolserver4-core - AOL web server version 4 - core libraries
aolserver4-daemon - AOL web server version 4 - program files
apache2-mpm-event - Apache HTTP Server - event driven model
apache2-mpm-prefork - Apache HTTP Server - traditional non-threaded model
apache2-mpm-worker - Apache HTTP Server - high speed threaded model
boa - Lightweight and high performance web server
bozohttpd - Bozotic HTTP server
ebhttpd - specialized HTTP server to access CD-ROM books
lighttpd - fast webserver with minimal memory footprint
mathopd - Very small, yet very fast HTTP server
micro-httpd - really small HTTP server
mini-httpd - a small HTTP server
monkey - fast, efficient, small and easy to configure web server
mono-fastcgi-server - ASP.NET backend for FastCGI webservers - default version
mono-fastcgi-server2 - ASP.NET 2.0 backend for FastCGI webservers
mono-fastcgi-server4 - ASP.NET 4.0 backend for FastCGI webservers
nginx-extras - nginx web/proxy server (extended version)
nginx-full - nginx web/proxy server (standard version)
nginx-light - nginx web/proxy server (basic version)
nginx-naxsi - nginx web/proxy server (version with naxsi)
nginx-naxsi-ui - nginx web/proxy server - naxsi configuration front-end
ocsigen - web server and programming framework in OCaml
ocsigenserver - web server of the Ocsigen project
php5-cgi - server-side, HTML-embedded scripting language (CGI binary)
tntnet - modular, multithreaded web application server for C++
webfs - lightweight HTTP server for static content
yaws - High performance HTTP 1.1 webserver written in Erlang
pi@raspberrypi ~ $
在前面的示例中,apt-cache search和grep用于显示可用的 HTTP Web 服务器列表。可以通过apt-get install命令安装任何列出的 Web 服务器(例如,apt-get install monkey)。
另见
-
Apache HTTP 服务器项目 (
httpd.apache.org): Apache Web 服务器的官方网站是 Web 服务器的完整参考资料。 -
lighttpd – 轻量飞速 (
www.lighttpd.net/): lighttpd 官网提供了 Web 服务器的详细文档。 -
Nginx (
nginx.org/en): Nginx 的官方网站提供了有关 Web 服务器的更多信息。 -
bash – GNU Bourne-Again SHell (
manpages.debian.net/cgi-bin/man.cgi?query=bash): Debian 的bash手册页面是 Bash 命令语言的参考资料。 -
chmod – 更改文件模式位 (
manpages.debian.net/cgi-bin/man.cgi?query=chmod): Debian 的chmod手册页面详细介绍了该命令及其选项。 -
date – 打印或设置系统日期和时间 (
manpages.debian.net/cgi-bin/man.cgi?query=date): Debian 的date手册页面详细介绍了该命令及其选项。 -
grep – 打印匹配模式的行 (
manpages.debian.net/cgi-bin/man.cgi?query=grep): Debian 的grep手册页面详细介绍了该命令及其选项。 -
ln -s – 创建文件间的链接 (
manpages.debian.net/cgi-bin/man.cgi?query=ln): Debian 的ln -s手册页面详细介绍了该命令及其选项。 -
AOL Web 服务器 (
www.aolserver.com): AOL Web 服务器的官方网站。
安装 Wiki(mediawiki)
本文档安装并设置与维基百科相同的 Wiki 系统(MediaWiki)。
Wiki 是一个有用的协作环境,适用于共享不断发展的文档集的团队。每个团队成员都可以参与创建和编辑 Wiki 中的页面。存储在 Wiki 中的最终文档页面是团队共同努力的结果,反映了团队的集体知识。
本配方用于安装 MediaWiki。这是维基百科使用的相同的 wiki 软件。维基百科网站由一群高性能服务器托管,以便能够不断为数百万用户提供服务。本配方使用的是单台树莓派,它完全有能力管理一个团队或小型办公室的 wiki。
完成此步骤后,你将拥有一个准备好协作的 wiki。
准备工作
材料:
已启动的树莓派的初始设置或基本网络设置。你还需要以pi用户身份登录(有关如何启动和登录,请参阅第一章,安装与设置,以及有关如何远程登录的说明,请参阅第二章,管理)。
本配方不需要桌面 GUI,可以从基于文本的控制台或LXTerminal中运行。
如果树莓派的安全外壳服务器正在运行,可以使用安全外壳客户端远程完成此步骤。
安装完成后,可以通过 Web 浏览器访问并配置 MediaWiki。配置不需要在树莓派上完成;可以通过与树莓派在同一网络中的其他计算机远程完成。
为了获得更好的性能,应将树莓派的视频内存设置为最低,以便有更多内存可用于 MediaWiki(有关更多信息,请参阅第二章,管理中的配置内存使用配方)。
如何操作...
安装 MediaWiki wiki 服务器的步骤如下:
-
直接或远程登录到树莓派。
-
使用
apt-get install命令安装mediawiki软件包。pi@raspberrypi ~ $ sudo apt-get install -y mediawiki Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common heirloom-mailx javascript-common libaio1 libapache2-mod-php5 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libdbd-mysql-perl libdbi-perl libhtml-template-perl libjs-jquery libjs-jquery-cookie libjs-jquery-form libjs-jquery-tipsy libmysqlclient16 libmysqlclient18 libonig2 libqdbm14 lsof mediawiki-extensions-base mysql-client-5.5 mysql-common mysql-server mysql-server-5.5 mysql-server-core-5.5 php-wikidiff2 php5 php5-cli php5-common php5-mysql ssl-cert wwwconfig-common ... -
apt-get install命令下载并安装 MediaWiki。注意
mediawiki的安装包括apache2、mysql和php5。完整的安装时间将至少需要 15 至 30 分钟。
-
安装过程中,
mysql软件包会提示输入一个新的 root 密码,用于管理数据库。输入 root 密码并在下一个屏幕上重复输入该密码。![如何操作...]()
-
在接受
mysql数据库的 root 密码(两次输入)后,mediawiki的安装完成。-
使用 vi 编辑器编辑 MediaWiki 网站的配置文件
(/etc/mediawiki/apache.conf)。pi@raspberrypi ~ $ sudo vi /etc/mediawiki/apache.conf
-
-
vi编辑器显示配置文件的内容。有关如何使用该编辑器的说明,请参阅vi的 man 手册(有关更多信息,请参阅第二章,管理中的阅读内建文档配方)。# Uncomment this to add an alias. # This does not work properly with virtual hosts.. #Alias /mediawiki /var/lib/mediawiki "/etc/mediawiki/apache.conf" 33 lines, 800 characters -
通过删除行首的
#来取消注释 MediaWiki 网站的Alias。Alias /mediawiki /var/lib/mediawiki -
保存并关闭文件(
:wq)。 -
使用
apachectl restart命令重新启动 Web 服务器。pi@raspberrypi ~ $ sudo apachectl restart apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName pi@raspberrypi ~ $ -
Apache web 服务器重新启动后,在 web 浏览器中继续配置 MediaWiki。
-
打开一个 web 浏览器(可能在另一台计算机上),浏览到 MediaWiki 的 URL(
http://192.168.2.13/mediawiki/)。注意
Raspberry Pi 的 IP 地址(
192.168.2.13)将会不同。可以使用hostname -I命令显示 Raspberry Pi 的 IP 地址——参见第二章中远程访问部分,以hostname -I命令的示例。![操作方法...]()
-
在浏览器中显示 MediaWiki 的初始配置页面。点击设置 wiki 链接以继续。
![操作方法...]()
-
选择 MediaWiki 要使用的语言。点击继续 ->进入下一个配置页面。
-
语言设置完成后,MediaWiki 会运行一些测试,以确定是否(以及如何)可以在 Raspberry Pi 上设置。
![操作方法...]()
上图显示了验证 Raspberry Pi 准备好安装 MediaWiki 的网页。
-
消息“环境已检查。您可以安装 MediaWiki
.”表明 MediaWiki 已准备安装。(如果您未看到此绿色消息,请点击重新启动安装。) -
滚动到页面底部。点击继续 ->接受许可证并继续安装。
![操作方法...]()
截图显示了必须接受的版权协议。
-
接受许可协议后,继续进行 MySQL 设置。
-
输入第 4 步中 MySQL 根用户的密码。
-
输入数据库名称和 MySQL 根密码后,继续配置一些额外的数据库设置以进行 web 访问。
-
点击继续 ->接受默认设置。
![操作方法...]()
上述截图显示了如何输入 MySQL 数据库设置。
![操作方法...]()
上述截图接受了默认的数据库设置。
-
接受默认的数据库设置后,继续配置,输入 wiki 的名称以及管理员账户的用户名和密码。
-
为 wiki 输入一个名称。输入 MediaWiki 管理员账户的用户名和密码。点击继续 ->。
![操作方法...]()
上述截图显示了用于输入 wiki 名称以及管理员账户的用户名和密码的网页。
-
输入 wiki 名称和 MediaWiki 管理员用户名和密码后,滚动到页面底部。
-
选择我已经厌倦了,直接安装 wiki
.并点击继续 ->。![操作方法...]()
截图显示了如何跳过可选的配置设置。
-
MediaWiki 使用提供的配置参数来设置数据库,并显示一个列出已完成安装步骤的网页。
-
点击 继续 ->。此步骤需要一些时间来设置数据库。
![如何操作...]()
此截图显示了已完成安装步骤的列表。
-
接受显示的安装列表后,会显示一个祝贺页面,表示安装已完成。然而,
LocalSettings.php文件仍然需要下载和安装。- 下载
LocalSettings.php文件。
![如何操作...]()
截图显示了配置文件 LocalSettings.php 已完成。
- 下载
-
一旦下载了
LocalSettings.php文件,它需要被移动到 MediaWiki 安装目录的根目录。注意
如果用于配置的浏览器在另一台计算机上,则需要将
LocalSettings.php文件复制到 Raspberry Pi 上。golden-macbook:~ user$ scp ~/Downloads/LocalSettings.php pi@192.168.2.13:. pi@192.168.2.13's password: LocalSettings.php 100% 4689 4.6KB/s 00:00 golden-macbook:~ user$ ssh pi@192.168.2.13 pi@192.168.2.13's password: Linux raspberrypi 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l Last login: Wed Aug 12 19:29:52 2015 from golden-macbook.local pi@raspberrypi ~ $ sudo mv LocalSettings.php /var/lib/mediawiki/ pi@raspberrypi ~ $ sudo chmod a+r /var/lib/mediawiki/LocalSettings.php在上面的例子中,
LocalSettings.php文件是从另一台计算机(golden-macbook)复制到 Raspberry Pi 上的 MediaWiki 目录(/var/lib/mediawiki/)的,并且修改了文件权限(chmod a+r),以便 MediaWiki 可以读取该设置文件。 -
一旦
LocalSettings.php文件被移动到 MediaWiki 安装的根目录,MediaWiki 就可以开始使用了! -
浏览到 Raspberry Pi 上的 MediaWiki URL:(
http://192.168.2.2/mediawiki/)![如何操作...]()
-
MediaWiki 已设置并运行;但是,它仍然需要根据您的团队进行定制(通过添加自定义团队徽标、字体和样式)。请按照
用户指南链接获取有关自定义安装的更多信息,以及如何使用 MediaWiki 的详细说明。
它是如何工作的...
在本教程的开始,MediaWiki 软件包(mediawiki)是通过 apt-get install 命令下载并安装的。MediaWiki 的安装包括 Apache2、MySQL 和 PHP5 的安装。这些包也可以单独安装,用于提供 Web 服务器(Apache2)、数据库(MySQL)或 Web 脚本语言(PHP5)。
MediaWiki 的安装首先安装 Apache2、MySQL 和 PHP5。Apache2 安装和 PHP5 安装都不需要用户输入即可顺利完成。然而,MySQL 安装需要为数据库的 root 用户设置密码。
MySQL 管理员 root 密码用于设置和配置 MySQL 数据库管理服务器。它与用户 pi 使用的密码不同。如果用户 pi 和数据库的密码不同,将提升 Raspberry Pi 的安全性。
在输入 MySQL root 密码后,安装过程继续。MySQL 数据库被安装,MediaWiki 应用程序文件被安装,Apache2 Web 服务器被安装并启动。然而,Apache2 Web 服务器尚未配置为托管 MediaWiki。
使用 vi 编辑器编辑 apache.conf 配置文件并为 MediaWiki 分配一个网站。配置文件位于 MediaWiki 配置目录 /etc/mediawiki/,并且也链接到 web 服务器配置目录 /etc/apache2/conf.d/。
需要在 Apache2 配置文件中更改的唯一一行是以 #Alias 开头的那一行。行首的 # 将该行变成注释。Apache web 服务器在读取配置文件时会忽略注释行。删除行首的 # 将激活 MediaWiki,下次启动 web 服务器时会生效。
Alias 语句有两个参数:网站的 URL 前缀 (/mediawiki) 和网站应用程序文件的位置 (/var/lib/mediawiki)。URL 前缀成为维基的 URL 一部分(http://192.168.2.13/mediawiki/)。更改 URL 前缀也会改变访问维基所使用的 URL。将前缀更改为 /TeamWiki 会将维基的 URL 改为 http://192.168.2.2/TeamWiki/。
在编辑完 web 服务器配置文件并取消注释 Alias 行后,使用 apachectl restart 命令重启 Apache web 服务器。此特权命令用于重启 Apache web 服务器。
重启 web 服务器会强制它重新加载配置文件,包括 MediaWiki 的 web 服务器配置文件。现在 MediaWiki 的别名已经取消注释,MediaWiki 网站已可用;然而,维基的数据库仍需设置。
一旦 MediaWiki 网站运行,可以使用 web 浏览器(可能是在另一台计算机上)来完成维基的数据库设置。示例 URL 为 http://192.168.2.13/mediawiki/。你的 Raspberry Pi 的 IP 地址很可能不同。
MediaWiki 显示的第一页面提示找不到 LocalSettings.php 文件。标有 setup the wiki 的链接指向用于完成维基设置的网页。
第一设置页面用于定义维基管理员使用的语言(Your language)和其他维基用户使用的语言(Wiki language)。
下一页的设置页面显示了系统配置检查的结果,并且必须接受一个许可证才能完成 MediaWiki 的安装。
接下来,在下一页面输入数据库设置。之前为 MySQL 管理员 root 用户输入的密码应在此处再次输入。
下一页显示了一些额外的数据库设置。接受默认设置即可。
最后有一个设置页面,要求输入维基名称以及 MediaWiki 管理员的用户名和密码。这个新密码仅用于配置维基,而不是 MySQL 管理员的 root 密码,也不是用户 pi 的密码。
页面底部有一个输入更多配置信息的机会。食谱中的示例选择了我已经无聊了,直接安装 Wiki 吧。 并点击继续 -> 完成数据库安装。
在显示状态页面后,设置的最后一页会触发LocalSettings.php文件的下载,该文件用于完成 Wiki 的安装。如果该文件是在另一台计算机上下载的,可以使用scp命令将文件复制到树莓派,具体示例如下。
LocalSettings.php 文件是输入到 MediaWiki 安装页面的配置参数的总结。此文件需要移动到 MediaWiki 安装目录(/var/lib/mediawiki/)以完成 Wiki 的设置。
在将LocalSettings.php文件移动到 MediaWiki 安装目录后,设置完成,MediaWiki 的主页现已显示在配置的 URL(http://192.168.2.13/mediawiki/)上。Wiki 已启动并运行!
点击[编辑]链接以更改主页的内容。
仍可以进行一些定制化以个性化 Wiki(例如,改变 Wiki 的 Logo);不过,基本的设置已完成,Wiki 现在可以用于协作。
更多关于使用和定制 MediaWiki 的信息,可以通过点击 Wiki主页上的用户指南链接来找到。
另见
-
MediaWiki (
en.wikipedia.org/wiki/Mediawiki): 这篇维基百科文章介绍了 MediaWiki wiki 服务器。 -
apachectl – Apache HTTP 服务器控制接口 (
manpages.debian.net/cgi-bin/man.cgi?query=apachectl): Debian 的apachectl手册页提供了有关该命令及其选项的更多信息。 -
scp – 安全复制(远程文件复制程序) (
manpages.debian.net/cgi-bin/man.cgi?query=scp): Debian 的scp手册页提供了有关该命令及其选项的更多详细信息。 -
mv – 移动(重命名)文件 (
manpages.debian.net/cgi-bin/man.cgi?query=mv): Debian 的mv手册页提供了有关该命令及其选项的更多详细信息。 -
chmod – 更改文件模式位 (
manpages.debian.net/cgi-bin/man.cgi?query=chmod): Debian 的chmod手册页提供了有关该命令及其选项的更多详细信息。
使用 hostapd 创建无线接入点
这个食谱将树莓派设置为无线接入点——作为一个可以让其他无线设备连接到本地网络的集线器——或者连接到树莓派上运行的服务。
默认情况下,Raspbian Linux 发行版支持通过无线 USB 适配器将 Raspberry Pi 连接到现有无线网络。本食谱超出了将 Raspberry Pi 作为网络客户端使用的范围,改为将 Raspberry Pi 配置为其他无线设备的网络中心。如果 Raspberry Pi 还通过 TCP 电缆连接到本地网络,则 Raspberry Pi 将充当无线网络路由器,使其他设备能够通过 Raspberry Pi 连接到本地网络。
注意
并非所有无线 USB 适配器都支持接入点(AP)模式。
本食谱将测试无线适配器以确保其支持 AP 模式。
完成本食谱后,您将能够创建一个无线网络,使 Raspberry Pi 充当网络中心。
准备工作
配料:
这是一个初步设置或基本网络配置的食谱,要求 Raspberry Pi 已经开机,并且您已经以 pi 用户身份登录(有关如何启动和登录,请参考 第一章,安装与设置 中的食谱;有关如何远程登录,请参考 第二章,管理 中的食谱)。
- 一个支持的无线 USB 适配器。
本食谱不需要桌面 GUI,可以从文本控制台运行,或在 LXTerminal 内运行。
如果 Raspberry Pi 的 Secure Shell 服务器正在运行,并且 Raspberry Pi 已通过有线网络连接到本地网络,则可以使用 Secure Shell 客户端远程完成此食谱。
在此食谱过程中,无线连接将被重置,因此不建议在设置期间通过无线连接远程登录。
如何操作...
配置 Raspberry Pi 作为无线接入点的步骤如下:
-
直接或远程登录 Raspberry Pi。
-
使用
apt-get install命令安装软件包hostapd、udhcpd和iw。pi@raspberrypi ~ $ sudo apt-get install -y hostapd udhcpd iw Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: crda wireless-regdb The following NEW packages will be installed: crda hostapd iw udhcpd wireless-regdb 0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded. Need to get 0 B/509 kB of archives. After this operation, 1,188 kB of additional disk space will be used. Selecting previously unselected package wireless-regdb. (Reading database ... 88434 files and directories currently installed.) Unpacking wireless-regdb (from .../wireless-regdb_2014.10.07-1~deb7u1_all.deb) ... Selecting previously unselected package crda. Unpacking crda (from .../crda_1.1.2-1_armhf.deb) ... Selecting previously unselected package hostapd. Unpacking hostapd (from .../hostapd_1%3a1.0-3+deb7u2_armhf.deb) ... Selecting previously unselected package iw. Unpacking iw (from .../archives/iw_3.4-1_armhf.deb) ... Selecting previously unselected package udhcpd. Unpacking udhcpd (from .../udhcpd_1%3a1.20.0-7_armhf.deb) ... Processing triggers for man-db ... Setting up wireless-regdb (2014.10.07-1~deb7u1) ... Setting up crda (1.1.2-1) ... Setting up hostapd (1:1.0-3+deb7u2) ... Setting up iw (3.4-1) ... Setting up udhcpd (1:1.20.0-7) ... udhcpd: Disabled. Edit /etc/default/udhcpd to enable it. pi@raspberrypi ~ $ -
apt-get install命令将下载并安装软件包hostapd、udhcpd和iw。 -
检查无线 USB 适配器。
注意
使用以下命令检查您的无线 USB 适配器是否支持 AP 模式:
sudo iw list | grep '* AP'如果没有返回任何行,则表示无线适配器不支持 AP 模式。
-
使用
iw list命令(通过grep过滤)查看无线适配器是否支持接入点(AP)模式。pi@raspberrypi ~ $ sudo iw list | grep '^[[:blank:]]*\* A' * AP * AP/VLAN * AP/VLAN * AP: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 * AP/VLAN: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 * AP: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0 * AP/VLAN: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0 pi@raspberrypi ~ $ -
显示名称服务器地址。
-
使用
cat命令显示存储在/etc/resolve.conf中的名称服务器地址。pi@raspberrypi ~ $ cat /etc/resolv.conf # Generated by resolvconf nameserver 192.168.2.1 pi@raspberrypi ~ $Raspberry Pi 使用的 DNS
nameserver是 192.168.2.1。 -
配置
udhcpd服务器。 -
使用
vi编辑器编辑udhcpd配置文件/etc/udhcpd.conf。pi@raspberrypi ~ $ sudo vi /etc/udhcpd.conf -
vi编辑器显示配置文件的内容。有关如何使用编辑器的说明,可以在vi手册页中找到(请参见 第二章,管理 中的食谱 阅读内建文档)。# Sample udhcpd configuration file (/etc/udhcpd.conf) # The start and end of the IP lease block start 192.168.0.20 #default: 192.168.0.20 end 192.168.0.254 #default: 192.168.0.254 # The interface that udhcpd will use interface eth0 #default: eth0 "/etc/udhcpd.conf" 123 lines, 3054 characters -
通过将以
interface开头的行更改为interface wlan0来更改udhcpd使用的网络接口。# The interface that udhcpd will use interface wlan0 -
通过更改以
#Examples开头的部分来修改udhcpd的示例配置,替换示例 DNS 地址为你的 Raspberry Pi 使用的nameserver地址(192.168.2.1,来自第 5 步)。#Examples opt dns 192.168.2.1 option subnet 255.255.255.0 opt router 192.168.0.1 option domain local option lease 864000 -
保存文件并退出编辑器(
:wq)。 -
启用 udhcpd 服务器。
pi@raspberrypi ~ $ sudo vi /etc/default/udhcpd -
使用
vi编辑器编辑udhcpd配置文件,/etc/default/udhcpd。 -
vi编辑器显示配置文件的内容。# Comment the following line to enable DHCPD_ENABLED="no" # Options to pass to busybox' udhcpd. # # -S Log to syslog # -f run in foreground DHCPD_OPTS="-S" ~ ~ "/etc/default/udhcpd" 9 lines, 164 characters -
通过注释掉行
DHCP_ENABLED="no"来启用 udhcpd 服务器。要注释掉该行,请在行首添加#。# Comment the following line to enable #DHCPD_ENABLED="no" -
保存文件并退出编辑器(
:wq)。 -
配置 hostapd 服务器。使用
vi编辑器创建新的hostapd配置文件(/etc/hostapd/hostapd.conf)。pi@raspberrypi ~ $ sudo vi /etc/hostapd/hostapd.conf -
vi编辑器显示空的配置文件。 -
将以下参数添加到 hostapd 配置文件中:
interface=wlan0 ssid=Raspi_AP wpa_passphrase=Pr0t3ct3d driver=nl80211 hw_mode=g channel=6 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP -
保存文件并退出编辑器(
:wq)。 -
启用 hostapd 服务器。使用
vi编辑器编辑服务默认文件(/etc/default/hostapd)来启用hostapd服务。pi@raspberrypi ~ $ sudo vi /etc/default/hostapd -
vi编辑器显示配置文件的内容。# Defaults for hostapd initscript # # See /usr/share/doc/hostapd/README.Debian for information about alternative # methods of managing hostapd. # # Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration # file and hostapd will be started during system boot. An example configuration # file can be found at /usr/share/doc/hostapd/examples/hostapd.conf.gz # #DAEMON_CONF="" # Additional daemon options to be appended to hostapd command:- # -d show more debug messages (-dd for even more) # -K include key data in debug messages # -t include timestamps in some debug messages # # Note that -B (daemon mode) and -P (pidfile) options are automatically # configured by the init.d script and must not be added to DAEMON_OPTS. # #DAEMON_OPTS="" ~ "/etc/default/hostapd" 20 lines, 770 characters -
将以
#DAEMON_CONF开头的行替换为DAEMON_CONF="/etc/hostapd/hostapd.conf"。DAEMON_CONF="/etc/hostapd/hostapd.conf" -
保存文件并退出编辑器(
:wq)。 -
配置 IP 转发。使用
vi编辑器编辑内核参数文件/etc/sysctl.conf来启用 IP 转发。pi@raspberrypi ~ $ sudo vi /etc/sysctl.conf -
vi编辑器显示配置文件的内容。# # /etc/sysctl.conf - Configuration file for setting system variables # See /etc/sysctl.d/ for additonal system variables # See sysctl.conf (5) for information. # "/etc/sysctl.conf" 64 lines, 2137 characters -
vi编辑器打开内核参数文件(/etc/sysctl.conf)。 -
通过删除行首的
#来取消注释以net.ipv4.ip_forward开头的行。# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 -
保存文件并退出编辑器(
:wq)。 -
启用 IP 转发。通过使用
echo命令将内核参数/proc/sys/net/ipv4/ip_forward设置为值"1"来启用转发。pi@raspberrypi ~ $ sudo bash -c 'echo "1" > /proc/sys/net/ipv4/ip_forward' pi@raspberrypi ~ $ -
使用
iptables命令为网络地址转换和端口转发设置 IP 转发规则。pi@raspberrypi ~ $ sudo iptables -t nat -A POSTROUTING –o eth0 –j MASQUERADE pi@raspberrypi ~ $ sudo iptables -A FORWARD –i eth0 –o wlan0 -m state --state RELATED,ESTABLISHED –j ACCEPT pi@raspberrypi ~ $ sudo iptables -A FORWARD –i wlan0 –o eth0 –j ACCEPT -
保存 iptables 配置(
iptables-save),并将输出文件(iptables.ipv4.net)移动到/etc配置目录中,以便在系统启动时使用。pi@raspberrypi ~ $ sudo iptables-save > iptables.ipv4.nat pi@raspberrypi ~ $ sudo mv iptables.ipv4.nat /etc pi@raspberrypi ~ $ sudo chown root:root /etc/iptables.ipv4.nat pi@raspberrypi ~ $ ls -l /etc/iptables.ipv4.nat -rw-r--r-- 1 root root 566 Aug 13 19:30 /etc/iptables.ipv4.nat pi@raspberrypi ~ $ -
给无线接口分配静态 IP 地址。使用
ifconfig命令给无线网络接口(wlan0)分配静态 IP 地址(192.169.0.1)。pi@raspberrypi ~ $ sudo ifconfig wlan0 192.168.0.1 pi@raspberrypi ~ $ -
配置网络接口启动参数。使用 vi 编辑器编辑网络接口配置文件(
/etc/network/interfaces)。pi@raspberrypi ~ $ sudo vi /etc/network/interfaces -
vi编辑器打开网络接口配置文件(/etc/network/interfaces)。 -
更改文件,使其仅包含以下内容
:。auto lo iface lo inet loopback auto eth0 allow-hotplug eth0 iface eth0 inet manual auto wlan0 iface wlan0 inet static address 192.68.0.1 netmask 255.255.255.0 up iptables-restore < /etc/iptables.ipv4.nat -
保存文件并退出编辑器(
:wq)。 -
启用无线接入点。使用
update-rc.d命令启用hostapd和udhcpd服务。pi@raspberrypi ~ $ sudo update-rc.d hostapd enable update-rc.d: using dependency based boot sequencing pi@raspberrypi ~ $ sudo update-rc.d udhcpd enable update-rc.d: using dependency based boot sequencing pi@raspberrypi ~ $ -
Raspberry Pi 已配置为在系统启动时启动
hostapd和udhcpd服务。 -
禁用 wpa_supplicant。使用
mv命令将 WPA Supplicant 的服务定义文件(fi.epitest.hostap.WPASupplicant.service)从服务目录(/usr/share/dbus-1/system-services)中移动出去。pi@raspberrypi ~ $ mv /usr/share/dbus-1/system-services/ fi.epitest.hostap.WPASupplicant.service ~/ pi@raspberrypi ~ $ -
重启:重启系统,树莓派就变成了无线接入点!查找
Raspi_AP网络 SSID 并使用在 hostapd 配置文件(/etc/hostapd/hostapd.conf)中定义的密码(Pr0t3ct3d)进行连接。
它是如何工作的……
配方从下载并安装无线接口工具包(iw)开始,并安装两个服务器:无线接入点服务器(hostapd)和 DHCP 服务器(udhcpd)。
在配置开始之前,需要测试无线 USB 适配器的兼容性。
检查无线 USB 适配器
并非所有无线 USB 适配器都支持接入点(AP)模式。可以使用iw list命令列出任何连接的无线设备的无线功能。如果支持 AP 模式,它将在Supported interface modes部分中列出。
iw list命令的输出非常长。grep命令用于过滤iw list命令的输出。管道符号(|)将iw list命令的输出连接到grep命令的输入。grep命令使用正则表达式过滤器限制其他命令的输出('[3]** A' – 从行首^开始,任意数量的空白字符[[:blank:]],然后是星号*,接着是空格和大写字母A*)。
如果无线适配器与hostapd不兼容,iw list命令将显示信息"nl80211 not found." 适配器仍然有可能与hostapd一起工作;不过,这需要使用另一种驱动程序重新编译hostapd(请参见本章末尾的参考资料)。
一旦无线适配器被测试并显示支持 AP 模式,接下来的配置将继续进行。
使用 udhcpd 配置 DHCP 服务器
动态主机配置协议(DHCP)服务器(udhcpd)为客户端计算机分配网络配置信息;例如 DNS 名称服务器的地址、IP 地址和默认路由(或网关)。完成此配方后,树莓派将使用 DCHP 配置其无线客户端。
对 DHCP 配置文件(/etc/udhcpd.conf)进行三项更改:
-
选择无线接口(wlan0)
-
剩余的标志被设置为支持嵌入式设备(例如树莓派)
-
为无线客户端定义默认的网络参数
默认网络参数为:
dns – 要使用的 DNS 名称服务器。系统的 DNS 名称服务器定义在/etc/resolv.conf中,并将在第 5 步中显示。
-
子网– 同一网络子网中的 IP 地址数量。值255.255.255.0是一个网络掩码,它使得具有相同前三个字节的 IP 地址的计算机能够相互通信。
-
router – 树莓派无线接口的静态 IP 地址(192.168.0.1)
-
domain – 网络名称(local)
-
lease– 网络地址分配给特定计算机的时长(864000 秒或 10 天)
配置文件顶部的 start 和 end 参数默认设置为 IP 地址范围从 192.168.0.20 到 192.168.0.254。
如果树莓派始终连接到一个有网络时间服务器的有线网络,则无需设置剩余时间标志。
配置完成后,udhcpd 的启动脚本参数文件 (/etc/default/udhcpd) 也需要进行更改。需要将参数 DHCP_ENABLED="no" 注释掉(通过在行首添加 #),以启用 DHCP 服务器(udhcpd)。
使用 hostapd 配置无线接入点服务器
无线接入点服务器(hostapd)管理其他无线设备与树莓派之间的无线连接。这包括使用加密协议(如 Wi-Fi Protected Access,WPA)建立安全连接;设置服务集标识符(SSID)和预共享密钥(PSK)。
创建的 hostapd 配置参数文件包括:
-
interface – 无线接口(wlan0)
-
ssid – 网络 ID(Raspi_AP)
-
wpa_passphrase – 密码短语或预共享密钥(
Pr0t3ct3d) -
driver – 无线设备驱动程序(nl80211)
-
hw_mode – 硬件模式(g)
-
channel – 无线频率频道(6)
-
macaddr_acl – 访问控制列表(0)
-
auth_algs – 要使用的授权算法(1 – 开放认证)
-
ignore_broadcast_ssid – 启用广播网络 ID(0 – 不忽略广播)
-
wpa – WPA 的版本(2)
-
wpa_key_mgmt – 管理算法的密钥(WPA-PSK)
-
wpa_pairwise – WPA v1 数据加密(TKIP)
-
rsn_pairwise – WPA v2 数据加密(CCMP)
配置完成 hostapd 后,其启动脚本参数文件(/etc/default/hostapd)也需要更改。需要将参数 DAEMON_CONF 设置为 hostapd 配置文件的位置 (/etc/hostapd/hostapd.conf),以便启用无线接入点服务器。
设置 IP 转发
IP 转发用于在网络接口之间传递(转发)网络流量。在本食谱中,IP 转发用于在无线网络和有线网络之间传递网络流量。通过使用 IP 转发,树莓派将无线网络的客户端连接到有线网络。
第一步配置是启用树莓派 Linux 内核中的 IP 转发功能。内核参数文件 (/etc/sysctl.conf) 中有一项 IP 转发条目(net.ipv4.ip_forward=1),默认是被注释掉的。通过去掉行首的 # 来取消注释,从而启用 Linux 内核中的 IP 转发功能。
启用 IP 转发后,iptables 命令用于定义网络过滤规则,决定哪些网络数据包可以穿过 Linux 内核的内部防火墙。Linux 内核的防火墙将规则组织成表,定义数据包如何通过内核。iptables 命令用于管理存储在这些表中的规则。
此步骤中定义的第一个 Linux 内核防火墙规则被添加到网络地址转换表(-t nat)的后处理规则中(-A POSTROUTING)。该规则在网络数据包(MASQUERADE)传递到有线网络(-o eth0)时进行伪装。无线网络客户端的 IP 地址在传递到有线网络时被转换为树莓派的有线网络连接的 IP 地址。这是如何将来自多个无线网络客户端的网络数据包转换,使它们能够通过树莓派的单个有线网络连接。
第二条规则被添加到过滤表(默认表)的包转发规则中 (-A FORWARD)。该规则允许网络数据包(-j ACCEPT)从有线网络(-i eth0)转发到无线网络(-o wlan0),前提是它们与已建立的连接(-m state –state RELATED,ESTABLISHED)相关。
此步骤中最后一条 iptables 命令规则被添加到过滤表的转发规则中(-A FORWARD)。该规则允许数据包从无线网络(-i wlan0)传递到有线网络(-o eth0)。
下一条命令 ifconfig wlan0 将树莓派无线网络连接的 IP 地址设置为 192.168.0.1。
最后,iptables-save 命令用于将这些规则的副本保存在配置文件 (/etc/iptables.ipv4.nat) 中,以便在启动时使用。
完成此步骤后,IP 转发规则已定义并保存在配置文件中。IP 转发规则也已启用。
配置启动参数
启动时使用的网络接口定义存储在配置文件 (/etc/network/interfaces) 中。该文件定义了每个网络接口的网络地址、网络掩码和默认路由。
本教程中使用的配置文件定义了三个网络接口:
-
lo – 回环网络
-
eth0– 有线网络
-
wlan0 – 无线网络
-
回环接口(lo)会自动加载(auto)。
-
有线接口(eth0)使用 DHCP 协议动态配置。
无线接口(wlan0)有一个静态定义(static)——它位于此文件中。无线接口的 IP 地址 被定义为 192.168.0.1。接口的网络掩码(255.255.255.0)足够大,可以支持同一子网中的 256 个唯一地址。
在网络接口启动(up)后,之前保存在此配方中的 IP 转发定义 (/etc/iptables.ipv4.nat) 将被恢复(iptables-restore)(使用iptables-save保存)。
一旦网络接口定义被保存,网络就可以启动了。
启动无线接入点
配置文件已更新:
-
无线接入点
(/etc/hostapd/hostapd.conf) -
动态主机配置协议
(/etc/udhcpd.conf) -
网络接口
(/etc/network/interfaces) -
IP 转发定义
(/etc/iptables.ipv4.nat)
无线接入点守护进程(hostapd)和动态主机配置协议守护进程(udhcp)的启动脚本可以启用(update-rc.d enable)。
树莓派现在每次启动时都会变成无线接入点!
树莓派重启后,无线接入点已准备好使用!无线设备现在可以使用您选择的 SSID(Raspi_AP)和密码(Pr0t3ct3d)连接到树莓派。
还有更多……
并非所有 USB 无线适配器都支持 AP 模式
有限数量的无线 USB 适配器可以与树莓派配合使用,并且可以配置为无线接入点。本章末尾的链接可以帮助您找到目前可以与树莓派一起使用的无线 USB 适配器,以创建无线接入点(请参见其他资源)。
一些无线 USB 适配器的功耗超过了树莓派能持续支持的范围。通过 USB 集线器间接连接无线 USB 适配器到树莓派将带来更好的性能,并减少其他 USB 设备(如板载网卡!)因电力不足而无法正常工作的可能性。
无线防火墙、文件服务器或网页服务器
这个配方与本书中的其他配方结合使用时效果很好。
与第四章中的文件共享配方,文件共享,结合使用时,树莓派可以成为有线和无线设备都能连接到本地网络的文件服务器——用于交换文档和媒体文件;或用于备份和存储。
当与本章中的其他高级网络配方结合使用时,树莓派可以成为一个网络防火墙,保护无线访问到有线网络;一个可以远程访问桌面设备的教学或支持工具;一个提供网页的通信工具;或一个托管 wiki 页面的协作工具。
在树莓派和开源 GNU Linux 社区中,有许多其他工具和应用程序可以与此配方结合使用,将树莓派转变为无线设备的动态网络中心。
另请参阅
-
hostapd (
en.wikipedia.org/wiki/Hostapd):这篇关于 hostapd 的维基百科文章更详细地描述了该服务。 -
hostapd: IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS 身份验证器 (
w1.fi/hostapd/):hostapd网站是服务器的完整参考。 -
Debian Linux 内核手册 (
kernel-handbook.alioth.debian.org/): Debian Linux 内核手册提供了有关 iptables 工作原理的更多信息。 -
Linux 无线 (
linuxwireless.org/): Linux 无线网站有更多关于在 Linux 上使用无线设备的信息。 -
RPI 无线热点 (
elinux.org/RPI-Wireless-Hotspot): 这是一篇关于在嵌入式 Linux 网站上设置无线热点的文章。 -
USB Wi-Fi 适配器 (
elinux.org/RPi_VerifiedPeripherals#USB_Wi-Fi_Adapters): 这是一篇关于嵌入式 Linux Wiki 中 Wi-Fi 适配器的文章。 -
树莓派 Wi-Fi 适配器测试 (
www.element14.com/community/docs/DOC-44703/l/raspberry-pi-wifi-adapter-testing): 这是一篇关于在 Element14 社区网站上测试过的无线适配器的文章。
安装网络跟踪工具
本食谱安装网络跟踪工具 My Traceroute(mtr)。
mtr工具通常用于网络故障排除。该工具显示树莓派和另一台计算机之间的网络数据包路由。显示会持续刷新,显示数据包在每个设备之间传输的时间。使用mrt时,你可以看到网络路由中哪些设备最慢。
完成本食谱后,你将能够使用mrt跟踪网络数据包。
准备就绪
材料:
树莓派的初始设置或基础网络设置已完成,树莓派已经开机。你也已经以pi用户登录(参见第一章,安装与设置,了解如何启动和登录,以及第二章,管理,了解如何远程登录)。
本食谱不需要桌面 GUI,可以通过基于文本的控制台或LXTerminal中运行。
如果树莓派的安全外壳服务器正在运行,本食谱可以通过安全外壳客户端远程完成。
如何操作...
安装网络跟踪工具的步骤如下:
-
登录到树莓派,可以是直接登录或远程登录。
-
使用
apt-get install命令来安装mtr软件包。pi@raspberrypi ~ $ sudo apt-get install mtr Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: mtr 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 59.2 kB of archives. After this operation, 142 kB of additional disk space will be used. Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main mtr armhf 0.82-3 [59.2 kB] Fetched 59.2 kB in 0s (66.3 kB/s) Selecting previously unselected package mtr. (Reading database ... 88583 files and directories currently installed.) Unpacking mtr (from .../archives/mtr_0.82-3_armhf.deb) ... Processing triggers for menu ... Processing triggers for man-db ... Setting up mtr (0.82-3) ... Processing triggers for menu ... pi@raspberrypi ~ $ -
apt-get install命令安装mrt软件包。 -
使用
mrt命令来跟踪你的树莓派与树莓派基金会网站之间的网络路由。pi@raspberrypi ~ $ sudo mtr raspberrypi.org -
mrt命令显示路由。My traceroute [v0.82] raspberrypi (0.0.0.0) Sat Aug 29 16:44:37 2015 Keys: Help Display mode Restart statistics Order of fields quit Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1\. 192.168.2.1 0.0% 29 2.6 0.9 0.5 3.1 0.8 2\. 10.0.0.1 3.4% 29 3.8 4.2 2.7 6.8 1.1 3\. c-24-5-176-1.hsd1.ca.comcast.net 0.0% 29 20.0 18.3 13.1 49.7 6.9 4\. te-0-6-0-14-sur03.sanmateo.ca.sf 0.0% 29 16.1 18.0 12.5 26.9 4.2 5\. he-0-13-0-0-ar01.santaclara.ca.s 0.0% 29 32.5 21.4 12.6 36.9 6.3 he-0-13-0-1-ar01.santaclara.ca.sfba.comcast.net 6\. ??? 7\. he-0-11-0-1-pe02.529bryant.ca.ib 0.0% 28 12.7 23.0 12.7 97.3 15.5 8\. 50.248.118.238 0.0% 28 22.6 20.8 14.8 44.7 5.4 9\. be2016.ccr22.sfo01.atlas.cogentc 0.0% 28 23.7 21.6 13.7 29.0 3.2 10\. be2133.ccr22.mci01.atlas.cogentc 0.0% 28 59.7 64.6 57.5 120.8 11.7 11\. be2157.ccr42.ord01.atlas.cogentc 0.0% 28 69.2 72.7 64.3 126.5 11.8 12\. be2185.ccr22.cle04.atlas.cogentc 0.0% 28 75.2 78.4 71.1 108.7 8.8 13\. be2483.ccr42.jfk02.atlas.cogentc 0.0% 28 90.6 90.8 82.7 106.7 4.5 14\. be2490.ccr42.lon13.atlas.cogentc 0.0% 28 155.8 159.9 153.5 171.7 4.0 15\. be2494.ccr22.lon01.atlas.cogentc 0.0% 28 160.9 161.8 157.4 178.6 4.6 16\. be2352.rcr21.b015534-1.lon01.atl 0.0% 28 176.2 163.5 156.9 222.6 12.6 17\. 149.11.4.86 0.0% 28 163.9 161.9 153.9 188.4 6.6 18\. mythic10g-private.orochi.mythic- 0.0% 28 157.6 160.4 155.9 169.7 3.4 19\. 93.93.128.230 0.0% 28 172.9 182.7 172.9 252.8 14.9
显示将持续刷新,直到你按下q。
它是如何工作的...
登录到 Raspberry Pi 后,本食谱安装 My Traceroute 软件包(mtr)。
然后,使用新安装的 mtr 命令来追踪位于美国加利福尼亚州圣马特奥的作者 Raspberry Pi 与托管在英国伦敦 Mythic-Beasts 网站上的 Raspberry Pi 基金会网站之间的网络路由。
按下 q 键可以退出命令。
还有更多内容...
mtr 动态更新从远程计算机到 Raspberry Pi 之间路径上设备收集的网络统计信息。除了显示路径上的设备列表(主机),mtr 还显示 数据包 和 Ping 的统计信息。
数据包 的统计信息显示了发送的数据包数量(已发送)和途中丢失的数据包数量(丢失%)。
Ping 的统计信息显示了网络数据包从 Raspberry Pi 到路径上每个设备所需的时间。还显示了平均时间(Avg)、最佳时间(Best)、最差时间(Wrst)和标准偏差(StDev)。
另见
-
MTR (My traceroute) (
en.wikipedia.org/wiki/MTR_(software)): 这篇维基百科文章提供了关于mtr、其历史以及工作原理的更多信息。 -
MTR (
www.bitwizard.nl/mtr/): MTR – My Traceroute 的主页。 -
mtr – 网络诊断工具 (
manpages.debian.net/cgi-bin/man.cgi?query=mtr): Debian 的mtr手册页描述了该命令及其选项。 -
Mythic Beasts – 基础设施 (
www.mythic-beasts.com/article/infrastructure): 该网页描述了 Raspberry Pi 基金会使用的托管基础设施,包括其数据中心的位置。
安装网络协议分析工具
本食谱安装网络协议分析器 Wireshark。
Wireshark 网络协议分析器让你在微观层面上检查网络上的流量。这个网络工具可以用于实时捕获或离线分析。Wireshark 拥有图形用户界面(GUI)和 TTY 模式工具(tshark)。
可以从以太网、IEEE 802.11(Wi-Fi)、PPP/HDLC、ATM、蓝牙、USB、令牌环、帧中继、FDDI 等低级协议中读取实时数据。支持对包括 IPsec、ISAKMP、Kerberos、SNMPv3、SSL/TLS、WEP 和 WPA/WPA2 在内的多种高级协议进行解密。数据可以以多种形式读取/写入,包括 tcpdump、Microsoft 网络监控器、Network General Sniffer、Sniffer Pro、NetXray 等。
完成本食谱后,你将能够使用 wireshark 分析你的网络。
注意
本食谱仅是探索网络协议分析的起点。
更多详细信息的链接可以在本食谱的末尾找到。
准备工作
配料:
一个已开启的 Raspberry Pi 的初始设置或基本网络设置。你已经以用户 pi 登录。
本教程需要桌面 GUI。
如果 Raspberry Pi 的 VNC 服务器正在运行,则可以使用 VNC 客户端远程完成本教程(参见本章前面的 远程访问显示器 教程)。
如何操作...
安装网络协议分析仪的步骤如下:
-
登录到 Raspberry Pi 桌面 GUI。
-
使用
apt-get install命令安装wireshark包。pi@raspberrypi ~ $ sudo apt-get install -y wireshark Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: libc-ares2 libcap2-bin liblua5.1-0 libpam-cap libpcap0.8 libsmi2ldbl libwireshark-data libwireshark2 libwiretap2 libwsutil2 wireshark-common Suggested packages: libcap-dev snmp-mibs-downloader wireshark-doc The following NEW packages will be installed: libc-ares2 libcap2-bin liblua5.1-0 libpam-cap libpcap0.8 libsmi2ldbl libwireshark-data libwireshark2 libwiretap2 libwsutil2 wireshark wireshark-common 0 upgraded, 12 newly installed, 0 to remove and 0 not upgraded. Need to get 14.0 MB of archives. After this operation, 48.6 MB of additional disk space will be used. ... -
apt-get install命令用于下载并安装wireshark软件包。 -
使用
dpkg-reconfigure命令修改wireshark的默认配置。pi@raspberrypi ~ $ sudo dpkg-reconfigure wireshark-common The dpkg-reconfigure command asks if non-superusers should be able to capture packets. ┌─────────────────────┤ Configuring wireshark-common ├──────────────────────┐ │ │ │ Dumpcap can be installed in a way that allows members of the "wireshark" │ │ system group to capture packets. This is recommended over the │ │ alternative of running Wireshark/Tshark directly as root, because less │ │ of the code will run with elevated privileges. │ │ │ │ For more detailed information please see │ │ /usr/share/doc/wireshark-common/README.Debian. │ │ │ │ Enabling this feature may be a security risk, so it is disabled by │ │ default. If in doubt, it is suggested to leave it disabled. │ │ │ │ Should non-superusers be able to capture packets? │ │ │ │ <Yes> <No> │ │ │ └───────────────────────────────────────────────────────────────────────────┘ -
使用
键选择 <是> 答案,然后按 键以更新软件包配置。 -
使用
usermod命令将用户pi添加到wireshark系统组(-G wireshark)。pi@raspberrypi ~ $ sudo usermod -a -G wireshark pi pi@raspberrypi ~ $ -
使用桌面 GUI 菜单启动 Wireshark 应用程序。
![如何操作...]()
-
启动 Wireshark 应用程序。
![如何操作...]()
-
从菜单中选择一个接口并点击 开始 以开始嗅探网络数据包。
-
Wireshark 应用程序会在捕获(嗅探)每个网络数据包时,显示详细信息。
![如何操作...]()
-
使用 文件 菜单或 Ctrl+Q 来退出。
它是如何工作的...
登录到 Raspberry Pi 后,本教程使用 apt-get install 命令安装 Wireshark 网络协议分析仪(网络数据包嗅探器)。
安装 Wireshark 应用程序后,使用 dpkg-reconfigure 命令更改默认应用程序配置(wireshark-common),允许非超级用户捕获网络数据包。默认情况下,只有超级用户才能捕获网络数据包。
在接受配置更改(<是>)后,wireshark 系统组的成员也可以捕获网络数据包。
在启动应用程序之前,用户 pi 通过 usermod 命令被添加(-a)到 wireshark 用户组。
通过选择 菜单 > 网络 > Wireshark 从 Raspberry Pi 桌面启动 Wireshark 命令。
启动应用程序后,Wireshark 应用程序的主页面会显示。
在主页面上,可以选择哪些网络接口将被嗅探(监控进出网络数据包)。点击 开始 命令后,Wireshark 开始捕获并显示网络数据包。
可以通过从菜单栏选择 文件 > 退出 或按 Control-Q 来退出 Wireshark 应用程序。
还有更多内容...
Wireshark 应用程序是一个免费的开源网络协议分析仪,广泛用于网络故障排除、分析和教育。
混杂模式
Wireshark 将选定的网络接口(s) 设置为混杂模式。在混杂模式下,接口会监听所有网络数据包,包括那些并非发送给 Raspberry Pi 的数据包。Wireshark 能够看到网络接口上的所有网络流量。
基于终端的用户界面
Wireshark 还有一个命令行工具 tshark,它将嗅探到的数据包直接输出到控制台。tshark 命令是与 Wireshark 分开安装的。
pi@raspberrypi ~ $ sudo apt-get install -y tshark
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
tshark
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 173 kB of archives.
After this operation, 314 kB of additional disk space will be used.
Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main tshark armhf 1.8.2-5wheezy16 [173 kB]
Fetched 173 kB in 1s (149 kB/s)
Selecting previously unselected package tshark.
(Reading database ... 88953 files and directories currently installed.)
Unpacking tshark (from .../tshark_1.8.2-5wheezy16_armhf.deb) ...
Processing triggers for man-db ...
Setting up tshark (1.8.2-5wheezy16) ...
pi@raspberrypi ~ $
当在命令行中输入时,如果不带选项,tshark 会开始捕获它能够嗅探到的数据包,并且默认使用网络接口 (eth0)。
pi@raspberrypi ~ $ tshark
Capturing on eth0
7.169256 93.93.130.39 -> 192.168.2.11 TCP 74 http > 47593 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=3829221233 TSecr=2254282 WS=128
7.169418 192.168.2.11 -> 93.93.130.39 TCP 66 47593 > http [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=2254310 TSecr=3829221233
7.170328 192.168.2.11 -> 93.93.130.39 HTTP 399 GET / HTTP/1.1
7.332273 93.93.130.39 -> 192.168.2.11 TCP 66 http > 47593 [ACK] Seq=1 Ack=334 Win=15616 Len=0 TSval=3829221302 TSecr=2254310
7.333431 93.93.130.39 -> 192.168.2.11 HTTP 324 HTTP/1.0 302 Found (text/html)
7.333558 192.168.2.11 -> 93.93.130.39 TCP 66 47593 > http [ACK] Seq=334 Ack=259 Win=30336 Len=0 TSval=2254326 TSecr=3829221302
7.339590 192.168.2.11 -> 93.93.130.39 TCP 66 47593 > http [FIN, ACK] Seq=334 Ack=259 Win=30336 Len=0 TSval=2254327 TSecr=3829221302
7.342519 192.168.2.11 -> 192.168.2.1 DNS 64 Standard query 0x32c4 A wpad
7.343102 192.168.2.1 -> 192.168.2.11 DNS 139 Standard query response 0x32c4 No such name
7.344034 192.168.2.11 -> 192.168.2.1 DNS 79 Standard query 0x5959 A www.raspberrypi.org
7.371312 192.168.2.1 -> 192.168.2.11 DNS 160 Standard query response 0x5959 CNAME lb.raspberrypi.org A 93.93.128.211 A 93.93.128.230 A 93.93.130.39 A 93.93.130.214
上述 tshark 示例输出显示了在浏览网站 www.raspberrypi.org 时捕获的一些网络数据包。
捕获过滤器
并非所有通过 Raspberry Pi 网络接口传输的网络数据包都是有趣的。Wireshark 和 tshark 都可以使用捕获过滤器来限制捕获和显示的数据包数量。
在此示例中,捕获过滤器将显示内容限制为 SSL 流量。
pi@raspberrypi ~ $ tshark -R 'ssl'
Capturing on eth0
1.080068 192.168.2.11 -> 216.58.209.227 TLSv1.2 135 Encrypted Alert
1.081229 192.168.2.11 -> 74.125.224.145 TLSv1.2 135 Encrypted Alert
1.082105 192.168.2.11 -> 74.125.224.145 TLSv1.2 135 Encrypted Alert
1.082913 192.168.2.11 -> 216.58.192.35 TLSv1.2 135 Encrypted Alert
1.083782 192.168.2.11 -> 74.125.20.95 TLSv1.2 135 Encrypted Alert
1.084541 192.168.2.11 -> 74.125.224.9 TLSv1.2 135 Encrypted Alert
1.085294 192.168.2.11 -> 74.125.20.95 TLSv1.2 135 Encrypted Alert
1.239064 192.168.2.11 -> 173.194.202.105 SSL 206 Client Hello
1.345864 173.194.202.105 -> 192.168.2.11 SSL 1484 [TCP Previous segment not captured] Continuation Data
1.345865 173.194.202.105 -> 192.168.2.11 SSL 405 Continuation Data
...
以下示例捕获来自无线网络 (wlan0) 的数据,并将显示限制为 HTTP 流量。
pi@raspberrypi ~ $ tshark -i wlan0 -R http
Capturing on wlan0
7.721824 192.168.0.75 -> 199.27.79.133 HTTP 452 GET / HTTP/1.1
7.818987 199.27.79.133 -> 192.168.0.75 HTTP 781 [TCP Previous segment not captured] Continuation or non-HTTP traffic
7.831542 192.168.0.75 -> 199.27.79.133 HTTP 511 GET /css/main.css HTTP/1.1
更多关于捕获过滤器使用的示例,以及有关 Wireshark 和 tshark 使用的更多细节,可以在以下参考资料中找到。
另见
Wireshark (www.wireshark.org):Wireshark 应用的主页上有关于如何有效使用 Wireshark 的详细文档。
Wireshark (en.wikipedia.org/wiki/Wireshark):这篇维基百科文章有关于 Wireshark 的更多信息,包括它的历史和工作原理。
-
wireshark - 交互式转储和分析网络流量 (
manpages.debian.net/cgi-bin/man.cgi?query=wireshark):Debian 手册页描述了 wireshark 命令、其配置和选项。 -
tshark - 转储和分析网络流量 (
manpages.debian.net/cgi-bin/man.cgi?query=tshark):Debian 手册页描述了tshark命令、其配置和选项。
wireshark-filter - Wireshark 过滤器语法和参考 (manpages.debian.org/cgi-bin/man.cgi?query=wireshark-filter):这篇 Debian 手册页详细描述了 Wireshark 的捕获过滤器。
- CaptureFilters (
wiki.wireshark.org/CaptureFilters):这个网站有许多有用的捕获过滤器示例。
Wireshark 介绍 (www.wireshark.org/video/wireshark/introduction-to-wireshark/):这段视频是一个很好的 Wireshark 数据包嗅探入门。
启用 IPv6 网络协议
本教程配置您的树莓派以支持 IPv6。
互联网协议的第六版 IPv6 旨在取代当前的 IPv4 协议。IPv6 提供比 IPv4 多 8x10²⁸ 个 IP 地址。它也是一个更稳定、更高效和更安全的协议。
大多数现代家用网络路由器都支持 IPv4 和 IPv6;然而,并非所有仍在使用的旧路由器都支持 IPv6。因此,树莓派默认情况下不启用 IPv6,这样可以节省一些内存和处理能力。要充分利用现代网络服务,您可以在树莓派上启用 IPv6。
完成本教程后,您的树莓派将启用 IPv6。
准备工作
配料:
一个已启动的树莓派的初步设置或基本网络设置。您还需要以用户pi登录(有关如何启动和登录的详细信息,请参见第一章,安装与设置,以及第二章,管理中关于如何远程登录的教程)。
本教程不需要桌面图形界面,可以在基于文本的控制台或LXTerminal中运行。
如果树莓派的安全外壳(SSH)服务器正在运行,可以通过安全外壳客户端远程完成本教程。
如何操作...
安装网状网络的步骤如下:
-
直接或远程登录树莓派。
-
使用
modprobe命令启用ipv6协议。pi@raspberrypi ~ $ sudo modprobe ipv6 -
使用
ifconfig命令验证所有网络接口是否已启用 IPv6(查找inet6 addr)。pi@raspberrypi ~ $ ifconfig eth0 Link encap:Ethernet HWaddr b8:27:eb:3f:aa:0c inet addr:192.168.2.11 Bcast:192.168.2.255 Mask:255.255.255.0 inet6 addr: fe80::ba27:ebff:fe3f:aa0c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:978305 errors:0 dropped:0 overruns:0 frame:0 TX packets:1786420 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:100780981 (96.1 MiB) TX bytes:2430911170 (2.2 GiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:45 errors:0 dropped:0 overruns:0 frame:0 TX packets:45 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3420 (3.3 KiB) TX bytes:3420 (3.3 KiB) wlan0 Link encap:Ethernet HWaddr 00:0f:55:bb:aa:b5 inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::20f:55ff:febb:aab5/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1628703 errors:0 dropped:50 overruns:0 frame:0 TX packets:803167 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2395688238 (2.2 GiB) TX bytes:94274367 (89.9 MiB) pi@raspberrypi ~ $ -
树莓派现在正在使用 IPv6!然而,
ipv6模块不会在下次启动时自动加载。请使用以下步骤将该模块配置为自动加载。 -
将
ipv6模块添加到内核模块配置文件/etc/modules的末尾。pi@raspberrypi ~ $ sudo sh -c 'echo ipv6 >>/etc/modules' -
使用
vi命令编辑内核模块配置文件/etc/modprobe.d/ipv6.conf。pi@raspberrypi ~ $ sudo vi /etc/modprobe.d/ipv6.conf -
vi编辑器显示配置文件的内容。使用该编辑器的说明可以在vi的手册页中找到(请参阅第二章,管理中的教程阅读内建文档)。# Don't load ipv6 by default alias net-pf-10 off #alias ipv6 off ~ ~ "/etc/modprobe.d/ipv6.conf" 3 lines, 65 characters -
将alias net-pf-10行末的off改为on,并删除alias ipv6行,因为它已经不再适用了。
# ipv6 is loaded by default alias net-pf-10 ipv6 ~ ~ "/etc/modprobe.d/ipv6.conf" 3 lines, 59 characters -
保存文件并退出编辑器(
:wq)。 -
最后,重启树莓派以使用新的 IPv6 配置!
pi@raspberrypi ~ $ sudo reboot Broadcast message from root@raspberrypi (pts/0) (Sun Aug 30 13:01:44 2015): The system is going down for reboot NOW! pi@raspberrypi ~ $ Connection to 192.168.2.13 closed by remote host. Connection to 192.168.2.13 closed.
它是如何工作的...
登录到树莓派后,本教程使用modprobe命令加载ipv6模块。简单地加载该模块即可启用 IPv6 网络;然而,ipv6模块不会在下次重启时自动加载。需要更新内核的模块配置以启用开机自动加载。
该配方使用在子 shell 中运行的 echo 命令(sh –c)将模块名 ipv6 附加(>>)到 /etc/modules 配置文件的底部。将模块名添加到模块配置中可确保该模块在启动时加载。
该配方还使用 vi 命令更新 /etc/modprobe/ipv6.conf 文件,显式启用(on)完整的 IPv6 网络协议族(net-pf-10)。
配置更新后,Raspberry Pi 会重启。
还有更多...
互联网协议版本 6 不仅具有更大的地址空间,还有更多的功能。
隐私扩展
IPv6 有两个有趣的隐私扩展:一个是在每次重启时创建一个新的随机地址,另一个则是持续地随机化地址。
要启用每次启动时生成一个临时随机 IPv6 地址,请将 net.ipv6.conf.iface.use_tempadd Linux 内核参数添加到 /etc/sysctl.conf 内核配置文件的底部。
要启用随机 IP 地址的持续刷新,请将内核参数 net.ipv6.conf.iface.temp_prefered_lft 添加到同一文件的底部。
以下示例使用 echo 命令将两个内核配置参数附加(>>)到内核配置文件 /etc/sysctl.conf 的底部。IPv6 内核参数(net.ipv6.conf)用于生成临时地址(use_tempadd),并启用(2)每两小时刷新一次地址(temp_prefered_lft)(7200 秒)的参数,适用于所有接口。首先,使用 sudo sh 命令创建一个具有超级用户权限的子 shell。内核参数添加完成后,退出(exit)子 shell 并丢弃超级用户权限。
pi@raspberrypi ~ $ sudo sh
# echo "net.ipv6.conf.all.use_tempaddr = 2" >> /etc/sysctl.conf
# echo "net.ipv6.conf.default.use_tempaddr = 2" >> /etc/sysctl.conf
# echo "net.ipv6.conf.all.temp_prefered_lft = 7200" >> /etc/sysctl.conf
# echo "net.ipv6.conf.default.temp_prefered_lft = 7200" >> /etc/sysctl.conf
# exit
pi@raspberrypi ~ $
重启 Raspberry Pi 后,变更将会生效。
使用 sysctl 在运行时更改内核参数
以下示例使用 systctl 命令专门为接口 eth0 配置扩展功能。但 /etc/sysctl.conf 仍需要更新,以确保启动时自动使用这些配置。
pi@raspberrypi ~ $ sudo sh
# sysctl -a --pattern 'net.ipv6.conf.eth0.use_tempaddr'
net.ipv6.conf.eth0.use_tempaddr = 0
# sysctl net.ipv6.conf.eth0.use_tempaddr=2
net.ipv6.conf.eth0.use_tempaddr = 2
# sysctl -a --pattern 'net.ipv6.conf.eth0.temp_prefered_lft'
net.ipv6.conf.eth0.temp_prefered_lft = 86400
# sysctl net.ipv6.conf.eth0.temp_prefered_lft=7200
net.ipv6.conf.eth0.temp_prefered_lft = 7200
# exit
pi@raspberrypi ~ $
另请参见
-
IPv6 (
en.wikipedia.org/wiki/IPv6):这篇维基百科文章提供了更多关于互联网协议版本 6 的信息。 -
sysctl.conf – 配置内核参数的运行时文件 (
manpages.debian.net/cgi-bin/man.cgi?query=sysctl):Debian 的sysctl手册页面提供了有限的命令信息。 -
sysctl.conf – sysctl 预加载/配置文件 (
manpages.debian.net/cgi-bin/man.cgi?query=sysctl.conf):Debian 的sysctl.conf手册页面提供了有限的文件格式信息。
第六章:物联网(IoT)——物联网
在本章中,我们将介绍:
-
轻松访问硬件
-
安装 GrovePi
-
从网页控制设备
-
连接到物联网平台
-
创建物联网网关
介绍
本章中的食谱展示了如何将连接到树莓派的设备和传感器——物品——连接到物联网(IoT)。
(物联网)描述了当互联网被用于使物理物体——物品——交换数据时的状态。当树莓派连接到互联网时,它可以参与物联网,通过其通用输入/输出(GPIO)和其他硬件接口交换实时数据。本章包含了一些食谱,展示了树莓派如何参与物联网。
本章中的食谱特定于树莓派。它们利用树莓派的硬件接口——GPIO 引脚。虽然这些概念可以应用于其他 Linux 计算机,但这些指令特定于树莓派。
完成本章的食谱后,您将能够配置和控制直接连接到树莓派的设备和传感器,或通过 GrovePi 硬件系统连接的设备。您还将能够通过树莓派上托管的网页和物联网服务提供商 SmartLiving.io 与 ThingBox.io 控制连接到树莓派的设备。
轻松访问硬件
这个食谱演示了如何轻松从树莓派访问硬件。
在这个食谱中,使用简单的 Bash 命令(ls、cat和echo)使连接到树莓派 GPIO 引脚的 LED 闪烁。
完成这个食谱后,您将能够通过 Bash 命令行控制连接到树莓派的 GPIO 端口。
准备就绪
配料:
-
未开机的树莓派的初始设置或基础网络设置
-
一个 LED
-
一个推钮开关
-
三个 330 欧姆电阻器
-
一块面包板
-
一些面包板连接线
这个食谱不需要桌面 GUI,可以从基于文本的控制台运行,或者从LXTerminal中运行。
如果树莓派的安全外壳服务器正在运行,可以使用安全外壳客户端远程完成这个食谱。
如何操作...
从命令行轻松访问硬件的步骤如下:
-
在打开树莓派电源之前,请使用以下两个图示将推按钮开关连接到 GPIO 端口 23(引脚 16),并将 LED 连接到 GPIO 端口 24(引脚 18)。
以下图示显示了本食谱的组件布局:
![如何操作...]()
-
推钮开关应连接到引脚 2(5V)的一侧。推按钮开关的另一侧应连接两个 330 欧姆的电阻器——一个电阻器连接到引脚 6(GND),另一个电阻器连接到引脚 16(GPIO 23)。
-
LED 应连接到引脚 18(GPIO 端口 24)的一侧。LED 的另一侧应连接一个 330 欧姆的电阻器,电阻器另一端连接到引脚 20(GND)。
注意
如果第一次尝试失败,重新旋转 LED。
LED 是一种发光二极管。二极管只允许电流单向流动。反向二极管是常见的电子电路故障。
-
在验证按钮开关、LED 和两个 330 欧姆电阻连接正确后,启动树莓派。
以下图示显示了树莓派 GPIO 接口的针脚布局:
![如何操作...]()
-
直接或远程登录到树莓派。
-
使用
cd命令导航到树莓派内核参数的/sys/class/gpio目录。pi@raspberrypi ~ $ cd /sys/class/gpio pi@raspberrypi ~ $ -
使用
ls命令列出包含 GPIO 参数和接口的内核参数目录的内容。pi@raspberrypi /sys/class/gpio $ ls export gpiochip0 unexport pi@raspberrypi /sys/class/gpio $ -
使用
echo命令告诉树莓派内核将 GPIO 端口23和24的接口export到用户空间。pi@raspberrypi /sys/class/gpio $ echo 23 >export pi@raspberrypi /sys/class/gpio $ echo 24 >export pi@raspberrypi /sys/class/gpio $ -
使用
ls命令再次显示内核参数和接口目录/sys/class/gpio的内容。pi@raspberrypi /sys/class/gpio $ ls export gpio23 gpio24 gpiochip0 unexport pi@raspberrypi /sys/class/gpio $ -
注意两个新的用户空间可访问的内核接口:GPIO 端口 23(
gpio23)和 GPIO 端口 24(gpio24)。 -
使用
echo命令将 GPIO 端口 23(gpio23)配置为接收输入信号(in),将 GPIO 端口 24(gpio24)配置为发送输出信号(out)。pi@raspberrypi /sys/class/gpio $ echo in >gpio23/direction pi@raspberrypi /sys/class/gpio $ echo out >gpio24/direction pi@raspberrypi /sys/class/gpio $ -
使用
cat命令查看当按钮开关未按下(0)和按下(1)时的当前状态。pi@raspberrypi /sys/class/gpio $ cat gpio23/value 0 pi@raspberrypi /sys/class/gpio $ # WHILE PRESSING THE BUTTON... pi@raspberrypi /sys/class/gpio $ cat gpio23/value 1 pi@raspberrypi /sys/class/gpio $ -
按钮开关工作正常!
-
使用
echo命令打开 LED(1),然后关闭 LED(0)。pi@raspberrypi /sys/class/gpio $ echo 1 >gpio24/value pi@raspberrypi /sys/class/gpio $ echo 0 >gpio24/value pi@raspberrypi /sys/class/gpio $ -
LED 工作正常!
-
使用以下
while循环控制 LED 与按钮开关配合使用。使用Ctrl-C(^C)停止while循环。pi@raspberrypi /sys/class/gpio $ in=gpio23/value pi@raspberrypi /sys/class/gpio $ out=gpio24/value pi@raspberrypi /sys/class/gpio $ while true; do echo $(cat $in) >$out; done ^C pi@raspberrypi /sys/class/gpio $ -
按钮开关控制 LED!
-
使用
echo命令将 GPIO 端口23和24从用户空间unexport,并使用ls命令查看树莓派内核已移除gpio23和gpio24接口。pi@raspberrypi /sys/class/gpio $ ls export gpio23 gpio24 gpiochip0 unexport pi@raspberrypi /sys/class/gpio $ echo 23 >unexport pi@raspberrypi /sys/class/gpio $ echo 24 >unexport pi@raspberrypi /sys/class/gpio $ ls export gpiochip0 unexport
它是如何工作的...
本教程使用一个连接的输入设备(按钮开关)来激活一个输出设备(LED)。步骤首先是将输入和输出设备连接到树莓派。一旦设备连接好,将对每个设备进行单独测试。最后,通过一个 Bash 脚本,每当输入设备发出信号时,激活输出设备。
在树莓派通电之前,两个设备,一个按钮开关和一个LED,已连接到树莓派。
将按钮开关连接到 GPIO 端口 23。
按钮开关作为输入设备。一端通过第 2 针连接到+5v,另一端通过第 16 针连接到 GPIO 端口 23。当按钮开关被按下时,GPIO 端口 23(第 16 针)会检测到来自+5v(第 2 针)通过闭合的按钮开关传来的高电平信号。
除了按钮开关外,还需要两个 330 欧姆电阻来安全完成电路的这一部分。一个 330 欧姆电阻用于在按钮开关按下(闭合)且信号高时限制电流流动。另一个 330 欧姆电阻用于在按钮开关未按下(打开)时将信号拉低到低电平。
电流限制电阻将按钮开关连接到 GPIO 端口 23(引脚 16)。下拉电阻将 GPIO 端口 23(引脚 16)连接到 GND(引脚 6)。
当按钮开关打开时,GPIO 端口 23(引脚 16)通过连接到 GND(引脚 6)的下拉电阻检测到低信号。当按钮开关闭合时,GPIO 端口 23(引脚 16)通过限流电阻从 +5v(引脚 2)检测到高信号。
将 LED 连接到 GPIO 端口 24
LED 充当输出设备。它一侧连接到 GPIO 端口 24(引脚 18)。另一侧,LED 通过一个限流 330 欧姆电阻连接到 GND(引脚 20)。
当 GPIO 端口 24(引脚 18)发出高信号时,电路中的足够电流通过以点亮 LED。信号低时,LED 保持未点亮。
开机并登录
一旦验证了 LED、按钮开关和三个保护用的 330 欧姆电阻正确连接,打开树莓派并登录。
使用 sysfs 导航 Linux 内核
登录后,该示例使用 cd 命令导航到 sysfs 虚拟文件系统中的 /sys/class/gpio 目录。sysfs 虚拟文件系统是 Linux 内核参数和接口的用户空间映射。GPIO 接口的内核参数可以从 /sys/class/gpio 访问。
使用 ls 命令查看当前从内核空间导出到用户空间的 GPIO 端口接口。到目前为止,尚未导出任何接口。
gpio 目录仅包含三个条目:两个伪参数 export 和 unexport;以及一个接口 gpiochip0。本示例未使用 gpiochip0 接口。这两个伪参数用于从内核空间到用户空间导出和取消导出 GPIO 端口接口。
导出 GPIO 端口 23 和 24
该示例使用 echo 命令将数字 23 和 24 写入 export 伪参数。这告诉树莓派的 Linux 内核将 GPIO 端口 23 和 24 的接口导出到用户空间(位于 /sys/class/gpio)。
导出 GPIO 端口 23 接口的命令行为 echo 23 >export,它有效是因为它将数字 23(echo 23)写入 Linux 内核的伪参数 /sys/class/gpio/export,告诉内核为 GPIO 端口 23 创建一个接口子目录(gpio23)。
在内核被告知导出两个 GPIO 端口后,再次使用 ls 命令显示 Linux 内核已为 GPIO 端口 23 /sys/class/gpio/gpio23 和 GPIO 端口 24 /sys/class/gpio/gpio24 创建了两个新的 GPIO 端口接口子目录。
配置每个接口的方向为输入或输出
然后,方案使用 echo 命令将 (>) in(用于输入)或 out(用于输出)写入每个 GPIO 端口接口子目录(gpio23 和 gpio24)中的 direction 参数。
输入设备(按钮开关)连接到 GPIO 端口 23,因此 GPIO 端口 23(gpio23)的方向参数设置为输入(echo in > gpio23/direction)。
输出设备(LED)连接到 GPIO 端口 24,因此 GPIO 端口 24(gpio24)的方向设置为输出(echo out > gpio24/direction)。
一旦每个 GPIO 端口的输入/输出方向被配置完毕,就可以测试每个端口的接口。
测试输入设备
使用 cat 命令测试输入设备,显示 GPIO 端口 23 的值(gpio23/value)。
当按钮开关释放时以及按下时,GPIO 端口 23(gpio23/value)的值会被显示。当按钮开关释放(开关断开)时,GPIO 端口 23(gpio23/value)的值为低(0)。当按钮开关被按下(闭合)时,值为高(1)。
测试输出设备
输出设备通过 echo 命令进行测试。
当高电平值发送到 GPIO 端口 24(echo 1 >gpio24/value)时,LED 会亮起。当发送低电平值(echo 0 >gpio24/value)时,LED 停止亮起。
使用输入设备激活输出设备
在成功测试输入设备(按钮开关)和输出设备(LED)后,该方案将两个设备通过一个简单的 while 循环连接起来。
首先,将 shell 变量 in 定义为 GPIO 端口 23(gpio23/value)值的别名,将变量 out 定义为 GPIO 端口 24(gpio24/value)值的别名。
然后,两个变量被用于一个无限循环(while true; do),该循环从 GPIO 端口 23 读取输入信号($(cat in)),并使用 echo 命令将信号写入 GPIO 端口 24(>$out)。
当循环运行时,每当按钮开关被按下,LED 就会亮起。
按下 Ctrl+C 可停止循环。
清理
在运行循环后,cat 命令用于将 Linux 内核接口从用户空间导出到 GPIO 端口 23 (/sys/class/gpio/gpio23) 和 GPIO 端口 24 (/sys/class/gpio/gpio24)。
在 GPIO 端口接口被取消导出后,使用 ls 命令验证这两个 GPIO 端口接口(gpio23 和 gpio24)是否已从 /sys/class/gpio 用户空间目录中移除。
另见
-
通用输入输出 (
en.wikipedia.org/wiki/General-purpose_input/output):这篇维基百科文章描述了通用输入输出接口的工作原理。 -
sysfs (
en.wikipedia.org/wiki/Sysfs):这篇维基百科文章描述了sysfs文件系统、它的历史以及工作原理。 -
上拉电阻 (
en.wikipedia.org/wiki/Pull-up_resistor):这篇维基百科文章描述了如何使用上拉电阻来确保电路具有有效的逻辑电平。 -
二极管 (
en.wikipedia.org/wiki/Diode):这篇维基百科文章详细解释了二极管。 -
Bash 初学者指南 (
tldp.org/LDP/Bash-Beginners-Guide/html/index.html):这是一本实用的 Bash 和 Bash 脚本语言指南。
安装 GrovePi
本食谱配置了对树莓派的 Grove Pi 扩展板的访问。
Seeed 的 Grove 硬件系统是一种类似乐高的系统,可以将电子组件拼接在一起,无需焊接。
Dexter Industries 的 GrovePi 将树莓派转变为 Grove 组件的中央控制中心。
下图展示了 GrovePi+安装在树莓派 2 上的样子:

完成本食谱后,您将能够通过 Python 脚本语言从树莓派控制连接到 GrovePi 的 Grove 组件。
准备就绪
材料:
-
树莓派的初始设置或基础网络设置,树莓派已通电,但 GrovePi 尚未安装。你还需要以
pi用户登录(参考第一章,安装与设置了解如何启动和登录,参考第二章,管理了解如何远程登录)。 -
一块 GrovePi GPIO 扩展板。
-
一颗 Grove LED。
-
一颗 Grove 按钮开关。
-
两根 Grove 连接线。
如果树莓派的安全外壳服务器正在运行,本食谱可以通过安全外壳客户端远程完成。
如何操作...
安装 GrovePi 的步骤如下:
-
在将 GrovePi 连接到树莓派之前,使用
git命令从github.com上的DexterInd/GrovePi仓库下载 GrovePi 安装文件。pi@raspberrypi ~ $ git clone https://github.com/DexterInd/GrovePi Cloning into 'GrovePi'... remote: Counting objects: 2206, done. remote: Total 2206 (delta 0), reused 0 (delta 0), pack-reused 2206 Receiving objects: 100% (2206/2206), 1.22 MiB | 1.37 MiB/s, done. Resolving deltas: 100% (1134/1134), done. pi@raspberrypi ~/ $ -
使用
cd命令切换到包含安装脚本的目录GrovePi/Scripts。pi@raspberrypi ~ $ cd GrovePi/Script/ pi@raspberrypi ~/GrovePi/Script $ -
使用
sh命令执行安装脚本。该命令需要超级用户权限(使用sudo)。pi@raspberrypi ~/GrovePi/Script $ sudo sh ./install.sh _____ _ | __ \ | | | | | | _____ _| |_ ___ _ __ | | | |/ _ \ \/ / __/ _ \ '__| | |__| | __/> <| || __/ | |_____/ \___/_/\_\__\___|_| _ _ |_ _| | | | | (_) | | _ __ __| |_ _ ___| |_ _ __ _ ___ ___ | | | '_ \ / _` | | | / __| __| '__| |/ _ \/ __| _| |_| | | | (_| | |_| \__ \ |_| | | | __/\__ \ |_____|_| |_|\__,_|\__,_|___/\__|_| |_|\___||___/ Welcome to GrovePi Installer. Requirements: 1) Must be connected to the internet 2) This script must be run as root user Steps: 1) Installs package dependencies: - python-pip alternative Python package installer - git fast, scalable, distributed revision control system - libi2c-dev userspace I2C programming library development files - python-serial pyserial - module encapsulating access for the serial port - python-rpi.gpio Python GPIO module for Raspberry Pi - i2c-tools This Python module allows SMBus access through the I2C /dev - python-smbus Python bindings for Linux SMBus access through i2c-dev - arduino AVR development board IDE and built-in libraries - minicom friendly menu driven serial communication program 2) Installs wiringPi in GrovePi/Script 3) Removes I2C and SPI from modprobe blacklist /etc/modprobe.d/raspi-blacklist.conf 4) Adds I2C-dev, i2c-bcm2708 and spi-dev to /etc/modules 5) Installs gertboard avrdude_5.10-4_armhf.deb package 6) Runs gertboard setup - configures avrdude - downloads gertboard known boards and programmers - replaces avrsetup with gertboards version - in /etc/inittab comments out lines containing AMA0 - in /boot/cmdline.txt removes: console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 - in /usr/share/arduino/hardware/arduino creates backup of boards.txt - in /usr/share/arduino/hardware/arduino creates backup of programmers.txt Special thanks to Joe Sanford at Tufts University. This script was derived from his work. Thank you Joe! Raspberry Pi will reboot after completion. -
在安装过程中,系统会提示是否安装新的软件包。按Enter键接受默认回答(
Y)。 -
当安装脚本完成时,系统会提示你重新启动树莓派。相反,请使用
poweroff命令关闭树莓派。_____ ______ _____ _______ _____ _______ | __ \| ____|/ ____|__ __|/\ | __ \__ __| | |__) | |__ | (___ | | / \ | |__) | | | | _ /| __| \___ \ | | / /\ \ | _ / | | | | \ \| |____ ____) | | |/ ____ \| | \ \ | | |_| \_\______|_____/ |_/_/ \_\_| \_\ |_| Please restart to implement changes! To Restart type sudo reboot pi@raspberrypi ~ $ sudo poweroff Broadcast message from root@raspberrypi (pts/0) (Sun Sep 27 21:42:34 2015): The system is going down for system halt NOW! -
在树莓派关闭且电源已断开时,将 GrovePi 连接到树莓派。
下图展示了如何将 GrovePi+连接到树莓派 2:
![How to do it...]()
-
将 GrovePi 连接到树莓派后,重新连接电源,并在树莓派启动完成后登录。
-
登录后,使用
i2cdetect命令验证 GrovePi 是否已正确安装。注意:如果使用的是原版树莓派,请使用–y 0选项,而不是–y 1。pi@raspberrypi ~ $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- 04 -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- -
现在,使用
apt-get install命令安装 Python 设置工具(python-setuptools)。pi@raspberrypi ~ $ sudo apt-get install -y python-setuptools Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: python-pkg-resources Suggested packages: python-distribute python-distribute-doc The following NEW packages will be installed: python-pkg-resources python-setuptools 0 upgraded, 2 newly installed, 0 to remove and 39 not upgraded. Need to get 0 B/513 kB of archives. After this operation, 1,308 kB of additional disk space will be used. Selecting previously unselected package python-pkg-resources. (Reading database ... 82496 files and directories currently installed.) Unpacking python-pkg-resources (from .../python-pkg-resources_0.6.24-1_all.deb) ... Selecting previously unselected package python-setuptools. Unpacking python-setuptools (from .../python-setuptools_0.6.24-1_all.deb) ... Setting up python-pkg-resources (0.6.24-1) ... Setting up python-setuptools (0.6.24-1) ... pi@raspberrypi ~ $ -
使用
cd命令导航到 GrovePi Python 软件库(~/GrovePi/Software/Python)。pi@raspberrypi ~ $ cd GrovePi/Software/Python pi@raspberrypi ~/GrovePi/Software/Python $ -
使用
python setup.py命令来构建并安装``grovepi模块。pi@raspberrypi ~/GrovePi/Software/Python $ python setup.py build running build running build_py creating build creating build/lib.linux-armv7l-2.7 copying grovepi.py -> build/lib.linux-armv7l-2.7 pi@raspberrypi ~/GrovePi/Software/Python $ sudo python setup.py install running install Checking .pth file support in /usr/local/lib/python2.7/dist-packages/ /usr/bin/python -E -c pass TEST PASSED: /usr/local/lib/python2.7/dist-packages/ appears to support .pth files running bdist_egg running egg_info creating grovepi.egg-info writing grovepi.egg-info/PKG-INFO writing top-level names to grovepi.egg-info/top_level.txt writing dependency_links to grovepi.egg-info/dependency_links.txt writing manifest file 'grovepi.egg-info/SOURCES.txt' reading manifest file 'grovepi.egg-info/SOURCES.txt' writing manifest file 'grovepi.egg-info/SOURCES.txt' installing library code to build/bdist.linux-armv7l/egg running install_lib running build_py creating build/bdist.linux-armv7l creating build/bdist.linux-armv7l/egg copying build/lib.linux-armv7l-2.7/grovepi.py -> build/bdist.linux-armv7l/egg byte-compiling build/bdist.linux-armv7l/egg/grovepi.py to grovepi.pyc creating build/bdist.linux-armv7l/egg/EGG-INFO copying grovepi.egg-info/PKG-INFO -> build/bdist.linux-armv7l/egg/EGG-INFO copying grovepi.egg-info/SOURCES.txt -> build/bdist.linux-armv7l/egg/EGG-INFO copying grovepi.egg-info/dependency_links.txt -> build/bdist.linux-armv7l/egg/EGG-INFO copying grovepi.egg-info/top_level.txt -> build/bdist.linux-armv7l/egg/EGG-INFO zip_safe flag not set; analyzing archive contents... creating dist creating 'dist/grovepi-0.0.0-py2.7.egg' and adding 'build/bdist.linux-armv7l/egg' to it removing 'build/bdist.linux-armv7l/egg' (and everything under it) Processing grovepi-0.0.0-py2.7.egg creating /usr/local/lib/python2.7/dist-packages/grovepi-0.0.0-py2.7.egg Extracting grovepi-0.0.0-py2.7.egg to /usr/local/lib/python2.7/dist-packages Adding grovepi 0.0.0 to easy-install.pth file Installed /usr/local/lib/python2.7/dist-packages/grovepi-0.0.0-py2.7.egg Processing dependencies for grovepi==0.0.0 Finished processing dependencies for grovepi==0.0.0 pi@raspberrypi ~/GrovePi/Software/Python $ -
将一个
Grove LED设备连接到D2端口,将一个Grove 按钮开关连接到D4端口的GrovePi上。 -
一个
Grove 按钮开关和一个Grove LED已连接到GrovePi+,如下图所示:![How to do it...]()
-
现在,使用以下 Python 脚本(
button.py)来测试Grove 按钮开关。运行测试脚本(button.py)两次——一次不按按钮开关(0),一次按下按钮开关(1)。注意结果的不同。pi@raspberrypi:~$ cat <<EOD >button.py from grovepi import * button = 4 pinMode( button, "input" ) print digitalRead( button ) EOD pi@raspberrypi:~$ # without pressing the pushbutton switch pi@raspberrypi:~$ python button.py 0 pi@raspberrypi:~$ # while pressing the pushbutton switch pi@raspberrypi:~$ python button.py 1 pi@raspberrypi:~$ -
接下来,使用以下 Python 脚本(
led.py)来测试LED。当运行脚本(led.py)时,LED应持续发光一秒钟。pi@raspberrypi:~$ cat <<EOD >led.py from grovepi import * from time import sleep led = 2 pinMode( led, "output" ) digitalWrite( led, 1 ) sleep( 1 ) digitalWrite( led, 0 ) EOD pi@raspberrypi:~$ python led.py pi@raspberrypi:~$ -
最后,使用以下 Python 脚本在按下
Grove 按钮开关时点亮LED。按Ctrl+C停止脚本。pi@raspberrypi:~$ cat <<EOD >loop.py from grovepi import * from time import sleep led = 2 pinMode( led, "output" ) button = 4 pinMode( button, "input" ) while True: try: state = digitalRead( button ) digitalWrite( led, state ) sleep( 0.01 ) except KeyboardInterrupt: digitalWrite( led, 0 ) break except IOError: print "IOError" EOD pi@raspberrypi:~$ python loop.py ^C
如何操作...
这个方案使用连接到树莓派的 GrovePi,通过输入设备(Grove 按钮开关)的状态变化来激活输出设备(Grove LED)。该方案首先将 GrovePi 及输入输出设备连接到树莓派。设备连接后,逐一测试每个设备。最后,使用 Python 脚本在输入设备状态变化时激活输出设备。
在将 GrovePi 连接到树莓派之前,已经安装了 GrovePi 驱动程序。
安装 GrovePi 驱动程序和接口
GrovePi 的驱动程序和接口直接从其源代码库(GitHub)下载(github.com/)。git clone命令使用安全的互联网连接(https://)从其代码库DexterInd/GrovePi下载 GrovePi 接口和驱动程序。下载的文件包括安装脚本。
安装脚本install.sh位于GrovePi/Scripts目录中。使用cd命令导航到GrovePi/Scripts目录。
在GrovePi/Scipts目录中,使用sh命令来运行install.sh脚本。该脚本需要超级用户权限,因此在命令前使用sudo。
在开始安装之前,install.sh脚本会显示它将对您的 Raspberry Pi 进行的所有更改的完整列表。安装脚本提示您继续安装。按Enter键接受安装过程中所有问题的默认设置。
安装完 GrovePi 接口和驱动程序后,您将提示重新启动 Raspberry Pi。相反,请关闭 Raspberry Pi,以便您可以断开 Raspberry Pi 的电源并将 GrovePi 连接到其上。
将 GrovePi 连接到 Raspberry Pi
遵循制造商在www.dexterindustries.com/grovepi/上的说明,将 GrovePi 连接到 Raspberry Pi。
如果将原始的 26 针 GrovePi 连接到 40 针型号的 Raspberry Pi 之一,请确保引脚 1 正确对齐。尽管 GrovePi 不覆盖所有引脚,但仍将完美工作。
可能需要在 GrovePi 和 Raspberry Pi 之间放置保护层,以防止 GrovePi 的底部接触到 Raspberry Pi 的 USB 连接器。GrovePi 运送时所用的静电袋片段是一个完美的保护层。
打开电源并登录
一旦验证 GrovePi 已正确连接到 Raspberry Pi,请将电源电缆连接到 Raspberry Pi,并在重新启动后登录。
使用i2cdetect命令验证 GrovePi 是否已正确连接。使用–y选项绕过交互模式。只有原始的 Raspberry Pi 使用总线0,而所有新型 Raspberry Pi 使用总线1。
如果 GrovePi 连接正确,其芯片 ID 为04将显示在地址00 4处。
现在 GrovePi 已经连接并被检测到,是时候安装 GrovePi 的 Python 语言应用程序编程接口(API)了。
安装 Python API
在安装 GrovePi API 之前,需要安装 Python 设置工具。使用apt-get install命令安装python-setuptools软件包。安装 Python 的设置工具后,可以安装 GrovePi API。
GrovePi API 的源代码位于GrovePi/Software/Python目录中。使用cd命令导航到该目录。
使用python命令来运行setup.py脚本,首先构建 API,然后安装 API。安装需要超级用户权限,因此在install期间使用sudo命令作为命令前缀。
安装完成 GrovePi Python API 后,可以测试硬件设备。
测试 Grove 按钮开关
cat命令用于创建一个新的脚本button.py,该脚本测试Grove pushbutton switch的状态。紧随其后的cat命令至数据标记(<<EOD)的所有行被复制到新脚本(>button.py)。
python命令用于运行button.py测试脚本两次。
第一次运行button.py脚本时,没有按下按键开关。结果为 0,因为开关是打开的(未按下)。
第二次运行脚本时,按下了按键开关。结果为 1,因为开关是闭合的(按下)。
测试 Grove LED。
cat命令还用于创建另一个测试脚本led.py,该脚本测试Grove LED。紧随其后的cat命令至数据标记(<<EOD)的所有行被复制到新脚本(>led.py)。
python命令用于运行led.py测试脚本。当脚本(led.py)运行时,Grove LED应该亮起一秒钟。
按下按键开关时,LED 会亮起。
cat命令再次用于创建loop.py Python 脚本。这个简短的程序将无限循环,发送来自输入设备(按键开关)的信号值到输出设备(LED)。
loop.py脚本导入了完整的(*) grovepi API,并从time API 中导入了sleep函数。
一个变量led用来表示数字端口2,即连接 LED 与 GrovePi 的端口。grovepi API 中的pinMode函数用于将 LED 端口的信号方向设置为输出。
另一个变量button用来表示数字端口4,即连接按键开关与 GrovePi 的端口。pinMode函数用于将button端口的信号方向设置为input。
脚本的主体是一个无限循环(while True:),只有在发生KeyboardInterrupt异常时才会跳出。
循环首先使用digitalRead函数接收button端口的当前值。接收到的值存储在变量state中。
然后,state变量的值通过digitalWrite函数发送到 LED 端口。
在while循环继续之前,程序会休眠 0.01 秒。这样可以给 Raspberry Pi 一个机会在设置 LED 端口的state和从button端口读取下一个state之间做些其他操作。
while循环监听两种异常:KeyboardInterrupt和IOError。当发生KeyboardInterrupt时,脚本使用digitalWrite函数向 LED 端口发送关闭信号(0),并跳出while循环结束程序。当发生IOError时,打印消息IOError。
python命令用于运行loop.py脚本。当脚本运行时,每当按下按钮开关时,LED 会亮起;松开按钮开关时,LED 会熄灭。使用Ctrl+C发送KeyboardInterrupt异常并结束程序。
还有更多内容…
Dexter Industries 的 GrovePi 扩展板可以将树莓派与 Seeed Studio 开发的 Grove 硬件平台的 100 多个组件连接。官方网站是www.seeedstudio.com/depot/。这些组件可以通过简单的 Python 脚本进行操作,也可以集成到用 C、Go 或 Java 编写的更大应用程序中。
除了本配方中使用的数字端口外,GrovePi 还具有模拟端口,可以接收 0 到 1023 之间的信号级别,并可以输出 0 到 255 之间的信号级别。GrovePi 还具有 3 个 I2C 端口和一个通用异步收发器/传输器(UART)串行端口,可用于与更复杂的设备通信。
完整的 GrovePi 文档,包括 Python API,可以在 Dexter Industries 的网站上找到。更多关于 Grove 系统的信息可以在 Seeed Studio 的 Wiki 上找到。
另请参见
-
GrovePi: 位于
www.dexterindustries.com/grovepi/。GrovePi 主页提供了兼容传感器和设备的完整列表。 -
The Grove System:
www.seeedstudio.com/wiki/Category:Grove。该 Wiki 页面更详细地描述了类似乐高的 Grove 硬件系统。 -
The Grove System – Python Library Documentation:
www.dexterindustries.com/GrovePi/programming/python-library-documentation/。这个网站记录了 GrovePi 的 Python 编程语言库。 -
Python:
www.python.org/。Python 官网提供了 Python 语言的完整参考文档。 -
GrovePi Windows IoT: LED Blink:
www.hackster.io/9381/grove-pi-windows-iot-getting-started-94bf38。这是一个适用于 Windows 10 和 GrovePi 的 LED 闪烁示例。 -
Dexter Industries:
en.wikipedia.org/wiki/Dexter_Industries。Dexter Industries 最著名的是他们为树莓派开发的机器人传感器。 -
Seeed Studio:
www.seeedstudio.com/depot/。Seeed 是一个位于中国深圳的硬件创新平台。 -
GitHub:
github.com。GitHub 是一个开放源代码软件的协作仓库。 -
i2cdetect:
manpages.debian.org/cgi-bin/man.cgi?query=i2cdetect。Debian 的 i2cdetect 手册页记录了该命令及其选项。
从网页控制设备
本教程使用一个简单的 Python 脚本,展示了如何从网页控制连接到 Raspberry Pi 的设备。
web.py Python 编程框架可用于从使用 Python 编程语言编写的脚本提供网页。本教程介绍了一个 Python 脚本,用于提供显示 GrovePi LED 当前状态的网页,并允许网页上的按钮打开和关闭 GrovePi LED。这是一个简单的示例,但是是简单物联网项目的良好基础。
完成此教程后,您将安装并应用了web.py Python 框架,用于提供一个可用于打开和关闭 LED 灯的网页。
准备工作
以下是从网页控制设备所需的组件:
-
对于已安装了 GrovePi 接口和驱动程序的 Raspberry Pi 的初始设置或基本网络设置(请参见前一教程安装 GrovePi的说明)。您也已登录为用户
pi(请参见第一章的教程,安装和设置,了解如何启动和登录,以及第二章的教程,Administration,了解如何远程登录)。 -
GrovePi 应该已连接到 Raspberry Pi 上。
-
Grove LED 应连接到 GrovePi 的 D2 端口。
本教程不需要桌面 GUI,可以从基于文本的控制台或LXTerminal应用程序运行。
如果 Raspberry Pi 的安全外壳服务器正在运行,则可以使用安全外壳客户端远程完成此教程。
如何做...
控制设备从网页的步骤是:
-
登录 Raspberry Pi,可以直接或远程登录。
-
使用
apt-get install命令为 Python 安装web.py网页框架。pi@raspberrypi ~ $ apt-get install –y python-webpy Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: libpq5 python-cheetah python-egenix-mxdatetime python-egenix-mxtools python-flup python-psycopg2 python2.6 python2.6-minimal Suggested packages: python-markdown python-pygments python-memcache python-egenix-mxdatetime-dbg python-egenix-mxdatetime-doc python-egenix-mxtools-dbg python-egenix-mxtools-doc python-psycopg2-doc python2.6-doc binfmt-support The following NEW packages will be installed: libpq5 python-cheetah python-egenix-mxdatetime python-egenix-mxtools python-flup python-psycopg2 python-webpy python2.6 python2.6-minimal 0 upgraded, 9 newly installed, 0 to remove and 39 not upgraded. Need to get 923 kB/4,773 kB of archives. After this operation, 16.5 MB of additional disk space will be used. ... -
安装了
web.py后,使用cat命令创建一个 Python 脚本,用于提供一个用于打开和关闭 Grove LED 灯的网页。pi@raspberrypi ~ $ cat <<EOD >ledpage.py import grovepi import web LED = 2 URLS = ( '/(.*)', 'request_handler' ) class request_handler: def GET( self, url_match ): web.header( 'Content-Type', 'text/html; charset=utf-8' ) if url_match == 'on': grovepi.digitalWrite( LED, 1 ) return html_page( 'off' ) if url_match == 'off': grovepi.digitalWrite( LED, 0 ) return html_page( 'on' ) return html_page( 'on' ) def html_page( state ): form = '<form action="/' + state + '">' form += '<input type="submit" value="' + state + '">' form += '</form>' return '<html><body>' + form + '</body></html>' if __name__ == '__main__': grovepi.pinMode( LED, 'output' ) app = web.application( URLS, globals() ) app.run() EOD pi@raspberrypi ~ $ -
使用
python命令启动网页服务。pi@raspberrypi ~ $ python ledpage.py http://0.0.0.0:8080/ -
从 Web 浏览器,您可以看到网页。使用您的 Raspberry Pi 的 IP 地址加上端口
8080访问网页(例如,http://192.168.2.19:8080)。 -
网页显示一个按钮。如果 LED 灯灭了,按钮标签为
on。如果 LED 灯亮了,按钮标签为off。点击按钮设置 LED 灯状态,与按钮标签说明一致。 -
使用Ctrl+C停止提供网页服务。
工作原理如下...
登录 Raspberry Pi 后,本教程首先使用apt-get install命令安装python-webpy软件包。该软件包包含 Python 的web.py网页框架。
web.py网页框架是用 Python 编写的,用于创建使用 Python 编程语言创建网页的 Web 服务器工具包。本教程中的 Python 脚本还使用了前一教程中介绍的 GrovePi API,即安装 GrovePi。
创建并运行 ledpage 网站
cat命令用于创建一个新的脚本ledpage.py。紧随cat命令之后的行一直到数据标记(<<EOD)结束,都会复制到新的脚本中(>ledpage.py)。
这个新脚本将提供一个网页,可以用来控制 GrovePi 的 LED。在示例脚本中,LED 连接到 GrovePi 的D2端口。
ledpage.py脚本通过python命令运行。运行该脚本时,一个网页服务器会在每个网络接口的8080端口上启动,监听来自 Raspberry Pi 的请求(http://0.0.0.0)。
可以在网页浏览器中查看网页服务器的输出。打开浏览器,访问http://ipaddress:8080,即运行ledpage.py脚本的网址。将网址中的ipaddress替换为你 Raspberry Pi 的 IP 地址(有关如何确定 IP 地址的说明,请参见第二章,管理)。
操作网址
默认视图(http://ipaddress:8080/)显示一个按钮,用于更改 LED 的当前状态。当 LED 关闭时,按钮上标注为on,当 LED 打开时,按钮上标注为off。点击按钮后,LED 将切换到按钮上标注的状态。
当按钮上标注为on时,点击按钮会将浏览器引导到网址http://ipaddress:8080/on;当按钮上标注为off时,点击按钮会将浏览器引导到网址http://ipaddress:8080/off。
浏览到/on网址会开启灯光,并显示一个off按钮。浏览到/off网址会关闭灯光,并显示一个on按钮。这些操作网址/on和/off在ledpage.py中定义。
使用 Ctrl+C 退出
Python 网页服务器会持续运行,直到按下Ctrl+C。
还有更多内容……
ledpage.py脚本是一个简单而完整的网页服务示例,用于控制连接到 Raspberry Pi 的设备。该脚本可以分为四个部分:初始化、request handler类、html_page函数和main循环。
初始化
脚本以两个import语句开始:一个用于grovepi API,另一个用于web API。web API 用于设置网页服务器,grovepi API 用于连接到 Grove LED。
在import语句之后,定义了两个常量:LED和URLS。LED常量定义了将用于 GrovePi 的数字输出端口(2),而URLS常量定义了正则表达式(/(.*))和请求处理器(request_handler)之间的映射。
定义的正则表达式(/(.*))匹配所有网址。网址中匹配的部分,即斜杠后面的内容((.*)),将被传递给request_handler(作为url_match)。
request_handler类
request_handler类定义了如何处理网页服务器的 HTTP 请求。在这个脚本中,只实现了超文本传输协议(HTTP)的GET方法。
当你浏览到 Python Web 服务器的 URL(http://ipaddress:8080)时,Web 服务器会收到一个 GET 方法,并且会调用 request_handler 类的 GET 方法(GET ( self, url_match ))。
GET 方法使用 web API 函数 header 来设置 HTTP 响应的 Content-type 为 text/html,并且字符集编码为 UTF-8(charset=utf-8)。Content-type 响应头告诉浏览器这个 URL 下的内容类型是什么(网页、纯文本、图片、音频、视频等)。该 URL 的响应是一个使用 UTF-8 字符集的网页(text/html)。
然后,GET 方法会检查 url_match 参数的值。
当 url_match 为 on(http://ipaddress:8080/on)时,grovepi API 函数 digitalWrite 会首先打开 LED(1),然后将带有 off 按钮的 html_page 返回给浏览器。
当 url_match 为 off(http://ipaddress:8080/off)时,digitalWrite 函数会关闭 LED(0),并将带有 on 按钮的 html_page 返回给浏览器。
如果匹配的 URL(url_match)既不是 on 也不是 off,则会将带有 on 按钮的 html_page 返回给浏览器。此时 LED 的状态不会改变。
html_page 函数
html_page 函数(html_page( state ))渲染将要发送给浏览器的 HTML,以显示网页。
该函数有一个参数 state,用于指定按钮(<input type="submit">)的标签(value)和 HTML <form> 标签的 action。
创建一个字符串变量 form 来构建网页的 HTML <form> 部分。
HTML <form> 标签的 action 属性根据 state 参数的值设置为 /on 或 /off。action 属性定义了当 HTML <form> 被提交时(即按钮被按下时),浏览器会被发送到的 URL。
<input type="submit"> 标签(按钮)的 value 属性(标签)根据 state 参数的值设置为 on 或 off。点击按钮时,该标签将提交 HTML <form>。
一旦 HTML <form> 标签定义完成,包括结束标签 </form>,它会被包裹在 <body> 标签和 <html> 标签中,形成一个最小的 HTML 网页。
完整的网页会被返回给 request_handler,然后 request_handler 会将网页发送给浏览器。
主循环
主循环从 if __name__ == '__main__': 开始,并在 html_page 函数和 request_handler 定义后被调用一次。
主循环首先使用 grovepi API 来初始化 LED 为 output pinMode。GrovePi 数字端口可以用来接收信号或触发信号。对于此脚本,LED 端口被配置为 output。
配置LED端口后,web API 的application函数用于创建一个 Web 应用程序,该应用程序使用 Python 的默认全局变量(globals())作为应用程序上下文,监听指定的URLS。
web.application函数的第一个参数URLS定义了 URL 请求模式(正则表达式)与其请求处理程序(Python 类)之间的映射关系。第二个参数定义了应用程序上下文(在此情况下是global上下文)。web.application函数返回一个 Web 应用对象(app),该对象封装了 HTTP 协议并管理 Web 服务器。
最后,使用新创建的 Web 应用对象(app)的run函数启动 Web 服务器。
Web 应用程序默认在树莓派(0.0.0.0)附加的所有网络接口的端口8080上监听。app.run函数会持续运行,直到被中断(通过Ctrl+C)。
使用web.py创建基于 Python 脚本语言的 Web 应用程序的更多信息可以在web.py网站上找到(webpy.org/)。
另见
-
web.py(
webpy.org/):这个 Web 框架最初是在 reddit.com 开发的,后来它扩展为每天处理数百万页面浏览量。 -
web.py – 教程(
webpy.org/docs/0.3/tutorial):这是web.py教程的根本。 -
正则表达式如何做(
docs.python.org/2/howto/regex.html):这是一个介绍如何在 Python 中使用正则表达式的教程。 -
超文本传输协议(
en.wikipedia.org/wiki/Hypertext_Transfer_Protocol):这篇维基百科文章讲解了 HTTP 协议。 -
HTML(
en.wikipedia.org/wiki/HTML):这篇维基百科文章描述了超文本标记语言(HTML)及其历史。
连接到物联网平台
本食谱将你的树莓派连接到 SmartLiving(smartliving.io)物联网(IoT)平台。
SmartLiving 物联网平台使用 Web 浏览器配置响应传感器和/或激活连接到你的树莓派的物联网设备的规则。SmartLiving API 包括来自 Dexter Industries 的 GrovePi 驱动程序。本食谱将你的树莓派与 SmartLiving 平台集成,并利用它来控制连接到树莓派的 GrovePi 设备。
完成本食谱后,你将能够使用 SmartLiving 物联网平台控制连接到树莓派的 Grove 设备。
准备工作
材料:
-
对于已经安装了 GrovePi 接口和驱动的树莓派,基本的网络设置(参考前面的教程《安装 GrovePi》获取详细操作)。你也应该已经以用户
pi身份登录(参考第一章《安装与设置》教程中如何启动和登录的操作,或参考第二章《管理》教程中如何远程登录的操作)。 -
树莓派应连接到互联网。
-
一颗 GrovePi 应该已经连接到树莓派。
-
一颗 Grove LED 应该已连接到 GrovePi 的 D2 端口。
本教程不需要桌面 GUI,可以从基于文本的控制台或LXTerminal中运行。
如果树莓派的安全外壳(Secure Shell)服务器正在运行,可以通过使用安全外壳客户端远程完成此步骤。
如何操作...
从 SmartLiving 平台控制物联网设备的步骤如下:
-
首先,创建一个免费账户并登录到 SmartLiving 平台:
beta.smartliving.io。![如何操作...]()
-
点击加号图标以创建新设备。
![如何操作...]()
-
选择设备类型为树莓派并命名设备(MyGoldenPi)。点击右箭头图标继续。
![如何操作...]()
-
通过点击树莓派图标选择树莓派设备。
![如何操作...]()
-
点击齿轮图标选择设置。
![如何操作...]()
-
现在你的树莓派已注册,你可以看到设备 ID、客户端 ID 和客户端密钥,是时候切换回树莓派了。
-
登录树莓派(本地或远程)。
-
使用
git clone命令下载 All Things Talk(allthingstalk)Python 客户端(raspberrypi-python-client)。pi@raspberrypi ~ $ git clone https://github.com/allthingstalk/raspberrypi-python-client Cloning into 'raspberrypi-python-client'... remote: Counting objects: 369, done. Receiving objects: 100% (369/369), 85.93 KiB, done. remote: Total 369 (delta 0), reused 0 (delta 0), pack-reused 369 Resolving deltas: 100% (240/240), done. pi@raspberrypi ~ $ -
使用
cd命令进入客户端安装目录,然后使用 Bash 脚本setupGrovePi.sh安装客户端。pi@raspberrypi ~ $ cd raspberrypi-python-client pi@raspberrypi ~/raspberyypi-python-client $ sudo bash setupGrovePi.sh Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: python2.7-dev The following NEW packages will be installed: python-dev python2.7-dev 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Need to get 0 B/28.7 MB of archives. ... -
在所有安装提示中按下Enter键,以接受默认设置。
-
安装脚本完成后,使用
reboot命令重启树莓派。... Please restart to implement changes! _____ ______ _____ _______ _____ _______ | __ \| ____|/ ____|__ __|/\ | __ \__ __| | |__) | |__ | (___ | | / \ | |__) | | | | _ /| __| \___ \ | | / /\ \ | _ / | | | | \ \| |____ ____) | | |/ ____ \| | \ \ | | |_| \_\______|_____/ |_/_/ \_\_| \_\ |_| Please restart to implement changes! To Restart type sudo reboot pi@raspberrypi ~/raspberrypi-python-client $ sudo reboot Broadcast message from root@raspberrypi (pts/0) (Mon Oct 12 17:07:11 2015): The system is going down for reboot NOW! -
现在 All Things Talk(Smart Living)客户端已经安装完成,接下来是测试物联网功能。
-
重新登录树莓派(本地或远程)。
-
使用
cd命令切换到 Smart Living Python 客户端raspberrypi-python-client所在的目录。pi@raspberrypi ~ $ cd raspberrypi-python-client pi@raspberrypi ~/ raspberrypi-python-client $ -
使用
cat命令创建一个 Python 脚本(ledserver.py),将 Grove LED 连接到 D2 端口,并连接到 Smart Living 平台。确保用你在 Smart Living 账户中获得的三个配置参数值(IOT.DeviceId、IOT.ClientId和IO.ClientKey)替换脚本中的相应值(步骤 6 中的值)。pi@raspberrypi ~/ raspberrypi-python-client $ cat <<EOD >ledserver.py import grovepi import ATT_IOT as IOT import time LED = 2 def on_message( id, value ): if id.endswith( str( LED ) ): value = value.lower() if value == "true": grovepi.digitalWrite( LED, 1 ) if value == "false": grovepi.digitalWrite( LED, 0 ) # ignore unkown ids and values if __name__ == '__main__': grovepi.pinMode( LED, 'output' ) IOT.DeviceId = "JKi92itLxuwZbLuuYXQug8I" IOT.ClientId = "golden" IOT.ClientKey = "jlsvtobazhs" IOT.on_message = on_message IOT.connect() IOT.addAsset( LED, "LED", "Light Emitting Diode", True, "boolean" ) IOT.subscribe() while True: time.sleep( .1 ) EOD pi@raspberrypi ~ $ -
使用
python命令运行新创建的脚本。pi@raspberrypi ~/ raspberrypi-python-client $ python ledserver.py connected with http server HTTP PUT: /asset/JKi92itLxuwZbLuuYXQug8I2 HTTP HEADER: {'Auth-ClientId': 'golden', 'Content-type': 'application/json', 'Auth-ClientKey': 'jlsvtobazhs'} HTTP BODY:{"name":"LED","description":"Light Emitting Diode", "style": "Undefined","is":"actuator","profile": {"type":"boolean" },"deviceId":"JKi92itLxuwZbLuuYXQug8I" } (200, 'OK') {"deviceId":"JKi92itLxuwZbLuuYXQug8I","id":"JKi92itLxuwZbLuuYXQug8I2","name":"LED","is":"actuator","description":"Light Emitting Diode","createdOn":"2015-10-13T00:36:01.742Z","createdBy":"555a3d487ae2530b385b2173","updatedOn":"2015-10-13T01:07:44.074Z","updatedBy":"555a3d487ae2530b385b2173","profile":{"type":"boolean"},"state":null,"style":"undefined","control":{"name":null,"widgetUrl":null}} Connected to mqtt broker with result code 0 subscribing to: client/golden/in/device/JKi92itLxuwZbLuuYXQug8I/asset/+/command (0, 1) Subscribed to topic, receiving data from the cloud: qos=(0,) -
在浏览器中,刷新智能生活设备页面。树莓派设备(MyGoldenPi)现在有了一个新设备(LED)。
![如何操作...]()
-
在智能生活网页上切换布尔开关,Grove LED 会随之开关,同时运行中的
ledserver.py脚本会打印附加的状态信息。Incoming message - topic: client/golden/in/device/JKi92itLxuwZbLuuYXQug8I/asset/JKi92itLxuwZbLuuYXQug8I2/command, payload: true Incoming message - topic: client/golden/in/device/JKi92itLxuwZbLuuYXQug8I/asset/JKi92itLxuwZbLuuYXQug8I2/command, payload: false -
按Ctrl+C停止
ledserver.py脚本。
它是如何工作的…
这个教程分为三部分:将树莓派设备注册到智能生活物联网平台,安装智能生活客户端 API,最后运行一个脚本,交换智能生活平台与树莓派之间的信号。
将树莓派注册到物联网平台
本教程首先通过beta.smartliving.io注册一个免费账户。
注册账户后,创建了一个新的树莓派设备界面(MyGoldenPi),并显示该设备的设备 ID、客户端 ID和客户端密钥。这三个配置值将在本教程后续步骤中用于将树莓派连接到智能生活物联网平台。
安装物联网平台 API
接下来的步骤是登录到树莓派。
使用git clone命令下载适用于树莓派的 All Things Talk 客户端 API(allthingstalk/raspberrypi-python-client)——这个 Python API 用于与智能生活物联网平台进行通信。
客户端 API 下载完成后,使用bash命令从客户端 API 目录(raspberrypi-python-client)运行setGrovePi.sh脚本。setupGrovePi.sh安装脚本会安装额外的软件包和 Python 库。
与物联网平台交换信号
安装智能生活客户端 API 后,使用cat命令创建一个简短的 Python 脚本(ledserver.py),该脚本监听来自智能生活物联网平台的信号。
使用python命令从raspberrypi-python-client目录运行脚本。当脚本运行时,树莓派会连接到智能生活物联网平台,并接收来自物联网平台的信号,控制 LED 的开关。
物联网信号通过智能生活网站上的树莓派设备页面发送。设备页面上有一个标有LED的执行器。通过切换false – true开关,一个信号会从智能生活平台通过物联网发送到树莓派。false信号会关闭 LED,true信号会打开 LED。
本地键盘中断信号(按下Ctrl+C键)会停止脚本。
还有更多…
Python 脚本ledserver.py是一个简单的示例,展示了如何将树莓派连接到物联网平台。该脚本监听并响应从智能生活物联网平台发送的二进制信号。来自物联网平台的信号控制连接到树莓派的设备(一个 LED)。
脚本分为三个部分:初始化、信号处理器和主循环。
初始化
脚本开始时有三个 import 语句:一个导入 GrovePi API(grovepi),一个导入 All Things Talk API(ATT_IOT),另一个导入 time API。time API 提供 sleep 函数;ATT_IOT API 用于连接智能生活物联网平台,而 grovepi API 用于连接 Grove LED。
在 import 语句之后,定义了一个常量 LED,表示 GrovePi 上将使用的数字端口(2)。
信号处理器
信号处理器函数 on_message ( ID, value ) 定义了接收到来自物联网平台的信号(消息)时应采取的操作。
当消息的最后一个字符(endswith)的 id 等于注册的 LED 资产 ID(str(LED))时,消息将应用于 LED 资产。
如果消息的值(转换为小写,lower)为 "true",LED 将通过 grovepi API 打开(digitalWrite( LED, 1 ))。当值为 "false" 时,LED 将关闭(digitalWrite( LED, 0 ))。
主循环
主循环(if __name__ == '__main__':)开始时,使用 GrovePi API 将 LED 的引脚模式设置为输出。
智能生活客户端 API(IOT)通过 DeviceId、ClientId 和 ClientKey 配置参数进行配置。这些参数设置为之前在智能生活注册过程中显示的值。IOT 信号处理器参数 on_message , 被设置为信号处理函数 on_message。
现在客户端 API(IOT)已配置完毕,树莓派已准备好 connect 到智能生活物联网平台,注册一个新设备资产(addAsset),并订阅来自物联网平台的消息。
IOT.connect 方法通过之前指定的 DeviceId、ClientId 和 ClientKey 来建立与智能生活物联网平台的连接。
在连接建立后,树莓派通过 addAsset 告知物联网平台,端口 D2 上连接了一个二进制("boolean")输出(True)设备(LED)。输出设备被标记为 "LED",并有简短描述 "Light Emitting Diode"(发光二极管)。
IOT.subscribe 方法通知智能生活物联网平台,树莓派准备好接收来自平台的信号(消息)。
on_message 函数先前已被定义为信号处理器。因此,当树莓派收到一个新的信号(消息)时,on_message 函数会接收该信号并根据其 id 和 value 执行相应操作。
当接收到 "true" 信号时,LED 会打开;当接收到 "false" 信号时,LED 会关闭。
物联网规则
尽管这个示例展示了树莓派如何连接到智能生活物联网平台并与其交换信号,但并没有展示如何创建新的物联网规则。
Smart Living 网站(smartliving.io)提供了许多关于如何使用物联网规则来响应和控制树莓派的示例:
-
检测运动——当传感器检测到运动时点亮 LED 灯
-
拔掉智能手机——当手机从充电器上拔掉时震动
-
智能门铃——门铃会响铃并通知您的智能手机
-
光传感器——在智能手机上显示远程房间的光线水平
-
智能商店橱窗——使用二维码控制橱窗内的灯光
-
访问 Smart Living 网站,获取详细的说明和完整的参考资料,了解如何将 Smart Living 物联网平台与树莓派及其他设备一起使用。
另请参见
-
SmartLiving(
www.smartliving.io/):使用 Maker 链接注册 Smart Living 帐户。 -
All Things Talk(
allthingstalk.com/):All Things Talk 网站提供了更多关于其物联网平台家庭版和商业版的详细信息。 -
Raspberry Pi 套件(
docs.smartliving.io/kits/linux-raspberry-pi/stepbystep/):本教程是将树莓派连接到 Smart Living 的指南。 -
Raspberry Pi 套件实验指南(
docs.smartliving.io/kits/linux-raspberry-pi/experiments/):此网站上有五个实验帮助您入门物联网。
创建物联网网关
这个教程将您的树莓派变成一个物联网网关,使用由 Node-RED(nodered.org/)支持的 The ThingBox(thethingbox.io/)。
The ThingBox 是一个基于 Raspbian 的操作系统发行版,用于以新颖和有趣的方式连接硬件设备、API 和在线服务。它预安装了 Node-RED 可视化工具,用于连接物联网。
在此教程中,The ThingBox 被部署,并创建了一个新的流程,该流程在按下按钮时点亮连接到树莓派的 LED。这是一个非常简单的示例,但完全展示了 The ThingBox 的使用方法。教程的最后,还列出了可以在下一个项目中使用的附加节点。
完成此教程后,您的树莓派将成为一个物联网网关。
准备工作
配料:
-
用于下载 The ThingBox 发行版的互联网连接
-
一张 SD 卡——4GB 或更大(class 10 性能最佳)
-
一台连接到本地网络的树莓派
此教程只需要桌面 GUI 来设置无线网络。
一旦树莓派运行并连接到网络,该教程将在另一台计算机上使用网页浏览器完成。
如何操作...
创建物联网网关的步骤如下:
-
从 The ThingBox 网站下载最新的镜像文件,
thethingbox.io/#packagestable(请参阅第一章中的食谱下载新 SD 卡,安装与设置)。 -
将镜像文件写入 SD 卡(请参阅第一章中的适当磁盘工具食谱,安装与设置)。
-
使用更新的 SD 卡启动树莓派。
-
如果你的树莓派使用 Wi-Fi 适配器连接到本地网络,你需要登录树莓派的 GUI 一次(用户名:
root,密码:raspberry),然后使用 Wi-Fi 配置工具来配置无线网络适配器。 -
在树莓派成功启动并连接到网络后(第一次启动时可能需要稍等几秒钟),运行在树莓派上的 The ThingBox 服务器将在本地网络地址
http://thethingbox.local/提供服务。![如何操作...]()
-
如果你点击默认Flow开头的Go节点左侧的彩色方块,在debug标签页中会显示消息Hello!。
-
点击中间面板右侧最远处的+标签(与Flow标签相对)以创建新的流程。
-
通过从左侧工具箱拖动一个输入节点并将其放置到中间的流程图上,向流程中添加一个
rpi-gpio输入节点。 -
通过从工具箱中拖动并放置输出节点,向流程中添加一个
rpi-gpio输出节点。 -
通过拖动rpi-gpio输入节点的输出连接器到rpi-gpio输出节点的输入连接器,连接这两个节点。
![如何操作...]()
-
现在基本流程已经设置好,是时候配置节点了。输入和输出节点上的红色三角形和蓝色圆圈徽章表示配置尚未完成。
-
配置
Pushbutton节点。双击rpi-gpio输入节点。将GPIO Pin更改为16 – GPIO4 – BCM23。将Resistor更改为上拉。将Name参数更改为Pushbutton。点击Ok按钮。![如何操作...]()
-
配置 LED 节点。双击
rpi-gpio输出节点。将GPIO Pin更改为18 – GPIO5 – BCM24。将Type更改为数字输出。将Name更改为LED。点击Ok按钮。![如何操作...]()
-
重命名流程图。双击名称Sheet 1。将流程图的Name更改为Pushbutton LED。点击Ok按钮。
![如何操作...]()
-
点击红色Activate按钮启动流程。等待Successfully Deployed消息出现。
![如何操作...]()
-
Pushbutton LED流程已启动!
-
按住按钮不放,LED 灯会亮起。松开按钮,LED灯熄灭。
![操作方式...]()
-
注意,当按下按钮时,输入和输出节点下的绿色状态指示器旁的值会从0变为1。
-
ThingBox 物联网网关通过发送硬件信号来响应硬件信号。您的物联网网关正在工作!
工作原理
本配方有两个主要部分:
-
为 ThingBox 物联网网关创建可启动的 SD 卡
-
在运行中的物联网网关中创建按钮 LED流程
您可能还需要配置 Raspberry Pi 的无线网络。
当 ThingBox 准备好后,您可能想运行示例流程。
创建可启动的 SD 卡
当前的 ThingBox 可启动磁盘映像可以从 ThingBox 网站下载(thethingbox.io/#packagestable)。下载映像后,需要将其写入至少 4 GB 存储空间的 SD 卡。Class 10 SD 卡具有最佳性能。有关创建可启动 SD 卡的说明,请参阅第一章,安装与设置。
一旦 ThingBox 镜像写入 SD 卡,使用它启动 Raspberry Pi。初次启动时,由于文件系统会扩展以填充整个 SD 卡,因此启动会较慢。初次启动后,随后的启动会快得多。
配置无线网络
如果您的 Raspberry Pi 依赖 Wi-Fi 适配器进行网络连接,您需要在初始启动后登录 Raspberry Pi 桌面并配置无线网络。使用用户名root和默认密码raspberry。
无线网络配置应用可以通过Raspberry Pi 菜单 > 偏好设置 > WiFi 配置菜单找到。
一旦 WiFi 配置应用程序启动,点击扫描以显示可用的网络。双击您的网络SSID,输入您网络的私有安全密钥(PSK),然后点击添加将此设备添加到已知 Wi-Fi 接口列表中。
关闭扫描结果窗口后,您可以在WiFi 配置窗口中观察到连接状态的变化。添加您的网络SSID和PSK后,Raspberry Pi 将在每次启动时默认使用该配置。
Wi-Fi 配置也可以通过 ThingBox 用户界面进行设置。在用户界面右上角的配置菜单中选择设置(位于激活按钮旁的三个横条)。
ThingBox 已准备好
当 Raspberry Pi 启动后,它会将其名称thethingbox广播到本地多播 DNS 服务器。几秒钟后,mDNS 服务器更新后,ThingBox 用户界面可以通过 URL http://thethingbox.local/访问。
不需要额外的网络配置。然而,可以通过界面右上角的配置菜单更改设备名称和其他网络参数。
运行示例流
当第一次访问 ThingBox 时,它会显示一个由三个节点组成的默认Flow:Go、Hello!和显示。
每个节点都有配置参数,可以通过双击节点来设置。节点也可以有多个输入和输出,并且能够处理多个消息。
默认Flow通过点击位于Go节点左侧的彩色方块来激活。点击方块会将消息(msg)发送到Hello!节点。
Hello!节点接收消息(msg),并将消息的payload参数设置为"Hello!",然后将消息发送到显示节点。
显示节点将msg.payload参数的值输出到右侧边栏的调试标签中。
这完成了默认的Flow。
顺着流走
所有流遵循相同的基本模式。
消息(msg)沿着连接每个节点的路径从一个节点发送到另一个节点。
每个节点可以在消息通过节点时读取并更新msg,添加、更新或删除msg参数,直到msg被传递到下一个节点。
到达流的末端后,消息(msg)将被丢弃。
创建 Pushbutton LED 流
Pushbutton LED 流通过点击中心面板右上角的+标签来创建。这将创建一个新的流表单,默认名称为Sheet 1。
从工具箱左侧的树莓派部分,拖动一个rpi-gpio输入节点到空白的流表单中。同样,拖动一个rpi-gpio输出节点到流表单中。
通过先点击rpio-gpio输入节点的输出连接器,拖动直到形成路径并连接到rpio-cpio输出节点的输入连接器,连接这两个节点。
现在,双击每个节点并输入适当的配置信息。rpi-gpio输入节点名为Pushbutton,连接到GPIO4,并且有一个上拉****电阻。rpi-gpio输出节点名为LED,类型为数字输出,并连接到GPIO5。通过双击工作表名称Sheet 1,将工作流表单重命名为Pushbutton LED。
一旦节点配置完成,点击红色的激活按钮即可部署流。当流有更改时,激活按钮为红色;当流已部署后,按钮会变为灰色。
当 Pushbutton LED 流处于活动状态时,当按下按钮时 LED 亮起,释放按钮时 LED 熄灭。
请注意,当按下按钮时,两个节点下方的绿色状态指示器也会从0变为1。Node-RED 平台正在处理每次按钮按下的操作。
现在你的树莓派已成为物联网的网关!
还有更多…
这个示例是由 Node-RED 驱动的 The ThingBox 的一个非常简单的例子。
有一个庞大的可用节点库
Node-RED 平台中有数十个额外的 API 和服务。
-
Raspberry Pi
-
GPIO – 硬件 GPIO 引脚
-
鼠标 – 按下鼠标按钮
-
-
通用 I/O
-
HTTP – ReSTful 服务和网页
-
MQTT – 消息队列
-
Web Sockets – JSON 消息
-
TCP/UDP – 数据流
-
串口 – 字符流
-
-
数据解析
-
CSV – 逗号分隔值
-
JSON – JavaScript 对象表示法
-
XML – 可扩展标记语言
-
HTML – 超文本标记语言
-
-
社交
-
电子邮件 – 发送/接收电子邮件
-
Twitter – 发送/接收推文
-
Esendx – 发送短信
-
Google Calendar – 添加、更新和响应事件
-
RSS – 监控 RSS/Atom 源
-
-
存储
-
文件 – 读写磁盘上的文件
-
Carriots – 从连接的物体收集数据
-
Emoncms – 处理和可视化环境数据
-
Evrythng – 通过实时数据驱动应用程序
-
Exosite – 实现云处理
-
Thingspeak – 开源物联网平台
-
Tinamous – 注重隐私和协作的物联网平台
-
Xively – 企业物联网应用平台
-
等待 40 秒钟再关闭电源或重启
在 The ThingBox 文档中有一个特别的警告反复提到。它说在激活(保存)任何流程后,至少等待 40 秒钟才能关闭或重启 Raspberry Pi —— 即使流程比这更早就开始工作了!
将更新后的流程图保存到磁盘是一个独立的任务,该任务与当前在 Node-RED 服务器上运行的其他任务(节点)并行运行。因此,流程图的更改很可能在被持久化到磁盘之前就在 Node-RED 服务器中被激活。
另见
-
The ThingBox Project (
thethingbox.io/): 使用物联网技术,无需任何技术知识,并且是免费的。 -
Node-RED (
nodered.org/): Node-RED 是一个用于连接物联网的可视化工具。 -
Carriots (
www.carriots.com/): Carriots 是一个物联网平台,可以为 10 个设备存储一年的数据,且免费提供。 -
Emoncms (
emoncms.org/): Emoncms 是一个功能强大的开源 Web 应用程序,用于处理、记录和可视化能量、温度和其他环境数据。 -
Evrythng (
evrythng.com/): Evrythng 是一个物联网平台,它将任何消费品与网络连接,并管理实时数据以驱动应用程序。 -
Thingspeak (
thingspeak.com/): Thingspeak 是一个开源物联网平台。 -
Tinamous (
www.tinamous.com/): Tinamous 集成了状态更新、警报和传感器测量,使用简单、开放的连接解决方案,轻松连接人和物联网设备。 -
Xively (
xively.com/):Xively 简化了公司如何安全且稳健地连接其产品和用户,管理大规模物联网数据,并与客户、用户和合作伙伴更紧密地互动。 -
零配置网络 (
en.wikipedia.org/wiki/Zero-configuration_networking):这篇维基百科文章描述了 The ThingBox 使用的零配置网络,用于在http://thethingbox.local/上发布其位置。
第七章:集群
本章将涵盖:
-
安装高可用负载均衡器
-
安装分布式文件系统
-
创建超级计算机
引言
本章中的食谱是针对树莓派的网络集群的。
网络集群是指多个计算机通过网络连接,作为一个单一的系统。计算机集群用于扩展和高可用性。集群通过将系统的工作负载分配到集群中的所有计算机上来扩展性能。在高可用性系统中,即使集群中的一台计算机发生故障,网络集群仍然可以继续工作。
树莓派集群可以用于保持网站的持续运行,即使用来托管网站的树莓派之一发生故障。树莓派集群还可以用于将处理和数据存储分布到多个树莓派上,从而创建一个树莓派超级计算机。
本章中的食谱并不专门针对树莓派。它们可以在大多数(基于 Debian 的)Linux 操作系统上重复使用。编写这些食谱是为了展示树莓派计算机集群的可能性。
完成本章中的食谱后,你将使用负载均衡器保持网站的高可用性,分发文件和数据到树莓派集群中的联合存储,并创建一个树莓派超级计算机。
安装高可用负载均衡器
本食谱将四台树莓派转变为一个高可用性的网站集群。
两台树莓派用作 Web 服务器,共享托管网站的负载。其他两台树莓派作为负载均衡器,负责将进入的 Web 请求负载均衡到两台 Web 服务器之间。
只需要一个负载均衡器来平衡负载。第二个负载均衡器配置为在第一个负载均衡器发生故障时替代它。
本食谱中的 Web 服务器使用 Apache HTTP 服务器提供简单的无状态网站,以演示负载均衡的实际操作。
本食谱中的负载均衡器使用 HA Proxy 在两台 Web 服务器之间平衡 Web 请求,并使用Keepalived创建一个虚拟 IP 地址。如果当前负载均衡器发生故障,该 IP 地址将自动重定向到备份负载均衡器。
完成本食谱后,你将创建一个高可用性的网站。
准备工作
本食谱的配料如下:
-
树莓派的四种基本网络设置,所有设备都连接到同一个网络交换机
-
本地网络上的五个可用 IP 地址
本食谱不需要桌面 GUI,可以通过基于文本的控制台或 LXTerminal 运行。
在每台树莓派上运行 Secure Shell 服务器时,可以使用 Secure Shell 客户端远程完成本食谱。网站通常是通过远程方式管理的。
如何做到这一点……
构建高可用树莓派网站集群的步骤如下:
-
登录到每个 Raspberry Pi。设置其主机名和 IP 地址。将两个负载均衡器命名为
lb1和lb2。将两个 Web 服务器命名为web1和web2。使用您网络中的 IP 地址。本配方中使用了以下主机名和 IP 地址:
lb1– 192.168.2.101;lb2– 192.168.2.102;web1– 192.168.2.111;web2– 192.168.2.112。注意
可以使用
raspi-config命令更改 Raspberry Pi 的主机名。第二章,管理,提供了使用raspi-config命令配置 Raspberry Pi 的方法。第五章,高级网络,提供了更改静态 IP 地址的配置方法。
-
接下来,我们将设置 Web 服务器。登录到每个 Web 服务器:
web1和web2。注意
在
web1和web2两个 Web 服务器上重复以下步骤。 -
现在,我们将在每个 Web 服务器上安装 Apache2。使用
apt-get install命令安装 Apache Web 服务器守护进程(Apache2)。pi@web1 ~ $ sudo apt-get install -y apache2 Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.1-0 ssl-cert Suggested packages: apache2-doc apache2-suexec-pristine apache2-suexec-custom openssl-blacklist The following NEW packages will be installed: apache2 apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.1-0 ssl-cert 0 upgraded, 10 newly installed, 0 to remove and 0 not upgraded. ... -
为每个 Web 服务器创建独特的测试页面。
-
将目录(
cd)更改为 Web 服务器根目录(/var/www/html)。pi@web1 ~ $ cd /var/www/html pi@web1 /var/www/html $ -
使用
chown命令将用户pi的所有权赋给该目录(.)及其所有文件(*)。pi@web1 /var/www/html $ sudo chown pi:www-data . * pi@web1 /var/www/html $ -
使用
echo命令为 Web 服务器创建一个网页。pi@web1 /var/www/html $ echo '<html><body>web1</body></html>' > index.html pi@web1 /var/www/html $注意
在正常操作期间,两个 Web 服务器将提供相同的内容。
在测试过程中,页面内容
<body>web1</body>应该对每个 Web 服务器是唯一的。对于 Web 服务器web2,使用<body>web2</body>。 -
使用
touch命令创建一个文件(lb-check.txt),该文件可以被负载均衡器用来验证 Web 服务器是否正在运行。pi@web1 /var/www/html $ touch lb-check.txt pi@web1 /var/www/html $ -
现在,测试 Web 服务器。使用 Web 浏览器测试 Web 服务器。测试它们的主机名:
http://web1.local/和http://web2.local/,以及它们的 IP 地址:http://192.168.2.111/和http://192.168.2.112/。![如何操作...]()
-
设置负载均衡器。登录到每个负载均衡器
lb1和lb2。注意
在
lb1和lb2上重复以下步骤。 -
在每个负载均衡器上安装 HAProxy 和 Keepalived。使用
apt-get install命令下载并安装haproxy和keepalived包。pi@lb1 ~ $ sudo apt-get install -y haproxy keepalived Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: iproute ipvsadm libpci3 libperl5.20 libsensors4 libsnmp-base libsnmp30 Suggested packages: heartbeat ldirectord lm-sensors snmp-mibs-downloader vim-haproxy haproxy-doc The following NEW packages will be installed: iproute ipvsadm keepalived libpci3 libperl5.20 libsensors4 libsnmp-base libsnmp30 haproxy 0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded. ... -
为每个负载均衡器配置 HAProxy。使用
cat命令将listen stats和listen webfarm部分添加到/etc/haproxy/haproxy.cfg配置文件的底部。pi@lb1 ~ $ sudo bash root@lb1:/home/pi# cat <<EOD >>/etc/haproxy/haproxy.cfg listen stats bind 0.0.0.0:8880 stats enable stats hide-version stats uri / stats realm HAProxy\ Statistics stats auth pi:raspberry listen webfarm 192.168.2.100:80 mode http balance roundrobin option httpclose option httpchk HEAD /lb-check.txt HTTP/1.0 server web1 192.168.2.111:80 check server web2 192.168.2.112:80 check EOD root@lb1:/home/pi# exit pi@lb1 ~ $ -
使用
systemctl restart命令重新启动haproxy.service。pi@lb1 ~ $ sudo systemctl restart haproxy.service pi@lb1 ~ $ -
为两个负载均衡器启用虚拟 IP 地址监听。将配置参数
net.ipv4.ip_nonlocal_bind=1添加到sysctl.conf配置文件的底部。pi@lb1 ~ $ sudo bash root@lb1:/home/pi# echo "net.ipv4.ip_nonlocal_bind=1" >>/etc/sysctl.conf root@lb1:/home/pi# exit pi@lb1 ~ $ -
使用
sysctl –p命令加载更新的配置。pi@lb1 ~ $ sudo sysctl –p kernel.printk = 3 4 1 3 vm.swappiness = 1 vm.min_free_kbytes = 8192 net.ipv4.ip_nonlocal_bind = 1 pi@lb1 ~ $ -
为两个负载均衡器配置 Keepalived。
-
使用
cat命令创建keepalived.conf配置文件,定义以下内容:检查 HAProxy 守护进程状态的函数(chk_haproxy);监听的网络接口eth0;负载均衡器的优先级(最高的是主负载均衡器);以及负载均衡器共享的虚拟 IP 地址(192.168.2.100)。注意
重要的是,负载均衡器应具有不同的优先级。
在负载均衡器
lb1上,使用priority 101(如下所示)。在负载均衡器
lb2上,使用priority 100。pi@lb2 ~ $ sudo bash root@lb2:/home/pi# cat <<EOD >/etc/keepalived/keepalived.conf vrrp_script chk_haproxy { script "killall -0 haproxy" interval 2 weight 2 } vrrp_instance VI_1 { interface eth0 state MASTER virtual_router_id 51 priority 101 virtual_ipaddress { 192.168.2.100 } track_script { chk_haproxy } } EOD root@lb2:/home/pi# exit exit pi@lb2 ~ $ -
使用
systemctl restart命令重启keepalived.service。pi@lb1 ~ $ sudo systemctl restart keepalived.service pi@lb1 ~ $ -
测试集群。使用网页浏览器测试集群。浏览到集群的虚拟 IP 地址(
http://192.168.2.100)。 -
注意到每次刷新浏览器时,显示的网页在 web 服务器
web1和web2的网页之间交替。集群工作正常!注意
对于实际的网站,web 服务器
web1和web2应提供相同的内容、无状态的相同网站副本,或相同的 Web 服务。 -
测试 web 服务器故障。登录到
web1并使用poweroff命令关闭它。golden-macbook:~ rick$ ssh pi@web1.local Warning: Permanently added the RSA host key for IP address 'fe80::ba27:ebff:fec9:7ea9%en5' to the list of known hosts. pi@web1.local's password: The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sat Oct 24 14:34:34 2015 from fe80::12dd:b1ff:feee:dfc6%eth0 pi@web1 ~ $ sudo poweroff Connection to web1.local closed by remote host. Connection to web1.local closed. golden-macbook:~ rick$ -
使用网页浏览器验证集群的虚拟 IP 地址(192.168.2.100)是否仍然有效。
-
注意,每次刷新浏览器时,显示的网页都来自唯一正在运行的 web 服务器
web2。 -
使用网页浏览器检查
lb1上 HA Proxy 的状态(http://lb1.local:8880)。![如何操作...]()
-
注意到 web 服务器
web1的状态显示为红色,表示其已关闭。web2的状态是绿色,表示其仍在运行。 -
重启 web 服务器
web1。 -
刷新 HAProxy 状态页面(
http://lb1.local:8880),并注意到 web 服务器web1的状态再次变为绿色。 -
不断刷新集群的虚拟 IP 地址(
http://192.168.2.100),并注意到显示的网页一次又一次地在 web 服务器web1和 web 服务器web2的网页之间交替。 -
即使一个 web 服务器出现故障,集群仍然能够运行!
-
测试负载均衡器故障。登录到主负载均衡器
lb1。 -
使用
ip addr命令显示共享网络接口eth0的 IP 地址。pi@lb1 ~ $ ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:57:79:6d brd ff:ff:ff:ff:ff:ff inet 192.168.2.101/24 brd 192.168.2.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.2.100/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::9b32:5b03:f901:4777/64 scope link valid_lft forever preferred_lft forever pi@lb1 ~ $ -
请注意,网络接口
eth0上有两个 IPv4(inet)地址,包括集群的虚拟 IP 地址(http://192.168.2.100)。 -
现在,登录到故障转移负载均衡器
lb2。 -
使用
ip addr命令显示负载均衡器lb2上共享网络接口eth0的 IP 地址。pi@lb2 ~ $ ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:42:f6:a2 brd ff:ff:ff:ff:ff:ff inet 192.168.2.102/24 brd 192.168.2.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::9284:5714:5216:6cde/64 scope link valid_lft forever preferred_lft forever pi@lb2 ~ $ -
请注意,负载均衡器
lb2上的网络接口eth0只分配了一个 IPv4(inet)地址,而该地址不是集群的虚拟 IP 地址。 -
通过断开网络电缆,将主负载均衡器
lb1从集群中移除。 -
再次使用
ip addr命令显示负载均衡器lb2上共享网络接口eth0的 IP 地址。pi@lb2 ~ $ ip addr sh eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:42:f6:a2 brd ff:ff:ff:ff:ff:ff inet 192.168.2.102/24 brd 192.168.2.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.2.100/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::9284:5714:5216:6cde/64 scope link valid_lft forever preferred_lft forever pi@lb2 ~ $ -
注意,现在在
lb2的网络接口eth0上有两个 IPv4(inet)地址,包括集群的虚拟 IP 地址(http://192.168.2.100)。 -
通过不断刷新集群的虚拟 IP 地址(
http://192.168.2.100),可以看到负载均衡依然有效——网页仍然在web1和web2之间交替显示。 -
即使一个负载均衡器发生故障,集群仍能运行!
-
现在,让我们恢复正常操作。通过连接网络电缆将
lb1重新加入集群。 -
在负载均衡器
lb2上使用ip addr命令,可以显示集群的虚拟 IP 地址(192.168.2.100)不再分配给负载均衡器lb2上的网络接口eth0(参见步骤 32)。 -
在负载均衡器
lb1上使用ip addr命令,可以显示负载均衡器lb1再次将集群的虚拟 IP 地址分配给其网络接口eth0(参见步骤 29)。 -
高可用性网站集群已成功运行!
它是如何工作的…
该配方开始时通过设置四台树莓派的新主机名和 IP 地址,以便它们能更有效地用于集群。
负载均衡器被命名为 lb1 和 lb2,它们的 IP 地址分别设置为 192.168.2.101 和 192.168.2.102。
Web 服务器命名为 web1 和 web2,它们的 IP 地址分别设置为 192.168.2.111 和 192.168.112。
可以使用 raspi-config 命令更改树莓派的主机名(使用 raspi-config 命令的示例可以在 第二章,管理 中找到)。
关于 配置静态 IP 地址 的配方可以在 第五章,高级网络 中找到。
配置 Web 服务器
在每个树莓派正确命名并分配地址后,web1 和 web2 两台 Web 服务器上都已配置好 Apache HTTP 守护进程。
在每台 Web 服务器上安装 Apache2
使用 apt-get install 命令在每台 Web 服务器上安装 apache2 包。
安装过程包括启动 Apache HTTP 服务器并在每次启动时重启它。
注意
第五章,高级网络,中有安装 Web 服务器的配方,提供了更详细的 Web 服务器设置说明。
为每台 Web 服务器创建独特的测试网页
cd 命令用于更改 Web 服务器的根目录 /var/www/html,在该目录下将创建两个文件:默认网页 index.html 和一个供负载均衡器定期检查以确保 Web 服务器仍在运行的文件 lb-check.txt。
使用 chown 命令将根目录(./)及其中的所有文件(*)的所有权更改为用户 pi。更改所有权后,用户 pi 可以在 Web 服务器的根目录中创建和删除文件。
每台 Web 服务器上都会创建两个文件:index.html 和 lb-check.txt。lb-check.txt 文件可以为空,它只需要存在。
使用 echo 命令写入非常简单的 index.html 文件,使用 touch 命令创建一个空的 lb-check.txt 文件。
本文故意在每个 web 服务器上使用唯一的 index.html 文件来演示负载均衡的实际效果。在 web 服务器 web1 上,网页内容是 web1,而在 web 服务器 web2 上,网页内容是 web2。
在网站集群的正常运行过程中,网站的客户端应该看到相同的网页,无论负载均衡器选择了哪个 web 服务器。
在网站集群的正常运行过程中,集群中的每个 web 服务器应该是相同的。它们要么拥有相同的 index.html 文件,要么配置为提供相同的 web 应用程序。
本文使用两个不同的 index.html 文件来演示负载均衡。
测试 web 服务器
使用 web 浏览器测试每个 web 服务器是否正常运行。测试两个 web 服务器的主机名和 IP 地址:
http://web1.local/ http://192.168.2.111/
http://web2.local/ http://192.168.2.112/
设置负载均衡器
在 web 服务器安装并测试完成后,HAProxy 和 Keepalived 在两个负载均衡器 lb1 和 lb2 上进行设置。HAProxy 是负载均衡服务,Keepalived 是故障切换服务。HAProxy 在两个 web 服务器之间分配 web 请求,Keepalived 在主负载均衡器出现故障时会用另一个负载均衡器替代。
在每个负载均衡器上安装 haproxy 和 keepalived
使用 apt-get install 命令在每个负载均衡器上安装 HAProxy 和 Keepalived 软件包。
安装过程包括在每次启动时启动和重新启动 HAProxy 和 Keepalived。然而,HAProxy 和 Keepalived 仍然需要进行配置。
为每个负载均衡器配置 HAProxy
默认的 HAProxy 配置文件 (/etc/haproxy/haproxy.cfg) 需要两个新部分:listen stats 和 listen webfarm。
listen stats 部分在负载均衡器的所有网络接口(0.0.0.0)上创建一个受保护的单页 web 服务器,端口为 8880,包括集群的虚拟网络接口(192.168.2.100)。统计信息 web 服务器通过用户名(pi)和密码(raspberry)进行保护(stats auth)。
listen webfarm 部分定义了由 HAProxy 使用轮询负载均衡算法进行负载均衡的 web 服务器集合(服务器 web1,服务器 web2),以及用于测试 web 服务器是否仍在运行的方法(httpchk HEAD)和 URL(/lb-check.txt)。
使用安全外壳(sudo bash)更新 HAProxy 的配置文件(/etc/haproxy/haproxy.cfg)。
在安全外壳中,cat 命令用于将 cat 命令之后的行追加到数据标记结束(<<EOD)并写入文件底部(>>haproxy.cfg)。
文件更新完成后,退出安全外壳(exit)。
使用 systemctl 命令在每个负载均衡器上重新启动 HAProxy 服务 (happroxy.service),以便服务在每个负载均衡器上更新其配置。
启用两个负载均衡器上的虚拟 IP 地址监听。
树莓派的 Linux 内核默认未配置为监听 Keepalived 使用的虚拟 IP 地址。系统内核配置文件 (/etc/sysctl.conf) 需要更新以允许非本地网络绑定。
使用安全外壳 (sudo bash) 更新系统内核配置文件 (sysctl.conf)。
在安全外壳内部,使用 echo 命令通过将语句 net.ipv4.ip_nonlocal_bind=1 追加到系统内核配置文件 (systctl.conf) 的底部来启用虚拟 IP 地址 (>>)。
在更新文件后,安全外壳(Secure Shell)会释放 (exit)。
使用 sysctl –p 命令加载更新的内核配置。
配置两个负载均衡器的 Keepalived。
尽管 Keepalived 已安装并准备就绪,但尚未配置。
使用安全外壳 (sudo bash) 创建 Keepalived 配置文件 (/etc/keepalived/keepalived.conf)。
在安全外壳内部,使用 cat 命令通过复制从 cat 命令后面的行到结束数据标记 (<<EOD) 到配置文件 (>keepalived.conf) 来创建配置文件。
在更新文件后,安全外壳(Secure Shell)会释放 (exit)。
Keepalived 配置有两个部分:vrrp_script chk_haproxy 和 vrrp_instance VI_1。
vrrp_script chk_haproxy 部分定义了一个脚本 (killall -0 haproxy),只要名为 haproxy 的进程正在运行,就会完成 OK 状态。
killall 命令的命令名称有误导性;-0 参数告诉命令仅退出并显示 OK 状态。killall 命令也可以用来终止进程;但在这里不是其目的。
vrrp_instance VI_1 部分定义了两个负载均衡器(192.168.2.100)共享的 virtual_ipaddress。该部分还定义了用于绑定虚拟 IP 地址的网络接口 (eth0),用于跟踪 haproxy 进程的 track_script (chk_haproxy),以及用于确定哪个负载均衡器为 MASTER 的优先级。
注意
priority 参数在两个负载均衡器上应不同。
主负载均衡器 lb1 的优先级应比备用负载均衡器 lb2 更高(优先级 101)。
每个负载均衡器的优先级应不同。在本示例中,负载均衡器 lb1 的优先级为 101,负载均衡器 lb2 的优先级为 100。具有最高优先级 (lb1) 的负载均衡器用作主节点,另一个负载均衡器 (lb2) 用作备份从节点。
只有主负载均衡器(lb1)监听定义的虚拟网络地址(192.168.2.100)。故障切换负载均衡器(lb2)不监听。
运行在主负载均衡器(lb1)上的 HAProxy 是集群用来在 Web 服务器之间平衡 Web 请求的服务。故障切换负载均衡器(lb2)上的 HAProxy 仍在运行,但它不被集群使用,因为故障切换负载均衡器(lb2)没有监听集群的虚拟 IP 地址(192.168.2.100)。
如果主负载均衡器(lb1)发生故障,具有下一个最高优先级(lb2)的负载均衡器将成为主负载均衡器。
如果主负载均衡器(lb1)的 track_script 报告显示主负载均衡器的 haproxy 进程不再运行,主负载均衡器将把虚拟 IP 地址(192.168.2.100)的控制权转交给故障切换负载均衡器(lb2)。
如果故障切换负载均衡器(lb2)无法再连接到主负载均衡器(lb1),故障切换负载均衡器(lb2)将尝试接管虚拟 IP 地址。
virtual_router_id 参数定义了一个唯一的 ID(51),该 ID 由负载均衡器用于保持相同的虚拟 IP 地址持续运行。
文件创建完成后,退出安全外壳(exit)。
systemctl 命令用于在两个负载均衡器上重启 Keepalived 服务(keepalived.service),以便每个负载均衡器上的服务可以更新其配置。
测试集群
使用 Web 浏览器验证网站集群是否仍在定义的虚拟 IP 地址(192.168.2.100)上运行。
当在浏览器中刷新网站 URL(http://192.168.2.100/)时,浏览器中显示的页面在 Web 服务器 web1 的默认网页(index.html)和 Web 服务器 web2 的默认页面之间交替显示。主负载均衡器(lb1)在两个 Web 服务器之间交替(轮询)处理 Web 请求。
集群正在运行!
测试 Web 服务器故障
为了测试在单个 Web 服务器故障后,网站集群的虚拟 IP 地址是否仍然能响应 Web 请求,使用 poweroff 命令关闭 Web 服务器 web1。
在 Web 服务器 web1 被关闭后,使用 Web 浏览器验证网站集群是否仍在定义的虚拟 IP 地址(192.168.2.100)上正常运行。
当在浏览器中刷新网站 URL(http://192.168.2.100/)时,浏览器中显示的网页不再在两个 Web 服务器之间交替。现在,只有 Web 服务器 web2 的默认页面(index.html)被显示。主负载均衡器(lb1)仍在运行,但只能为来自 Web 服务器 web2 的 Web 请求提供服务。
然后,使用网页浏览器访问主负载均衡器(lb1)的 HAProxy 统计页面 URL(http://lb1.local:8880/)。统计页面显示 Web 服务器web1不可用,并以红色背景色显示该 Web 服务器的统计信息。Web 服务器web2仍在运行,因此其统计信息以绿色背景色显示。
即使一个 Web 服务器发生故障,网站也会继续正常运行。
接下来,重新启动 Web 服务器web1。
在 Web 服务器web1重新启动后,主负载均衡器(lb1)检测到 Web 服务器跟踪文件(http://lb1.local/chk_haproxy.txt)的可用性,并将 Web 服务器web1重新加入到负载均衡器的webfarm中。
刷新 HAProxy 统计页面显示,来自 Web 服务器web1的统计数据再次变为绿色,并且不断刷新网站的虚拟 URL(http://192.168.2.100/)时,页面在web1和web2之间交替切换。
网站受到 Web 服务器故障的保护,可以按需添加 Web 服务器来处理更多的请求!
测试负载均衡器故障
通过断开主负载均衡器(lb1)的网络连接来将其移出网络,从而测试主负载均衡器的故障切换。
在主负载均衡器(lb1)断开与网络的连接之前,使用ip addr命令显示网站集群的虚拟 IP 地址(192.168.2.100)绑定到主负载均衡器的网络接口(eth0)。ip addr命令也用于故障切换负载均衡器(lb2)以显示它的网络接口(eth0)上未绑定集群的虚拟 IP 地址。
在主负载均衡器(lb1)断开与网络的连接后,再次在故障切换负载均衡器(lb2)上运行ip addr命令。由于主负载均衡器(lb1)已从网络中断开,故障切换负载均衡器(lb2)已接管了集群的虚拟 IP 地址(192.168.2.100)。
当主负载均衡器(lb1)断开与网络的连接时,使用网页浏览器验证网站集群是否仍在定义的虚拟 IP 地址(192.168.2.100)上正常运行。
当在浏览器中刷新网站 URL(http://192.168.2.100/)时,浏览器中显示的网页继续在两个 Web 服务器之间交替。即使主负载均衡器(lb1)脱机,负载均衡仍然有效。故障切换负载均衡器(lb2)已成功接管负载均衡!
即使一个负载均衡器发生故障,网站集群仍然能够继续正常运行!
恢复正常运行
通过将主负载均衡器(lb1)重新连接到网络,恢复网站集群的正常运行。
在主负载均衡器(lb1)重新连接后,ip addr命令再次在每个负载均衡器上运行。主负载均衡器(lb1)再次将集群的虚拟 IP 地址(192.168.2.100)绑定到其网络接口(eth0),而故障切换负载均衡器(lb2)不再将虚拟 IP 地址绑定到其网络接口。
高可用性网站集群已启动并运行!
还有更多内容……
这个例子是一个非常简单的高可用性网站集群示例,可以用于服务任何无状态的网站,例如静态网页集合或使用像Jekyll (jekyllrb.com/) 这样的站点生成器创建的网站。
通过添加更多 Web 服务器进行水平扩展
通过添加更多服务器来水平扩展集群。
本示例中的网站集群可以通过添加更多树莓派 Web 服务器来进行水平扩展。每添加一个新的 Web 服务器到集群中,都应将其配置与现有的 Web 服务器完全相同(参见步骤2到8)。
树莓派集群的垂直扩展受限于树莓派可用的内存量。可以减少 GPU 分配的内存,从而为服务腾出更多内存;然而,树莓派的物理内存无法增加。
树莓派的固定内存大小限制了树莓派集群的扩展性。它们可以很容易地进行水平扩展,但无法垂直扩展。
会话 cookie
许多网站是有状态的,而不是无状态的。有状态的网站使用会话 cookie 来创建需要登录的唯一会话。本示例中的 HAProxy 配置适用于无状态网站,并不识别会话 cookie。
用户会话存储在 Web 应用服务器中,会话 cookie 是用于识别每个唯一用户会话的唯一键。在大多数情况下,会话不能跨 Web 服务器共享。负载均衡器需要确保一旦用户在某个 Web 服务器上开始会话,所有对网站集群的请求都被定向到该 Web 服务器,而不是其他服务器。
Web 应用服务器和框架如 Apache Tomcat 和 PHP 依赖于会话 cookie。Apache Tomcat 使用会话 cookie JSESSIONID,而 PHP 使用PHPSESSID会话 cookie。
对于依赖于会话 cookie 的网站,网站集群的负载均衡器需要确保来自同一唯一用户(由会话 cookie 识别)的 Web 请求始终发送到同一 Web 服务器,因为只有该 Web 服务器拥有该用户的会话。
为了使本示例中的 HAProxy 服务器能够识别 Apache Tomcat(或其他 Java 应用服务器)的会话 cookie,请将 HAProxy 配置文件(/etc/haproxy/haproxy.cfg)中的两个服务器配置参数替换为以下三行:
option cookie JSESSIONID prefix
server web1 192.168.2.111:80 check cookie web1
server web2 192.168.2.112:80 check cookie web2
第一行使用 JSESSIONID Cookie 和每个 Web 服务器的唯一前缀来启用 Cookie 跟踪选项。两个服务器的配置参数已更新,为每个服务器(web1 和 web2)设置唯一的 cookie 前缀。
在重启 HAProxy 服务(systemctl restart haproxy.service)后,集群将识别会话 Cookie。
另见
-
计算机集群 (
en.wikipedia.org/wiki/Computer_cluster): 这篇维基百科文章描述了计算机集群的概念和历史。 -
Keepalived (
www.keepalived.org/): 该项目的主要目标是为 Linux 系统及基于 Linux 的基础设施提供简单且稳健的负载均衡和高可用性功能。 -
HAProxy (
www.haproxy.org/): HAProxy 是一个免费的、非常快速且可靠的解决方案,提供高可用性、负载均衡和 TCP 与 HTTP 应用程序的代理功能。 -
systemctl – 控制 systemd 系统和服务管理器 (
manpages.debian.org/cgi-bin/man.cgi?query=systemctl): Debian 手册页面中描述了systemctl命令及其选项。 -
sysctl – 读取/写入系统参数 (
manpages.debian.org/cgi-bin/man.cgi?query=sysctl&sektion=8): Debian 手册页面中描述了sysctl命令及其选项。 -
killall – 按名称杀死进程 (
manpages.debian.org/cgi-bin/man.cgi?query=killall): Debian 手册页面中描述了killall命令及其选项。 -
Jekyll (
jekyllrb.com/): 将纯文本转换为静态网站和博客。 -
可扩展性 (
en.wikipedia.org/wiki/Scalability): 这篇维基百科文章定义了水平和垂直的可扩展性。 -
会话 Cookie (
en.wikipedia.org/wiki/HTTP_cookie#Session_cookie): 这篇关于 HTTP Cookie 的维基百科文章也定义了会话 Cookie。
安装分布式文件系统
这个配方将四台树莓派变成一个高可用的分布式文件系统,使用的是 GlusterFS。
GlusterFS 是一个可扩展的网络文件系统,适用于数据密集型任务,如云存储和媒体流。GlusterFS 是免费且开源的软件,可以利用常见的现成硬件,如树莓派。
完成这个配方后,你将把四台树莓派集群起来,创建一个高可用的分布式文件系统。
准备工作
这是这个配方所需的材料:
-
树莓派的四种基本网络配置
-
本地网络上的四个可用 IP 地址
本教程不需要桌面 GUI,可以从基于文本的控制台或 LXTerminal 中运行。
在每个树莓派上运行 Secure Shell 服务时,本教程可以通过 Secure Shell 客户端远程完成。分布式文件系统通常是通过远程管理的。
如何操作...
构建高可用的树莓派分布式文件系统的步骤如下:
-
登录到四个树莓派,设置它们的主机名。将树莓派命名为
gluster1、gluster2、gluster3和gluster4。注意
raspi-config命令可用于更改树莓派的主机名。第二章,管理,包含使用raspi-config命令配置树莓派的教程。
在每个树莓派上安装 GlusterFS 服务器
-
登录到四个树莓派:
gluster1、gluster2、gluster3和gluster4。 -
使用
apt-get install命令安装 GlusterFS 服务器(glusterfs-server)。pi@gluster1 ~ $ sudo apt-get install -y glusterfs-server Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: glusterfs-client glusterfs-common libaio1 libibverbs1 librdmacm1 The following NEW packages will be installed: glusterfs-client glusterfs-common glusterfs-server libaio1 libibverbs1 librdmacm1 0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. Need to get 7,604 kB of archives. After this operation, 13.6 MB of additional disk space will be used. …注意
在四个树莓派上重复安装
glusterfs-server:gluster1、gluster2、gluster3和gluster4。 -
现在,让我们创建一个受信存储池。在每个树莓派上安装了 GlusterFS 后,登录到
gluster1,使用gluster peer probe命令将其他三个树莓派连接到一个受信存储池中。pi@gluster1 ~ $ sudo gluster peer probe gluster2.local peer probe: success. pi@gluster1 ~ $ sudo gluster peer probe gluster3.local peer probe: success. pi@gluster1 ~ $ sudo gluster peer probe gluster4.local peer probe: success. pi@gluster1 ~ $ -
使用
glusterpeer status命令检查存储池是否已成功创建。pi@gluster1 ~ $ sudo gluster peer status Number of Peers: 3 Hostname: gluster2.local Uuid: 5b969ed1-01c2-406e-9710-944436c41c98 State: Peer in Cluster (Connected) Hostname: gluster3.local Uuid: 9a00c151-af6e-44c5-9d14-5607270b4038 State: Peer in Cluster (Connected) Hostname: gluster4.local Uuid: f036b1c4-7a51-49eb-aa63-81babb843b7e State: Peer in Cluster (Connected) pi@gluster1 ~ $ -
还可以从存储池中的另一个节点(
gluster2)使用gluster peer status验证存储池。pi@gluster2 ~ $ sudo gluster peer status Number of Peers: 3 Hostname: 192.168.2.12 Uuid: 4147586b-a723-4068-b8cb-d417df6766d8 State: Peer in Cluster (Connected) Hostname: gluster3.local Uuid: 9a00c151-af6e-44c5-9d14-5607270b4038 State: Peer in Cluster (Connected) Hostname: gluster4.local Uuid: f036b1c4-7a51-49eb-aa63-81babb843b7e State: Peer in Cluster (Connected) pi@gluster2 ~ $ -
注意,
gluster1显示的Hostname是一个 IP 地址(192.168.2.12)。 -
使用
gluster peer probe命令在任何其他节点(gluster2)上将gluster1的主机名添加到存储池中。注意
不要使用
gluster peer probe命令将自身添加到受信服务器池!一个存储节点不能将自己添加到池中!任何节点尝试将自己添加到池中,可能会破坏整个存储池。
pi@gluster2 ~ $ sudo gluster peer probe gluster1.local peer probe: success. pi@gluster2 ~ $ sudo gluster peer status Number of Peers: 3 Hostname: gluster1.local Uuid: 4147586b-a723-4068-b8cb-d417df6766d8 State: Peer in Cluster (Connected) Hostname: gluster3.local Uuid: 9a00c151-af6e-44c5-9d14-5607270b4038 State: Peer in Cluster (Connected) Hostname: gluster4.local Uuid: f036b1c4-7a51-49eb-aa63-81babb843b7e State: Peer in Cluster (Connected) pi@gluster2 ~ $ -
现在,是时候从受信存储池创建一个条带化复制卷了。从受信存储池中的任何节点(
gluster1),使用gluster volume create命令创建一个分布式条带化复制卷(stripe 2 replica 2),并使用受信存储池的四个节点(gluster1、gluster2、gluster3和gluster4)。在每个节点上,/srv/vol0目录用于存储新卷(vol0)的 GlusterFS 配置和数据。pi@gluster1 ~ $ sudo gluster volume create vol0 stripe 2 replica 2 gluster1.local:/srv/vol0 gluster2.local:/srv/vol0 gluster3.local:/srv/vol0 gluster4.local:/srv/vol0 force volume create: vol0: success: please start the volume to access data pi@gluster1 ~ $ -
使用
gluster volume start命令启动新创建的卷(vol0)。pi@gluster1 ~ $ sudo gluster volume start vol0 volume start: vol0: success pi@gluster1 ~ $ -
现在,让我们挂载分布式条带化复制卷。使用
mount命令将来自节点gluster1.local的glusterfs卷vol0挂载到本地挂载点/mnt。pi@gluster1 ~ $ sudo mount -t glusterfs gluster1.local:/vol0 /mnt pi@gluster1 ~ $ -
测试条带化复制卷。使用
cp命令将一个大文件(/boot/kernel.img)复制到新创建的分布式条带化复制卷(vol0)的本地挂载点(/mnt)。pi@gluster1 ~ $ ls -l /boot/kernel.img -rwxr-xr-x 1 root root 4056224 Sep 23 16:10 /boot/kernel.img pi@gluster1 ~ $ sha1sum /boot/kernel.img d5e64d892b308b99e9c2c55deaa39c579a2335ec /boot/kernel.img pi@gluster1 ~ $ sudo cp /boot/kernel.img /mnt/ pi@gluster1 ~ $ ls -l /mnt/kernel.img -rwxr-xr-x 1 root root 4056224 Oct 31 23:37 /mnt/kernel.img pi@gluster1 ~ $ sha1sum /mnt/kernel.img d5e64d892b308b99e9c2c55deaa39c579a2335ec /mnt/kernel.img pi@gluster1 ~ $ -
注意,复制的文件(
/mnt/kernel.img)的大小(4056224)和校验和(d5e64…35ec)与原始文件相同。 -
使用
ls -la命令显示分布式卷(/srv/vol0)的 GlusterFS 存储目录的完整内容。pi@gluster1 ~ $ ls -la /srv/vol0/ total 2068 drwxr-xr-x 3 root root 4096 Oct 31 23:37 . drwxr-xr-x 3 pi pi 4096 Oct 31 23:12 .. drw------- 7 root root 4096 Oct 31 23:37 .glusterfs -rwxr-xr-x 2 root root 2090144 Oct 31 23:37 kernel.img pi@gluster1 ~ $ -
注意,只有部分来自大文件(
kernel.img)的数据存储在此对等节点(gluster1)上。存储目录(/srv/vol0)中的文件大小(2090144)显著小于原始文件(/boot/kernel.img)的大小(4056224)。 -
登录到其余三个对等节点(
gluster2、gluster3和gluster4),并使用ls –l命令检查每个存储目录(/srv/vol0)中的文件大小。[登录到对等节点
gluster2]pi@gluster2 ~ $ ls -la /srv/vol0/ total 2068 drwxr-xr-x 3 root root 4096 Oct 31 23:37 . drwxr-xr-x 3 pi pi 4096 Oct 31 23:12 .. drw------- 7 root root 4096 Oct 31 23:37 .glusterfs -rwxr-xr-x 2 root root 2090144 Oct 31 23:37 kernel.img pi@gluster2 ~ $ [log in to peer gluster3] pi@gluster3 ~ $ ls -la /srv/vol0/ total 1936 drwxr-xr-x 3 root root 4096 Oct 31 23:37 . drwxr-xr-x 3 pi pi 4096 Oct 31 23:12 .. drw------- 7 root root 4096 Oct 31 23:37 .glusterfs -rwxr-xr-x 2 root root 1966080 Oct 31 23:37 kernel.img pi@gluster3 ~ $ [log in to peer gluster4] pi@gluster4 ~ $ ls -la /srv/vol0/ total 1936 drwxr-xr-x 3 root root 4096 Oct 31 23:37 . drwxr-xr-x 3 pi pi 4096 Oct 31 23:12 .. drw------- 7 root root 4096 Oct 31 23:37 .glusterfs -rwxr-xr-x 2 root root 1966080 Oct 31 23:37 kernel.img pi@gluster4 ~ $ -
注意,每个对等节点上的数据存储文件(
/srv/vol0/kernel.img)有两个不同的文件大小(2090144和1966080)。 -
注意,
gluster1和gluster2上的数据存储文件(/srv/vol0/kernel.img)大小相同;gluster3和gluster4上的数据存储文件大小也相同。这是复制卷如何在复制对等节点之间复制存储的一个例子,以防其中一个复制对等节点宕机。 -
注意,两个文件的大小之和等于原始文件的大小(
4056224)。这是条带化卷如何在条带化对等节点之间划分大文件数据的一个例子。 -
测试集群的高可用性。通过断开网络电缆将一台树莓派(
gluster4)从网络中移除。 -
在剩余的一个对等节点(
gluster1)上使用gluster对等节点状态命令检查分布式文件系统的安全存储池状态。pi@gluster1 ~ $ sudo gluster peer status Number of Peers: 3 Hostname: gluster2.local Uuid: 5b969ed1-01c2-406e-9710-944436c41c98 State: Peer in Cluster (Connected) Hostname: gluster3.local Uuid: 9a00c151-af6e-44c5-9d14-5607270b4038 State: Peer in Cluster (Connected) Hostname: gluster4.local Uuid: f036b1c4-7a51-49eb-aa63-81babb843b7e State: Peer in Cluster (Disconnected) pi@gluster1 ~ $ -
注意,
Hostname: gluster4.local显示为Disconnected。 -
在
gluster1上使用sha1sum命令验证存储在文件系统中的大文件(/mnt/kernel.img)没有发生变化。pi@gluster1 ~ $ sha1sum /mnt/kernel.img d5e64d892b308b99e9c2c55deaa39c579a2335ec /mnt/kernel.img pi@gluster1 ~ $ -
注意,校验和(
d5e64…35ec)仍然相同。 -
即使一个对等节点宕机,分布式文件系统仍然可以正常工作!
-
测试复制对等节点的修复功能。当
gluster4仍然与集群断开连接时,使用cp命令将另一个大文件(/boot/kernel7.img)复制到自愈的分布式条带化复制文件系统中。pi@gluster1 ~ $ sudo cp /boot/kernel7.img /mnt/ pi@gluster1 ~ $ -
使用
ls和sha1sum命令检查复制的文件(/mnt/kernel7.img)是否与原始文件(/boot/kernel7.img)完全相同。pi@gluster1 ~ $ ls -l /boot/kernel7.img -rwxr-xr-x 1 root root 4032544 Sep 23 16:10 /boot/kernel7.img pi@gluster1 ~ $ sha1sum /boot/kernel7.img 8a2b1f065fc9459de79ba40e7cb791216f2f501b /boot/kernel7.img pi@gluster1 ~ $ ls -la /mnt total 7912 drwxr-xr-x 3 root root 4096 Nov 1 00:47 . drwxr-xr-x 21 root root 4096 Oct 31 20:29 .. -rwxr-xr-x 1 root root 4032544 Nov 1 00:47 kernel7.img -rwxr-xr-x 1 root root 4056224 Oct 31 23:37 kernel.img pi@gluster1 ~ $ sha1sum /mnt/kernel7.img 8a2b1f065fc9459de79ba40e7cb791216f2f501b /mnt/kernel7.img pi@gluster1 ~ $ -
使用
ls –l命令检查每个对等节点的存储目录(/srv/vol0)中的文件大小,以验证新复制的文件(kernel7.img)是否也被条带化和复制。[登录到对等节点
gluster1]pi@gluster1 ~ $ ls -la /srv/vol0/ total 4092 drwxr-xr-x 3 root root 4096 Nov 1 00:47 . drwxr-xr-x 3 pi pi 4096 Oct 31 23:12 .. drw------- 8 root root 4096 Nov 1 00:47 .glusterfs -rwxr-xr-x 2 root root 2066464 Nov 1 00:47 kernel7.img -rwxr-xr-x 2 root root 2090144 Oct 31 23:37 kernel.img pi@gluster1 ~ $[登录到对等节点
gluster2]pi@gluster2 ~ $ ls -la /srv/vol0/ total 4092 drwxr-xr-x 3 root root 4096 Nov 1 00:47 . drwxr-xr-x 3 pi pi 4096 Oct 31 23:12 .. drw------- 8 root root 4096 Nov 1 00:47 .glusterfs -rwxr-xr-x 2 root root 2066464 Nov 1 00:47 kernel7.img -rwxr-xr-x 2 root root 2090144 Oct 31 23:37 kernel.img pi@gluster2 ~ $[登录到对等节点
gluster3]pi@gluster3 ~ $ ls -la /srv/vol0/ total 3864 drwxr-xr-x 3 root root 4096 Nov 1 00:47 . drwxr-xr-x 3 pi pi 4096 Oct 31 23:12 .. drw------- 8 root root 4096 Nov 1 00:47 .glusterfs -rwxr-xr-x 2 root root 1966080 Nov 1 00:47 kernel7.img -rwxr-xr-x 2 root root 1966080 Oct 31 23:37 kernel.img pi@gluster3 ~ $ -
注意,
gluster1和gluster2上的数据存储文件(/srv/vol0/kernel7.img)大小相同,且条带化文件的总大小(2066464 + 1966080)等于原始文件的大小(4032544)。即使某个节点宕机,分布式文件系统仍然会继续进行条带化和复制文件! -
重新连接
gluster4节点到网络。 -
重新连接的节点
gluster4上,立即使用ls –l命令检查数据存储目录(/srv/vol0)中的文件。pi@gluster4 ~ $ ls -la /srv/vol0/ total 1940 drwxr-xr-x 3 root root 4096 Nov 1 00:47 . drwxr-xr-x 3 pi pi 4096 Oct 31 23:12 .. drw------- 8 root root 4096 Nov 1 00:50 .glusterfs -rwxr-xr-x 2 root root 0 Nov 1 00:47 kernel7.img -rwxr-xr-x 2 root root 1966080 Oct 31 23:37 kernel.img pi@gluster4 ~ $ -
注意,新复制的文件(
kernel7.img)已在数据存储目录(/srv/vol0)中创建,但文件大小为空(0)。 -
等待五分钟后,再次使用
ls –l命令检查gluster4上的数据存储目录。pi@gluster4 ~ $ ls -la /srv/vol0/ total 3864 drwxr-xr-x 3 root root 4096 Nov 1 00:47 . drwxr-xr-x 3 pi pi 4096 Oct 31 23:12 .. drw------- 8 root root 4096 Nov 1 00:50 .glusterfs -rwxr-xr-x 2 root root 1966080 Nov 1 00:47 kernel7.img -rwxr-xr-x 2 root root 1966080 Oct 31 23:37 kernel.img pi@gluster4 ~ $ -
注意,存储文件
kernel7.img不再为空。gluster4上的数据存储文件(kernel7.img)现在与gluster3上的存储文件大小相同(1966080)。 -
分布式文件系统已经恢复正常!
-
现在,这四个树莓派组成的集群已经成为一个高可用的分布式文件系统!
它是如何工作的...
该步骤从更改四个树莓派的主机名开始,这些树莓派都连接在同一个网络中。树莓派的新主机名为gluster1、gluster2、gluster3和gluster4。
在每个树莓派上安装 GlusterFS 服务器
在重命名树莓派后,使用apt-get install命令在每个树莓派上安装 GlusterFS 服务器软件包(glusterfs-server)。
安装glusterfs-server软件包时,还会在每个树莓派上启动 GlusterFS 服务器:gluster1、gluster2、gluster3和gluster4。
从gluster1树莓派使用gluster peer probe命令将其他树莓派(gluster2、gluster3和gluster4)链接到可信节点关系中。
存储池中的第一个节点(gluster1)与其他存储池节点(gluster2,gluster3,gluster4)建立了可信节点关系。然而,一旦建立了可信关系,任何节点都可以作为存储池的主节点——管理存储卷、管理可信节点关系,或者作为分布式文件系统的网络可挂载端点。
在gluster1和gluster2上使用gluster peer status命令验证可信存储池是否正在运行。在这两个节点上,其他三个存储池节点都显示为存储池的一部分。
然而,gluster2上的gluster peer status命令显示了第一个节点gluster1的 IP 地址作为Hostname字段。因此,使用gluster peer命令在gluster2上将gluster1的主机名添加到存储池的元数据中。
注意
不要让节点将自己添加到可信存储池!
使用命令gluster peer probe并带上自己的主机名的节点可能会破坏可信存储池!
在受信任存储池中创建条带化复制卷
使用cluster volume create命令从gluster1节点创建一个新的条带化复制卷,该卷分布在四个存储池节点上(gluster1.local,gluster2.local,gluster3.local,gluster4.local)。
新的卷命名为vol0,它有两个条带(stripe 2)和两个副本(replica 2)。它在每个存储池节点(gluster1.local,gluster2.local,gluster3.local,gluster4.local)上使用相同的存储目录(/srv/vol0)。
不建议使用节点根文件系统(/)上的存储目录,默认情况下也不允许这样做。可以使用force关键字来覆盖默认行为。
本食谱使用根文件系统以简化操作。对于更健壮、可靠的分布式文件系统并具有更高性能的需求,可以将高速外部 USB 磁盘连接到每个 Raspberry Pi,并配置卷的存储目录位于外部磁盘上,而不是根文件系统上。第四章,文件共享,提供了多种将外部 USB 磁盘挂载到 Raspberry Pi 上的食谱。
在创建卷(vol0)之后,使用gluster volume start命令将新创建的卷与 GlusterFS 客户端共享。gluster volume start命令可以从集群中的任何节点运行。在此案例中,从gluster1节点运行。
挂载分布式条带化复制卷
现在,分布式条带化复制卷(vol0)已经创建并启动,可以让 GlusterFS 客户端挂载新创建的卷。
为了简化操作,本食谱使用gluster1作为客户端。然而,任何安装了 GlusterFS 客户端软件的本地网络计算机,现在应该都可以从任何受信任的节点挂载分布式卷(vol0)。
使用mount –t glusterfs命令从gluster1节点挂载受信任的存储节点gluster1.local上的分布式卷(vol0)到其本地目录/mnt。名为gluster1的 Raspberry Pi 既是分布式卷(vol0)的客户端,也是服务器。
测试条带化复制卷
使用cp命令将大文件从本地文件系统(/boot/kernel.img)复制到挂载在/mnt的分布式条带化复制卷。
使用ls –l命令和sha1sum命令验证复制的文件(/mnt/kernel.img)是否成功复制,通过检查文件的大小(4056224)和校验和(d5e64…35ec)是否与原文件(/boot/kernel.img)相同。
使用ls –la命令在存储池的每个节点(gluster1,gluster2,gluster3和gluster4)上显示该节点存储目录(/srv/vol0)的内容。
没有任何节点的存储目录中存在与原文件(/boot/kernel.img)大小相同的文件(/srv/kernel.img)。
复制
有两组大小相同的存储文件(/srv/kernel.img)。第一组存储文件大小相同(2090144),可以在 gluster1 和 gluster2 上找到。第二组存储文件,gluster3 和 gluster4,也具有相同的大小(1966080)。gluster1 和 gluster2 是彼此的副本;gluster3 和 gluster4 也是副本。
数据复制用于保持分发卷的高可用性。如果一个受信存储节点出现故障或与网络断开连接,无法访问的节点的存储数据副本仍然可用。如果 gluster1 出现故障,gluster2 仍然会有该数据的副本。如果 gluster4 与网络断开,gluster3 仍然会有它的数据副本。
条带化
两个不同的文件大小(2090144 和 1966080)之和等于原始文件的大小(4056224)。原始文件已经分布(条带化)到受信存储节点上。受信存储节点 gluster1 和 gluster2 正在复制大文件(kernel.img)的一部分(2090144),而受信节点 gluster3 和 gluster4 正在存储另一部分的副本(1966080)。
数据条带化是一种将大文件分布到多个存储节点的技术。文件的部分内容(条带)被均匀地分布到条带化的存储节点上,这样顺序读取(或写入)一个大文件时,不会持续对单一存储节点造成负担。通过将文件的数据分布到各个存储节点,条带化将访问文件的负载分配到多个存储节点上。条带化提高了分发卷的数据传输速率。
测试集群的高可用性
为了测试当一个受信数据存储节点出现故障时集群能否保持可用,受信数据存储节点 gluster4.local 被通过断开其网络电缆从集群中移除。
在从 gluster4 拔掉网线后,可以使用 gluster peer status 命令(在任何剩余的节点上执行)查看,受信存储节点 gluster4.local 已被标记为与集群 断开连接。
sha1sum 命令用于验证分发文件(/mnt/kernel.img)的校验和(d5e64…35ec)是否与原始文件(/boot/kernel.img)的校验和匹配。
即使一个节点从存储池中移除,GlusterFS 分发文件系统仍能正常工作!集群具有高可用性!
测试复制节点的修复
在受信存储节点 gluster4 仍与集群断开连接的情况下,使用 cp 命令将另一个大文件(/boot/kernel7.img)复制到分发存储卷(vol0),并将其挂载到本地 gluster1 的 /mnt 目录。
使用 sha1sum 命令将复制文件(/mnt/kernel7.img)的校验和与原始文件(/boot/kernel7.img)的校验和进行比较。文件完全相同。
在每个剩余的受信存储对等节点(gluster1、gluster2 和 gluster3)上使用 ls –la 命令,验证新大文件(kernel7.img)是否也已在分布式卷的存储目录(/srv/vol0)中进行条带和复制。受信存储对等节点 gluster1 和 gluster2 各自拥有文件的一部分副本,而对等节点 gluster3 拥有文件的另一部分副本。
在新大文件已经在分布式卷上进行条带和复制之后,受信对等节点 gluster4 再次连接到集群。
在对等节点 gluster4 重新连接到集群后,立即使用 ls –la 命令显示 gluster4 上数据存储目录(/srv/vol0)的内容。复制到分布式卷(vol0)的文件(kernel7.img)在 gluster4 从集群断开期间已经创建在数据存储目录中;然而,文件是空的(0)。
在等待几分钟,直到 GlusterFS 修复服务完成将新大文件(kernel7.img)的条带部分从对等节点 gluster3 复制到对等节点 gluster4 后,再次使用 ls –la 命令验证对等节点 gluster4 是否已复制其条带文件部分,并确认分布式卷(vol0)已完成修复。
这四个 Raspberry Pi 现在构成了一个自修复的高可用分布式文件系统。
还有更多…
GlusterFS 是一个基于对等节点的分布式文件系统。在 GlusterFS 的受信存储池中没有主服务器。在这个方案中,gluster1 是受信存储池中的第一个对等节点,并邀请其他受信对等节点加入池中。即使它是存储池中的第一个对等节点,gluster1 仍然是一个平等的对等节点,而不是主节点。
另一方面,当前的方案只允许 GlusterFS 客户端从一个受信存储池对等节点(gluster1、gluster2、gluster3 或 gluster4)挂载文件系统端点。在此方案中,gluster1 是提供分布式文件系统端点的对等节点。
如果挂载的对等节点(gluster1)宕机,即使集群中的其他对等节点保持文件系统可用,客户端仍然无法访问分布式文件系统。在此方案中,gluster1 同时也是客户端,因此这个问题不会发生。
GlusterFS 分布式文件系统通常是从集群外部访问的,而不是从集群内受信存储对等节点访问。直接从某个存储对等节点挂载分布式文件系统会破坏集群的高可用性,因为它使客户端依赖于单个受信对等节点,而不是依赖整个集群。
使用 Keepalived 创建虚拟文件系统端点
Keepalived 提供的虚拟 IP 地址服务可以用于创建一个由所有受信任存储池节点维持活跃的分布式文件系统端点。前面的食谱,安装高可用负载均衡器,展示了如何安装和配置 Keepalived,以便与 HA Proxy 一起使用。
Keepalived 还可以与 GlusterFS 配合使用,创建一个虚拟 IP 地址,用于访问分布式文件系统,只要分布式文件系统保持可用,虚拟 IP 也将保持可用。
使用 Keepalived,会为分布式文件系统创建一个虚拟端点(IP 地址)。客户端将挂载文件系统的虚拟端点,而不是直接从受信任存储节点挂载端点。
即使当前提供虚拟文件系统端点的受信任存储节点发生故障,Keepalived 提供的虚拟端点也不会失败;相反,系统会选择另一个受信任存储节点来替代发生故障的节点。不管哪个受信任节点发生故障,虚拟文件系统端点将始终保持活跃。
要在本食谱中使用 Keepalived,首先启用(=1)允许监听虚拟 IP 地址(net.ipv4.ip_nonlocal_bind)的内核参数,适用于集群中的每个受信任存储节点(gluster1、gluster2、gluster3 和 gluster4)。
pi@gluster1 ~ $ sudo -i bash
root@gluster1:~# echo "net.ipv4.ip_nonlocal_bind=1" >>/etc/sysctl.conf
root@gluster1:~# sysctl -p
kernel.printk = 3 4 1 3
vm.swappiness = 1
vm.min_free_kbytes = 8192
net.ipv4.ip_nonlocal_bind = 1
root@gluster1:~# exit
exit
pi@gluster1 ~ $
接下来,使用 apt-get install 命令安装 keepalived 软件包。
pi@gluster1 ~ $ sudo apt-get install -y keepalived
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
iproute ipvsadm libpci3 libperl5.20 libsensors4 libsnmp-base libsnmp30
Suggested packages:
heartbeat ldirectord lm-sensors snmp-mibs-downloader
The following NEW packages will be installed:
iproute ipvsadm keepalived libpci3 libperl5.20 libsensors4 libsnmp-base libsnmp30
0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,902 kB of archives.
After this operation, 7,093 kB of additional disk space will be used.
...
使用一个 Keepalived 配置,使得任何一个受信任的存储节点(gluster1、gluster2、gluster3 或 gluster4)在当前提供虚拟 IP 地址的节点发生故障时,能够接管集群的虚拟 IP 地址。
pi@gluster1 ~ $ sudo bash
root@gluster1:/home/pi# cat <<EOD >/etc/keepalived/keepalived.conf
vrrp_script chk_glusterd
{
script "killall -0 glusterd"
interval 2
weight 2
}
vrrp_instance VI_1
{
interface eth0
state MASTER
virtual_router_id 13
priority 100
virtual_ipaddress
{
192.168.2.100
}
track_script
{
chk_glusterd
}
}
EOD
root@gluster1:/home/pi# exit
exit
pi@gluster1 ~ $
最后,重启 Keepalived 服务。
pi@gluster1 ~ $ sudo systemctl restart keepalived.service
pi@gluster1 ~ $
现在,虚拟端点可以被挂载,替代受信任节点。
pi@gluster4 ~ $ sudo mount -t glusterfs 192.168.2.100:/vol0 /mnt
pi@gluster4 ~ $ ls -l /mnt
total 7900
-rwxr-xr-x 1 root root 4032544 Nov 1 00:47 kernel7.img
-rwxr-xr-x 1 root root 4056224 Oct 31 23:37 kernel.img
pi@gluster4 ~ $
参见:
-
GlusterFS (
www.glusterfs.org/): GlusterFS 是一个可扩展的网络文件系统。通过使用常见的现成硬件,你可以创建大型分布式存储解决方案,适用于媒体流、数据分析及其他数据和带宽密集型任务。GlusterFS 是免费且开源的软件。 -
GlusterFS (
en.wikipedia.org/wiki/GlusterFS): 这篇维基百科文章描述了 GlusterFS 的设计。
创建超级计算机
本食谱将四台 Raspberry Pi 变成一台使用 Apache Spark 的超级计算机。
Apache Spark 是一个用于大规模数据处理的快速通用引擎。在本食谱中,Apache Spark 被安装在四台网络连接的小型 Raspberry Pi 计算机集群上。该集群将被用来展示超级计算机的速度,通过蒙特卡洛算法计算圆周率值。
完成本食谱后,你将拥有一台 Raspberry Pi 超级计算机。
准备工作
创建超级计算机需要以下配件:
-
Raspberry Pi 的四种基本网络配置
-
一个高速网络交换机
这个方法不需要桌面 GUI,可以通过基于文本的控制台或者在 LXTerminal 中运行。
在每个树莓派上运行安全 Shell 服务器后,可以使用安全 Shell 客户端远程完成这个方法。通常,网站会通过远程管理。
所有树莓派应直接连接到同一网络交换机。
如何操作...
按照以下步骤构建树莓派超级计算机:
-
登录到每个树莓派并设置其主机名。一个树莓派将作为 Spark 主服务器,另外三个将作为 Spark 从机。将四个树莓派命名为
spark-master、spark-slave-a、spark-slave-b和spark-slave-c。 -
现在,设置主从机之间的安全通信。使用
spark-master上的ssh-keygen命令生成一对 SSH 密钥。按<enter>接受默认文件位置(/home/pi/.ssh/id_rsa)。然后,按两次<enter>以使用空密码(Spark 自动化要求为空密码)。pi@spark-master ~ $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/pi/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/pi/.ssh/id_rsa. Your public key has been saved in /home/pi/.ssh/id_rsa.pub. The key fingerprint is: 29:0e:95:61:a6:e6:30:8f:23:66:cd:68:d3:c4:0c:8e pi@spark-master The key's randomart image is: +---[RSA 2048]----+ | . + | |o + + o | |E.o+o o | | *B . . | |.*o++ . S | |+... o . | | . | | | | | +-----------------+ pi@spark-master ~ $ -
使用
ssh-copy-id命令将新创建的公钥从spark-master复制到每个 Spark 从机(spark-slave-a,spark-slave-b,和spark-slave-c)。pi@spark-master ~ $ ssh-copy-id pi@spark-slave-a.local The authenticity of host 'spark-slave-a.local (192.168.2.6)' can't be established. ECDSA key fingerprint is e9:55:ff:6c:69:be:5d:8f:80:de:b2:d9:85:eb:1b:90. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys pi@spark-slave-a.local's password: Number of key(s) added: 1注意
对每个从机重复步骤3:
spark-slave-a,spark-slave-b,和spark-slave-c。 -
请注意,从
spark-master到从机的安全 shell 登录(ssh)不再需要密码进行身份验证:pi@spark-master ~ $ ssh spark-slave-a.local The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Mon Nov 2 21:29:28 2015 from 192.168.2.1 pi@spark-slave-a ~ $ -
现在,开始下载 Apache Spark 软件发行版。使用网页浏览器在 Apache Spark 官网的下载页面上找到正确的 Apache Spark 软件发行包(
spark.apache.org/downloads.html),如下图所示:![如何操作...]()
-
在下载页面上,使用以下下拉选项:
-
选择一个 Spark 版本: 1.5.1(2015 年 10 月 2 日)
-
选择软件包类型: 为 Hadoop 2.6 及以后版本预构建
-
选择下载类型: 选择 Apache 镜像
在1、2和3的选择正确之后,点击在4处出现的链接(
spark-1.5.1-bin-haddop2.6.tgz)。下载 Spark。![如何操作...]()
-
-
请注意,下一网页显示了正确的 Apache Spark 软件发行包的实际下载链接(
www.eu.apache.org/dist/spark/spark-1.5.1/spark-1.5.1-bin-hadoop2.6.tgz)。 -
在
spark-master上使用wget命令下载 Apache Spark 软件发行页面,如下所示:pi@spark-master ~ $ wget http://www.eu.apache.org/dist/spark/spark-1.5.1/spark-1.5.1-bin-hadoop2.6.tgz --2015-11-05 17:41:01-- http://www.eu.apache.org/dist/spark/spark-1.5.1/spark-1.5.1-bin-hadoop2.6.tgz Resolving www.eu.apache.org (www.eu.apache.org)... 88.198.26.2, 2a01:4f8:130:2192::2 Connecting to www.eu.apache.org (www.eu.apache.org)|88.198.26.2|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 280901736 (268M) [application/x-gzip] Saving to: 'spark-1.5.1-bin-hadoop2.6.tgz' spark-1.5.1-bin-hadoop2.6.tgz 100%[============>] 267.89M 726KB/s in 4m 38s 2015-11-05 17:45:39 (987 KB/s) - 'spark-1.5.1-bin-hadoop2.6.tgz' saved [280901736/280901736] pi@spark-master ~ $ -
使用
tar命令在每个树莓派(spark-master,spark-slave-a,spark-slave-b和spark-slave-c)上解压 Apache Spark 软件发行版,如下所示:pi@spark-master ~ $ scp spark-1.5.1-bin-hadoop2.6.tgz spark-slave-a.local:. spark-1.5.1-bin-hadoop2.6.tgz 100% 268MB 4.4MB/s 01:01 pi@spark-master ~ $ scp spark-1.5.1-bin-hadoop2.6.tgz spark-slave-b.local:. spark-1.5.1-bin-hadoop2.6.tgz 100% 268MB 4.0MB/s 01:07 pi@spark-master ~ $ scp spark-1.5.1-bin-hadoop2.6.tgz spark-slave-c.local:. spark-1.5.1-bin-hadoop2.6.tgz 100% 268MB 5.2MB/s 00:47 pi@spark-master ~ $ -
使用
tar命令在每个树莓派(spark-master,spark-slave-a,spark-slave-b和spark-slave-c)上解压 Apache Spark 软件发行版,如下所示:pi@spark-master ~ $ tar xvfz spark-1.5.1-bin-hadoop2.6.tgz spark-1.5.1-bin-hadoop2.6/ spark-1.5.1-bin-hadoop2.6/NOTICE spark-1.5.1-bin-hadoop2.6/CHANGES.txt spark-1.5.1-bin-hadoop2.6/python/ spark-1.5.1-bin-hadoop2.6/python/run-tests.py spark-1.5.1-bin-hadoop2.6/python/test_support/ spark-1.5.1-bin-hadoop2.6/python/test_support/userlibrary.py spark-1.5.1-bin-hadoop2.6/python/test_support/userlib-0.1.zip spark-1.5.1-bin-hadoop2.6/python/test_support/sql/ spark-1.5.1-bin-hadoop2.6/python/test_support/sql/people.json spark-1.5.1-bin-hadoop2.6/python/test_support/sql/orc_partitioned/ spark-1.5.1-bin-hadoop2.6/python/test_support/sql/orc_partitioned/b=1/ spark-1.5.1-bin-hadoop2.6/python/test_support/sql/orc_partitioned/b=1/c=1/ ...注意
在每个树莓派上重复步骤 10,即
spark-master、spark-slave-a、spark-slave-b和spark-slave-c。 -
使用
mv命令将 Apache Spark 安装目录(spark-1.5.1-bin-hadoop2.6)移动到每个树莓派上的更方便的位置(/opt/spark),如下所示:pi@spark-master ~ $ sudo mv spark-1.5.1-bin-hadoop2.6 /opt/spark pi@spark-master ~ $ -
现在,配置 Spark 主节点。在
spark-master上使用cat命令创建一个从节点列表,如下所示:pi@spark-master ~/ $ cat <<EOD >/opt/spark/conf/slaves spark-slave-a.local spark-slave-b.local spark-slave-c.local EOD pi@spark-master ~/ $ -
在
spark-master上使用scp命令将 Spark 执行环境配置文件(spark-env.sh)复制到每个 Spark 从节点(spark-slave-a、spark-slave-b和spark-slave-c)中,如下所示:pi@spark-master ~ $ echo "SPARK_MASTER_IP=`hostname -I`" >/opt/spark/conf/spark-env.sh -
在
spark-master上使用scp命令将 Spark 执行环境配置文件(spark-env.sh)复制到每个 Spark 从节点(spark-slave-a、spark-slave-b和spark-slave-c)中,如下所示:pi@spark-master ~ $ scp /opt/spark/conf/spark-env.sh spark-slave-a:/opt/spark/conf/spark-env.sh spark-env.sh 100% 30 0.0KB/s 00:00 pi@spark-master ~ $ scp /opt/spark/conf/spark-env.sh spark-slave-b.local:/opt/spark/conf/spark-env.sh spark-env.sh 100% 30 0.0KB/s 00:00 pi@spark-master ~ $ scp /opt/spark/conf/spark-env.sh spark-slave-c.local:/opt/spark/conf/spark-env.sh spark-env.sh 100% 30 0.0KB/s 00:00 pi@spark-master ~ $ -
在
spark-master上使用echo命令将额外的内存限制(SPARK_DRIVER_MEMORY=512m)添加到 Spark 主服务器(spark-master)的执行环境(spark-env.sh)中,以确保主服务器上保留足够的内存来运行 Spark 任务,如下所示:pi@spark-master ~ $ echo "SPARK_DRIVER_MEMORY=512m" >>/opt/spark/conf/spark-env.sh pi@spark-master ~ $ -
在
spark-master上使用echo命令将本地 IP 地址(SPARK_LOCAL_IP)添加到执行环境(spark-env.sh)中。这可以减少 Spark 任务输出中的警告信息:pi@spark-master ~ $ echo "SPARK_LOCAL_IP=$(hostname -I)" >>/opt/spark/conf/spark-env.sh pi@spark-master ~ $ -
使用
sed命令将 Spark 任务的日志级别从INFO(会生成大量信息性输出)更改为WARN(生成的输出较少)。pi@spark-master ~ $ sed 's/rootCategory=INFO/rootCategory=WARN/' spark/conf/log4j.properties.template >/opt/spark/conf/log4j.properties pi@spark-master ~ $ -
此时,Spark 集群已准备好启动。
注意
接下来的步骤是分别使用 Spark 集群和不使用 Spark 集群计算 pi,以便对比这两种计算方法的时长。
-
现在,在不使用 Spark 集群的情况下计算 pi。在
spark-master上使用cat命令创建一个简单的 Python 脚本来计算 pi,而不使用 Spark 集群,如下所示:pi@spark-master ~ $ cat <<EOD >pi.py from operator import add from random import random from time import clock MSG = "Python estimated Pi at %f in %f seconds" n = 1000000 def f(_): x = random() * 2 - 1 y = random() * 2 - 1 return 1 if x ** 2 + y ** 2 < 1 else 0 def main(): st = clock() tries = map( f, range( 1, n + 1 ) ) count = reduce( add, tries ) et = clock() print( MSG % ( 4.0 * count / n, et - st ) ) if __name__ == "__main__": main() EOD pi@spark-master ~ $ -
在
spark-master上使用python命令运行计算 pi 的脚本(pi.py),而不使用 Spark 集群。pi@spark-master ~ $ python pi.py Python esitmated PI at 3.141444 in 13.430613 seconds pi@spark-master ~ $ -
注意,使用一个树莓派(
spark-master)计算 pi 时,没有使用 Spark 而花费了超过 13 秒(13.430613秒)。 -
现在,使用 Spark 集群计算 pi。在
spark-master上使用cat命令创建一个简单的 Python 脚本,来并行化计算 pi 并在 Spark 集群上使用,如下所示:pi@spark-master ~ $ cat <<EOD >pi-spark.py from __future__ import print_function from operator import add from random import random from sys import argv from time import clock from pyspark import SparkConf, SparkContext APP_NAME = "MonteCarloPi" MSG = "Spark estimated Pi at %f in %f seconds using %i partitions" master = argv[ 1 ] if len( argv ) > 1 else "local" partitions = int( argv[ 2 ] ) if len( argv ) > 2 else 2 n = 1000000 def f(_): x = random() * 2 - 1 y = random() * 2 - 1 return 1 if x ** 2 + y ** 2 < 1 else 0 def main(sc): st = clock() tries = sc.parallelize( range( 1, n + 1 ), partitions ).map( f ) count = tries.reduce( add ) et = clock() print( MSG % ( 4.0 * count / n, et - st, partitions ) ) if __name__ == "__main__": conf = SparkConf() conf.setMaster( master ) conf.setAppName( APP_NAME ) sc = SparkContext( conf = conf ) main( sc ) sc.stop() EOD pi@spark-master ~ $ -
在
spark-master上使用start-all.sh脚本启动 Apache Spark 集群。启动集群可能需要 30 秒。pi@spark-master ~ $ /opt/spark/sbin/start-all.sh starting org.apache.spark.deploy.master.Master, logging to /home/pi/spark/sbin/../logs/spark-pi-org.apache.spark.deploy.master.Master-1-spark-master.out spark-slave-c.local: starting org.apache.spark.deploy.worker.Worker, logging to /home/pi/spark/sbin/../logs/spark-pi-org.apache.spark.deploy.worker.Worker-1-spark-slave-c.out spark-slave-b.local: starting org.apache.spark.deploy.worker.Worker, logging to /home/pi/spark/sbin/../logs/spark-pi-org.apache.spark.deploy.worker.Worker-1-spark-slave-b.out spark-slave-a.local: starting org.apache.spark.deploy.worker.Worker, logging to /home/pi/spark/sbin/../logs/spark-pi-org.apache.spark.deploy.worker.Worker-1-spark-slave-a.out pi@spark-master ~ $ -
使用 Web 浏览器查看集群的状态,访问集群状态页面
http://spark-master.local:8080/。![如何操作...]()
-
等待 Spark 主服务器和所有三个从节点启动完毕。当集群准备好进行计算时,状态页面将显示三个工作节点 ID。如果需要,刷新页面。
-
将用于计算 pi 的 Python 脚本(
pi-spark.py)提交给 Spark 集群,如下所示:pi@spark-master ~ $ export SPARK_MASTER_URL="http://$(hostname –I | tr –d [:space:]):7077" pi@spark-master ~ $ export PATH=/opt/spark/bin:$PATH pi@spark-master ~ $ spark-submit pi-spark.py $SPARK_MASTER_URL 24 15/11/04 21:39:38 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 15/11/04 21:39:51 WARN MetricsSystem: Using default name DAGScheduler for source because spark.app.id is not set. [Stage 0:> (0 + 0) / 24]15/11/04 21:40:00 WARN SizeEstimator: Failed to check whether UseCompressedOops is set; assuming yes 15/11/04 21:40:05 WARN TaskSetManager: Stage 0 contains a task of very large size (122 KB). The maximum recommended task size is 100 KB. Spark esitmated Pi at 3.143368 in 0.720023 seconds using 24 partitions pi@spark-master ~ $ -
请注意,Spark 集群计算圆周率时用了不到一秒钟(
0.720023 秒)。这比传统方法快了超过 185 倍!! -
树莓派超级计算机正在工作!
工作原理...
本食谱包含以下六个部分:
-
设置主节点与从节点之间的安全通信
-
下载 Apache Spark 软件分发包
-
在集群中的每个树莓派上安装 Apache Spark
-
配置 Spark 主节点
-
在没有使用 Spark 集群的情况下计算圆周率
-
使用 Spark 集群计算圆周率
本食谱从设置四台树莓派计算机的主机名开始。选择一台树莓派作为 Spark 主节点(spark-master),其他三台树莓派作为 Spark 从节点(spark-slave-a、spark-slave-b 和 spark-slave-c)。
设置主节点与从节点之间的安全通信
设置主机名后,使用 ssh-keygen 和 ssh-copy-id 命令来建立 Spark 主节点(spark-master)与每个从节点(spark-slave-a、spark-slave-b 和 spark-slave-c)之间的安全通信连接。
ssh-keygen 命令用于创建一对安全密钥(/home/pi/.ssh/id_rsa 和 /home/pi/.ssh/id_rsa.pub)。ssh-copy-id 命令用于将公钥(id_rsa.pub)从 spark-master 复制到每个从节点。
在将 spark-master 的公钥复制到每个从节点后,可以在不使用密码的情况下,从 spark-master 登录到每个从节点。主节点到从节点的无密码安全登录是集群启动自动化的要求。
下载 Apache Spark 软件分发包
Apache Spark 下载页面(spark.apache.org/downloads.html)提供了多个选项,用于确定正确的软件分发包。
本食谱使用的是 Spark 1.5.1(2015 年 10 月 2 日发布)版本,该版本已经为 Hadoop 2.6 及更高版本预先构建。选择正确的选项后,将显示一个链接(spark-1.5.1-bin-hadoop2.6.tgz),点击该链接将跳转到实际的下载页面。
使用 wget 命令通过实际下载页面提供的链接(www.us.apache.org/dist/spark/spark-1.5.1/spark-1.5.1-bin-hadoop2.6.tgz)将 Spark 软件分发包下载到 spark-master。
软件分发包的大小为 280 MB。下载需要一些时间。
一旦 Spark 软件分发包(spark-1.5.1-bin-hadoop2.6.tgz)下载到 spark-master,然后使用 scp 命令将其复制到三个从节点(spark-slave-a、spark-slave-b 和 spark-slave-c)。
在集群中的每个树莓派上安装 Apache Spark
tar命令用于在集群中的每台树莓派(spark-master、spark-slave-a、spark-slave-b和spark-slave-c)上解压 Apache Spark 软件包(spark-1.5.1-bin-hadoop2.6.tgz)。
在软件包被解压到用户的主目录pi中后,使用mv命令将其移动到一个更中心的位置(/opt/spark)。
配置 Spark 主节点
cat命令用于创建从节点列表(/opt/spark/conf/slaves)。该列表在集群启动时使用,用于在 spark-master启动时自动启动从节点。cat命令后的所有行直到数据结束(EOD)标记都会被复制到从节点列表中。
echo命令用于创建 Spark 运行时环境文件(位于/opt/spark/conf/下的 spark-env.sh),并设置一个环境变量(SPARK_MASTER_IP),该变量的值为spark-master的 IP 地址(hostname -I)。
然后,将 Spark 运行时环境配置文件 spark-env.sh从 spark-master复制到每个从节点(spark-slave-a、spark-slave-b和 spark-slave-c)。
配置文件(spark-env.sh)复制到从节点后,向文件中添加了两个特定于spark-master的额外配置参数。
echo命令用于将SPARK_DRIVER_MEMORY参数追加(>>)到配置文件的底部。此参数用于限制spark-master使用的内存为512m(512 MB)。这为spark-master的内存池留出了运行 Spark 作业的空间。
echo命令还用于将SPARK_LOCAL_IP参数追加到配置文件(spark-env.sh)的底部。此参数设置为spark-master的 IP 地址(hostname -I)。设置该参数可以消除运行 Spark 作业时出现的一些警告消息。
sed命令用于修改spark-master的日志记录参数。log4j.properties文件被修改,以使INFO级别的消息不再显示,只有警告消息(WARN)和错误消息会显示。这大大减少了 Spark 作业的输出。
此时,Spark 集群已完全配置,准备启动。
不使用 Spark 集群计算圆周率
在启动 Spark 集群之前,使用cat命令创建一个简单的 Python 脚本(pi.py),用来在不使用 Spark 集群的情况下计算圆周率。
这个脚本(pi.py)使用蒙特卡罗方法,通过随机生成 100 万个数据点,并测试每个数据点是否位于圆内,从而估算圆周率的值。位于圆内的点与总点数的比例将大约等于Pi/4。
有关计算圆周率(Pi)的更多信息,包括如何使用蒙特卡罗方法,可以在维基百科上找到 (en.wikipedia.org/wiki/Pi)。
用于估算 pi 值的 Python 脚本在单个独立的 Raspberry Pi 上运行需要超过 13 秒。
使用 Spark 集群计算 pi
另一个 Python 脚本(pi-spark.py)使用 cat 命令创建。
这个新脚本(pi-spark.py)使用相同的蒙特卡洛方法,通过 100 万个随机数据点来估算 pi 值。然而,该脚本使用 SparkContext(sc)来创建一个 弹性分布式数据集(RDD),并将这 100 万个数据点(range(1, n + 1))并行化,使其可以分发到从节点进行实际计算(f)。
脚本创建后,启动 Spark 集群(/opt/spark/sbin/start-all.sh)。启动脚本(start-all.sh)使用 /opt/conf/slaves 文件中的内容来定位并启动 Spark 从节点(spark-slave-a、spark-slave-b 和 spark-slave-c)。
使用网页浏览器验证所有从节点是否已正确启动。spark-master 会生成一个小型网站(http://spark-master.local:8080/),展示集群的状态。Spark 集群的状态页面不会自动刷新,因此你需要不断刷新页面,直到所有工作节点启动完成。
每个 Spark 从节点在连接到 spark-master 时都会分配一个 Worker ID。你需要等待直到有三个工作节点启动,才能提交 Spark 任务,每个从节点一个工作节点(spark-slave-a、spark-slave-b 和 spark-slave-c)。
一旦所有从节点(工作节点)都已启动,就可以使用 spark-submit 命令将 pi-spark.py Python 脚本提交到集群。
spark-submit 命令传递了两个参数,即 $SPARK_MASTER_URL 和 24,给 pi-spark.py 脚本。
SPARK_MASTER_URL 的值用于配置(SparkConf conf)Spark 主节点的位置(conf.setMaster(master))。
pi-spark.py 脚本的第二个参数(24)决定了用于并行计算的计算分区数。分区将总计算任务划分为计算组(24 个独立的组)。
分区数应为可用计算核心数的因数。在这里,我们为每个可用计算核心使用 2 个分区(24 = 2 x 12)。共有 12 个核心——每个 Raspberry Pi 从节点有 4 个核心。
SPARK_MASTER_URL 和 PATH 环境变量已更新,以简化 spark-submit 命令行。
SPARK_MASTER_URL 使用 hostname –I 命令设置为 spark-master 的 IP 地址。tr 命令用来去除(-d)hostname –I 命令输出中的尾部空格([:space:])。
Spark 命令目录的位置(/opt/spark/bin)会被添加到 PATH 环境变量的前面,这样就可以在不需要完整路径的情况下使用 Spark 命令。
将pi-spark.py脚本提交到集群进行计算需要几秒钟。然而,一旦计算被分配到工作节点(从节点)上,估算π值的时间不到一秒钟(0.720023秒)。Spark 集群的计算速度比单一的树莓派快超过 185 倍。
树莓派超级计算机正在运行!
还有更多...
本教程仅开始探索使用低成本的树莓派计算机创建超级计算机的可能性。对于 Spark(以及 Spark 构建之上的 Hadoop),有许多用于统计计算和数据可视化的包。有关使用 Spark(和 Hadoop)进行超级计算的更多信息,可以在 Apache 软件基金会网站上找到(www.apache.org)。
参见
-
Apache Spark (
spark.apache.org/): Apache Spark™ 是一个用于大规模数据处理的快速通用引擎。 -
Apache Hadoop (
hadoop.apache.org/): Apache™ Hadoop^®项目开发了用于可靠、可扩展和分布式计算的开源软件。 -
ssh-copy-id (
manpages.debian.org/cgi-bin/man.cgi?query=ssh-copy-id): 使用本地可用的密钥来授权远程机器的登录。Debian 的ssh-copy-id手册页面描述了该命令及其选项。 -
tr (
manpages.debian.org/cgi-bin/man.cgi?query=tr): 用于翻译或删除字符。Debian 的tr手册页面描述了该命令及其选项。 -
用于估算π值的蒙特卡洛方法 (
en.wikipedia.org/wiki/Pi#Monte_Carlo_methods): 这篇关于π的维基百科文章描述了多种计算π的方法,包括蒙特卡洛方法。




















































浙公网安备 33010602011771号