像派一样简单:一个网络编码树莓派测试平台
克雷斯·W·索伦森 1,* †,内斯托尔·J·埃尔南德斯·马尔卡诺 1,2,†,胡安·A·卡布雷拉·格雷罗 3,4,西蒙·温德里希 3,丹尼尔·E·卢卡尼 1,†和弗兰克·H·P·菲策克 3
1丹麦奥尔堡奥尔堡大学电子系统系,邮编9220;nestor@steinwurf.com(N.J.H.M.); del@es.aau.dk(D.E.L.)2丹麦奥尔堡SteinwurfApS公司,邮编92203德国德累斯顿工业大学通信网络 德意志电信讲席,德累斯顿01069,德国;juan.cabrera@tu‐dresden.de(J.A.C.G.);simon.wunderlich@mailbox.tu‐dresden.de(S.W.);frank.fitzek@tu‐dresden.de(F.H.P.F.)4德国德累斯顿SFB912—协作研究中心HAEC,邮编01069*通讯作者:cws@es.aau.dk;电话:+45‐ 99‐408‐723
†当前地址:丹麦奥尔堡弗雷德里克·拜耶斯路7A,A3‐110室,邮编9220。
学术编辑:史蒂文·J·约翰斯通和西蒙·J·考克斯收到日期:2016年7月19日;接受 日期:2016年9月28日;发表日期:2016年10月13日
摘要
在不久的将来,随着物联网(IoT)产生海量数据,新兴的通信与存储网络预计将面临巨大 挑战。针对此类网络,基于网络编码的策略和机制已作为一种整体性解决方案出现,例如,在提升 某项网络指标的同时无需牺牲其他性能优势。然而,目前仍存在反复出现的问题:(i)难以实现类似 物联网的大规模部署;(ii)难以评估以及(iii)复现初步研究中获得的结果。因此,从研究角度来看, 迫切需要并期望拥有能够应对大规模部署且不丢失历史数据的测试平台,以评估这些机制。然而, 这可能难以管理,不仅因为硬件本身的成本问题,还因为维护上的挑战。本文介绍了设计、搭建和 维护一个低成本测试平台所需的关键步骤,该测试平台使用树莓派设备,具备网络编码能力,适用 于通信与存储网络。该测试平台可用于任何需要结果可复制性的应用。
关键词 :Linux;网络编码;树莓派;测试平台;C++
1.引言
即将到来的5G技术旨在全球范围内实时控制和引导物联网(IoT)。这将为无人驾驶车辆、制造 业、人形机器人和智能电网等新兴市场开辟全新前景。无线设备的数量预计增至目前的五倍,达到 500亿台[1]。普遍认为,这些设备不会以当前设备相同的连接方式进行联网。集中式系统将在容量上 不堪重负,而分布式系统则成为一种替代方案。因此,我们认为网状网络技术将在未来系统的通信架 构中发挥重要作用。网状网络技术在传感器网络、自组织网络或移动云计算场景中已有应用,但5G网 状通信系统的技术要求正在显著提升。未来的网状网络需要支持高数据速率、低延迟、安全性、网络 可用性以及异构设备,以确保终端用户获得高质量的用户体验(QoE)。在现有先进系统中,这些需 求之间往往需要权衡取舍,但在5G环境下,这种权衡已不再可行。
电子学2016,5,67;doi:10.3390/electronics5040067 www.md p i.com/ j ournal/electronics
本文档由funstory.ai的开源PDF翻译库BabelDOCv0.5.10(http://yadt.io)翻译,本仓库正在积极的建设当中,欢迎star和关注。
电子学2016, 5, 67 2/25
由Ahlswede等人[2],提出的网络编码在研究人员和工业界理解和操作网络的方式上代表了一种 范式转变,它改变了中间中继在信息传输过程中的角色。中继不再局限于存储和转发数据,而是通过 称为再编码的过程参与编码,即中继在不解码数据的情况下生成传入编码数据包的新线性组合。网络 编码能够提高网络的吞吐量、可靠性、安全性和延迟性能。在先前的研究中,我们已经表明随机线性 网络编码(RLNC)[3,4]能够满足上述技术要求。我们实际上已经展示了如何提高吞吐量[5],减少延迟 [6]或支持编码启用的通信节点的异构性[7]。
在我们之前的研究中,C++11 Kodo库[8]被用作包含基本RLNC功能的通用构建模块。大部 分工作集中在仅有少量通信节点的小型网状网络上,而预期的应用场景远远超出这一规模。尽管这些 技术已在实际系统中成功部署,但许多协议和贡献是在不同的测试平台上分别实现的,相关经验难以 复现。构建用于网络与存储的大规模可配置测试平台具有挑战性,这不仅源于硬件本身的成本,还涉 及维护难题以及结果一致性复现的能力。后者不仅要求设备运行相同的操作系统(OS),还必须具备完 全一致的配置和软件包。因此,迫切需要以快速、易于部署、可复现且易于维护的方式,对低成本设 备的大规模网络部署进行评估。
功能强大且价格低廉的单板计算机的出现为这一领域开辟了新的可能性。通过运行标准操作系统, 它们使得实现方案能够与高端设备兼容。此外,它们利用了由社区支持的稳定软件。例如,I ridis‐pi平台[9]详细描述了一个适用于教育应用的树莓派(Raspi)[10]测试平台。在此,作者提供 了用于评估测试平台性能的计算速度基准、节点间通信吞吐量以及用于数据存储的存储卡写入速度。这项工作仅对如何设置所需软件进行了基本描述,并提到其维护可能耗时较长。此外,该研究未考虑 可能的网络编码应用。针对物联网应用的不同研究考虑使用树莓派进行数据处理:在[11],中,树莓 派作为处理单元,协调和控制公共道路上路灯岛的工作状态,并将信息上报至监控中心。文献[13]提 出了一种利用树莓派和Arduino[12]技术进行远程环境监控的用例。在此场景中,两种设备均报告 文化壁画所在位置的气压、湿度和温度,以及壁画本身的高分辨率图像。这些数据被发送到监控中心, 以确保壁画的保护。此外,文献[14]中的作者提出了FingerScanner技术,该技术利用树莓派作为 指纹扫描应用中的数据服务器来收集指纹。尽管所有这些应用都将树莓派视为核心模块,但它们对其 配置树莓派的流程几乎没有或完全没有描述。当这些系统需要扩展以服务更多用户时,这些应用的维 护将变得繁琐。如前所述,在当前的物联网应用所考虑的网络中,现有的数据传输方式在未来5G系统 中将不可行。
鉴于这一系列特定需求,本文介绍了利用多个树莓派设备构建低成本测试平台的设计方案、关键 的分步操作指南以及设置、配置和维护方法,该测试平台可用于网络(无线或有线)和存储应用,并 通过Kodo将随机线性网络编码功能集成到测试平台中。该架构本身并不局限于网络领域,也可用于 其他需要在树莓派上获得可复现结果的应用场景。本文关于测试平台的过程组织如下:第2节介绍测 试平台系统。第3节提供有关测试平台设置、脚本、配置文件和连接性的详细信息。第4节详细阐述了 为测试平台构建叠加文件系统的必要性和设置方法,以同时实现
2.测试平台概述与设计准则
测试平台的示意图如图1所示。该测试平台最多包含100台不同型号的树莓派。具体而言,在我 们的设计中考虑了以下型号:树莓派1型B版rev.2、树莓派2型B版V1.1和树莓派3型B版V1.2。每台 树莓派均配备一张8GB安全数字(SD)存储卡、一个有线和无线网络接口以及一个电源。所有树莓派都 连接到一个通用的局域网(LAN),以提供内部和外部连通性。在一般情况下,它们通过有线以太网接 口连接至校园网,该接口按照Linux中以太网接口的传统命名规则命名为eth0 [15]。我们选择校园 网是因为该测试平台供学生和学术人员用于执行受控且可重复场景的测量与实验,作为学术研究的一 部分。测试平台的描述及其搭建过程并不局限于这一学术场景。所有树莓派均配置为运行安全外壳 (SSH)守护进程,以便在校园网内轻松实现远程访问。我们已请求大学信息技术(IT)部门配置校园网 的动态主机配置协议(DHCP)服务器,为每台树莓派分配一个静态互联网协议(IP)地址。这消除了非 图形化应用下对树莓派连接显示器和键盘的需求。最后,我们的设计目标是通过各自存储卡中的自定 义可启动镜像来统一配置所有树莓派,同时仍允许最终用户在每台树莓派上本地存储文件。
我们将测试平台管理员称为从操作系统角度看拥有管理员权限并负责设置和配置测试平台的人员。设置与配置过程由测试平台管理员在运行Linux发行版的个人计算机上执行,如图1所示。尽管原则上 对管理员使用的Linux发行版并无限制,但我们将在基于Debian的Linux发行版中介绍我们的操作过 程。我们的基本设计是创建一个定制镜像,并将其存储到每台树莓派的内存卡中。配置完成后,我们 将生成的镜像文件存储在一个超文本传输协议(HTTP)服务器上,以便备份,以及供测试平台管理员 需要对该文件进行新的修改时使用。在本例中,我们已将所有文件存储在Zenodo[16],但测试平台 管理员应将我们的文件复制到其自己的HTTP服务器上以获得读写权限。我们还将所有树莓派设置所 需的配置文件和脚本放在HTTP服务器上,从而提供一个集中存放和修改系统设置的位置。这简化了 系统维护,因为并非每次都需要
电子学2016, 5, 67 25中的 4
在树莓派上进行持久性更改——例如,当不同用户希望在重启的测试平台上运行实验时。我们稍后将 介绍如何利用堆叠式文件系统来实现持久性和临时存储,以具备此功能。其目的是在重启后清除不需 要的数据,同时保留原始的定制镜像结构。如果测试平台管理员决定无论测试平台用途如何都仅保留 持久性更改,则该步骤过程为可选。最后,我们在系统之上集成了一套自动化、监控和交叉编译工具, 以简化重复性和长时间任务的执行,能够跟踪长时间任务进程的进展,并为测试平台管理员编译相关 的C++源代码。
3.操作系统镜像设置
在本节中,我们回顾为所有树莓派创建通用操作系统镜像的步骤。镜像设置包含三个主要步骤: 选择并下载操作系统镜像文件、修改镜像结构以及配置操作系统文件。接下来我们将详细说明所有这 些步骤,并在必要时对我们的设置选择进行简要讨论。为了执行这些步骤,我们使用命令行块标明测 试平台管理员需要在其个人计算机上依次输入的命令,以获得所需的设置。在本文所有的命令行块中, 我们会指明某个命令需要以根权限(#)还是普通用户权限($)运行。这些符号将作为命令的前缀。
3.1.操作系统选择与下载
首先,我们需要安装一个能在所有树莓派型号上正常运行的操作系统。我们将在测试平台管理员 PC上使用基于Debian的发行版来下载并设置镜像。另一种方法是使用Yocto项目为树莓派平台创建 定制的Linux发行版[17]。然而,此过程需要从头开始为树莓派平台汇编和编译所有软件,超出了我 们工作的范围。我们采用流行的基于Debian的RaspbianLinux[18],因为它是树莓派推荐的默认 操作系统。Raspbian提供两种版本:Raspbian和RaspbianLite。两者之间的区别在于, Raspbian包含预安装的桌面环境以供用户交互,而RaspbianLite默认仅允许通过命令行shell进行 交互。鉴于我们测试平台中的树莓派未连接显示器,我们决定使用RaspbianLite。如有需要,以后 可通过包管理器安装桌面环境。
最新的RaspbianLite安装包可以从Raspbian官方网站[18]下载。在撰写本文时,最新的可 用安装包为2016‐05‐27‐raspbian‐jessie‐lite.zip。为了确保安装包内容的稳定性,本过程基于该特 定版本的RaspbianLite,我们已将其托管于[16]。本文中使用的所有其他文件也可在该位置获取。测试平台管理员需将这些文件移至其自己的HTTP服务器。开始之前,测试平台管理员必须在其个人 计算机上打开一个Linuxshell(终端),并声明如下命令块中所示的环境变量。接下来我们将以测 试平台管理员的身份演示整个过程。
1 $exportURL="https://zenodo.org/record/154328/files/"
2 $export IMAGE="2016‐05‐27‐raspbian‐jessie‐lite"
3 $exportWORKDIR="$ {HOME}/Raspbian"
在此代码块中,${URL}和${IMAGE}变量指定了Linux捆绑包的位置,而${WORKDIR}指定 了用于下载和自定义RaspbianLite捆绑包的工作目录。如果测试平台管理员将其文件分配到其他位 置,则需要更改${URL}环境变量。请注意,尽管我们在shell中使用$和#符号,但通常这些符号 是特定于测试平台管理员操作系统shell的。接下来,我们使用cd命令创建工作目录并切换到该目录。为了下载镜像,我们先使用wget命令,然后按如下方式解压zip文件:
1 $mkdir‐p${WORKDIR}
2 $cd$ {WORKDIR}
3 $wget${URL%/}/$ {IMAGE}.zip
4 $解压$ {IMAGE}.zip
3.2.镜像定制
解压RaspbianLite后,工作目录${WORKDIR}中应有一个.img文件。可以使用fdisk显示 镜像的内容。我们解析参数‐u扇区以扇区为单位显示大小,以及‐l以显示镜像内的分区。fdisk命 令应在终端输出类似于以下内容:
1 $fdisk‐u=扇区‐l${IMAGE}.img
2 磁盘2016‐05‐27‐raspbian‐jessie‐lite.img:1.3吉字节,1387266048字节,2709504扇区
3 单位:1\* 512= 512字节的扇区
4 扇区大小(逻辑/物理):512字节/512字节
5 I/O大小(最小/最佳):512字节/512字节
6 磁盘标签类型:dos
7 磁盘标识符:0x6fcf21f3
8
9 设备 Boot开始结束扇区大小ID类型
10 2016‐05‐27‐raspbian‐jessie‐lite.img1 8192 137215 129024 63M cW95FAT32(LBA)
11 2016‐05‐27‐raspbian‐jessie‐lite.img2 13721627095032572288 1.2G83Linux
输出提供了有关镜像的相关信息。该镜像总大小为2,709,504扇区(1.3吉字节),包含两个分 区。第一个分区从第8192扇区开始,另一个分区从第137,216扇区开始。第一个分区的类型为 FAT32,大小为63兆字节,第二个分区的类型为Linux,大小为1.2千兆字节。这表明第一个分区 是启动分区,第二个分区是传统的Linux文件系统。在这种情况下,即为根文件系统,也就是/。
3.3.镜像调整大小
鉴于我们想要自定义树莓派的根文件系统,我们需要扩展镜像文件,因为1.2GB可能不足以存储 现有的根文件系统以及额外的文件和软件包。因此,我们需要增加分区大小。以下过程说明了如何将 镜像及其根文件系统扩展1GB。首先,为了将镜像扩展1GB,我们执行:
1 $ddif=/dev/zerobs=1Mcount=1024>>${IMAGE}.img&&sync
之后,我们使用与之前相同的参数运行fdisk,以查看镜像现在已增大1GB:
1 $fdisk‐u=扇区‐l${IMAGE}.img
2 磁盘2016‐05‐27‐raspbian‐jessie‐lite.img:2.3GiB,2461007872字节,4806656扇区
3 单位:1\* 512= 512字节的扇区
4 扇区大小(逻辑/物理):512字节/512字节
5 I/O大小(最小/最佳):512字节/512字节
6 磁盘标签类型:dos
7 磁盘标识符:0x6fcf21f3
8
9 设备 Boot开始结束扇区大小ID类型
10 2016‐05‐27‐raspbian‐jessie‐lite.img1 8192 137215 129024 63M cW95FAT32(LBA)
11 2016‐05‐27‐raspbian‐jessie‐lite.img2 13721627095032572288 1.2G83Linux
现在,在上述命令块的输出中,我们通过注意到可用镜像总大小为2.3GiB来确认更改已生效。
为了扩展根文件系统,我们将Linux分区替换为一个大1GB的新分区。这个新分区的起始点应与旧 分区相同。我们使用fdisk在以下命令中修改分区表。这些命令(i)删除分区号2;(ii)创建一个 新的主分区,并(iii)设置新分区的起始点。在本例中,新分区的起始点值为137,216;最后,我们 (iv)将新的分区表写入镜像文件。操作如下所示:
1 $fdisk${IMAGE}.img<<EOF
2 d
3 2
4 n
5 p
6 2
7 137216
8
9 w
10 EOF
如果分区命令正确,分区表现在应如下所示:
1 $fdisk‐u=扇区‐l${IMAGE}.img
2 磁盘2016‐05‐27‐raspbian‐jessie‐lite.img:2.3GiB,2461007872字节,4806656扇区
3 单位:1\* 512= 512字节的扇区
4 扇区大小(逻辑/物理):512字节/512字节
5 I/O大小(最小/最佳):512字节/512字节
6 磁盘标签类型:dos
7 磁盘标识符:0x6fcf21f3
8
9 设备 Boot开始结束扇区大小ID类型
10 2016‐05‐27‐raspbian‐jessie‐lite.img1 8192 137215 129024 63M cW95FAT32(LBA)
11 2016‐05‐27‐raspbian‐jessie‐lite.img2 13721648066554669440 2.2G83Linux
3.4.回环设备设置
成功调整镜像文件大小后,我们使用回环设备将Raspbian镜像作为块设备在文件系统中挂载。要使该命令生效,测试平台管理员发行版必须包含util-linux软件包,且版本需为2.21或更高版本。否则,-P参数对于losetup而言将被视为无效。如果由于某些原因无法更新losetup的版本,则附录 A.1中提供了一种替代方案。
1 $exportDEV=$(sudolosetup命令‐‐show‐f‐P${IMAGE}.img);echo$DEV
2 /dev/loop0
如果上一个命令成功,可以使用lsblk命令列出文件系统中可用的块设备如下:
1 #lsblk
2 NAME MAJ:MINRM SIZEROTYPEMOUNTPOINT
3 ...
4 loop0 7:0 0 2.3G 0loop
5 \| ‐loop0p1259:2 0 63M 0loop
6 \| ‐loop0p2259:3 0 2.2G 0loop
7 ...
镜像块设备显示为/dev/loop0。该块设备有两个相关联的分区,例如loop0p1和loop0p2。最后,我们使用e2fsck检查块设备的文件系统,并使用resize2fs命令调整其大小:
1 #e2fsck‐f${DEV}p2
2 e2fsck1.42.8(20‐Jun‐2013)
3 第一阶段:检查inode、块和大 小
4 第二阶段:检查目录结构
5 第三阶段:检查目录连通性
6 第四阶段:检查引用计数
7 第五 阶段:检查组摘要信息
8 /dev/loop0p2:35392/80480文件(0.1%非连续),201968/321536块
9 #resize2fs${DEV}p2
10 resize2fs1.42.8(20‐Jun‐2013)
11 正在调整/dev/loop0上文件系 统的大小至583680(4k)块。
12 文件系统/dev/loop0现在长度为583680块。
3.5.块设备挂载
为了浏览和修改镜像中的文件,我们将块设备分区挂载到${WORKDIR}的特定路径下以进行自 定义。我们首先挂载包含根文件系统的块设备分区,然后挂载启动分区。为此,需要创建一个空目录 作为挂载点,我们在工作目录中将其命名为root,然后将根文件系统挂载到该挂载点上。挂载根文件 系统的方法如下:
1 $exportROOTDIR="${WORKDIR}/root"
2 $mkdir‐p${ROOTDIR}
3 #挂载${DEV}p2${ROOTDIR}
在${ROOTDIR}中挂载的根文件系统已经包含一个可用于块设备/dev/loop0p1启动分区挂载 点的boot目录。这非常方便,因为当树莓派使用包含原始最终镜像的内存卡启动时,$ {ROOTDIR}/boot中最终编辑的分区将挂载到同一目录。因此,我们执行以下操作来挂载启动分区:
1 #挂载${DEV}p1${ROOTDIR}/boot
通过这种方式,现在可以通过编辑${ROOTDIR}中的文件来随意更改Raspbian镜像内的所有 文件。我们利用这一点来编辑配置文件、添加新文件,甚至更新和安装软件包。
3.6.镜像操作系统文件与配置脚本设置
一般来说,树莓派应尽可能设置成相同。然而,仍需存在一些特定差异以从根本上区分各个设备。此外,希望将包含对树莓派进一步配置的脚本作为公共镜像的一部分进行分发。因此,本文将介绍如 何设置树莓派的基本属性,并通过镜像向每个设备分发配置脚本。首先,我们将说明如何获取并将我 们的配置脚本放入镜像中;随后,描述这些配置脚本所执行的任务;最后,说明这些脚本如何以及按 何种顺序执行,以完成所有设备的配置。任何测试平台管理员都可以根据其需求修改或添加其他任务, 正如我们将展示的那样。
3.6.1.镜像默认配置脚本下载
在我们的案例中,默认的配置脚本存储在一个名为rasp_config.zip的文件中,该文件位于与镜 像相同的HTTP服务器URL上,即位于该环境中的服务器。
变量${URL}。我们首先使用wget下载此压缩文件,并将其在本地解压为RaspbianLite镜像。这些 命令以及最后一个命令的输出如下所示:
1 $wget${URL%/}/rasp_config.zip
2 $解压rasp_config.zip‐d${ROOTDIR}/home/pi/目录/
3 归档: rasp_config.zip
4 创建:${ROOTDIR}/home/pi/目录/rasp_config/
5 解压中:${ROOTDIR}/home/pi/目录/rasp_config/nodes.csv
6 解压中:${ROOTDIR}/home/pi/目录/rasp_config/set_主机名
7 解压中:${ROOTDIR}/home/pi/目录/rasp_config/主程序
8 解压中:${ROOTDIR}/home/pi/目录/rasp_config/update_rasp_config
解压后的文件包括一个配置文件和三个配置脚本,位于镜像中新建的${ROOTDIR}/home/pi/rasp_ config/目录下。我们描述了所有树莓派需要具备的功能,以及如何通过这些配置文件来实现这些功能。
3.6.2.设备主机名
主机名帮助用户从物理上区分各个设备。在我们的案例中,要求测试平台中的设备具有不同的主 机名。我们根据树莓派的有线以太网接口的介质访问控制(MAC地址)来定义主机名。
在此阶段之前,可以使用命令ifconfig或ipaddr在给定的树莓派上查找网卡的MAC地址。我 们将树莓派的MAC地址和主机名存储在配置文件${ROOTDIR}/home/pi/rasp_ config/nodes.csv中。以下是我们文件的一个示例:
${ROOTDIR}/home/pi/目录/rasp_config/nodes.csv 文章:简单的Pi:一个基于树莓派的网络编码测试平台
1 #以太网MAC 主机名
2 b8:27:eb:5b:da:20rasp00
3 b8:27:eb:7b:c3:91rasp01
4 b8:27:eb:54:9c:64rasp02
5 b8:27:eb:95:bd:11rasp03
6 ...
测试平台管理员需要按照配置文件中所示的格式,插入之前获取的树莓派的MAC地址和主机名。对于每个给定的树莓派,都有一个MAC地址和对应的主机名。该文件将被$ {ROOTDIR}/home/pi/rasp_config/set_hostnameBourneAgainSHell(Bash)脚本使用,以分 配每个树莓派的主机名。该脚本内容如下:
${ROOTDIR}/home/pi/目录/rasp_config/set_hostname
文章简单如Pi:一个基于树莓派的网络编码测试平台
1 #!/usr/bin/envbash
2
3 脚本_路径="$(dirname$(realpath$0))"
4 config_文件=${script_路径}/nodes.csv
5 mac=$(cat/sys/class/net/eth0/地址)
6 old_主机名=$(hostname)
7 new_主机名=$(grep$mac$config_文件 \|cut‐f2‐d'' )
8
9 #分配在nodes.csv中找到的主机名
10 如果[!‐z${new_主机名}];那么
11 echo${新_主机名}>/etc/主机名
12 主机名${new _hostname}
13 流编辑器‐i.old‐e"s:${old_主机名}:${new _hostname}:g"/etc/主机列表
14 fi
该脚本(按行):(1)告诉系统使用Bash解释该脚本;(3–4)获取脚本自身的路径和主机名列表; (5)获取节点自身的MAC地址;(6)获取当前主机名;(7)从主机名列表中获取新主机名;以及(10– 14)将新主机名分配给将执行该脚本的树莓派。
3.6.3.更新默认配置文件和脚本
除了到目前为止我们的过程中介绍的单个脚本及其配置文件外,测试平台管理员可能还需要添加 其他脚本来配置其树莓派。我们希望确保以一种简单的方式获取所有测试床管理员的树莓派配置脚本。为此,我们在过程中引入了${ROOTDIR}/home/pi/rasp_config/update_rasp_config脚本,以自动 化完成此任务。该脚本的目的是在测试床启动时,使所有树莓派获取镜像中包含的所有配置脚本。
在我们的案例中,作为演示该过程的测试平台管理员,我们希望从${URL%/}/raspi_ config.zip获取所有配置脚本。更新脚本automatically会自动从远程位置下载rasp_config.zip文件 中的所有必需配置文件。这与我们之前手动获取文件的操作相同,但将在系统启动后以自动化方式完 成。该脚本内容为:
${ROOTDIR}/home/pi/目录/rasp_config/update_rasp_config
文章:像π一样简单:一个基于树莓派的网络编码测试平台
1 #!/usr/bin/envbash
2
3 url="https://zenodo.org/record/154328/files/"
4 配置_文件="rasp_config.zip"
5
6 尝试获取新的配置文件
7 如果!wget‐q‐‐show‐progress‐O/tmp/${config_文件}${url%/}/${config_文件};则
8 echo"警告:无法更新rasp_config文件"
9 退出1
10 fi
11
12 解压并覆盖配置文件到root用户的主目录
13 解压‐q‐o/tmp/${config_文件}‐d/home/pi/目录
更新脚本的第3‐4行指定了应下载的URL和.zip文件。第7‐10行将配置文件下载到相应树莓派的/ tmp目录中。如果出现错误,还会打印警告信息,第13行将文件解压到/home/pi/目录,即树莓派的 主目录。现有的文件和目录将被直接覆盖。
为了让上述脚本在树莓派上正常运行,必须确保树莓派的MAC地址存在于nodes.csv中。此外, 需要注意的是,对于其他测试平台管理员,文件获取的URL以及配置脚本本身都可以根据其需求进行 修改。如果需要,测试床管理员可以编辑rasp_config.zip,以包含所有必需的配置文件和脚本。此 外,可能还需要修改脚本update_rasp_config中的URL,以便从不同的位置存储和获取文件。不过, 如果需要,此处提供的URL和配置文件可用作起始样板。
3.6.4.配置脚本执行顺序
要使树莓派实际更改主机名以及任何其他相关配置,我们必须让每台树莓派在启动时调用上述脚 本。完成设置过程后,第3.6.1节中解压的所有文件应在获取根文件系统后在每台树莓派上本地可用。我们首先需要运行更新脚本,然后才能运行任何其他配置
将其上的持久性和非持久性数据作为可选步骤。第5节描述了一组可包含在测试平台中的自动化与监控工具,以简化常规和重复性任务的执行。第6节详细阐述了为树莓派编译Kodo库的方法。第7节回顾了结论与未来工作。最后,在附录中讨论了一组替代命令,以防本文中提供的命令无法执行。
2.测试平台概述与设计准则
测试平台的示意图如图1所示。该测试平台最多包含100台不同型号的树莓派。具体而言,在我 们的设计中考虑了以下型号:树莓派1型B版rev.2、树莓派2型B版V1.1和树莓派3型B版V1.2。每台 树莓派均配备一张8GB安全数字(SD)存储卡、一个有线和无线网络接口以及一个电源。所有树莓派都 连接到一个通用的局域网(LAN),以提供内部和外部连通性。在一般情况下,它们通过有线以太网接 口连接至校园网,该接口按照Linux中以太网接口的传统命名规则命名为eth0 [15]。我们选择校园 网是因为该测试平台供学生和学术人员用于执行受控且可重复场景的测量与实验,作为学术研究的一 部分。测试平台的描述及其搭建过程并不局限于这一学术场景。所有树莓派均配置为运行安全外壳 (SSH)守护进程,以便在校园网内轻松实现远程访问。我们已请求大学信息技术(IT)部门配置校园网 的动态主机配置协议(DHCP)服务器,为每台树莓派分配一个静态互联网协议(IP)地址。这消除了非 图形化应用下对树莓派连接显示器和键盘的需求。最后,我们的设计目标是通过各自存储卡中的自定 义可启动镜像来统一配置所有树莓派,同时仍允许最终用户在每台树莓派上本地存储文件。
我们将测试平台管理员称为从操作系统角度看拥有管理员权限并负责设置和配置测试平台的人员。设置与配置过程由测试平台管理员在运行Linux发行版的个人计算机上执行,如图1所示。尽管原则上 对管理员使用的Linux发行版并无限制,但我们将在基于Debian的Linux发行版中介绍我们的操作过 程。我们的基本设计是创建一个定制镜像,并将其存储到每台树莓派的内存卡中。配置完成后,我们 将生成的镜像文件存储在一个超文本传输协议(HTTP)服务器上,以便备份,以及供测试平台管理员 需要对该文件进行新的修改时使用。在本例中,我们已将所有文件存储在Zenodo[16],但测试平台 管理员应将我们的文件复制到其自己的HTTP服务器上以获得读写权限。我们还将所有树莓派设置所 需的配置文件和脚本放在HTTP服务器上,从而提供一个集中存放和修改系统设置的位置。这简化了 系统维护,因为并非每次都需要
电子学2016, 5, 67 25中的 4
在树莓派上进行持久性更改——例如,当不同用户希望在重启的测试平台上运行实验时。我们稍后将 介绍如何利用堆叠式文件系统来实现持久性和临时存储,以具备此功能。其目的是在重启后清除不需 要的数据,同时保留原始的定制镜像结构。如果测试平台管理员决定无论测试平台用途如何都仅保留 持久性更改,则该步骤过程为可选。最后,我们在系统之上集成了一套自动化、监控和交叉编译工具, 以简化重复性和长时间任务的执行,能够跟踪长时间任务进程的进展,并为测试平台管理员编译相关 的C++源代码。
3.操作系统镜像设置
在本节中,我们回顾为所有树莓派创建通用操作系统镜像的步骤。镜像设置包含三个主要步骤: 选择并下载操作系统镜像文件、修改镜像结构以及配置操作系统文件。接下来我们将详细说明所有这 些步骤,并在必要时对我们的设置选择进行简要讨论。为了执行这些步骤,我们使用命令行块标明测 试平台管理员需要在其个人计算机上依次输入的命令,以获得所需的设置。在本文所有的命令行块中, 我们会指明某个命令需要以根权限(#)还是普通用户权限($)运行。这些符号将作为命令的前缀。
3.1.操作系统选择与下载
首先,我们需要安装一个能在所有树莓派型号上正常运行的操作系统。我们将在测试平台管理员 PC上使用基于Debian的发行版来下载并设置镜像。另一种方法是使用Yocto项目为树莓派平台创建 定制的Linux发行版[17]。然而,此过程需要从头开始为树莓派平台汇编和编译所有软件,超出了我 们工作的范围。我们采用流行的基于Debian的RaspbianLinux[18],因为它是树莓派推荐的默认 操作系统。Raspbian提供两种版本:Raspbian和RaspbianLite。两者之间的区别在于, Raspbian包含预安装的桌面环境以供用户交互,而RaspbianLite默认仅允许通过命令行shell进行 交互。鉴于我们测试平台中的树莓派未连接显示器,我们决定使用RaspbianLite。如有需要,以后 可通过包管理器安装桌面环境。
最新的RaspbianLite安装包可以从Raspbian官方网站[18]下载。在撰写本文时,最新的可 用安装包为2016‐05‐27‐raspbian‐jessie‐lite.zip。为了确保安装包内容的稳定性,本过程基于该特 定版本的RaspbianLite,我们已将其托管于[16]。本文中使用的所有其他文件也可在该位置获取。测试平台管理员需将这些文件移至其自己的HTTP服务器。开始之前,测试平台管理员必须在其个人 计算机上打开一个Linuxshell(终端),并声明如下命令块中所示的环境变量。接下来我们将以测 试平台管理员的身份演示整个过程。
1 $exportURL="https://zenodo.org/record/154328/files/"
2 $export IMAGE="2016‐05‐27‐raspbian‐jessie‐lite"
3 $exportWORKDIR="$ {HOME}/Raspbian"
在此代码块中,${URL}和${IMAGE}变量指定了Linux捆绑包的位置,而${WORKDIR}指定 了用于下载和自定义RaspbianLite捆绑包的工作目录。如果测试平台管理员将其文件分配到其他位 置,则需要更改${URL}环境变量。请注意,尽管我们在shell中使用$和#符号,但通常这些符号 是特定于测试平台管理员操作系统shell的。接下来,我们使用cd命令创建工作目录并切换到该目录。为了下载镜像,我们先使用wget命令,然后按如下方式解压zip文件:
1 $mkdir‐p${WORKDIR}
2 $cd$ {WORKDIR}
3 $wget${URL%/}/$ {IMAGE}.zip
4 $解压$ {IMAGE}.zip
3.2.镜像定制
解压RaspbianLite后,工作目录${WORKDIR}中应有一个.img文件。可以使用fdisk显示 镜像的内容。我们解析参数‐u扇区以扇区为单位显示大小,以及‐l以显示镜像内的分区。fdisk命 令应在终端输出类似于以下内容:
1 $fdisk‐u=扇区‐l${IMAGE}.img
2 磁盘2016‐05‐27‐raspbian‐jessie‐lite.img:1.3吉字节,1387266048字节,2709504扇区
3 单位:1\* 512= 512字节的扇区
4 扇区大小(逻辑/物理):512字节/512字节
5 I/O大小(最小/最佳):512字节/512字节
6 磁盘标签类型:dos
7 磁盘标识符:0x6fcf21f3
8
9 设备 Boot开始结束扇区大小ID类型
10 2016‐05‐27‐raspbian‐jessie‐lite.img1 8192 137215 129024 63M cW95FAT32(LBA)
11 2016‐05‐27‐raspbian‐jessie‐lite.img2 13721627095032572288 1.2G83Linux
输出提供了有关镜像的相关信息。该镜像总大小为2,709,504扇区(1.3吉字节),包含两个分 区。第一个分区从第8192扇区开始,另一个分区从第137,216扇区开始。第一个分区的类型为 FAT32,大小为63兆字节,第二个分区的类型为Linux,大小为1.2千兆字节。这表明第一个分区 是启动分区,第二个分区是传统的Linux文件系统。在这种情况下,即为根文件系统,也就是/。
3.3.镜像调整大小
鉴于我们想要自定义树莓派的根文件系统,我们需要扩展镜像文件,因为1.2GB可能不足以存储 现有的根文件系统以及额外的文件和软件包。因此,我们需要增加分区大小。以下过程说明了如何将 镜像及其根文件系统扩展1GB。首先,为了将镜像扩展1GB,我们执行:
1 $ddif=/dev/zerobs=1Mcount=1024>>${IMAGE}.img&&sync
之后,我们使用与之前相同的参数运行fdisk,以查看镜像现在已增大1GB:
1 $fdisk‐u=扇区‐l${IMAGE}.img
2 磁盘2016‐05‐27‐raspbian‐jessie‐lite.img:2.3GiB,2461007872字节,4806656扇区
3 单位:1\* 512= 512字节的扇区
4 扇区大小(逻辑/物理):512字节/512字节
5 I/O大小(最小/最佳):512字节/512字节
6 磁盘标签类型:dos
7 磁盘标识符:0x6fcf21f3
8
9 设备 Boot开始结束扇区大小ID类型
10 2016‐05‐27‐raspbian‐jessie‐lite.img1 8192 137215 129024 63M cW95FAT32(LBA)
11 2016‐05‐27‐raspbian‐jessie‐lite.img2 13721627095032572288 1.2G83Linux
现在,在上述命令块的输出中,我们通过注意到可用镜像总大小为2.3GiB来确认更改已生效。
为了扩展根文件系统,我们将Linux分区替换为一个大1GB的新分区。这个新分区的起始点应与旧 分区相同。我们使用fdisk在以下命令中修改分区表。这些命令(i)删除分区号2;(ii)创建一个 新的主分区,并(iii)设置新分区的起始点。在本例中,新分区的起始点值为137,216;最后,我们 (iv)将新的分区表写入镜像文件。操作如下所示:
1 $fdisk${IMAGE}.img<<EOF
2 d
3 2
4 n
5 p
6 2
7 137216
8
9 w
10 EOF
如果分区命令正确,分区表现在应如下所示:
1 $fdisk‐u=扇区‐l${IMAGE}.img
2 磁盘2016‐05‐27‐raspbian‐jessie‐lite.img:2.3GiB,2461007872字节,4806656扇区
3 单位:1\* 512= 512字节的扇区
4 扇区大小(逻辑/物理):512字节/512字节
5 I/O大小(最小/最佳):512字节/512字节
6 磁盘标签类型:dos
7 磁盘标识符:0x6fcf21f3
8
9 设备 Boot开始结束扇区大小ID类型
10 2016‐05‐27‐raspbian‐jessie‐lite.img1 8192 137215 129024 63M cW95FAT32(LBA)
11 2016‐05‐27‐raspbian‐jessie‐lite.img2 13721648066554669440 2.2G83Linux
3.4.回环设备设置
成功调整镜像文件大小后,我们使用回环设备将Raspbian镜像作为块设备在文件系统中挂载。要使该命令生效,测试平台管理员发行版必须包含util-linux软件包,且版本需为2.21或更高版本。否则,-P参数对于losetup而言将被视为无效。如果由于某些原因无法更新losetup的版本,则附录 A.1中提供了一种替代方案。
1 $exportDEV=$(sudolosetup命令‐‐show‐f‐P${IMAGE}.img);echo$DEV
2 /dev/loop0
如果上一个命令成功,可以使用lsblk命令列出文件系统中可用的块设备如下:
1 #lsblk
2 NAME MAJ:MINRM SIZEROTYPEMOUNTPOINT
3 ...
4 loop0 7:0 0 2.3G 0loop
5 \| ‐loop0p1259:2 0 63M 0loop
6 \| ‐loop0p2259:3 0 2.2G 0loop
7 ...
镜像块设备显示为/dev/loop0。该块设备有两个相关联的分区,例如loop0p1和loop0p2。最后,我们使用e2fsck检查块设备的文件系统,并使用resize2fs命令调整其大小:
1 #e2fsck‐f${DEV}p2
2 e2fsck1.42.8(20‐Jun‐2013)
3 第一阶段:检查inode、块和大 小
4 第二阶段:检查目录结构
5 第三阶段:检查目录连通性
6 第四阶段:检查引用计数
7 第五 阶段:检查组摘要信息
8 /dev/loop0p2:35392/80480文件(0.1%非连续),201968/321536块
9 #resize2fs${DEV}p2
10 resize2fs1.42.8(20‐Jun‐2013)
11 正在调整/dev/loop0上文件系 统的大小至583680(4k)块。
12 文件系统/dev/loop0现在长度为583680块。
3.5.块设备挂载
为了浏览和修改镜像中的文件,我们将块设备分区挂载到${WORKDIR}的特定路径下以进行自 定义。我们首先挂载包含根文件系统的块设备分区,然后挂载启动分区。为此,需要创建一个空目录 作为挂载点,我们在工作目录中将其命名为root,然后将根文件系统挂载到该挂载点上。挂载根文件 系统的方法如下:
1 $exportROOTDIR="${WORKDIR}/root"
2 $mkdir‐p${ROOTDIR}
3 #挂载${DEV}p2${ROOTDIR}
在${ROOTDIR}中挂载的根文件系统已经包含一个可用于块设备/dev/loop0p1启动分区挂载 点的boot目录。这非常方便,因为当树莓派使用包含原始最终镜像的内存卡启动时,$ {ROOTDIR}/boot中最终编辑的分区将挂载到同一目录。因此,我们执行以下操作来挂载启动分区:
1 #挂载${DEV}p1${ROOTDIR}/boot
通过这种方式,现在可以通过编辑${ROOTDIR}中的文件来随意更改Raspbian镜像内的所有 文件。我们利用这一点来编辑配置文件、添加新文件,甚至更新和安装软件包。
3.6.镜像操作系统文件与配置脚本设置
一般来说,树莓派应尽可能设置成相同。然而,仍需存在一些特定差异以从根本上区分各个设备。此外,希望将包含对树莓派进一步配置的脚本作为公共镜像的一部分进行分发。因此,本文将介绍如 何设置树莓派的基本属性,并通过镜像向每个设备分发配置脚本。首先,我们将说明如何获取并将我 们的配置脚本放入镜像中;随后,描述这些配置脚本所执行的任务;最后,说明这些脚本如何以及按 何种顺序执行,以完成所有设备的配置。任何测试平台管理员都可以根据其需求修改或添加其他任务, 正如我们将展示的那样。
3.6.1.镜像默认配置脚本下载
在我们的案例中,默认的配置脚本存储在一个名为rasp_config.zip的文件中,该文件位于与镜 像相同的HTTP服务器URL上,即位于该环境中的服务器。
变量${URL}。我们首先使用wget下载此压缩文件,并将其在本地解压为RaspbianLite镜像。这些 命令以及最后一个命令的输出如下所示:
1 $wget${URL%/}/rasp_config.zip
2 $解压rasp_config.zip‐d${ROOTDIR}/home/pi/目录/
3 归档: rasp_config.zip
4 创建:${ROOTDIR}/home/pi/目录/rasp_config/
5 解压中:${ROOTDIR}/home/pi/目录/rasp_config/nodes.csv
6 解压中:${ROOTDIR}/home/pi/目录/rasp_config/set_主机名
7 解压中:${ROOTDIR}/home/pi/目录/rasp_config/主程序
8 解压中:${ROOTDIR}/home/pi/目录/rasp_config/update_rasp_config
解压后的文件包括一个配置文件和三个配置脚本,位于镜像中新建的${ROOTDIR}/home/pi/rasp_ config/目录下。我们描述了所有树莓派需要具备的功能,以及如何通过这些配置文件来实现这些功能。
3.6.2.设备主机名
主机名帮助用户从物理上区分各个设备。在我们的案例中,要求测试平台中的设备具有不同的主 机名。我们根据树莓派的有线以太网接口的介质访问控制(MAC地址)来定义主机名。
在此阶段之前,可以使用命令ifconfig或ipaddr在给定的树莓派上查找网卡的MAC地址。我 们将树莓派的MAC地址和主机名存储在配置文件${ROOTDIR}/home/pi/rasp_ config/nodes.csv中。以下是我们文件的一个示例:
${ROOTDIR}/home/pi/目录/rasp_config/nodes.csv 文章:简单的Pi:一个基于树莓派的网络编码测试平台
1 #以太网MAC 主机名
2 b8:27:eb:5b:da:20rasp00
3 b8:27:eb:7b:c3:91rasp01
4 b8:27:eb:54:9c:64rasp02
5 b8:27:eb:95:bd:11rasp03
6 ...
测试平台管理员需要按照配置文件中所示的格式,插入之前获取的树莓派的MAC地址和主机名。对于每个给定的树莓派,都有一个MAC地址和对应的主机名。该文件将被$ {ROOTDIR}/home/pi/rasp_config/set_hostnameBourneAgainSHell(Bash)脚本使用,以分 配每个树莓派的主机名。该脚本内容如下:
${ROOTDIR}/home/pi/目录/rasp_config/set_hostname
文章简单如Pi:一个基于树莓派的网络编码测试平台
1 #!/usr/bin/envbash
2
3 脚本_路径="$(dirname$(realpath$0))"
4 config_文件=${script_路径}/nodes.csv
5 mac=$(cat/sys/class/net/eth0/地址)
6 old_主机名=$(hostname)
7 new_主机名=$(grep$mac$config_文件 \|cut‐f2‐d'' )
8
9 #分配在nodes.csv中找到的主机名
10 如果[!‐z${new_主机名}];那么
11 echo${新_主机名}>/etc/主机名
12 主机名${new _hostname}
13 流编辑器‐i.old‐e"s:${old_主机名}:${new _hostname}:g"/etc/主机列表
14 fi
该脚本(按行):(1)告诉系统使用Bash解释该脚本;(3–4)获取脚本自身的路径和主机名列表; (5)获取节点自身的MAC地址;(6)获取当前主机名;(7)从主机名列表中获取新主机名;以及(10– 14)将新主机名分配给将执行该脚本的树莓派。
3.6.3.更新默认配置文件和脚本
除了到目前为止我们的过程中介绍的单个脚本及其配置文件外,测试平台管理员可能还需要添加 其他脚本来配置其树莓派。我们希望确保以一种简单的方式获取所有测试床管理员的树莓派配置脚本。为此,我们在过程中引入了${ROOTDIR}/home/pi/rasp_config/update_rasp_config脚本,以自动 化完成此任务。该脚本的目的是在测试床启动时,使所有树莓派获取镜像中包含的所有配置脚本。
在我们的案例中,作为演示该过程的测试平台管理员,我们希望从${URL%/}/raspi_ config.zip获取所有配置脚本。更新脚本automatically会自动从远程位置下载rasp_config.zip文件 中的所有必需配置文件。这与我们之前手动获取文件的操作相同,但将在系统启动后以自动化方式完 成。该脚本内容为:
${ROOTDIR}/home/pi/目录/rasp_config/update_rasp_config
文章:像π一样简单:一个基于树莓派的网络编码测试平台
1 #!/usr/bin/envbash
2
3 url="https://zenodo.org/record/154328/files/"
4 配置_文件="rasp_config.zip"
5
6 尝试获取新的配置文件
7 如果!wget‐q‐‐show‐progress‐O/tmp/${config_文件}${url%/}/${config_文件};则
8 echo"警告:无法更新rasp_config文件"
9 退出1
10 fi
11
12 解压并覆盖配置文件到root用户的主目录
13 解压‐q‐o/tmp/${config_文件}‐d/home/pi/目录
更新脚本的第3‐4行指定了应下载的URL和.zip文件。第7‐10行将配置文件下载到相应树莓派的/ tmp目录中。如果出现错误,还会打印警告信息,第13行将文件解压到/home/pi/目录,即树莓派的 主目录。现有的文件和目录将被直接覆盖。
为了让上述脚本在树莓派上正常运行,必须确保树莓派的MAC地址存在于nodes.csv中。此外, 需要注意的是,对于其他测试平台管理员,文件获取的URL以及配置脚本本身都可以根据其需求进行 修改。如果需要,测试床管理员可以编辑rasp_config.zip,以包含所有必需的配置文件和脚本。此 外,可能还需要修改脚本update_rasp_config中的URL,以便从不同的位置存储和获取文件。不过, 如果需要,此处提供的URL和配置文件可用作起始样板。
3.6.4.配置脚本执行顺序
要使树莓派实际更改主机名以及任何其他相关配置,我们必须让每台树莓派在启动时调用上述脚 本。完成设置过程后,第3.6.1节中解压的所有文件应在获取根文件系统后在每台树莓派上本地可用。我们首先需要运行更新脚本,然后才能运行任何其他配置脚本。为此,在启动后,我们在文件${ROOTDIR}/etc/rc.local中的exit0之前添加对更新脚本的调用:
#流编辑器‐i'/^exit0/ibash/home/pi/目录/rasp_config/update_rasp_config'${ROOTDIR}/etc/rc.local
如果需要添加更多的配置脚本,直接将它们加入rc.local文件会使测试平台管理员的维护工作变 得困难,因为这些脚本需要同时存在于镜像和下载的rasp_config.zip中。为了避免这个问题,我们 包含了${ROOTDIR}/home/pi/rasp_config/main脚本,该脚本按顺序调用所有其他配置脚本(除 了update_rasp_config)。此脚本内容为:
${ROOTDIR}/home/pi/目录/rasp_config/主程序 文章简单如Pi:一个基于树莓派的网络编码测试平台
-2 #!/usr/bin/envbash
-2
-1 bash/home/pi/目录/rasp_config/set_主机名
-1 #其他任何必需的配置脚本...
通过这种方式,自动化过程得以简化,因为镜像写入存储卡后,我们无需再次修改$ {ROOTDIR}/etc/rc.local。现在,我们在${ROOTDIR}/etc/rc.local中插入对主脚本的调用,如下所示:
#流编辑器‐i'/^exit0/ibash/home/pi/目录/rasp_config/main'${ROOTDIR}/etc/rc.local
最后,${ROOTDIR}/etc/rc.local应该如下所示:
${ROOTDIR}/etc/rc.local
文章简单如Pi:一个基于树莓派的网络编码测试平台
-5 ...
-6 bash/home/pi/目录/rasp_config/update_rasp_config
-7 bash/home/pi/目录/rasp_config/main
-8 exit0
请注意,set_hostname现在由主脚本调用。更新脚本仍然被直接调用。这确保了所有配置脚本 在执行前均已更新。对更新脚本本身的更改将在下一次系统启动时生效。
3.7.通过更改虚拟根目录进行镜像包更新
除了在镜像中添加和配置文件外,测试平台管理员可能还希望在将镜像写入所有树莓派的存储卡 之前,在镜像中安装和更新软件包。从任何作为测试平台管理员PC的Linuxx86机器上,可以使用 chroot命令在快速模拟器(QEMU)[19]虚拟机监控器中针对ARM处理器。chroot是Linux中的一种方法,可将显式的根文件系统位置从/修改为任何其他路径。因此, 在本例中,我们可以在测试平台管理员Linux发行版中使用RaspbianLite镜像的根文件系统。然后, QEMU允许通过测试平台管理员PC架构的指令来执行针对树莓派镜像(ARM指令)的命令。由于树 莓派采用ARM处理器,因此需要先安装与QEMU相关的软件,并验证QEMU是否已启用ARM支 持。为此,请运行以下命令:
-1 #apt‐get安装binfmt‐supportqemuqemu‐user‐static
-2 #update‐binfmts‐‐displayqemu‐arm
-3 qemu‐arm(已启用):
-4 软件包= qemu‐user‐static
-5 类型= magic
-6 offset= 0
-7 magic=\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00
-8 掩码=\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
-9 解释器=/usr/bin/qemu‐arm‐static
-10 detector=
在之前的输出中,测试平台管理员必须确保第二个命令写入的是qemu‐arm(已启用)。如果情 况不是这样,则可以通过运行以下命令来启用它:
-1 #update‐binfmts‐‐enableqemu‐arm
假设已启用qemu‐arm,我们现在应该能够chroot进入RaspbianLite镜像。在实际切换到镜 像的根分区之前,需要执行一些命令。首先,为了从RaspbianLite镜像内部获得互联网访问,必须 将测试平台管理员Linux发行版的resolv.conf文件复制到镜像的根文件系统中。为此,需要运行以 下命令:
-1 $cd$ROOTDIR
-2 #cp/etc/resolv.conf${ROOTDIR}/etc/resolv.conf
现在,由于使用的是ARM架构,在继续操作之前,需要将/usr/bin/qemu‐arm‐static命令复 制到镜像中,运行以下命令:
-1 # cp/usr/bin/qemu‐arm‐static${ROOTDIR}/usr/bin
在更改根目录之前,必须为镜像填充目录proc、sys和dev,以便测试平台管理员能够控制测试 平台的表观根文件系统。这可以通过以下命令实现:
-1 #mount‐tprocprocproc/
-2 #mount‐‐bind/syssys/
-3 #mount‐‐ bind/devdev/
-4 #mount‐‐bind/ dev/ptsdev/pts
最后,运行以下命令来更改根目录:
-1 #chroot${ROOTDIR}/usr/bin/qemu‐arm‐static/bin/bash
如果执行成功,我们的终端提示符应该已经发生变化,表明我们现在是以apparentroot身份位 于RaspbianLite的根文件系统中。如果chroot命令执行不成功,我们在附录A.2的附录中提供了 一个替代命令。为了明确当前所处的工作模式,我们将提示符标题更改为如下所示的chroot环境:
-1 #exportPS1="(chroot)$PS1"
RaspbianLite镜像现在应该可以几乎像在树莓派上启动一样使用了。一个主要的区别是,测试 平台管理员PC的运行速度可能明显快于树莓派。因此,启用更新、升级以及安装新的软件包会比在树 莓派上更快。不过,更新和升级树莓派的软件包可能仍需要一些时间。要更新系统软件包列表,请运 行以下命令:
-1 (chroot)#apt‐getupdate
我们进一步安装了一些我们认为有用的软件包:
-1 (chroot)#apt‐getinstallvimgitscreen
vim是Linux的改进版vi编辑器,git用于管理Git仓库,以及screen[20]用于更好地处理长时间 运行的进程。将镜像写入内存卡时,到目前为止对镜像所做的所有更改在获取后都将存在于所有树莓派中。
4.叠加文件系统
原则上,我们的过程仅在测试平台管理员PC上设置时对镜像文件进行一次修改。此外,将该镜像 保留在树莓派中可为所有设备提供相同的初始系统。如果我们不在镜像设置过程中进行任何进一步的 修改,则在树莓派首次启动后创建的所有文件都将保留在内存卡中。由于内存卡的大小相对较小(8 GB),并且可能有多个用户使用该测试平台,因此维护起来较为繁琐。此外,不同的测试平台用户 可能希望在其实验中使用原始的定制镜像重新启动一个全新的系统。我们强调,如果测试平台管理员 仅考虑为其设备使用持久存储,则此步骤并非必要。此场景的一个用例可能是测试平台的单一用户, 或当测试平台管理员仅需设置少量树莓派时。
如果树莓派需要同时使用持久存储和非持久存储,我们在此介绍设置叠加文件系统的步骤。这种 文件系统允许一个上层文件系统叠加到一个下层文件系统之上。每当请求一个文件时,若上层文件 系统中没有该文件,则会将请求转发给下层文件系统;如果上层文件系统中已有该文件,则直接返回 该文件。此机制可用于我们的配置中,在启动时将根文件系统(即RaspbianLite)作为只读文件系 统挂载到树莓派上。一方面,镜像配置文件将在重启后保留,但这些目录中的本地数据将在重启后被 清除。为了实现持久化更改的可能性,我们将挂载在树莓派随机存取存储器(RAM)中的上层文件 系统(即/tmp)叠加到下层根文件系统之上,并使其可写。读取文件时可能返回下层文件系统的文 件,但如果进行保存,则文件会被存储在上层文件系统中。再次访问该文件时,将返回上层文件系统 中已存储的文件。重启之后,上层文件系统中所有存储的文件将被清除,而下层文件系统中不属于原 始镜像的文件也将被删除。
4.1.文件系统安装
假设我们仍处于用于安装软件包的RaspbianLite根文件系统的chroot环境中,此时
33

被折叠的 条评论
为什么被折叠?



