DietPi 6.0 发布,适用于树莓派

DietPi 是一个基于 Debian 的 Linux 发行版。它主要为 Raspberry Pi 树莓派等单板设备开发,但也可运行于包含 x86 及 Odroid 机器在内的其它架构中。其 1 月 28 日发布的最新版本 DietPi 基于 Debian Stretch (除了 Odroid 的之外)。

在这一版本中:所有镜像已被重新创建;已有的安装( v159 及以下)无法被升级且不再被支持;用户需安装最新的 v6.0 镜像以继续获得支持; 基于 ARMbian 的镜像目前包含主线内核 4.13+ 。 Native PC (EFI) 现在是一个 ISO ,配备了 clonezilla ;通过 Rufus write 简化了安装。

详细内容或其它变化见于其发布通告。

DietPI 拥有如下特性:

轻量:镜像文件大小最低为 400 MB 左右,比 Raspbian Lite 轻 3 倍;

优化了 CPU 及内存资源的使用,确保用户的单板设备的稳定运行;

简单的界面:使用轻量级的 Whiptail 菜单,让用户花费更少的时间于命令行;

DietPi-Software 快速简便得安装经过优化的常见软件;

DietPi-Config: 个性化配置设备的软硬件;

DietPi-Backup: 快速简便地备份及恢复 DietPi 系统;

用户可以选择日志程度,使用 DietPi-Ramlog 或 rsyslog 及 rotate 以记录重要事件并获得性能提升;

DietPi-Process 工具:控制软件的优先级( nice 、 affinity 及策略调度);

DietPi-Update 系统: DietPi 自动检查、提示可用更新并可以快速应用更新;

DietPi-Automation :允许用户在启动之前简单地配置好 dietpi.txt 以完全自动化 DietPi 的安装而无需用户输入。

DietPi 支持 RaspberryPi 、 NanoPi 、 OrangePi 等常见单板设备并提供了详细的教程文档。

封面图片原由 mrneilypops 载于 deviantart.com 。

文内转自 cnBeta,部分文字转录或衍生自 DistroWatch.com 的对应页面与 DietPi 官网。

安装Pi-hole,让树莓派为你过滤家中广告!

感谢 BeLittleYang 的投稿!Pi-hole 是一个很实用的系统,取出抽屉里吃灰的树莓派,开始服役发挥余热吧~

