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 官网

DIY一个自拍相机:树莓派 3 +触摸屏显示器

一个使用树莓派 3加触摸屏显示器 、镜头和SenseHAT的有趣项目

使用树莓派,创建一个桌面“自拍”相机。不需要焊接或定制任何电子零件。应用程序也是超级简单。

硬件

整个项目使用了下列的零件:

  • 树莓派3型号B
  • 树莓派触摸屏
  • 树莓派相机
  • SenseHAT
  • 电源
  • 32GB Micro SD 卡

另外还配搭了定制激光切割和折叠亚克力盒。即使你没有激光切割机和亚克力文件夹,也可以使用其他的外壳替代。

O/S及相关

把Raspbian Jessie Lite写入一张Micro SD卡中,然后将主机名由简单的raspberrypi更改为其他名称,编辑根文件系统etc/hostname和etc/hosts文件就可以。这样在网络上会更容易找到主机。

openssh服务器现在默认为禁用,因为我更喜欢通过SSH进行登录,这可以通过在boot partition中创建一个名为ssh的空文件来启用它。

触摸屏技术上是上下倒转安装的,所以要将显示器旋转到正确的方向,有必要编辑config.txt – 也在启动分区,并添加行:

lcd_rotate=2

接下来将Micro SD卡插入Raspberry Pi并接通电源。之后,我建议按照惯例做法,通过登录并输入以下内容更新O / S:

$ sudo apt get update 

$ sudo apt-get dist-upgrade

请注意,由于我们已将主机名更改为selfiecam,因此可以从另一台Linux计算机使用以下命令登录到Pi:

$ ssh pi@selfiecam.local

由于我们想使用SenseHAT,相机和帧缓冲区,一些有用的Python软件也通过安装:

$ sudo apt-get install sense-hat python-picamera python-pygame

最后,需要启用相机和重新启动,这可以透过raspi-config完成:

$ sudo raspi-config

软件

首先,我们需要导入一些库,其中包括上面提到的。

import os
import time
import pygame
from picamera import PiCamera
from sense_hat import SenseHat

我们需要初始化Pygame,它将用来显示图像到帧缓冲区中(显示器)。

pygame.init()
screen = pygame.display.set_mode([800,480])

接下来我们设置摄像机,由于它的物理位置被水平翻转,我们需要通过软件翻转它。

camera = PiCamera()
camera.resolution = (800, 480)
camera.hflip = True

之后配置SenseHAT。

sense = SenseHat()
sense.set_rotation(0)

接下来我们将会定义一个函数,把其中一个文件作为参数,然后使用Pygame来绘制屏幕变成黑色,然后再显示它包含的图像。

def displayImage(file):

image = pygame.image.load(file)
imagerect = image.get_rect()

screen.fill([0, 0, 0])
screen.blit(image, imagerect)
pygame.display.flip()

然后我们定义一个功能,启用视频预览,在SenseHAT LED矩阵上显示3-2-1-0倒计时,截取静止图像前,停止预览,显示图像,並清除LED矩阵。映像文件名中应包含日期和时间。

def getSelfie(): # Start camera video preview

camera.start_preview()    # Commence countdown
sense.show_letter("3", text_colour=[255, 0, 0])    time.sleep(1)
sense.show_letter("2", text_colour=[255, 255, 0])    time.sleep(1)
sense.show_letter("1", text_colour=[0, 255, 0])    time.sleep(1)
sense.show_letter("0", text_colour=[0, 0, 255])    # Capture image and stop preview
filename = time.strftime("/selfies/%Y-%m-%d-%H-%M-%S.jpg")
camera.capture(filename)
camera.stop_preview()    # Display image and clear SenseHAT display
displayImage(filename)
sense.clear()

请注意,LED矩阵上显示的数字颜色是不同的:3 =红色,2 =黄色,1 =绿色,0 =蓝色。

到目前为止,我们只是导入了不同的库和定义函数。接下来,我们将使用displayImage()這个函数在启动时更新触摸屏显示欢迎图像。

displayImage(“/usr/local/share/images/Welcome.png”)

最后,我们进入程序的主循环。在这里,我们等待来自SenseHAT操纵杆的动作。如果这被按住,我们需要等待它被释放后使用getSelfie()函数。如果它被一直保持在左边,我们直接关机。我们可以忽略其他相关动作。

while True: # Wait for and process joystick events 
    event = sense.stick.wait_for_event(emptybuffer=True) 
    if event.direction == "middle" and event.action == "released": 
        getSelfie() 
    elif event.direction == "left" and event.action == "held": 
        os.system("/sbin/shutdown -h now") 
    else:
        pass

运行

/etc/rc.local文件在启动时运行,在这文件添加一行代码防止屏幕自动关闭,接着一秒后会启动自拍照相机应用程序。