最近在使用DietPi这个魔改版Raspbian系统时意外的发现了这个神奇的软件(软件主页:https://pi-hole.net/,正如标题所说,它可以帮你过滤整个家中的广告,但不需要繁琐地针对每台设备进行设置,算是对非智能路由及低性能路由无法过滤广告的一种解决方案。

下面就讲解一下具体的安装方法咯。

注:同样适用于其他Linux设备

0.开始之前

首先你需要为你的树莓派安装好系统,然后你可能需要针对自家的网络环境为你的树莓派设置好静态IP,不同的路由器设置方法有一定差别,具体方法自行百度(关键词:路由品牌 静态IP)。

例如我刷了LEDE的路由器的设置在这里:

不过近几年的路由器大多会针对不同的设备设置固定的IP地址,所以如果你确定自己树莓派的IP地址不会变动,不设置也是OK的。

1.安装Pi-hole

Pi-hole的安装过程比较简单,只需在终端中输入一条命令即可:

curl -sSL https://install.pi-hole.net | bash

安装过程中你可以喝杯咖啡,看会儿书,刷会儿微博,直到你进入这个界面:

一路Enter,直到这里:

选择其中一个DNS提供商,或者选择最后一项自定义:

选好之后接着一路Enter,然后你继续可以喝杯咖啡,看会儿书,刷会儿微博,直到这里:

这时就已经安装完成了,访问上面给出的网址,输入密码即可进入后台。

如果需要修改密码,在终端中输入:

pihole -a -p newpassword

新的密码就设置好了。

2.配置路由

光设置好树莓派是没卵用的,毕竟我们要过滤的是整个局域网的广告,所以我们要针对路由器进行配置。

Pi-hole采用的是使用本地DNS服务器的方式在局域网中进行过滤,所以我们需要设置Pi-hole为当前网络的DNS。

方法1

这种方法适用于大部分路由器,直接将DNS设置在路由器上。但需要注意的是,应当将DNS设置在LAN接口上(区别于WAN),在我这里是这样的:

方法2(推荐)

这种方法适用于一些刷了OpenWRT(LEDE),DD-WRT,Tomato等自定义程度较高固件的路由器,推荐使用该方式

在DHCP选项中填入:6,树莓派IP地址

注:若使用该方式,建议将上游DNS设置为路由器

方法3

如果这些选项在你的路由器里都没有,Pi-hole也内置了一个DHCP服务器,具体设置方法不多阐述。

方法4

如果你愿意的话,你也可以针对每一台设备进行设置,方便针对不同的设备进行过滤,具体设置方法不多阐述,自行百度。

不管你使用的哪一种方式,设置完之后都建议重启一下路由器或开关一下飞行模式,让设备使用新的DNS。

3.配置Pi-hole

实际上进行完上面的步骤就已经可以使用了,下面就针对一些常用的功能进行说明。

过滤规则

过滤的规则在这里,可以看到已内置了一些规则:

实际上,Pi-hole使用的是hosts方式对广告进行过滤(类似AdAway),默认的规则对于国内环境不太友好,下面就附上适用于国内环境的一些hosts:

pihole -w `curl -sSL https://raw.githubusercontent.com/vokins/yhosts/master/data/moot/cps.txt https://raw.githubusercontent.com/vokins/yhosts/master/data/moot/error.txt https://raw.githubusercontent.com/vokins/yhosts/master/data/moot/hate.txt | sed ‘/^@/d; /^#/d; s/127.0.0.1 //’ | tr ”

” ” “`

如果还有哪些不错的去广告hosts,欢迎在评论区中留言。

相较于通常的过滤方式(如Adblock Plus、KoolProxy等),利用hosts过滤有自己的优缺点。优点是不会拖累网速(甚至可能有一定提升),缺点是过滤效果不尽如人意。

不过如果你要是想要利用这个做一些有违我国国情的事情,放心,那样的话就相当于在你家里再上了一道防火长城(Pi-hole只能将规则中的网站解析到自身以进行屏蔽)。

黑白名单

顾名思义就是对过滤规则的手动调整,黑名单分为匹配和通配两种,建议那些整天说退游的同学可以试试。白名单主要是针对一些有防过滤广告或被误杀的网站。

隐私设置

在这里你可以设置让一些不想在日志中出现的网站或设备隐藏起来,至于有什么用嘛……那各位自己心里的B数都很清楚啊……

Pi-hole上的一些其他高级功能这里就不多赘述了,有待自行探索。

4.Enjoy it!

到这里关于Pi-hole的全部设置就完成了,打开浏览器访问一些广告较多的网站,看看广告是否被屏蔽了、仪表盘上的数字是否增加,如果没有再仔细按照上面的步骤检查一遍,尤其是关于DNS设置的部分。

好了,和广告Say Goodbye吧!

树莓派:Raspbian Stretch 桌面版本更新

树莓派基金会今天发布了第一个 Debain Stretch 树莓派桌面版本,兼容通用 PC 和 Mac 硬件。并且还更新了一下用于树莓派的 Raspbian Stretch 系统。

关于 PC 和 Mac 版本

今年初,树莓派基金会发布了桌面操作系统 PIXEL OS。而后他们看到这个桌面版本逐渐流行,并决定持续发布这一版本。事实证明这项工作异常艰巨,特别是今年从 Jessie 版本的 Debian 版本到 Stretch 版本。

但是我们已经完成了将 Raspbian Stretch 中的所有相关代码移植到 Debian 的工作,所以从今天开始为您的 PC 或 Mac 提供第一个 Debian Stretch 版本的 Raspberry Pi Desktop。

Raspbian Stretch 系统的部分新特性

1.文件管理器

在旧系统中,文件管理器一直是 LXDE 的一部分。它的功能非常丰富,几乎没有什么是不能实现的。但是再使用了数年之后,官方决定将略显复杂的它用精简版替代。

移除了很多大部分用户不喜欢的菜单选项、重整了工具栏的图标风格。支持显示更为简洁的用户界面。

2.笔记本电脑的电量显示

既然都说适配普通 PC 了,当然要考虑笔记本电脑。这个版本在工具栏加入了电量显示,如图。

如果你使用 Pi-Top,请确认配置选项中 I2C 功能是开启的。

3.一些新应用

新系统中加入了一些适用于 PC 版本的新应用。比如 PiServer 允许你搭建一个类似于 Raspbian 的操作系统并将它共享给网络上的其他树莓派客户端。

最后给出传送门,获取新系统

Raspbian 树莓派版本:

https://www.raspberrypi.org/downloads/raspbian/

Raspbian 桌面版本:

https://www.raspberrypi.org/downloads/raspberry-pi-desktop/

用树莓派DIY自动“气象站”

自动气象站可以实时探测气温、湿度、气压、风速、风向、降雨量、紫外线辐射等气象信息,通过不同的传感器采集地面气象数据,数据采集完成后通过网络统一传输到气象服务器上,再经气象采集软件处理各项数据,最后通过专业气象软件传出。

网上搜索到之前大部分的设计都是基于DSP的方案,但是IoT时代,我们需要速成的设计,网上现成的传感器和树莓派教程能帮助我们迅速的设计出一个小型气象站。

正好我在网上看到 DIY hacking 上 Arvind Sanjeev 做了个类似项目。这个完整的天气系统,只用树莓派的基础硬件,摄像头,和一些我们使用的杂七杂八的模拟和数字传感器。

风速计和雨量计也都是自己做的。

产品特点:

在RRD和CSV上记录信息,方便被导出/导入到其它格式

使用天气地下API来得到历史高点和低点,月相和日出/日落等信息

使用树莓派相机拍摄一分钟一次的图片(可以用它来制作延时录像)

有显示当前天气状况和历史天气状况的数据网页(最后一小时,一天,七天,月,年)

网站主题随不同时间而改变(四个选项:日出,日落,白天和夜间)。

所有的进行记录和显示信息的软件在GitHub上开源。

这个项目是很好的学习经验,能帮助真正深入理解树莓派的能力,尤其是GPIO。

所需的材料

1、电子元件

9个簧片开关(8个用于风向,1个用于雨计,1个可选用为风速来代替霍尔传感器

1个霍尔传感器 (用于风速,称为风速计)

温度传感器

湿度传感器(许多湿度传感器集成了温度传感器),我用的DHT11

压力传感器(许多也集成了温度传感器),我用的BMP180

光敏电阻

GPS芯片或USB GPS

4个强磁体(2个用于风速计,1个用于方向,1个用于雨量计)

各类电阻器

MCP3008用来把模拟转换为数字输入

2、硬件

树莓派,我使用的B +

无线适配器

树莓派摄像头

5V电源适配器

3、材料

2个推力轴承 (或滑板或滑旱冰的轴承也行)

2个防水罩——我用的是超市的电器罩,找一个大小合适,有足够的空间且能保护设备的就可以。

一些PVC管和盖子(各种尺寸)

PVC安装支架

一些薄有机玻璃片(不用太花哨)

塑料支架

塑料螺钉

2个塑料圣诞树装饰品——用于风速计。

小木钉

小胶合板

4、工具

达美电磨

胶枪

烙铁

万用表

钻孔机

机箱

一个能装进树莓派、摄像头、GPS和光传感器的盒子。需要选防水的,因为它装进了所有关键元件,测量环境风吹雨打。

机箱包含:

树莓派(螺母上)——需要Wi-Fi芯片。

摄像头(螺母上)

GPS芯片通过USB连接(我用的FTDI电缆 )。GPS能提供纬度和经度,更重要的是,我可以从GPS获取精确的时间!

2个以太网/CAT5个插口,连接到主外壳与其它传感器。两个容器之间这样链接很方便。我用了大致12跟线缆,两个CAT5提供16个可能的连接,所以有空间做扩展。

测温度、湿度、压力的机箱

这是我放置温度、湿度和压力传感器的板子,以及用于雨量计,风向和风速传感器挂钩。

这一切都非常简单。。

制作雨量器

我大多沿用这个教程进行实际测量仪。

我是用有机玻璃来做的。总的来说,有机玻璃效果不错,结合胶枪,橡胶密封材料,以及整体切割和钻孔就更棒了。

关键点:

该传感器是一个简单的簧片开关和磁体,树莓派上充当按钮。我简单地计算随着时间的推移桶里的水位,后来转换为“雨/英寸。”

让它大到足以容纳足够的水来翻转,但不用太大因为需要很多个。我的第一个制作失败了因为不够大,所以它会被填满,并开始在它倾斜之前开始排水。

风向

这很简单。

关键点:

这是一种模拟传感器。

拧在风向标的后面,您需要校准它,“这个方向就是指向北方。”

我做了一个木试验台,有所以我可以在全量程内轻松切换电阻器。

我使用的推力轴承工作得很好。

软件

该软件也是开源的,可以在同一个GitHub库拿到。

软件是用Python写的,记录来自传感器的数据。 我第三方的库,获得来自传感器和GPS信息。

看起来很不错吧?

链接表

Google 推出树莓派 AIY 计算机视觉开发工具

Google 为树莓派(Raspberry Pi)爱好者提供了一套新工具,让他们以更有趣的方式使用 Google 的 AI 工具。AIY Vision Kit 套装包括新的计算机视觉软件和新的电路板,用户可以将其配合自己的树莓派电脑和相机使用,当然还包括一个可爱的硬纸盒,以及一些辅助配件。AIY Vision Kit 要价 44.99 美元,将于 12 月 31 日通过 Micro Center 发售。

AIY Vision Kit 的软件包括 3 种神经网络模型,一个可以识别上千种物体,一个可以识别面部表情,还有一个“人、猫和狗识别器”。用户可以使用 Google 的 TensorFlow 机器学习软件训练自己的模型。

Google 表示这是一个廉价且简单的计算机视觉系统,由于本地处理单元的存在,所以它不需要联网就能完成计算。这是 Google AIY 推出的第 2 个项目,在推出 AIY 计算机视觉开发套包之前,Google 还曾为树莓派推出过一款 Voice HAT 计算机语音开发套包,让用户通过 Google Assistant 命令树莓派控制设备。

购买链接。

配置树莓派USB接口的电流限制

树莓派的USB接口是有电流限制的,默认只能达到600mA。这给外接一些对电流要求较高的设备时会遇到电流不足的问题,导致无法工作或工作不稳定。

例如外接某些移动硬盘,我们通常需要加入额外的电源来对这些设备供电。当然可以选择有源 USB HUB 来很好地解决。

而今天介绍的一种方案,只需要修改树莓派系统的配置,即可提高 USB 接口供电的电流限制(最大为 1.2A)。

首先申明一些重要的注意事项:

首先需要合理评估超载的电流是否在可以接受的范围内,如超出默认值 600mA 50%以上,则墙裂建议用有源 HUB 方案。

本方案不可用于树莓派 Zero。也不适用于 2017-04-10 之前的 Raspbian 系统。

使用该方案之后,树莓派将失去保修的条件。

分享本方案仅供专业玩家了解这个配置项,如果你无法理解或无法对负载进行合理评估请勿继续阅读,我们非常不愿意看到因为忽视了以上事项而导致你的树莓派主板因过载而报废。同时对进行该项尝试而发生的任何可能的损失免责。

因树莓派的USB接口电流大小由USB电流保护芯片进行限制,所以通过旁路USB电流保护芯片(即不让电流从电流保护芯片流过)就可以实现更大电流。

具体配置需要修改 /boot/config.txt 这个文件,在最后面添加三行。

max_usb_current=1 current_limit_override=0x5A000020 avoid_warnings=2

由于电源芯片限制,最大电流为1.2A。重新启动树莓派即可生效。

曾经有一个树莓派摆在你的面前正常工作着,你要好好珍惜哦~(采用请慎重)

修改树莓派交换分区 SWAP 的正确姿势

树莓派实验室按:Swap分区是磁盘上的一个特殊用途的分区。是当系统的物理内存不够用的时候,把物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。

分配太多的Swap空间,会浪费磁盘空间,而Swap空间太少,则系统会发生错误。一般在内存小于2G的情况下,交换分区应为内存的2倍。对于树莓派来说,可以设置为2GB。当然也需要考虑 microSD 卡容量和使用情况。

错误的做法

下面是错误的做法!错误的做法!错误的做法!重要的事情说三遍!!!

一直以来,我以为树莓派的 swap 和普通 linux 的差不多,也就照着某些网站上的方法修改树莓派的交换分区大小。

熟悉的套路开始了!

首先,查看内存大小:

$ free -m total used free shared buff/cache available Mem: 976 35 226 12 714 864 Swap: 99 0 99

然后:

$ sudo dd if=/dev/zero of=/swapfile bs=1024 count=102400 $ sudo mkswap /swapfile $ sudo chown root:root /swapfile $ sudo chmod 0600 /swapfile $ sudo swapon /swapfile $ sudo vi /etc/fstab

接着,添加以下内容到fstab文件尾:

/swapfile swap swap defaults 0 0

查看是否有swap空间

$ free -m

重启后,你就会发现树莓派的 swap 又回到还原了。

正确的做法

如果你按照上面的方法做了,只需删除 swap 分区:

$ sudo swapoff /swapfile $ sudo rm /swapfile

然后将自己在 /etc/fstab 文件添加的那一行删除。

下面开始正式修改树莓派的 swap 的大小:

sudo vi /etc/dphys-swapfile

将 CONF_SWAPSIZE 的值修改成你想要的大小。 一般在内存小于2G的情况下,交换分区应为内存的2倍!

然后,重新启动 dphys-swapfile 文件服务:

sudo /etc/init.d/dphys-swapfile restart

最后查看大小:

$ free -h total used free shared buff/cache available Mem: 976M 66M 801M 12M 108M 849M Swap: 2.0G 0B 2.0G

后记

在修改 /etc/fstab 文件的时候,我在下面的注释里发现了这样的两句话:

# a swapfile is not a swap partition, no line here

# use dphys-swapfile swap[on|off] for that

不过当时并不知道 dphys-swapfile 是什么,也不知道它在哪。后来通过搜索 dphys-swapfile 查阅到这篇文章 How to change Raspberry Pi’s Swapfile Size on Raspbian,终于找到了正确修改树莓派交换分区的方法。

转自: http://wanshicheng.org

圣诞老人检测机:基于树莓派和 Keras 的深度学习 AI

各位 MAKER 们大家圣诞节快乐啊!

热门美剧《硅谷》中的人物创建了一个“不是热狗”APP,可以确定输入的照片是“热狗”还是“不是热狗”。今天我们介绍如何使用Keras在Raspberry Pi上运行一个识别圣诞老人的深度神经网络,仅仅用130行代码,成功在圣诞老人来你家时点亮圣诞树同时播放圣诞歌曲来迎接!来试试看~

今天这篇文章是使用Keras在Raspberry Pi上运行深度神经网络的一个完整指南。

我把这个项目当做一个“不是圣诞老人”(Not Santa)检测器,教你如何实际地实现它(并且过程中乐趣无穷)。

第一部分,我们说一下什么是“圣诞老人检测器”(可能你不熟悉热播美剧《硅谷》里的“不是热狗”识别App,现在已经有人把它实现了)。

然后,我们将通过安装TensorFlow、Keras和其他一些条件来配置树莓派进行深度学习。

树莓派为深度学习配置好之后,我们将继续构建一个Python脚本,它可以:

从磁盘加载Keras模型

访问树莓派相机模块/usb网络摄像头

应用深度学习来检测圣诞老人是否在框内

如果发现圣诞老人,就可以访问GPIO pin并播放音乐

那么让我们开始吧!

什么是Not Santa检测器?

图1:HBO美剧《硅谷》里的“不是热狗”识别应用程序

“不是圣诞老人”检测器灵感来自HBO美剧《硅谷》。剧中人物创建了一个App,可以确定输入的照片是“热狗”还是“不是热狗”。这个节目显然是在取笑美国硅谷的创业文化:

对机器学习和深度学习的炒作

讽刺大量手机App都毫无用处(但发明者相信他们的App将会“改变世界”)。

今天,我们决定做一个“不是圣诞老人”检测器,它可以检测出圣诞老人是否在一个图像/视频框中。

为那些不熟悉圣诞老人的人简单说明一下,圣诞老人是一个诙谐、肥胖、白胡子、虚构的西方文化人物,会在圣诞前夜给小孩子送礼物。

不过,我们这个App并不完全是为了好玩和讽刺。我们将学习一些实用的技能,包括:

为深度学习配置树莓派

在树莓派上安装Keras和TensorFlow

部署一个预训练的卷积神经网络到你的树莓派上

一旦检测到,就执行一个给定的动作

硬件配置

但是在编写代码之前,让我们先来说一下我们需要的硬件。

图2:“不是圣诞老人”检测器的设置包括树莓派3、扬声器、3D圣诞树和一个网络摄像头,为了检测圣诞老人,树莓派在Python脚本中用Keras实现LeNet。

遵循这个教程,你需要:

树莓派3(同时强烈推荐树莓派3入门套件)

一个树莓派相机模块或一个USB相机。

适用树莓派的3D圣诞树

一组音箱

当然,这些不是全部必须的。只要有一个树莓派+相机模块/usb摄像头,就能全部设置好(但是必须修改代码,这样它就不会试图访问GPIO pins或通过音箱播放音乐)。

你的设置应该与上面的图2相似,把扬声器、3D圣诞树和网络摄像头连接在一起。我还推荐使用HDMI监视器+键盘来测试并调试脚本:

图3:我的深度学习设置包括树莓派和组件,以及键盘、鼠标和一个小的HDMI显示器。这样设置好后,圣诞老人来到我的圣诞树前放礼物时一定能抓到他。

怎样在树莓派上安装TensorFlow和Keras?

关于如何使用Kera来训练卷积神经网络,以确定圣诞老人是否处于输入的图像中,可以参考[1]:

我们将采用预训练的模型,并将其部署到树莓派上。正如我之前提到的,树莓派不适合训练神经网络。但是,树莓派可以部署训练好的神经网络(当然,模型需要能够适应很小的内存占用空间)。

我假设你已经在树莓派上安装了OpenCV。如果还没有,可以看[2]的教程。

建议增加树莓派的交换空间,这能使你能够使用Raspberry Pi SD卡来增加内存(当尝试在内存限制的树莓派上编译和安装大型库时,这是一个关键步骤)。

要增加交换空间,打开 /etc/dphys-swapfile然后编辑CONF_SWAPSIZE变量:

# set size to absolute value, leaving empty (default) then uses computed value # you most likely don’t want this, unless you have a special disk situation # CONF_SWAPSIZE=100 CONF_SWAPSIZE=1024

我将交换空间从100MB增加到了1024MB。然后,重新启动交换服务器:

$ sudo /etc/init.d/dphys-swapfile stop $ sudo /etc/init.d/dphys-swapfile start

注意:增加交换空间容易烧毁存储卡,因此请确保恢复这个更改并在完成后重启交换服务器。

然后,我们开始配置开发环境。

首先,使用Python 2.7创建一个名为not_santa的Python虚拟环境:

$ mkvirtualenv not_santa -p python2

请注意,-p开关指向python2,指示Python 2.7将用于虚拟环境。

还要确保你已经把cv2.so绑定到not_santa虚拟环境中:

$ cd ~/.virtualenvs/not_santa/lib/python2.7/site-packages $ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so

同样,要再次确认已经用Python 2.7绑定编译了OpenCV,还要仔细检查cv2.so文件的路径,以防安装路径与我的演示有不同。

如果你编译了Python 3 + OpenCV绑定,创建了sym-link,然后试图将cv2导入你的Python shell,你会得到一个令人困惑的路径回溯,说导入失败。

重要说明:对于接下来的几个pip命令,要确保你处于not_santa环境,否则你会把这些包安装到树莓派的系统Python中。

要进入环境,只需在bash提示符下使用workon命令:

$ workon not_santa

然后,你会在bash提示符开头看到“(not_santa)”。

确保使用以下命令在not_santa环境中安装NumPy:

$ pip install numpy

由于我们将访问该项目的GPIO pins,因此需要同时安装RPi.GPIO和gpiozero:

$ sudo pip install RPi.GPIO gpiozero

现在在树莓派上安装TensorFlow。问题是没有一个官方的(Google发布的)TensorFlow发行版,那就要在树莓派上从头开始编写TensorFlow,参考[3]。

或者我们可以使用预先编译的二进制文件Sam Abrahams(GitHub上有[4])。

问题是只有两种类型的预编译的TensorFlow二进制文件,一个用于Python 2.7,另一个用于Python 3.4。

Raspbian Stretch发行版附带了Python 3.5,因此,我们的版本不匹配。为了避免Python 3.4和Python 3.5之间的麻烦,我决定坚持使用Python 2.7安装。

让我们继续,使用以下命令为Python 2.7安装TensorFlow:

$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl $ pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl

TensorFlow编译和安装好后(我花了大约一个小时),然后需要安装HDF5和H5py。这些库将允许我们从磁盘加载预训练的模型:

$ sudo apt-get install libhdf5-serial-dev $ pip install h5py

最后,让我们安装Keras和这个项目所需的其他条件:

$ pip install pillow imutils $ pip install scipy –no-cache-dir $ pip install keras

为了测试你的配置,请打开一个Python shell(在not_santa环境中)并执行以下命令:

$ workon not_santa $ python >>> import h5py >>> from gpiozero import LEDBoard >>> from gpiozero.tools import random_values >>> import cv2 >>> import imutils >>> import keras Using TesnsorFlow backend. >>> print(“OpenCV version: {}”.format(cv2.__version__)) ‘3.3.1’ >>> print(“Keras version: {}”.format(keras.__version__)) ‘2.0.8’ >>> exit()

如果一切按计划进行,你应该看到使用TensorFlow后端导入的Keras。

正如上面的输出所示,你还应该仔细检查OpenCV绑定(cv2)是否可以导入。

最后,不要忘记通过以下方式将交换空间从1024MB减到100MB:

打开/etc / dphys-swapfile

重置CONF_SWAPSIZE为100MB。

重新启动交换服务器

在树莓派运行Keras + 深度学习模型

现在我们准备使用Keras,TensorFlow和树莓派来编写一个Not Santa检测器。再次,我会假设你的硬件设置和我的一样,如果不一样,你需要修改下面的代码。

首先,请打开一个新文件,将其命名为not_santa_detector.py,插入以下代码:

# import the necessary packages from keras.preprocessing.image import img_to_array from keras.models import load_model from gpiozero import LEDBoard from gpiozero.tools import random_values from imutils.video import VideoStream from threading import Thread import numpy as np import imutils import time import cv2 import os

第2-12行处理输入,特别是:

keras: 用于预处理输入帧进行分类,并从磁盘加载预训练的模型。

用于预处理输入帧进行分类,并从磁盘加载预训练的模型。 gpiozero: 用于访问3D圣诞树。

用于访问3D圣诞树。 imutils: 用于访问视频流(无论是树莓派相机模块还是USB)。

用于访问视频流(无论是树莓派相机模块还是USB)。 threading:用于non-blocking操作,尤其是当我们要点亮圣诞树或播放音乐的同时不阻塞主线程的执行。

然后,定义一个函数来点亮3D圣诞树:

def light_tree(tree, sleep=5): # loop over all LEDs in the tree and randomly blink them with # varying intensities for led in tree: led.source_delay = 0.1 led.source = random_values() # sleep for a bit to let the tree show its Christmas spirit for # santa clause time.sleep(sleep) # loop voer the LEDs again, this time turning them off for led in tree: led.source = None led.value = 0

light_tree函数接受一个tree参数(被设为一个LEDBoard对象)。

首先,我们循环tree中的所有LED,并随机点亮每个LED,以产生“闪烁”效果(17-19行)。

我们让灯亮一段时间(第23行),然后再次循环LED,然后把它关掉(26-28行)。

下面是一个打开3D圣诞树灯的例子:

图6:Raspberry Pi的3D圣诞树

当检测到圣诞老人时,下一步是播放音乐

def play_christmas_music(p): # construct the command to play the music, then execute the # command command = “aplay -q {}”.format(p) os.system(command)

在play_christmas_music函数中,对aplay命令进行系统调用,从而能够像从命令行那样播放音乐文件。

然后,让我们硬编码将使用的配置:

# define the paths to the Not Santa Keras deep learning model and # audio file MODEL_PATH = “santa_not_santa.model” AUDIO_PATH = “jolly_laugh.wav” # initialize the total number of frames that *consecutively* contain # santa along with threshold required to trigger the santa alarm TOTAL_CONSEC = 0 TOTAL_THRESH = 20 # initialize is the santa alarm has been triggered SANTA = False

第38行和第39行将硬编码到预训练的Keras模型和音频文件的路径。文末的下载可以获取音频文件。

初始化用于检测的参数,包括TOTAL_CONSEC和TOTAL_THRESH。这两个值表示包含圣诞老人的帧的数量以及我们将分别播放音乐和打开树的阈值(第43行和第44行)。

最后的初始化是SANTA = False,一个boolean(第47行)。我们稍后将在脚本中使用SANTA变量作为状态标志。

接下来,加载预训练的Keras模型并初始化圣诞树:

# load the model print(“[INFO] loading model…”) model = load_model(MODEL_PATH) # initialize the christmas tree tree = LEDBoard(*range(2, 28), pwm=True)

Keras允许我们将模型保存到磁盘以供将来使用。Not Santa模型已经保存到了磁盘上[1],那么我们把它加载到树莓派上。第51行使用Keras load_model函数加载了模型。

第54行实例化tree对象。如图所示,tree是gpiozero包中的一个LEDBoard对象。

然后初始化视频流:

# initialize the video stream and allow the camera sensor to warm up print(“[INFO] starting video stream…”) vs = VideoStream(src=0).start() # vs = VideoStream(usePiCamera=True).start() time.sleep(2.0)

要访问摄像机,在imutils包中使用VideoStream

重要提示:如果你想在本项目中使用PiCamera模块(而不是USB摄像头),只需注释第58行并取消第59行的注释即可。

Sleep 两秒钟,以便相机预热(第60行),然后开始循环播放帧:

# loop over the frames from the video stream while True: # grab the frame from the threaded video stream and resize it # to have a maximum width of 400 pixels frame = vs.read() frame = imutils.resize(frame, width=400)

第63行,我们开始循环播放视频帧,直到满足停止条件(稍后在脚本中显示)。

首先,通过调用vs.read来获取一个frame(第66行)。

然后调整frame为width= 400,保持纵横比(第67行)。在喂入神经网络模型之前预处理这个frame。稍后,我们将显示框架以及文本标签。

然后预处理图像,并通过Keras +深度学习模型进行预测:

# prepare the image to be classified by our deep learning network image = cv2.resize(frame, (28, 28)) image = image.astype(“float”) / 255.0 image = img_to_array(image) image = np.expand_dims(image, axis=0) # classify the input image and initialize the label and # probability of the prediction (notSanta, santa) = model.predict(image)[0] label = “Not Santa” proba = notSanta

第70-73行预处理图像并准备分类。然后,我们查询model.predict与image作为参数。这向神经网络发送image,返回包含类概率的tuple(第77行)。

我们将label初始化为“Not Santa”,并将概率proba初始化为第78和79行中notSanta的值。

我们来看看圣诞老人是否在图像中:

# check to see if santa was detected using our convolutional # neural network if santa > notSanta: # update the label and prediction probability label = “Santa” proba = santa # increment the total number of consecutive frames that # contain santa TOTAL_CONSEC += 1

在83行检查圣诞老人的概率是否大于notSanta。如果是,就继续更新label和proba,然后递增TOTAL_CONSEC(85-90行)。

如果连续提供了足够的“Santa”帧,就需要触发圣诞老人警报:

# check to see if we should raise the santa alarm if not SANTA and TOTAL_CONSEC >= TOTAL_THRESH: # indicate that santa has been found SANTA = True # light up the christmas tree treeThread = Thread(target=light_tree, args=(tree,)) treeThread.daemon = True treeThread.start() # play some christmas tunes musicThread = Thread(target=play_christmas_music, args=(AUDIO_PATH,)) musicThread.daemon = False musicThread.start()

如果SANTA为False,并且TOTAL_CONSEC达到TOTAL_THRESH阈值,就有两个操作要执行:

创建并启动一个treeThread来闪烁圣诞树灯(98-100行)。

创建并启动一个musicThread在后台播放音乐(103-106行)。

这些线程将独立运行,不停止脚本的正向执行(即非阻塞操作)。

在第95行,我们将我们的SANTA状态标志设置为True,意味着我们在输入框架中找到了圣诞老人。 在循环的下一个loop中,我们将像第93行那样查看这个值。

否则(SANTA为True或TOTAL_THRESH未满足),我们将TOTAL_CONSEC重置为零,并将SANTA重置为False:

# otherwise, reset the total number of consecutive frames and the # santa alarm else: TOTAL_CONSEC = 0 SANTA = False

最后,我们使用生成的文本标签将框架显示在屏幕上:

# build the label and draw it on the frame label = “{}: {:.2f}%”.format(label, proba * 100) frame = cv2.putText(frame, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) # show the output frame cv2.imshow(“Frame”, frame) key = cv2.waitKey(1) & 0xFF # if the `q` key was pressed, break from the loop if key == ord(“q”): break # do a bit of cleanup print(“[INFO] cleaning up…”) cv2.destroyAllWindows() vs.stop()

概率的值被附加到包含“圣诞老人”或“不是圣诞老人”的label(第115行)。

然后使用OpenCV的cv2.putText,可以在框架顶部显示标签(以圣诞节为主题的绿色),然后将框架显示在屏幕上(116-120行)。

无限while loop 的退出条件是在键盘上按下“q”键(121-125行)。如果循环的退出条件满足,则在脚本退出之前,break并执行第129行和第130行的一些清理。

完成!

回头看看这130行代码,这个框架/模板也可以很容易地用于树莓派上的其他深度学习项目。

现在,让我们来抓那个胖胖的,有胡子的,快活的圣诞老人吧!

深度学习+ Keras +树莓派结果

图7:我,Adrian Rosebrock,扮成圣诞老人。我将亲自测试使用深度学习,Keras,Python和OpenCV构建的“不是圣诞老人”检测器。

然后,我把相机朝着客厅里的圣诞树上的树莓派:

图8:圣诞树将作为测试已经部署到树莓派上的Not Santa深度学习模型的背景。

如果圣诞老人来为给我的好孩子们送礼物,我想确保通过闪烁3D圣诞树灯和播放圣诞歌曲来欢迎他。

然后,我使用以下命令启动了Not Santa深度学习+ Keras检测器:

$ python not_santa_detector.py

Not Santa 检测器启动并运行后,我就开始行动:

亲爱的圣诞老人:如果你读到了这里,要知道我会用树莓派找到你哦!

参考:

[1]https://www.pyimagesearch.com/2017/12/11/image-classification-with-keras-and-deep-learning

[2]https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi

[3]https://github.com/samjabrahams/tensorflow-on-raspberry-pi/blob/master/GUIDE.md

[4]https://github.com/samjabrahams/tensorflow-on-raspberry-pi

原文:https://www.pyimagesearch.com/2017/12/18/keras-deep-learning-raspberry-pi/

作者:Adrian Rosebrock 翻译:鲁道夫

在树莓派上用 Syncthing 自建私有云盘

自建的私有云网盘软件很多,比如 Seafile、ownCloud 等,功能很实用,而 Syncthing 最大的特色是采用了与 Resilio Sync (BitTorrent Sync) 类似的 P2P 分布式技术,无需中心服务器,即可让多台设备互相实时同步文件,用过 Resilio Sync 的朋友都明白这种同步方式的优势了。它们两者的实现方式很相似,区别是 Resilio 属于商业软件,需付费使用,在国内已慢慢变得访问(被)困难(墙),而 Syncthing 不仅完全免费且开源,相比 Resilio 还增加了「文件版本控制」、「单向同步」等堪称杀手级的功能特性。

Syncthing 功能上非常接近于 Resilio Sync / BT Sync,不过说它是一款用于搭建网盘的服务器软件或者云存储服务应用似乎并不十分恰当,相较于 Seafile、NextCloud 等服务器工具,Syncthing 实际上更像是一款文件/文件夹同步工具。你可以非常轻松简单地让同一路由器下的多台 PC 电脑、NAS 设备实现局域网互相同步,也可以在 VPS 服务器或 24 小时不关机且有公网 IP 的电脑上安装和配置 Syncthing,让其成为真正意义上的云同步网盘。

更难得的是 Syncthing 开源且免费,跨平台支持 Windows,Mac,Linux,Android。(稍有些遗憾的是目前暂不支持iOS平台)当然也支持树莓派平台,下面应读者要求,树莓派实验室为大家介绍如何在树莓派上安装 Syncthing!(VPS 等 Linux 平台上安装方法类同,也可以参考本文)

获取软件包

#进入用户所在目录 cd ~ #下载软件包,如果发现不能顺畅下载,那可能是墙的锅,手动下载了再通过 SFTP 上传到 /home/pi 目录下也可以 wget https://github.com/syncthing/syncthing/releases/download/v0.14.42/syncthing-linux-arm-v0.14.42.tar.gz #解压 tar -zxvf syncthing-linux-arm-v0.14.42.tar.gz

注:Syncthing 的版本迭代比较频繁,你可以在这个页面获取最新的安装包。页面中文件名为 syncthing-linux-arm-版本号.tar.gz 的就是树莓派可用的版本。

部署、测试

解压之后当前目录下多了一个名为 syncthing-linux-arm-v0.14.42 的目录。

#强迫症表示要重命名缩短一下: mv syncthing-linux-arm-v0.14.42 syncthing #进入 syncthing 目录 cd syncthing #给主程序加上执行权限 chmod +x syncthing

先运行主程序看看是个什么东东

~/syncthing/syncthing

结果输出一些程序初始化信息,包括网络监听端口、WebUI(操作界面) URL 等,表示部署成功。先不要急着访问 WebUI,因为还需要少量配置。先 Ctrl+C 中止程序。

配置

运行下面的命令编辑 Syncthing 的配置文件:

sudo nano /home/pi/.config/syncthing/config.xml

找到下面的内容

127.0.0.1:8384

XXXXXX

将 127.0.0.1:8384 修改为 0.0.0.0:8384 以便让其他终端可以访问到 Syncthing 的 WebUI。

下面再次运行主程序

~/syncthing/syncthing

不要中断程序,尝试用电脑或者手机的浏览器访问 Syncthing 的 WebUI,地址为

http://树莓派的IP地址:8384

打开之后,会让你设置用户名和密码。下面再大致了解下几个关键的界面:

到这一步就已经可以投入使用了!

但是使用这个命令运行 Syncthing,程序需要一直在前台运行。为了让它在后台默默执行可以这样:

~/syncthing/syncthing &

如果你希望让 Syncthing 可以自动开机运行,可以继续往下阅读。

设置开机自动运行

在 /etc/init.d 目录下建立启动文件

sudo nano /etc/init.d/syncthing

输入以下内容:

#!/bin/sh ### BEGIN INIT INFO # Provides: Syncthing # Required-Start: $local_fs $remote_fs $network # Required-Stop: $local_fs $remote_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Syncthing # Description: Syncthing is for backups ### END INIT INFO # Documentation available at # http://refspecs.linuxfoundation.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptfunc.html # Debian provides some extra functions though . /lib/lsb/init-functions DAEMON_NAME=”syncthing” DAEMON_USER=pi DAEMON_PATH=”/home/pi/syncthing/syncthing” DAEMON_OPTS=”” DAEMON_PWD=”${PWD}” DAEMON_DESC=$(get_lsb_header_val $0 “Short-Description”) DAEMON_PID=”/var/run/${DAEMON_NAME}.pid” DAEMON_NICE=0 DAEMON_LOG=’/var/log/syncthing’ [ -r “/etc/default/${DAEMON_NAME}” ] && . “/etc/default/${DAEMON_NAME}” do_start() { local result pidofproc -p “${DAEMON_PID}” “${DAEMON_PATH}” > /dev/null if [ $? -eq 0 ]; then log_warning_msg “${DAEMON_NAME} is already started” result=0 else log_daemon_msg “Starting ${DAEMON_DESC}” “${DAEMON_NAME}” touch “${DAEMON_LOG}” chown $DAEMON_USER “${DAEMON_LOG}” chmod u+rw “${DAEMON_LOG}” if [ -z “${DAEMON_USER}” ]; then start-stop-daemon –start –quiet –oknodo –background \ –nicelevel $DAEMON_NICE \ –chdir “${DAEMON_PWD}” \ –pidfile “${DAEMON_PID}” –make-pidfile \ –exec “${DAEMON_PATH}” — $DAEMON_OPTS result=$? else start-stop-daemon –start –quiet –oknodo –background \ –nicelevel $DAEMON_NICE \ –chdir “${DAEMON_PWD}” \ –pidfile “${DAEMON_PID}” –make-pidfile \ –chuid “${DAEMON_USER}” \ –exec “${DAEMON_PATH}” — $DAEMON_OPTS result=$? fi log_end_msg $result fi return $result } do_stop() { local result pidofproc -p “${DAEMON_PID}” “${DAEMON_PATH}” > /dev/null if [ $? -ne 0 ]; then log_warning_msg “${DAEMON_NAME} is not started” result=0 else log_daemon_msg “Stopping ${DAEMON_DESC}” “${DAEMON_NAME}” killproc -p “${DAEMON_PID}” “${DAEMON_PATH}” result=$? log_end_msg $result rm “${DAEMON_PID}” fi return $result } do_restart() { local result do_stop result=$? if [ $result = 0 ]; then do_start result=$? fi return $result } do_status() { local result status_of_proc -p “${DAEMON_PID}” “${DAEMON_PATH}” “${DAEMON_NAME}” result=$? return $result } do_usage() { echo $”Usage: $0 {start | stop | restart | status}” exit 1 } case “$1” in start) do_start; exit $? ;; stop) do_stop; exit $? ;; restart) do_restart; exit $? ;; status) do_status; exit $? ;; *) do_usage; exit 1 ;; esac

保存之后运行

#加可执行权限 sudo chmod +x /etc/init.d/syncthing #添加默认启动 sudo update-rc.d syncthing defaults

之后你还可以通过这四个命令管理 Syncthing,顾名思义。

sudo service syncthing start sudo service syncthing stop sudo service syncthing restart sudo service syncthing status

如后面你要开机自动运行可以使用

sudo update-rc.d syncthing remove

与 BTSync 的比较

Syncthing 与 BTSync 有着相似的功能,均很强大。

1.Syncthing 与 BTSync 相比,Syncthing 是开源的,MIT协议。可免费用于商业用途,而 BTSync 相反。

2.Syncthing 的方式更侧重个人资料的同步,BTSync 还可以在同步的基础上进行分享。

3.Syncthing 暂无 iOS 版本。

各种平台的客户端可以在官网免费获取:

https://syncthing.net/

(Windows 版的 Syncthing 官方还提供了一个图形界面版的「SyncTrayzor」工具)

GitHub:

https://github.com/syncthing/syncthing

有价值的参考:

在安卓设备上使用 Syncthing

正文的脚本出处

Enjoy!有任何使用经验欢迎在树莓派实验室文章下面留言分享~

Linux/Raspbian 每个目录用途说明

本文转自无聊小博,很多刚接触树莓派/Linux 的同学会在给树莓派安装、卸载、配置软件时,软件和配置文件等存放在哪儿产生疑惑。也会遇到诸如“磁盘分区”、U盘挂载等涉及到的目录路径问题。Linux 的目录是有非常明确的规则的,这里推荐这篇文章助你快速了解、快速上手。

为什么会有这篇文章

因为在使用apt-get purge remove openvpn之后,发现系统里依然有很多openvpn名字的目录或者文件,比如像下面这样

/usr/sbin/openvpn

/etc/default/openvpn

/etc/network/if-down.d/openvpn

/etc/network/if-up.d/openvpn

/etc/bash_completion.d/openvpn

/etc/init.d/openvpn

/run/openvpn

有强迫症+洁癖的我当然就很不爽了,挨个查看之后,就删掉了这些,但是对于一些目录的用户比较感兴趣,就找到了下面这篇文章,英文的,翻译了,留在这里,增加自己对LINUX系统的了解。

Linux和Windows的区别

的显著区别之一就是其不同的目录结构,并不仅仅是格式上的不同,而是不同位置上保存的东西区别很大。

在Windows中,典型的路径可能是这样的 D:\Folder\subfolder\file.txt ,而在Linux中,路径则是这样的 /Folder/subfolder/file.txt 。

斜线倾斜的方向不同,并且,在Linux中,也没有C盘D盘的概念,Linux系统启动之后, 根分区 就”挂载”在了在了 / 的位置,并且所有的文件、文件夹、设备以及不同的硬盘光驱之类的,也都挂载在了 / 。

虽然可能在下面这个例子中并不明显,但是Linux系统对文件或者文路径的名称中的大小写字符是敏感的。

比如 /Folder/subfolder/file.txt 与 /folder/subfolder/file.txt 并不是同一个文件。

Linux系统目录说明

Unix中和Linux的目录结构是一个统一的目录结构,所有的目录和文件最终都统一到”/“根文件系统下。文件系统是无论是不是挂载过来的,最终都分层排列到以”/“为起始的文件系统之下。

Linux目录结构遵循”文件系统层次结构(Filesystem Hierarchy Structure,FHS)”,这标准是由“自由标准组织(Free Standards Group)”进行维护的,然而大多数LINUX发行版都有意或者无意的与这一规范背离。

“/” 根路径

这是Linux系统的“根”目录,也是所有目录结构的最底层。在UNIX以及和它兼容的系统中,”/“是一个单独的目录。

/boot

这个目录下包含系统启动文件(boot loader),例如Grub,Lilo或者Kernel,以及initrd,system.map等配置文件。

Initrd ramdisk或者””initrd””是指一个临时文件系统,它在启动阶段被Linux内核调用。initrd主要用于当“根”文件系统被挂载之前,进行准备工作。

/sys

这个目录下包含内核、固件以及系统相关文件。

/sbin

包含系统操作和运作所必需的二进制文件以及管理工具,主要就是可执行文件。类似WINDOWS下的EXE文件。

/bin

包含单用户模式下的二进制文件以及工具程序,比如cat,ls,cp这些命令。

/lib

包含/sbin和/bin目录下二进制文件运行所需要的库文件。

/dev

内含必需的系统文件和驱动器。

/etc

内含系统配置文件,其下的目录,比如 /etc/hosts, /etc/resolv.conf, nsswitch.conf, 以及系统缺省设置,网络配置文件等等。以及一些系统和应用程序的配置文件。

/home

每一个用户的在这个目录下,都会单独有一个以其用户名命令的目录,在这里保存着用户的个人设置文件,尤其是以 profile结尾的文件。但是也有例外,root用户的数据就不在这个目录中,而是单独在根路径下,保存在单独的/root文件夹下。

/media

一个给所有可移动设备比如光驱、USB外接盘、软盘提供的常规挂载点。

/mnt

临时文件系统挂载点。比如,你并不想长期挂载某个驱动器,而是只是临时挂载一会U盘烤个MP3之类的,那么应该挂载在这个位置下。

/opt

在Linux系统中,这个目录用到的并不多,opt是 可选系统程序包(Optional Software Packages)的简称。这个目录在UNIX系统,如Sun Solaris用途要广泛的多。

/usr

用户数据目录,包含了属于用户的实用程序和应用程序。这里有很多重要的,但并非关键的文件系统挂载这个路径下面。在这里,你会重新找到一个 bin、sbin 和 lib目录,其中包含非关键用户和系统二进制文件以及相关的库和共享目录,以及一些库文件。

/usr/sbin

包含系统中非必备和并不是特别重要的系统二进制文件以及网络应用工具。

/usr/bin

包含用户的非必备和并不是特别重要的二进制文件。

/usr/lib

保存着/usr/sbin以及/usr/bin中二进制文件所需要的库文件。

/usr/share

“平台无关”的共享数据目录。

/usr/local

是/usr下的二级目录,这里主要保存着包含系统二进制文件以及运行库在内的本地系统数据。

/var

这个路径下通常保存着包括系统日志、打印机后台文件(spool files)、定时任务(crontab)、邮件、运行进程、进程锁文件等。这个目录尤其需要注意进行日常的检查和维护,因为这个目录下文件的大小可能会增长很快,以致于很快占满硬盘,然后导致系统便会出现各种奇奇怪怪的问题。

/tmp

顾名思义,这是一个临时文件夹,专门用来保存临时文件,每次系统重启之后,这个目录下的”临时”文件便会被清空。同样,/var/tmp 也同样保存着临时文件。两者唯一的不同是,后者 /var/tmp目录保存的文件会受到系统保护,系统重启之后这个目录下的文件也不会被清空。

/proc

这个目录是驻留在系统内存中的虚拟(psuedo,伪)文件系统,其中保存的都是文本格式的系统内核和进程信息。

LINUX系统目录结构图

需要注意的是,不同LINUX发行版本的目录结构会有一些差异,这对LINUX新手来说比较纠结,但是大体上,所以LINUX的不同发行版本,都符合上面这幅图片中的路径结构。

参考文章

1.Linux Directory Structure Overview

Pi-Top:树莓派变身笔记本

如果玩过树莓派的人应该知道Pi-Top,他们创建了由树莓派驱动的笔记本电脑,近期他们宣布推出其最新一代产品,新的Pi-Top笔记本电脑基于Raspberry Pi 3。新一代产品采用了模块化的设计,可以将键盘下滑并在树莓派的接口上添加其他设备,让我们来看一下它的外形:

树莓派隐藏在键盘底部,通过排线连接屏幕与键盘。新型号是世界上第一款具有滑动键盘的笔记本电脑,考虑到Raspberry Pi 3包含一系列GPIO引脚,用于与各种物理组件(如电机,伺服机构,泵等)进行交互时,这一点非常有用。

它拥有8到10个小时的电池寿命,以及一个14英寸1080p屏幕。

基于Raspberry Pi 3,性能上采用四核1.2Ghz ARM CPU,1GB内存,以及至关重要的蓝牙和Wi-Fi功能。

现在这款产品主要面向学生编程学习市场,目前这款产品零售价格319美元。虽然Raspberry Pi 3的性能算不算一台合格的笔记本,但是对于学生编程还是非常实用的,因为它提供了更多的接口让学生可以用于开发调试。

树莓派上使用 GitLab 搭建专业 Git 服务

GitLab是一个专业的Git解决方案,功能强大,和GitHub类似,而且其Community Edition (CE)是免费的,完全可以胜任为中小团队提供专业代码托管服务的工作,当然更重要的是它可以在Raspberry Pi上部署运行。

准备

项目首页:https://about.gitlab.com

下载页:https://packages.gitlab.com/gitlab/raspberry-pi2

下载地址(打开页面,点击右上角的Download按钮):

https://packages.gitlab.com/gitlab/raspberry-pi2/packages/debian/jessie/gitlab-ce_8.13.0-ce.0_armhf.deb

下载得到gitlab-ce_8.13.0-ce.0_armhf.deb文件。

注意版本要选择jessie,也就是Debian 8,因为现在的Raspbian是基于它打造的。

官网给出了在线安装的方法,但是我试了几次,可能由于国内到GitLab下载服务器之间的网络状况不好,很难在线安装成功。

国内的软件源即使有GitLab的镜像,通常也没有支持Raspberry Pi架构的分支。

所以这里给出先下载安装包,然后离线安装到Raspberry Pi上的方法。

开始安装

先安装一些必要的依赖包:

sudo apt-get install curl openssh-server ca-certificates postfix apt-transport-https

安装postfix时,会弹出一些设置,这是和发邮件相关的,如果不需要邮件功能,这里的设置并不重要。

等待上述依赖包安装完成后,把之前下载的安装包gitlab-ce_8.13.0-ce.0_armhf.deb上传到Raspberry Pi的文件系统里。

正式安装deb包

sudo dpkg -i gitlab-ce_8.13.0-ce.0_armhf.deb

这个包有281MB,包含123034个文件,因此安装会有些慢,卡在下面这步是正常的,耐心等待一下。

安装完成提示信息:

根据提示,需要运行:

sudo gitlab-ctl reconfigure

看到如下提示就配置完成了

初始设置

管理员用户是root

首次登录后会要求修改密码(8位及以上)

在浏览器访问Raspberry Pi的IP,会跳转到设定密码的页面。

设定完成后,用新密码登录root用户。

这是管理员用户,只用它来添加普通用户,在普通用户里新建仓库来托管代码。

点击界面右上角的小扳手图标,进入Admin Area,这是管理员独有的区域。

在user里新建一个普通用户。

注意初始的Projects limit只有10,只能创建10个projects。如果觉得不够用,可以放宽一点限制。

普通用户的密码会发送到邮箱,如果之前邮箱没配置好,可能会收不到,或者如果是内网使用,邮件也无法发出。这个问题可以这样解决:

管理员里可以用管理权限修改这个用户的密码,改完后告诉该用户这个密码,该用户在首次登录后,会被提示设置一个新密码。

如果以后使用时该用户忘记了密码,管理员也可以登录Admin Area重置。

这样就不需要邮件来重置密码,缺点是需要管理员介入,对于中小团队这样的管理方法是可取的(可以由项目组织者充当管理员)。

另外在Admin Area界面右侧有个齿轮形状的图标,点击这里可以修改一些全局设定(包括前面初始的Projects limit等), 根据提示修改就行了。

修改服务端口

默认使用80端口,如果需要修改,可以修改/etc/gitlab/gitlab.rb中如下图的2处地方,比如这样就修改成了7000端口。

两个地方都要修改。

注意保存文件后,要运行如下命令使得配置生效:

sudo gitlab-ctl reconfigure

可以看到能使用7000端口访问了,Project path也是正确的。

一些实用的维护命令

#修改任何配置文件后都要输入如下命令使配置生效。 sudo gitlab-ctl reconfigure #页面缓存清除: sudo gitlab-rake cache:clear RAILS_ENV=production #GitLab各组件启动: sudo gitlab-ctl start #GitLab各组件停止: sudo gitlab-ctl stop #GitLab各组件重启: sudo gitlab-ctl restart #禁用GitLab开机自启动: sudo systemctl disable gitlab-runsvdir #启用GitLab开机自启动: sudo systemctl enable gitlab-runsvdir

转自电子工程世界论坛

Crontab 简单实现树莓派语音闹钟

树莓派实验室按:这是来自 hyhmnn 的投稿。是时候关掉你的手机闹铃了,用树莓派外接一个音箱就可以 Make 一款科技感和实用性兼备的“AI 闹钟”。这里用到了 Linux 的计划任务、百度语音 API、天气 API。

不看天气的死宅(不爱带包),出门遇到下雨天就尴尬了,在学校还好可以蹭伞,到外面就不行了。

一开始的解决办法就是将爬到的天气信息发到微信上GETWeaInfo

结果有个很大的问题就是,网络要是断了,或者程序不运行了,就要重新载终端上扫二维码登录(太麻烦了)。

于是乎~就有了下面的想法——用树莓派做个天气闹钟。下面开始了!

播放mp3

前提:树莓派安装系统(我装的是最小化的Raspbian jessie)),ssh连接,wifi连接How to set up WiFi..网上都有…音响(基本都可以,没有就用耳机先代替),LED。

sudo apt-get update sudo apt-get install maplayer2 #更新源 #安装mplayer(用他来播放MP3) mplayer xxx.mp3 #测试一下

如果有声ok,没有参考林佳楠的博客

配置运行环境

前提:用的python3

安装python3

sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev libssl-dev openssl libgdbm-dev liblzma-dev libreadline-dev libncursesw5-dev #安装依赖包 wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz #下载源码包,你也可以换其他的 tar zxf Python-3.6.1.tgz #解压 cd Python-3.6.1/ ./configure –prefix=/usr/loacl/python3 make sudo make install echo $? #如果是0就是正确的,非零仔细看报错信息去百度google(我没有遇到,不好解答) sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3

安装virtualenv

sudo pip install virtualenv mkdir naozhong cd naozhong virtualenv – p /usr/bin/python3 naoz #/usr/bin/python3 是你安装python3可执行路径(不知道就运行$ which pytho3), source naoz/bin/activate #前面会出现(dirname) #deactivate (退出)

virtulaenv的作用&&详细使用

安装需要用到的库

pip install requests pip install beautifulsoup4 pip install baidu-aip #安装失败,因为依赖的库pillow安装失败 #那就装一些pillow的依赖包 sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk #我试下来需要一个一个安装, #能安装就安装,不能的就跳过。 #再次 pip install pillow&&pip install baidu-aip pip install rpi.gpio #遇到问题error:command ‘arm-linux-gnueabihf-gcc’ failed with exit status 1 sudo apt-get install python3-dev sudo apt-get install libevent-dev #再次pip install rpi.gpio

代码

灯闪亮

vim LEDShining.py

# -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time #init GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(11, GPIO.OUT) def LED_shining(): try: GPIO.output(11, 1) time.sleep(0.5) GPIO.output(11, 0) time.sleep(0.5) except: print(”) def main(): for tmp_a in range(60): LED_shining() GPIO.cleanup() if __name__ == ‘__main__’: main()

led正极接在11引脚上,负极我放在GND

获取天气并用百度语音转mp3文件

vim wulala.py

# -*- coding: utf-8 -*- from aip import AipSpeech import requests import re from bs4 import BeautifulSoup import time ”’ 爬取天气网-无锡 http://www.weather.com.cn/weather/101190201.shtml ”’ def getHtmlText(url,code=’utf-8′): try: r = requests.get(url) r.raise_for_status() r.encoding = code return r.text except: return ” def makeSoup(html): wstr = ” if html == ”: return ‘哎呀~今天我也不知道无锡天气了’ else: soup = BeautifulSoup(html,’html.parser’) soup1 = soup.find_all(‘li’,attrs = {‘class’:’on’})[1] str1 = re.findall(r’>(.*)(.*)(.*)$’,str1[4]) for x in range(len(slist[0])): b += slist[0][x] except: b = str1[4] if ‘/’ in b: b = b.replace(‘/’,’-‘) str1[4] = ‘无锡的温度是’+b #print(str1[4]) str1[6] = ‘小风风是’+str1[6] for i in str1: if i != ”: wstr = wstr +i if ‘雨’ in wstr: wstr += ‘今天别忘记带雨伞哦!’ #print(wstr) return wstr ”’ 用百度的AIP 把文字变成mp3文件 ”’ def stringToMp3(strings_txt): strings_txt = ‘起床呀~懒虫~起床啊~死肥宅~起床啦~要上班啦!今天是’ + strings_txt APPID = ‘9***3**8’ APIKey = ‘QC*****UK*****nP***b’ SecretKey = ‘e8***6******25*****56′ aipSpeech = AipSpeech(APPID,APIKey,SecretKey) result = aipSpeech.synthesis(strings_txt,’zh’,’1′,\ {‘vol’:8, ‘per’:4, ‘spd’:5}) if not isinstance(result,dict): with open(‘test_tmp.mp3′,’wb’) as f: f.write(result) ”’ 执行的主函数 ”’ def main(): url = ‘http://www.weather.com.cn/weather/101190201.shtml’ html=getHtmlText(url) stringToMp3(makeSoup(html)) if __name__ == ‘__main__’: main()

最后设置定时运行

首先看时区(中国的是CST)、时间对不对

date

时区不对:

sudo dpkg-reconfigure tzdata #选择亚洲-上海就可以了

时间不对:

sudo ntpd -s -d

定时

crontab -e

第一次运行需要指定您的编辑器(随意选)

在最后添加

50,53,55 7 * * * /home/pi/naozhong/naoz/bin/python3 /home/pi/naozhong/LEDShining.py 45 7 * * * /home/pi/naozhong/naoz/bin/python3 /home/pi/naozhong/wulala.py > /home/pi/naozhong/wulala.log 2>&1 50,53,55 7 * * * `mplayer /home/pi/naozhong/tmp.mp3`

用树莓派做 RTMP 流直播服务器,可推送至斗鱼直播

在《用树莓派DIY共享鱼缸,支持微信远程喂鱼》一文中,使用了树莓派来做直播服务器。通过安装在树莓派上的摄像头采集实时视频数据流,推送至 RTMP 监听服务器。同时,其他的客户端访问这个 RTMP 服务器就可以观看视频了。下面我们来详细介绍这个模块如何搭建,文末还将给出将直播视频推送至斗鱼直播平台的方法。

需要用的东西和软件说明:

树莓派主板(本文使用树莓派 Zero W 套件,该套件附带一款完美安装摄像头的外壳)

兼容摄像头(本文使用官方摄像头模块,其他 USB 兼容摄像头亦可)

软件方面:

avconv 和 GStreamer 用于采集摄像头捕获的视频流并推送到 RTMP 服务

NGINX 和 RTMP 模块,用于接收视频流,同时提供视频发布功能

Strobe Media Playback,一款基于 Flash 的网页视频播放器

一、配置摄像头

无论是树莓派官方摄像头模块还是其他兼容的USB摄像头,连接好摄像头之后,运行命令去启用摄像头:

sudo raspi-config

编辑系统模块文件。

sudo nano /etc/modules

在这个文件的最后添加一行

bcm2835-v4l2

保存。建议配置好之后重启一下树莓派。然后测试摄像头是否正常工作。

vcgencmd get_camera

输出如图所示表示被识别到。进一步测试拍照。

raspistill -t 2000 -o 1.jpg

执行上面的指令之后,会你用摄像头拍照,并将照片保存在当前目录下,名为 1.jpg。

如果一切正常,恭喜!可以开始下面的步骤了!

二、网络配置

如果你的树莓派使用有线网络的话可以忽略这一步。笔者用的树莓派是 Zero W 版本,没有有线网口,所以必须手动配置无线网络。

sudo nano /etc/network/interfaces

将配置修改为:

auto lo iface lo inet loopback allow-hotplug wlan0 auto wlan0 iface wlan0 inet dhcp wpa-ssid “WIFISSID” wpa-psk “WIFIPASSWORD”

WIFISSID 和 WIFIPASSWORD 分别替换为你的 WIFI 的 SSID 和密码。

网络配置方法可以参考树莓派实验室的其他文章,例如这篇《树莓派 Raspberry Pi 设置无线上网》。

三、安装 NGINX 和 RTMP

我们用 nginx 加上 nginx-rtmp-module 模块作为 RTMP 服务端。这里先安装 nginx 然后再移除它,目的是利用这个过程吧 nginx 相关的依赖安装好并设定好系统环境。这个通过 apt 安装的 nginx 并不能直接使用,因为他并不包含我们需要的 RTMP 模块,所以将它移除。而后我们手工下载 nginx 和 nginx-rtmp-module 模块源码来手工编译安装,以获得我们最终需要的服务端。

sudo apt-get update #安装 nginx sudo apt-get -y install nginx #移除 nginx sudo apt-get -y remove nginx sudo apt-get clean #清空 nginx 的配置文件 sudo rm -rf /etc/nginx/* #安装编译用的模块 sudo apt-get install -y curl build-essential libpcre3 libpcre3-dev libpcre++-dev zlib1g-dev libcurl4-openssl-dev libssl-dev #创建存放网页的目录给 nginx 使用 sudo mkdir -p /var/www #创建编译用的目录 mkdir -p ~/nginx_src cd ~/nginx_src #下载 nginx 源码包 wget http://nginx.org/download/nginx-1.11.8.tar.gz #下载 nginx-rtmp-module 源码包 wget https://github.com/arut/nginx-rtmp-module/archive/master.zip tar -zxvf nginx-1.11.8.tar.gz unzip master.zip cd nginx-1.11.8 #设定编译参数 ./configure –prefix=/var/www –sbin-path=/usr/sbin/nginx –conf-path=/etc/nginx/nginx.conf –pid-path=/var/run/nginx.pid –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –with-http_ssl_module –without-http_proxy_module –add-module=/home/pi/nginx_src/nginx-rtmp-module-master #开始编译安装 make sudo make install

比较漫长的等待之后,编译安装结束。这时可以测试 nginx 是否安装好。

nginx -v

正常的話,會顯示 nginx 的版本。

配置 nginx。

/etc/nginx/nginx.conf

在末尾添加如下配置:

rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; } } }

重启 nginx 服务。

sudo service nginx start

没有错误提示就表示成功了。

到这里 nginx 和 RTMP 模块都准备好了。

四、安装 avconv 和 GStreamer

安装的组件比较多,如果操作的时候因为软件源的问题总是出现错误难以完成,建议更换软件源试试。笔者用的是清华大学软件源安装的。

sudo nano /etc/apt/sources.list

deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi deb-src https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi

开始安装

sudo apt-get update sudo apt-get install libav-tools #安装 GStreamer sudo apt-get install gstreamer1.0-tools #安装 GStreamer 扩展组件 sudo apt-get install libgstreamer1.0-0 libgstreamer1.0-0-dbg libgstreamer1.0-dev liborc-0.4-0 liborc-0.4-0-dbg liborc-0.4-dev liborc-0.4-doc gir1.2-gst-plugins-base-1.0 gir1.2-gstreamer-1.0 gstreamer1.0-alsa gstreamer1.0-doc gstreamer1.0-omx gstreamer1.0-plugins-bad gstreamer1.0-plugins-bad-dbg gstreamer1.0-plugins-bad-doc gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-base-dbg gstreamer1.0-plugins-base-doc gstreamer1.0-plugins-good gstreamer1.0-plugins-good-dbg gstreamer1.0-plugins-good-doc gstreamer1.0-plugins-ugly gstreamer1.0-plugins-ugly-dbg gstreamer1.0-plugins-ugly-doc gstreamer1.0-pulseaudio gstreamer1.0-tools gstreamer1.0-x libgstreamer-plugins-bad1.0-0 libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-base1.0-0 libgstreamer-plugins-base1.0-dev