sudo sh -c “TERM=linux setterm -blank 0 >/dev/tty0” /usr/local/bin/selfie.py &

重新启动后,我们会看到我们设定的欢迎图像。按下操纵杆时,会显示实时视频预览,并开始倒數计时。

在倒数到零时将会拍照,并停止视频预览,图像会显示在屏幕上。

最后图像可以从SD卡中复制出来。

如果你想自己做这个项目,可以在GitHub上找到Python脚本和亞克力外壳的设计文件。

本文来自:ednchina

在树莓派上用 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

找到下面的内容

<gui enabled="true" tls="false">
<address>127.0.0.1:8384</address>
<apikey>XXXXXX</apikey>
</gui>

将 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
正文的脚本出处

本文来自:树莓派实验室

 

 

 

 

树莓派Zero WH SBCs现在提供专业焊接头

树莓派基金会(Raspberry Pi Foundation)今天宣布推出一款带有预焊接头的微型Raspberry Pi Zero W单板电脑的新变种 – Raspberry Pi Zero WH,这是第三款Raspberry Pi Zero型号,它提供了与Raspberry Pi Zero W相同的功能,并且有专业的焊接头,方便那些不知道如何在Raspberry Pi Zero W上添加焊接头的用户,也方便于通过Raspberry Pi Zero进行小项目的用户。

据Raspberry Pi基金会介绍,Raspberry Pi Zero WH可以帮助用户在PC或Mac上充分利用Debian GNU / Linux 9“Stretch”操作系统的GPIO扩展工具,让他们从一个U盘启动Rasbian或使用Linux电脑。

GPIO扩展器工具可让用户快速而简单地访问物理计算,而无需完整的树莓派设置,也无需配置任何SD卡。除了利用GPIO扩展器工具外,Raspberry Pi Zero WH的预焊接头非常适合任何原型工作。

 

 

来自 cnBeta

 

树莓派+YOLO打造人工智能相机

不久之前,亚马逊刚刚推出了DeepLens。这是一款专门面向开发人员的全球首个支持深度学习的摄像机,它所使用的机器学习算法不仅可以检测物体活动和面部表情,而且还可以检测类似弹吉他等复杂的活动。虽然DeepLens还未正式上市,但智能摄像机的概念已经诞生了。

今天,我们将自己动手打造出一款基于深度学习的照相机,当小鸟出现在摄像头画面中时,它将能检测到小鸟并自动进行拍照。最终成品所拍摄的画面如下所示:

相机不傻,它可以很机智

我们不打算将一个深度学习模块整合到相机中,相反,我们准备将树莓派“挂钩”到摄像头上,然后通过WiFi来发送照片。本着“一切从简”(穷)为核心出发,我们今天只打算搞一个跟DeepLens类似的概念原型,感兴趣的同学可以自己动手尝试一下。

接下来,我们将使用Python编写一个Web服务器,树莓派将使用这个Web服务器来向计算机发送照片,或进行行为推断和图像检测。

我们这里所使用的计算机其处理能力会更强,它会使用一种名叫YOLO的神经网络架构来检测输入的图像画面,并判断小鸟是否出现在了摄像头画面内。

我们得先从YOLO架构开始,因为它是目前速度最快的检测模型之一。该模型专门给Tensorflow(谷歌基于DistBelief进行研发的第二代人工智能学习系统)留了一个接口,所以我们可以轻松地在不同的平台上安装和运行这个模型。友情提示,如果你使用的是我们本文所使用的迷你模型,你还可以用CPU来进行检测,而不只是依赖于价格昂贵的GPU。

接下来回到我们的概念原型上… 如果像框内检测到了小鸟,那我们就保存图片并进行下一步分析。

检测与拍照

正如我们所说的,DeepLens的拍照功能是整合在计算机里的,所以它可以直接使用板载计算能力来进行基准检测,并确定图像是否符合我们的标准。

但是像树莓派这样的东西,我们其实并不需要使用它的计算能力来进行实时计算。因此,我们准备使用另一台计算机来推断出现在图像中的内容。

我使用的是一台简单的Linux计算机,它带有一个摄像头以及WiFi无线网卡(树莓派3+摄像头),而这个简单的设备将作为我的深度学习机器并进行图像推断。对我来说,这是目前最理想的解决方案了,这不仅大大缩减了我的成本,而且还可以让我在台式机上完成所有的计算。

当然了,如果你不想使用树莓派视频照相机的话,你也可以选择在树莓派上安装OpenCV 3来作为方案B,具体的安装方法请参考【这份文档】。友情提示,安装过程可谓是非常的麻烦!