这里安装了 avconv 和 GStreamer 两套视频采集组件。 avconv 的使用方式是:

avconv -f video4linux2 -r 24 -i /dev/video0 -f flv rtmp://localhost:1935/live

avconv 采用软编码实现,因此 CPU 消耗比较高,推荐用 GStreamer,GStreamer 的采集使用如下命令:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! ‘video/x-raw, width=1024, height=768, framerate=30/1′ ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location=’rtmp://树莓派的IP地址/live live=1’

如果希望在后台运行这两个命令可以在命令后面添加 & ,例如:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! ‘video/x-raw, width=1024, height=768, framerate=30/1′ ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location=’rtmp://树莓派的IP地址/live live=1’ &

device=/dev/video0 这个参数可以省去,除非在有多个摄像头的时候,希望指定视频采集自某个指定的摄像头才需要这个参数。

采集的视频怎么播放呢?请看下面介绍。

五、实时视频的呈现

有多种方式呈现直播视频画面:

1、使用 RTMP 播放器播放视频流

例如 VLC 等播放器(桌面版和手机版均有)支持 RTMP 视频流播放,填入 rtmp://树莓派的IP地址/live 即可播放。不过这个软件有数十秒的缓冲延迟,需要设定缓冲时间来缩短延迟。

2、使用 Strobe Media Playback 创建播放页面,通过网页播放视频流