接下来,我们需要使用Flask来搭建Web服务器,这样我们就可以从摄像头那里获取图像了。这里我使用了MiguelGrinberg所开发的网络摄像头服务器代码(Flask视频流框架),并创建了一个简单的jpg终端:

#!/usr/bin/envpython
from import lib import import_module
import os
from flask import Flask, render_template, Response
 
#uncomment below to use Raspberry Pi camera instead
#from camera_pi import Camera
 
#comment this out if you're not using USB webcam
from camera_opencv import Camera
 
app =Flask(__name__)
 
@app.route('/')
def index():
 return "hello world!"
 
def gen2(camera):
 """Returns a single imageframe"""
 frame = camera.get_frame()
 yield frame
 
@app.route('/image.jpg')
def image():
 """Returns a single currentimage for the webcam"""
 return Response(gen2(Camera()),mimetype='image/jpeg')
 
if __name__ == '__main__':
app.run(host='0.0.0.0', threaded=True)

如果你使用的是树莓派视频照相机,请确保没有注释掉上述代码中from camera_pi那一行,然后注释掉from camera_opencv那一行。

你可以直接使用命令python3 app.py或gunicorn来运行服务器,这跟Miguel在文档中写的方法是一样的。如果我们使用了多台计算机来进行图像推断的话,我们还可以利用Miguel所开发的摄像头管理方案来管理摄像头以及计算线程。

当我们启动了树莓派之后,首先需要根据IP地址来判断服务器是否正常工作,然后尝试通过Web浏览器来访问服务器。

URL地址格式类似如下:
http://192.168.1.4:5000/image.jpg

在树莓派中加载Web页面及图像来确定服务器是否正常工作:

图像导入及推断

既然我们已经设置好了终端来加载摄像头当前的图像内容,我们就可以构建一个脚本来捕捉图像并推断图像中的内容了。

这里我们需要用到request库(一个优秀的Python库,用于从URL地址获取文件资源)以及Darkflow(YOLO模型基于Tensorflow的实现)。

不幸的是,我们没办法使用pip之类的方法来安装Darkflow,所以我们需要克隆整个代码库,然后自己动手完成项目的构建和安装。安装好Darkflow项目之后,我们还需要下载一个YOLO模型。

因为我使用的是速度比较慢的计算机和板载CPU(而不是速度较快的GPU),所以我选择使用YOLO v2迷你网络。当然了,它的功能肯定没有完整的YOLO v2模型的推断准确性高啦!

配置完成之后,我们还需要在计算机中安装Pillow、numpy和OpenCV。最后,我们就可以彻底完成我们的代码,并进行图像检测了。

最终的代码如下所示:

from darkflow.net.build import TFNet
import cv2
 
from io import BytesIO
import time
import requests
from PIL import Image
import numpy as np
 
options= {"model": "cfg/tiny-yolo-voc.cfg", "load":"bin/tiny-yolo-voc.weights", "threshold": 0.1}
 
tfnet= TFNet(options)
 
birdsSeen= 0
def handleBird():
 pass
 
whileTrue:
 r =requests.get('http://192.168.1.11:5000/image.jpg') # a bird yo
 curr_img = Image.open(BytesIO(r.content))
 curr_img_cv2 =cv2.cvtColor(np.array(curr_img), cv2.COLOR_RGB2BGR)
 
 result = tfnet.return_predict(curr_img_cv2)
 print(result)
 for detection in result:
 if detection['label'] == 'bird':
 print("bird detected")
 birdsSeen += 1
 curr_img.save('birds/%i.jpg' %birdsSeen)
 print('running again')
time.sleep(4)

此时,我们不仅可以在命令控制台中查看到树莓派所检测到的内容,而且我们还可以直接在硬盘中查看保存下来的小鸟照片。接下来,我们就可以使用YOLO来标记图片中的小鸟了。

假阳性跟假阴性之间的平衡

我们在代码的options字典中设置了一个threshold键,这个阈值代表的是我们用于检测图像的某种成功率。在测试过程中,我们将其设为了0.1,但是如此低的阈值会给我们带来是更高的假阳性以及误报率。更糟的是,我们所使用的迷你YOLO模型准确率跟完整的YOLO模型相比,差得太多了,但这也是需要考虑的一个平衡因素。

降低阈值意味着我们可以得到更多的模型输出(照片),在我的测试环境中,我阈值设置的比较低,因为我想得到更多的小鸟照片,不过大家可以根据自己的需要来调整阈值参数。

代码开源

跟之前一样,我已经将所有的代码上传到GitHub上了,感兴趣的同学可以自行下载安装【GitHub传送门】。

* 参考来源:makeartwithpython,FB 小编 Alpha_h4ck 编译,转自 FreeBuf.COM

本文来自:树莓派实验室

树莓派是如何免疫 Meltdown 和 Spectre 漏洞的

原文作者:Eben Upton。参与:路雪、黄小天、李泽南

过去几天,对 Meltdown 和 Spectre 安全漏洞的讨论甚嚣尘上。该漏洞影响了所有的现代英特尔处理器,Spectre 还影响了 AMD 处理器和 ARM 内核。Spectre 漏洞使得攻击者可以绕过软件检查读取当前地址空间中的任意位置数据;Meltdown 漏洞使得攻击者可以读取操作系统核地址空间的任意位置数据(用户程序通常不可访问该数据)。这两种漏洞皆通过边信道攻击(side-channel attack)利用很多现代处理器都有的性能特征(缓存和推测执行)泄漏数据。近日,树莓派创始人 Eben Upton 称树莓派不受这些漏洞的影响,并撰文详解其原因。

谷歌 Project Zero 团队发现的漏洞分别被称为“Meltdown”和“Specter”。这些漏洞允许恶意程序从其它程序的内存中窃取信息,这意味着恶意程序可以监听密码、账户信息、密钥及理论上存储在进程中的任何内容。

其中,“Meltdown”影响英特尔处理器,它打破了用户应用程序和操作系统之间最基本的隔离。这种攻击允许程序访问其它程序和操作系统的内存,这可能导致数据泄露。而“Spectre”除了能影响英特尔处理器外,还能影响 AMD 与 ARM 架构的大量处理器,这意味着除服务器与个人电脑以外,智能手机等终端设备也会受到影响,几乎所有现代计算机处理器均无法幸免。它打破了不同应用程序之间的隔离,这意味着,攻击者可以使用恶意程序来获取被隔离的私有数据。

英特尔近日表示,在未来数周内将有软件补丁发布。尽管大多数 PC 用户不会受到影响,但安全补丁会导致处理器 0-30% 的运算速度下降。

根据Eben Upton所述,大量类似树莓派的廉价计算设备可能同样也不会受到两种安全漏洞的影响,包括很多低端安卓手机。

本文介绍现代处理器设计的一些概念,使用简单的 Python 程序解释这些概念,比如:

t = a+b
u = c+d
v = e+f
w = v+g
x = h+i
y = j+k

尽管你的计算机处理器不会直接执行 Python,但这里的语句足够简单,大致相当于简单的机器指令。本文不详述过多处理器设计中的重要细节(主要是 pipelining 和寄存器重命名),它们对理解 Spectre 和 Meltdown 的工作原理不太重要。

想全面了解处理器设计和现代计算机架构,可参阅 Hennessy 和 Patterson 的经典著作《Computer Architecture: A Quantitative Approach》。

什么是标量处理器?

最简单的现代处理器每次循环执行一个指令,我们称之为标量处理器。上述示例在标量处理器上需要执行六次循环。

树莓派 1 和树莓派 Zero 中使用的 Intel 486 和 ARM1176 都是标量处理器。

什么是超标量处理器?

很明显,加速标量处理器的方式就是提高其时钟频率(clock speed)。但是,我们很快就到达处理器内部逻辑门运行的极限;因此处理器设计人员开始寻找一次性处理多件事情的方式。

有序超标量处理器检查收到的大批指令,尝试在一个 pipeline 中一次性执行多个指令,这取决于指令之间的依赖关系。依赖关系很重要:你或许认为双向超标量处理器可以将 6 个指令配对执行,如下所示:

t, u = a+b, c+d
v, w = e+f, v+g
x, y = h+i, j+k

但是这没有作用:我们必须先计算 v 再计算 w,即第三个和第四个指令无法同时执行。双向超标量处理器实际上无法找到与第三个指令配对的指令,因此,该示例将执行四个循环:

t, u = a+b, c+d
v    = e+f                   # second pipe does nothing here
w, x = v+g, h+i
y    = j+k

超标量处理器包括 Intel Pentium 以及树莓派 2 和树莓派 3 分别使用的 ARM Cortex-A7 和 Cortex-A53。树莓派 3 的时钟频率只比树莓派 2 高 33%,但性能大约是后者的 2 倍:部分原因在于 Cortex-A53 超出 Cortex-A7 的对大量指令的配对执行能力。

什么是无序处理器(out-of-order processor)?

回到我们的示例,我们可以看到即使 v 和 w 之间存在依赖关系,我们也可以找到其他独立的指令填补第二次循环中空的 pipe。无序超标量处理器能够打乱指令的顺序(同样受限于指令之间的依赖关系)以保持每个 pipeline 都处于忙碌状态。

无序处理器可以有效交换 w 和 x 的顺序:

t = a+b
u = c+d
v = e+f
x = h+i
w = v+g
y = j+k

允许执行三次循环:

t, u = a+b, c+d
v, x = e+f, h+i
w, y = v+g, j+k