这个是在树莓派上创建一个带有播放功能的网页,播放器选用 Strobe Media Playback,当然你也可以选择其他支持 RTMP 的播放器控件。播放的时候用浏览器打开 http://树莓派的IP地址/index.html 进入播放界面。下面介绍这个播放页面的创建方法。

mkdir -p ~/strobe_src cd ~/strobe_src wget http://downloads.sourceforge.net/project/smp.adobe/Strobe%20Media%20Playback%201.6%20Release%20%28source%20and%20binaries%29/StrobeMediaPlayback_1.6.328-full.zip unzip StrobeMediaPlayback_1.6.328-full.zip sudo cp -r for\ Flash\ Player\ 10.1 /var/www/html/strobe sudo nano /var/www/html/index.html

填入如下内容,记得把下面的“树莓派的IP地址”替换成你的树莓派实际的IP地址。IP地址可以通过 ifconfig 命令查看。

Live Streaming

播放的时候用浏览器打开 http://树莓派的IP地址/index.html 进入播放界面。

3、推送至斗鱼直播平台观看

你可能注意到了 GStreamer 这个命令中有 location 这个参数。这个参数是设定采集到的视频流推向哪里,通过设定这个参数可以将视频流推向任何支持 RTMP 协议的服务器。

gst-launch-1.0 -v v4l2src device=/dev/video0 ! ‘video/x-raw, width=1024, height=768, framerate=30/1′ ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location=’rtmp://树莓派的IP地址/live live=1’