无序处理器包括 Intel Pentium 2(以及大部分后续 Intel 和 AMD x86 处理器,除了一些 Atom 和 Quark 设备)和很多近期的 ARM 处理器,如 Cortex-A9、-A15、-A17、-A57。

什么是分支预测器(branch predictor)?

上述示例是直线式代码块。真正的程序不是这样的:他们还包括正向分支(用于实现条件运算,如 if 语句)、反向分支(用于实现 loop)。分支可能是无条件的(通常被采用),也可能是有条件的(是否采用取决于计算值)。

获取指令时,处理器可能遇到依赖于计算值的条件分支(而该值目前尚未计算出)。为了避免停顿,处理器必须猜测下一个要获取的指令:内存顺序(对应未采用分支)或分支目标(对应采用分支)上的下一个指令。分支预测器通过收集某一个分支之前被采用频率的相关统计数据,帮助处理器猜测该分支是否被采用。

现在分支预测器非常复杂,可以生成非常准确的预测。树莓派 3 的额外性能部分是由于 Cortex-A7 和 Cortex-A53 之间分支预测的改进。但是,攻击者也可以通过执行精心设计的一系列分支,误训练分支预测器作出较差的预测。

什么是推测?

重排序顺序指令(reordering sequential instruction)是一种恢复指令级别并行化的强大方法,但是由于处理器变得更宽(能够一次执行三个或四个指令),保证所有 pipeline 处于忙碌状态变得更难了。因此,现代处理器提高了推测能力。推测执行可以处理并不需要的指令:这样就可以保证 pipeline 处于忙碌状态,如果最后该指令没有被执行,我们只需要放弃结果就可以了。

推测执行不必要的指令(以及支持推测和重排序的基础架构)需要耗费大量能源,但是在很多情况下为了获取单线程性能的提升,这种方法是值得的。分支预测器用于选择通过程序最可能的路径,最大化推测获得收益的可能性。

为了展示推测的好处,我们可以看一下另一个示例:

t = a+b
u = t+c
v = u+d
if v:
   w = e+f
   x = w+g
   y = x+h

现在,我们具备从 t 到 u 到 v、从 w 到 x 到 y 的依赖关系,那么没有推测的双向无序处理器无法填充第二个 pipeline。它用三次循环来计算 t、u 和 v,之后处理器知道 if 语句的主体是否被执行,然后用三次循环来计算 w、x 和 y。假设 if(由一个分支指令实现)使用了一次循环,那么该示例可以执行四次(v 是零)或七次循环(v 不是零)。如果分支预测器表明 if 语句的主体很可能被执行,那么推测可以有效打乱程序,如下:

t = a+b
u = t+c
v = u+d
w_ = e+f
x_ = w_+g
y_ = x_+h
if v:
   w, x, y = w_, x_, y_

因此现在我们有了额外的指令级别的并行来保持 pipeline 繁忙:

t, w_ = a+b, e+f
u, x_ = t+c, w_+g
v, y_ = u+d, x_+h
if v:
   w, x, y = w_, x_, y_

循环计数在推测性无序处理器中变得不太明确,但是 w、x 和 y 的分支和条件更新(几乎)是空闲的,因此上述示例几近于执行三个循环。

什么是缓存?

在过去,处理器速度与内存访问速度成正比。我的 BBC Micro(2MHz 6502),可以每 2μs(微秒)执行一次指令,存储周期为 0.25μs。在接下来的 35 年中,处理器已经变的非常快,但是内存几乎没变化:树莓派 3 中的一个 Cortex-A53 可以每 0.5ns(纳秒)执行一次指令,但是可能需要 100ns 才能访问主存。

a = mem[0]
b = mem[1]

需要 200ns。

但在实践中,程序倾向于以相对可预测的方式访问内存,同时展示时间局部性(如果我访问一个定位,我很可能很快再次访问它)和空间局部性(如果我访问一个定位,我很可能很快访问附近的位置)。缓存利用这些属性来降低访问内存的平均成本。

缓存是一个小的片上内存,接近于处理器,存储最近使用的位置(及其近邻)内容的副本,以便在随后的访问中可以快速获取。借助缓存,上述示例的执行将稍微超过 100ns:

a = mem[0]    # 100ns delay, copies mem[0:15] into cache
b = mem[1]    # mem[1] is in the cache

从 Spectre 和 Meltdown 的角度来看,最重要的一点是你可以对内存访问的时间进行计时,你可以知道访问的地址是在缓存之中(短时)或者不在(长时)。

什么是边信道?

来自维基百科:

“边信道攻击是基于从密码系统的物理实现获得的信息的任何攻击,而不是算法中的蛮力或理论弱点(相较于密码分析学)。例如,定时信息、功耗、电磁泄漏甚至声音都可以提供额外的信息源,这些信息可被用来破解系统。”