斗鱼平台同样采用了 RTMP 协议传输直播视频,以斗鱼平台为例来说明一下推流到斗鱼的方法。

首先获取斗鱼的 RTMP 推流地址。开启了直播室之后可以获得推流码。注意,斗鱼的推流码是有时限的,取到推流码需要尽快使用以免过期。

把这两个参数组合起来(中间加上 / )。修改之后的命令例如:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! ‘video/x-raw, width=1024, height=768, framerate=30/1′ ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location=’rtmp://send1.douyu.com/live/1372rSOMdcBJ8UHD?wsSecret=96d2k4ecdf267d17b8e8c38b6a4a6efd&wsTime=59f92e2e&wsSeek=off live=1’

然后就可以开播了。

打个小广告,欢迎大家关注我的斗鱼直播间~

https://www.douyu.com/1372

这里不定期直播宠物鱼。

应用以上技术实现的远程喂鱼项目:

http://make.quwj.com/program/nature-aquarium

总体上三种播放方式都有一定延迟,其中网页 Strobe Media Playback 播放延迟最小,大概在1秒左右。VLC 延迟比较固定默认约20秒,个别平台的版本是可以设置延迟数值的笔者没有亲力尝试。然后是斗鱼平台,斗鱼随着播放时间变长延迟也越来越长,需要刷新直播间页面才会同步。

搭建过程有问题请在树莓派实验室原文下面留言,转载请保证文章内容完整、注明出处并附带原文链接~

自行移植树莓派64位内核系统的方法介绍

不久前我们推荐了 chainsx 的《树莓派 Ubuntu 64位系统玩家体验版》。作者进一步提供了自行编译上述系统并制作镜像文件的方法,分别介绍了如何通过交叉编译和在树莓派上直接编译,授人以渔啦~

你可以通过ubuntu16.04交叉编译,也可以直接在树莓派上编译。

我们遵循树莓派官方的内核编译引导

这里,感谢bamarni的思路提供。

在电脑上交叉编译

构建内核

你需要一个Ubuntu16.04的64位版本。

安装交叉编译环境

apt-get update apt-get install -y bc build-essential gcc-aarch64-linux-gnu git unzip

获取源码

gitclone–depth=1-b rpi-4.8.y https://github.com/raspberrypi/linux.git

接下来,开始你的构建,分别运行以下命令:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

这时,你可以去泡杯茶,看看电视,或者吃鸡。。。。

因为这要一点时间。

准备一个系统

这里,我拿raspbian做例子(有些数字你要自己改,不要太死板)。

先从官网下载raspbian(建议下载lite)。

解压后得到img文件。

然后,我们用下面的命令审查:

fdisk- l raspbian-jessie-lite.img

Diskraspbian-jessie-lite.img:1.3GiB,1390411776 bytes,2715648 sectors Units: sectors of 1*512=512 bytes Sectorsize(logical/physical):512 bytes /512 bytes I/O size(minimum/optimal):512 bytes /512 bytes Disklabel type: dos Disk identifier:0x244b8248 DeviceBootStartEndSectorsSizeIdType raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT32 (LBA) raspbian-jessie-lite.img2 137216 2715647 2578432 1.2G83Linux

注意,上面两条很关键!

我们可以在我们的文件系统上挂载这些分区(当然,你也可以直接写入sd卡),从根分区开始:

mount-o loop,offset=70254592 raspbian-jessie-lite.img /mnt

offset 取决于扇区大小(512):70254592 = 512 * 137216

接着是启动分区:

mount-o loop,offset=4194304,sizelimit=66060288 raspbian-jessie-lite.img /mnt/boot

offset :4194304 = 512 8192,sizelimit:66060288 = 512 129024

安装内核

执行以下命令,将编译好的内核以及设备树复制到系统中(前提是你编译完了):

cp arch/arm64/boot/Image/mnt/boot/ kernel8.img cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/boot/

执行以下命令,安装内核模块。

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu INSTALL_MOD_PATH=/mnt modules_install

执行以下命令,调整config.txt。

echo kernel=kernel8.img >> /mnt/boot/config.txt

不过,保险起见,你还是手动修改,如果没有的话,加上 kernel=kernel8.img ,有的话,修改为 kernel=kernel8.img 。

卸载分区

umount /mnt/boot && umount /boot

大功告成!

在树莓派上编译

其实差不多。就是不用交叉编译工具罢了,不过,时间有点久。

注意,要使用aarch64(arm64)的系统进行编译!

不过,这里有现成的Debian | Ubuntu(如果你用Ubuntu的话,请将源换成中科院的mirrors.opencas.org)。

安装依赖

apt-get update apt-get install -y bc build-essential

获取源码包

git clone https://github.com/raspberrypi/linux.git

开始编译

make ARCH=arm64 bcmrpi3_defconfig make ARCH=arm64

这时,考验你心态的时候到了,可能要一个多小时吧!

如果你想多核编译,使用 -j4 参数。

准备一个要移植的系统。

这里,给几个推荐。

ubuntu 15.10 | CentOS

下载下来后,按照上面方法挂载,或直接写入sd卡。

安装内核

执行以下命令,将编译好的内核以及设备树复制到系统中(前提是你编译完了)

cp arch/arm64/boot/Image/mnt/boot/ kernel8.img cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/boot/

执行以下命令,安装内核模块:

make ARCH=arm64 INSTALL_MOD_PATH=/mnt modules_install

执行以下命令,调整config.txt。

echo kernel=kernel8.img >> /mnt/boot/config.txt

不过,保险起见,你还是手动修改,如果没有的话,加上 kernel=kernel8.img ,有的话,修改为 kernel=kernel8.img 。

卸载分区

umount /mnt/boot && umount /mnt

至此,大功告成

制作一个自己的系统

这里,简要说一下制作根分区(rootfs)的思路。

如果你熟悉 debootstrap,用它构建你自己的(这回比较棘手,因为它需要一些手工调整,它最初的目的是在已经运行的主机上进行 chroot,而不是为其他机器构建根文件系统)。

我建议使用 multistrap,这里有一个很好的教程:http://free-electrons.com/blog/embdebian-with-multistrap/。

同样,提供几个根分区的压缩文件。

Ubuntu 17.04 | CentOS

小贴士:对于第一次使用树莓派 64位 Ubuntu 的用户,建议将 Ubuntu15.10 的源换成中科院的源 mirrors.opencas.org 不然的话将无法使用哦。

项目 GitHub:https://github.com/chainsx/ubuntu64-rpi

Maker 趣无尽项目主页:http://make.quwj.com/project/28