Spectre 和 Meltdown 属于边信道攻击,通过定时来观察缓存中是否有另一个可访问的位置,以推断内存位置的内容,这些内容通常不应该被访问。

把它放在一起

现在让我们看看如何结合推测和缓存以允许类似 Meltdown 的攻击。考虑下面这个示例,它是一个有时读取所有非法(内核)地址的用户程序,并导致错误(崩溃):

t = a+b
u = t+c
v = u+d
if v:
   w = kern_mem[address]   # if we get here, fault
   x = w&0x100
   y = user_mem[x]

现在,假设我们可以训练分支预测器,使其相信 v 很可能是非零的,那么我们的无序双向超标量处理器就会混洗程序,像这样:

t, w_ = a+b, kern_mem[address]
u, x_ = t+c, w_&0x100
v, y_ = u+d, user_mem[x_]

if v:
   # fault
   w, x, y = w_, x_, y_      # we never get here

即使处理器总是推测性地读取内核地址,它必须推迟产生的错误,直到知道 v 是非零。从表面上看,这是安全的,因为:

  • v 是零,所以非法读取的结果不会被提交给 w
  • v 是非零,但在读取结果被提交给 w 之前发生了错误

然而,假设我们在执行代码之前刷新缓存,并排列 a、b、c、d 以使 v 实际上为零。现在第三个循环中的推测性读取为:

v, y_ = u+d, user_mem[x_]

其将依赖非法读取结果的第八位获取用户地址 0x000 或 0x100,并把地址及其近邻加载进缓存。由于 v 是零,推测性指令的结果将被摈弃,执行将继续。如果我们随后访问其中一个地址,就可以决定哪个地址在缓存之中。恭喜:你刚刚从内核地址空间读取了一个位!

真正的 Meltdown 实际上要比这更复杂(特别是,为了避免错误训练分支预测器,作者无条件地优先执行非法读取,并处理产生的异常),但原理是相同的。Spectre 使用相似方法来颠覆软件阵列边界检查。

结论

现代处理器竭尽全力保持抽象,从而成为直接访问内存的有序标量机器,而事实上,使用包括缓存、指令重排序和推测在内的大量技术来提供比简单处理器更高的性能有望成为现实。Meltdown 和 Spectre 就是当我们在抽象的语境中推理安全性,然后在抽象与现实之间遇到细微差别时会发生的事情的实例。

树莓派使用的 ARM1176、Cortex-A7 和 Cortex-A53 内核中推测的缺失使我们免于此类攻击。

译文出处

本文来自:树莓派实验室

树莓派网络存储(NAS) OpenMediaVault 安装配置

OpenMediaVault,是一个开源的基于 Debian Linux 的下一代网络附加存储(NAS)解决方案。它包含众多服务,如 SSH、(S)FTP、SMB / CIFS、DAAP 媒体服务器、RSync、BitTorrent 客户机等。并具有通过插件可增强的模块化设计框架特性。其核心如下:

  • Debian Linux(Squeeze)系统(i386 or x64)
  • 基于Web方式的系统管理
  • 通过Debian软件包简单的系统升级
  • 用户管理
  • 计划任务
  • 多语言支持(0.4.18版支持繁体中文)
  • 基于DNS-SD(Apple’s protocol)的服务公告
  • 插件系统

下面介绍如何在树莓派上安装配置 OpenMediaVault,方便快捷地搭建 NAS。

一.准备工作

1.树莓派1/2/3型 开发板(我用的是3B),适配的5V2A电源;
2.TF卡(不小于4G),TF 读卡器,/boot (vfat)占55.95MB,OWN (ext4) 占3.18GB
3.一台PC,Windows系统。
4.一台显示器或都电视机,HDMI接口,HDMI线。(其实不用显示设备也是可以的,可以SSH在电脑端操作。
5.一块移动硬盘,最好再配个有源USB-Hub
6.TF镜像。找到对应Pi的型号的镜像,omv_2.2.5_rpi2_rpi3.img.gz 或 omv_2.0.15_rpi_rpi2.img.gz 。
下载地址:https://sourceforge.net/projects/openmediavault/files/Raspberry%20Pi%20images/
或者百度网盘(密码: t8gm)。
7.镜像读写工具 win32diskimager
8.磁盘分区工具 DiskGenius
9.远程SSH  PuTTY

二.刷系统

1.解压 omv_2.2.5_rpi2_rpi3.img.gz 得到omv_2.2.5_rpi2_rpi3.img
2.用Win32DiskImager 把omv_2.2.5_rpi2_rpi3.img 镜像写入(Write)TF卡

三.开机测试

1.把刷好的TF插入树莓派,接好HDMI线到显示器,通电开机。第一次开机系统会自动运行脚本把TF卡未分配空间划分给第三分区。当出现”OMV login:” 说明OMV已经完全启动了。对应找到“My IP address is 192.168.xxx.xxx”记下。

2.登录WebUI:在PC端用浏览器(非IE内核,否则页面加载不正常。我用的360极速)打开刚才的IP地址192.168.xxx.xxx,会进WebUI,
选择语言:简体中文
用户名:admin
密 码:openmediavault
点击登录 按钮

3.修改端口,运行后会莫名的80端口无法访问,所以最好改成其它端口(我用82),改完点保存。应用完成生效。

4.修改时间。如果已经改完端口,这时刷新的面是不能正常访问的,要在IP后面加端口号(192.168.xxx.xxx:82)
时区-Asia/Shanghai (亚洲/上海,东八区和中国同时区就好),其他默认,保存->应用

5.登录SSH,打开 PuTTY ,输入IP,端口,点Open,在打开的命令行窗口提示下输入
用户:root
密码:openmediavault   (输入时不会显示任何字符)
当出现root@OMV:~#  时说明登录成功,可以做任何你想得到的操作,前提是你会。不然就去打相关教程好了。

 

四.插件安装(略)

五.备份

做一个备份是好习惯,如果已经用漫长的时间做好基本设置,装好了各种所要用的插件后,在你做各种尝试性操作时,让系统崩溃,而又无从修复时,从备份还原,可以减少很多时间。
1.软关机。点完关机后10s左右,树莓派网卡的灯会熄掉,就说时已经关机了。软关机后,正常的树莓派是不能再次软开机的,只能重新通电的方式开机。

2.从树莓派上取下TF卡,用读卡器连接电脑,打开Win32DiskImager,在Image File 里选择一个位置,并输入文件名.img(xxx.img),在Device选择TF卡的盘符,点 Read,等待Successful(成功)。将备份好的IMG保存好,在需要还原时,参考 “二.刷系统” 操作。

六.挂载移动硬盘

OMV不支持EXT2,3,extFat,所以最好用ext4或NTFS,如果用Fat32可能会在设置权限时出错。
1.格式化移动硬盘。如果用NTFS或Fat,并且硬盘已经是这种分区格式,直接USB连到树莓派上即可。
NTFS/Fat: WinXP/Win7、8、10系统,我的电脑–管理–磁盘管理–建立分区–格式化  ext4:Win系统不能直接格式化,DiskGenius也只能格成ext2。有谁会用DG格ext4请授教。
PuTTY 远程:   对硬盘分区  fdisk /dev/sda
要把分区格式化成Linux Ext4格式,用: mkfs.ext4 /dev/sda?   要把分区格式化成FAT32格式,用: mkfs.vfat -F 32 /dev/sda?
要把分区格式化成NTFS 格式,用: mkfs.ntfs /dev/sda?   —————–sda?  里的“?”是对应分区编号。
如果要用一块硬盘挂载几种不同格的分区,建议先在PC端分成可识别的几种分区,再到SSH,对所需要的分区      格成ext4格式。
如果在WebUI–磁盘管理–擦除,会抹去整张硬盘数据,重新分成并格式化为ext4的一个分区。谨慎操作!!

2.挂载分区
如果硬盘已经正常连接,会在WebUI–磁盘管理–看到对应的硬盘。
点开WebUI–文件系统,分区会自动挂载,如果没有,就选定分区,手动点挂载。

最后,开始使用你的 OpenMediaVault 吧。

本文来自 噪音爵士 的推荐,原文

本文转载自:树莓派实验室

树莓派3 的 64位 Ubuntu 17.04 评测

本文和测试数据来自 chainsx 的推荐。为了避免标题党嫌疑,把原文标题中的倍数略去了,但从数据上看确实有很大幅度提升,最高指标超官方系统60倍。

为了证明树莓派3与ubuntu-17.04的arm64系统更搭配,我用ubuntu64-rpi里的基于f2fs文件系统的ubuntu-17.04-arm64进行了系统评测。

在树莓派实验室里有一篇《树莓派64位系统Debian 9先行测评:性能最高提升30倍!》,可是,他是使用的预览版debian9进行评测,我这里使用的是ubuntu-17.04-arm64,可以说,这次评测是一次相当成功的评测,评测数据可以在ubuntu64-rpi项目主页内找到,这里,也会附出。

关于F2FS文件系统我也不再介绍,在《树莓派64位系统Debian 9先行测评:性能最高提升30倍!》里也已介绍,

硬件测试环境:

  • RaspberryPi 3 Model B
  • 16GB Class 10 TF卡
  • 5v 2.5A电源
  • 以太网网线及能连外网路由设备

软件测试环境:

  • ubuntu64-rpi(使用ubuntu-17.04-arm64 非移植版,由源码构建)
  • sysbench 压力测试软件

这里,为了确保可比较性,我使用的评测工具和《树莓派64位系统Debian 9先行测评:性能最高提升30倍!》里一样

sudo apt-get update && sudo apt-get –y install sysbench htop iperf3

测评结果点击这里查看(直接保存的ssh记录,如有疑问请自测,系统已放出)

总结一下:

  • cpu单线程:12.4798
  • cpu4线程:31.1217
  • cpu8线程 31.0916
  • 八线程测试共享线程锁 14.9217
  • 连续读写 0.3604
  • 随机文件读写 0.5636
  • 互斥锁测试 0.0184
  • 内存连续测试 1.2890
  • 内存随机测试 0.9564

这里,使用《树莓派64位系统Debian 9先行测评:性能最高提升30倍!》里提供的raspbian的数据进行比较(由于我目前没有过多时间来进行对最新版raspbian的评测,这里直接引用该文章提供的数据,这里,感谢该文章作者提供的数据。)

测试项目 Raspbian2017-03-03 ubuntu-17.04-arm64(ubuntu64-rpi) 提升倍数
系统信息 Arm 32bit/ext4文件系统 Arm64bit/f2fs文件系统 见文件系统测试
CPU单线程 367.2971 12.4798 29倍
四线程 1017.6742 31.1217 31倍
八线程 1920.0601 31.0916 62倍
内存随机 5.7678 0.9564 6倍
内存连续 6.3309 1.2890  5倍
文件连续读写 5.7655 0.3604 15倍
随机读写 不支持 0.5636
互斥锁性能 0.0231s 0.0184s 1.2倍

这里我们看到,测试结果让我们大吃一惊,我们的ubuntu-17.04-arm64超官方60倍,我相信,树莓派官方系统仍在不停的改进,测试结果可能与现在的最新版raspbian有出入,但是,我们这里强调的是64位系统的优越性,由此可见,64位系统的却发挥了其应有的优势。

以上测试并非使用64位官方系统,但能够让大家看到软硬件匹配64位之后,树莓派性能上的提升潜力。作为树莓派爱好者,一起期待官方发布64位系统吧!

附上系统项目地址 https://github.com/chainsx/ubuntu64-rpi

本文来自:树莓派实验室

 

 

 

树莓派安装 Arduino IDE 进行 Arduino 开发

Arduino 与 树莓派是 Maker 们创作的两大利器。在接触树莓派之前,我们通常是在 PC 上安装 Arduino 的 IDE 进行 Arduino 开发,而今有了树莓派,PC 的在 Arduino 开发中所起的作用将被树莓派替代了,现在可以直接在树莓派上安装 Arduino IDE 进行 Arduino 开发。下面来介绍具体方法。

由于 Arduino IDE 是图形界面的,所以不用说你的树莓派需要是图形界面版本而非 Lite、Core 版。

一、安装 Arduino IDE

直接命令行安装最简单:

sudo apt-get install arduino

之后主菜单中会出现 Arduino IDE 的菜单。

二、连接 Arduino 开发板

1、通过 USB 将 Arduino 开发板和树莓派连接起来,同 Arduino 连接 PC 一样。
因树莓派 USB 口限流,将 Arduino 板的供电接口同时外接 9-12V 的电源适配器供电更好。

2、配置通信端口
菜单:Tools -> Port:”/dev/ttyxxx” -> 选择”/dev/ttyACM0″

 

 

3、编译测试
菜单:File -> Examples -> 01.Basics -> Blink

点击工具栏 Upload 按钮,将自动完成编译后并下载到板子上,看到界面下方出现 “Done uploading” 即可。

本文来自:树莓派实验室

 

 

一张树莓派全家福,你拥有多少?

Raspberry Pi(树莓派)是为学习计算机编程教育而设计,只有信用卡大小的微型电脑。自问世以来,受众多计算机发烧友和创客的追捧。从第一枚树莓派发布至今,已经有过10种不同的版本,其尺寸从存储棒大小的 Zero 系列、到 A+、再到信用卡大小的 Model B,可用于各类智能产品、可穿戴设备的 DIY。下面发一张树莓派至今(2018年)最完整的全家福,包括了不同的小版本,看看你拥有多少?

Raspberry Pi Family Photo

再来看看不同版本的配置对比,内存从1代的 256MB 到最新的3代 1GB。

P.S.树莓派官方称下一代树莓派4预计在2019年发布,届时配置将达到 CPU BCM4908 64 Bit 1.8GHz\内存 2GB,同时支持 USB3.0。

本文来自:树莓派实验室