3000核!用750张树莓派挑战最经济超算

国家耗数亿元巨资打造的天河、太湖之光等超级计算机,使中国得以在超级计算机排名中长期霸榜。不过除了砸大钱盖超级计算机之外,美国国家实验室则是选泽了更节省成本的方式,来打造超级计算机,利用750片树莓派开发板组成的运算丛集,成功打造出一台更省钱的超级计算机,未来更要扩大至1万个节点扩充,挑战挤进全球百大Peta级超级计算机排名。目前这套HPC系统已经实际展开测试,未来也将用于科学研究之用。这台树莓派超级计算机本周也在美国丹佛举行的2017超级计算机展上公开展出 。

这套系统藉由5套每个包含150张Raspberry Pi 3 B的6U机箱模块构成,且由于Raspberry Pi 3 B搭载了64位的四核心ARMv8 1.2GHz,高达750张Raspberry Pi 3 B也意味著有超过3000个以上的核心,足以满足特定超级计算机的多核需求。

值得一提的是,Raspberry Pi 3 Model B的国内售价为240元左右,所以750张树莓派组成的超级计算机售价大概为18万元,这对于一台拥有3000核心以上的超级计算机来说已经是最低价格了。

其实利用树莓派来打造超级计算机,早已不是新鲜事。火柴盒大小外型的树莓派,因为具备有迷你电脑的功能,2012年一推出就十分受到欢迎,甚至还掀起了一股自造者(Maker)风潮。一台千元有找的树莓派开发板,因为价格便宜,不只成为许多新创公司开发及验证产品的首选,这股DIY热潮甚至也蔓延到科学界,开始有人将它用在科学研究,例如,2012年就有美国树城州立大学博士生Joshua Kiepert用32个树莓派组成运算丛集,成本不到2,000美元。

后来,更有英国南安普敦大学一名电脑工程师,使用64个树莓派和乐高积木,来打造出超级计算机Iridis-Pi,成本只花不到台币13万元。这次由美国能源部两大国家实验室之一的洛斯阿拉莫斯国家实验室( Los Alamos National Laboratory)自建的树莓派超级计算机,使用的树莓派更是当时数量的10倍,多达成750片树莓派开发板组成的运算丛集。

用750片树莓派打造世界级的超级计算机

洛斯阿拉莫斯国家实验室自建的超级计算机,主要采用BitScope提供的模组式刀锋机柜来搭建,因为全采用树莓派开发板来设计超级计算机,所以成本上也比一般超级计算机还便宜,甚至使用上也更省电,每个运算节点平均耗电只有2到3瓦而已。

根据洛斯阿拉莫斯国家实验室高效能运算部门负责人Gary Grider表示,这个树莓派超级计算机系统内,总共内建750个CPU计算节点(采用1.2 GHz Quad Core ARMv8处理器),拥有高达3,000颗核心可供计算使用,已经具备有等同超级计算机的计算能力。该实验室未来还要扩大规模挑战1万个,甚至最多5万个节点扩充,单以运算效能来看,理论上,跟自家的Grizzly超级计算机系统(全球排名85,运算效能达到1.5 PFLOPS)相比,将毫不逊色,甚至比台湾国网中心自行研发排行全球95名的Peta超级计算机(运算效能有1.325PFLOPS)都还快。

不只目标要挤进前百大,这台树莓派超级计算机的建置成本,比起一般超级计算机还更加便宜,虽然Gary Grider并未透露实际的建置成本,但若以他们使用的Raspberry Pi3 Model B(售价35美元)来计算的话,750个树莓派加总成本差不多2万6千美元(约台币78万元),即使在加上其他的基础建置费用,还是远比一般动辄上亿美元的超级计算机建置成本低许多。

Gary Grider表示,开发人员可以利用树莓派的模组及软体,在超级计算机上来编写应用,而不需要花费数亿美元购买高成本的软硬体,来搭建HPC测试平台,而且更耗电,需要数百万瓦(MW)的电力才可供系统正常运作。 Gary Grider也透露,他们自建的树莓派超级计算机,每个运算节点平均耗电只有2到3瓦,即使是将750个节点全部加总起来,耗电量也远低于目前许多的超级计算机,不只省钱也省电,而且系统还可以依需求弹性扩充。

树莓派超级计算机的机箱共有5个刀锋模组组成,每个模组可以装下150片树莓派开发板,上图为其中一个刀峰模组,并经由乙太网路连接,来建立运算丛集,机箱内也整合交换器,还配备一组48伏特的电源供应器设备来供电。

然而,要用数千到数万台树莓派组出一台Peta级的超级计算机,并不是件容易的事,因为随着运算丛集规模变大,不同运算节点和节点之间连接和传输也将变得更加复杂,而容易造成存取延迟与传输频宽不足的问题,而影响了系统的效能,这也是系统扩充的挑战。即使是洛斯阿拉莫斯国家实验室一开始,也只能扩充到最多40个运算节点,后来,他们找来了HPC厂商BitScope及SICORP共同合作,重新设计机箱和进行系统整合,来解决系统扩充的难题,才从原来最多40个节点,增加到144个,到现在的750个节点,未来还要挑战数千到数万个节点的扩充。

根据SICORP网站的介绍,树莓派超级计算机是采用BitScope提供的模组式刀锋机柜来搭建,机箱内由5个刀锋模组组成,每个模组一次最多可以装入150片树莓派开发板,这些运算模组可以经由乙太网路连接,来建立运算丛集,机箱内也整合网路交换器,还配备一组48伏特的电源供应器设备供电。

不过,Gary Grider也强调,这台树莓派超级计算机并非用来取代其他超级计算机,而是希望当作提供给开发人员,及研究者,另一个可用于研究测试及验证的全新HPC运算平台,不只具备高效能计算能力,而且更便宜。他也表示,未来除了会持续增加节点数量,来提高运算效能外,也将建立新的网路架构,并且结合引入( bootstrap)、管理及灾难复原的演算法,以及聚焦系统与分散式储存研究等。

本文来自:http://shumeipai.nxez.com/2017/11/22/750-raspberry-pi-challenge-the-most-economical-super-computing.html

 

树莓派开箱配置之更改键盘布局

树莓派用了几次后,发现键盘老是按错,一些字符打不出来或打错。这个问题,折腾我半天。还是把心得分享一下吧~

上网查,发现是键盘布局不对,树莓派(raspberry pi)是英国产品,默认键盘布局是英国(GB),我们用的键盘布局一般是美国(US)的。

更改键盘布局,命令如下:

sudo dpkg-reconfigure keyboard-configuration

进入后,选通用的101键PC键盘。

按tab键,到OK,按Enter确定。

在键盘layout选择中,选Other。

按tab键,到OK,按Enter确定。

然后在选项中,选English(US)。

按tab键,到OK,按Enter确定。

再选English(US, alternative international)。

按tab键,到OK,按Enter确定。

然后一路按OK。

退出后,重启系统。

sudo reboot

重新启动时,由于修改了键盘布局,在读取键盘布局的阶段会比平常慢一些。

OK了, 终于可以打出所有字符了。

本文来自:http://shumeipai.nxez.com/2017/11/13/raspberry-pi-change-the-keyboard-layout.html

自行移植树莓派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://maker.quwj.com/project/28

本文来自:树莓派实验室

Umain公司,推出与树莓派3联动的UWB Radar sensor开发套件

超宽频(UWB)近距雷达传感器被称为第四次产业革命的核心要素,韩国Umain将树莓派3与UWB雷达传感器模块进行相结合,成功开发出为开发者提供更为自由的开发环境的HST-D3套件。

一般使用1GHz的UWB雷达传感器模板价格在人民币几万元左右,但是Umain通过系统级芯片技术实现了产品的量产,将产品价格更加合理化。今年2月份问世的产品,也得到了全世界很多家企业的关心以及支持。

近期正式推出的HST-D3开发套件是通过特定开发平台—树莓派3,为开发者提供更为自由的开发环境,并且适用于各种应用。此款产品可以单独工作,或者通过提供的接口与其他机器进行联动工作。此外,Windows以及Linux环境下的SDK也将提供给开发者便于开发。

由于UWB雷达技术具有极强的穿透性等优秀性能,技术性要求比较高,所以一直以来大多数被作为军用技术进行开发使用。即使在较为恶劣的条件下也可以正常运行工作,在暴雪天气或者酷暑天气也可以保持超高的探测能力。

UWB雷达传感器模块可以高速分析并处理Implus信号的发射与反射。Umain开发了可以在多种环境下进行物体监测或者进行呼吸、脉搏等生物信号的软件。目前为止,Umain成功开发出了呼吸、脉搏、人体、距离、车辆、在室监测算法。公司负责人提到,由于UWB技术具有极高的性能,所以可以被广泛应用在自主泊车、医疗、机器人、物联网、保安、家电以及ITS等领域。

最近公司正在进行共同开发的项目有监测患者是否从病床坠落的相关开发,不仅是韩国很多的医院,成功开发以后,也可以作为智能家居的设备被使用。根据调查结果显示,现在老人意外事故中,有很大一部分是在睡眠中不慎从床上摔下导致的。

此外,Umain公司为了开拓中国市场,已经参加了MWC上海博览会,深圳国际物联网博览会,并且已经确定参加11月在深圳举办的深圳高新技术成果交易博览会。

转载自

http://news.163.com/17/1107/10/D2KQV70Q00014AEE.html

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

是时候关掉你的手机闹铃了,用树莓派外接一个音箱就可以 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 mplayer
#更新源
#安装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

代码

灯闪亮

# -*- 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文件

# -*- 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'>(.*)</',str(soup1))
        b = ''
        try:
            slist = re.findall(r'^(.*)</span>(.*)<i>(.*)$',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()

去创建新应用,看开发文档,查看key,复制进去,就可以使用百度语音api了。
百度语音合成-开发文档
天气网选择你的城市,把main函数下的url改了,如果html结构都是一样的,那就都可以执行,如果不一样需要更改makeSoup函数了。

最后设置定时运行

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

时区不对:

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`

前面的python3,就是virtualenv下的python
后面的文件也需要使用绝对路径
mpalyer命令有’`’这个符合不要忘记加上

本文来自:

http://shumeipai.nxez.com/2017/10/27/crontab-and-raspberry-pi-voice-alarm-clock.html

 

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

本文来自:

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

在树莓派3上安装ROS

本文介绍如何在树莓派3上安装ROS Kinect

虽然可以在树莓派官方镜像Raspbian上安装ROS,不过实际上所有代码都在树莓派上本地编译,耗时不说还有可能出现意想不到的错误,因此我们还是推荐大家先把树莓派换成Ubuntu的镜像再安装ROS。

你需要准备以下东西:

  • 树莓派3
  • 最少16G的SD卡,最好Class10

下面让我们一步步来~

1. 在树莓派上安装Ubuntu

最新Kinect版本的ROS只能在16.04上运行,因此我们首先要在树莓派上安装Ubuntu Mate 16.04。

到ubuntu mate 下载最新的镜像,注意一定要选16.04不要下载成16.10了

https://ubuntu-mate.org/raspberry-pi/

下载完成后会得到一个如下的镜像文件

ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img.xz

将它解压得到

ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img

Windows的用户可以使用ImageWrite将镜像烧录到SD卡上,如果找不到工具可以在这里下载 https://sourceforge.net/projects/win32diskimager/

经过漫长的等待。。。。。


2. 首次启动Ubuntu Mate

将烧录好的SD卡插入树莓派3,接上电源,HDMI显示器和键盘鼠标

注意: 这里有同学可能跟我一样平时玩树莓派从来不接键盘鼠标和显示器,全部靠ssh远程操作。不过Ubuntu Mate在首次启动需要人工完成一下安装过程和配置,因此还是老老实实接上外设吧:)

安装过程基本就是一路Next,还有就是配置Ubuntu的用户名和密码。

进入系统后可以先将SD卡扩容到真实大小。具体操作是点击欢迎界面右下角的红色树莓派图标,里面有一个SD卡扩容选项。

也可以通过下面命令行手动重新分区sd卡。

sudo fdisk /dev/mmcblk0

在fdisk的提示框下按下d,2删除第二个分区,之后重新建立分区(n,p,回车,回车),最后按下w保存。重启系统,之后执行下面命令行

sudo resize2fs /dev/mmcblk0p2

注意:安装完系统后配置wifi连接并不能生效,这是一个bug重启系统后解决。


3. 安装ROS Kinect

接下来的步骤基本就是照着http://wiki.ros.org/kinetic/Installation/Ubuntu 走了

打开树莓派的终端,或者远程ssh连到树莓派。

首先加入ROS官方的源

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" &gt; /etc/apt/sources.list.d/ros-latest.list'<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1">​</span>

并且设置秘钥

sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

Ok,现在更新Package的列表

sudo apt-get update

在树莓派上安装ROS包,这里我们只安装ROS内核。因为平时机器人在运动的时候基本上是在PC上远程查看信息的,因此不需要安装ROS的GUI相关工具。

sudo apt-get install ros-kinetic-ros-base

更新ROS相关依赖和环境

sudo rosdep init
rosdep update

注意第二个命令有可能会超时,这是GFW经常卡gist.github造成丢包,多重试几次应该就能过了。
接着将ROS环境导入到bashrc,这样每次启动新的终端都有ros的命令和环境参数了。

echo "source /opt/ros/kinetic/setup.bash" &gt;&gt; ~/.bashrc
source ~/.bashrc

最后安装常用的ROS命令行工具

sudo apt-get install python-rosinstall

到这里位置ROS基本安装完毕了,打开一个新的终端,并且输入:

roscore

看看ROS内核是不是跑起来了呢?

参考链接:

http://wiki.ros.org/kinetic/Installation/Ubuntu

http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi

转载请注明出处:http://kittenbot.cn/install_ros_on_rpi3/ ‎

树莓派3上安装配置Kali Linux

0x01 准备工作

用win32diskmanager将kali系统写入tf卡

1)kali官网下载树莓派3镜像文件(https://www.offensive-security.com/kali-linux-arm-images/)

2)win32diskmanager下载安装(傻瓜式写入tf卡,不赘述了)

0x02 连接树莓派3,简单配置kali

1)若身边无多余显示器,也没有路由器的管理权限(有自己路由管理权限的,登入去看下就知道新装的kali的ip了),可以开启笔记本无线网络共享,用网线连接树莓派3和笔记本,再ssh连接树莓派3,具体操作:

开启无线网络共享

用网线连接树莓派3和笔记本, arp -a 查看树莓派3的ip,此处动态的ip即为你pi3的ip地址

使用SecureCRT或putty等工具ssh连接树莓派3(root/toor),接下来你也会的(apt-get update && apt-get upgrade && apt-get dist-upgrade && apt-get clean),进入漫长的等待吧,可以出去买杯星爸爸再回来看看。笔者没有配置国内源,如果你想配置,也可以,命令 nano /etc/apt/source.list,复制你想要添加的源即可,我这里添加了下阿里和中科大的源。

#阿里云kali源
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free
deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free

#中科大kali源
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-fre

0x03 安装VNC,远程桌面你的kali

还是先用ssh连接到kali,然后

##apt-get install tightvncserver

安装完之后,开启vnc连接

##tightvncserver

会提示你输入远程时要验证的密码,输入你的密码(系统会提示你需要一定复杂度)

第二个view-only password(应该是指只远程,不授权管理的远程桌面吧,类似qq的那个允许远程,但不授权控制),选n即可;创建完发现是:New ‘X’ desktop is kali:1。

然后在你的笔记本或PC终端上安装vnc(百度下载安装下),打开vnc后输入kali的ip:1(这里后面的“:1”一定要输入),然后键入你刚创建的密码(不是kali系统的密码,允许远程桌面连接的那个密码)

设置vnc服务开机启动(我会另起一文做下说明)

连接成功。

 

0x04 重新调整磁盘大小(安装gparted)

重新调整下你的kali盘符大小,默认装完,可以查看下系统的大小(df -h)

发现才6.7G(我的tf卡有32G),所以我们要resize下磁盘大小,需要安装gparted

##apt-get install gparted

安装完之后,启动

##gparted

重启调整下磁盘大小,拉到最大,确定,应用(apply)。

0x05 完全安装你的kali(kali-linux-full)

安装后之后,你会发现kali上只有一部分工具,那么我们需要完全安装kali

##apt-get install kali-linux-full

安装过程中会让你选择一些配置,根据自己的喜好选择下(什么自动切换mac之类的),接下来又是漫长的等待

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-10/147705.htm

 

 

 

树莓派上安装配置Archlinux

安装Archlinux

安装Archlinux这部分在Linux系统中测试通过。sdX是SD卡盘符。

SD卡分区

  1. 使用fdisk工具 # fdisk /dev/sdX
  2. fdisk提示命令下删除旧分区并新建:
    •  按o 删除全部分区
    • p列出分区,此时应该没有任何分区。
    • n新建分区, 然后p选择为主分区, 输入1作为SD卡的第1个主分区; 按回车选择默认开始扇区,再输入+100M设置结束扇区.
    • t,然后按c设置刚才的主分区类型为W95 FAT32(LBA).
    • n新建分区,然后p选择为主分区,输入2作为SD卡的第2个主分区;按两次回车默认把SD卡剩下的空间都给第2主分区.
    • w写入保存分区, 退出fdisk.

格式化和挂载分区

把第1主分区格式化为FAT分区,并挂载到boot:

mkfs.vfat /dev/sdX1
mkdir boot
mount /dev/sdX1 boot

把第2分区格式化为ext4分区,并挂载到root:

mkfs.ext4 /dev/sdX2
mkdir root
mount /dev/sdX2 root

下载树莓派Archlinux ARM版本, 安装到SD卡

wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz
tar -zxpf ArchLinuxARM-rpi-latest.tar.gz -C root
sync
mv root/boot/* boot

安装完成,卸载分区

unmount boot root

系统安装完成

Archlinux镜像已经安装成功,连上网线,插上电源,可以直接SSH到树莓派了。
默认用户名和密码为:alarm
管理员用户名和密码为:root
管理员帐号无法远程登录

配置Archlinux

添加国内源

编辑 /etc/pacman.d/mirrorlist

在文件头部添加:

  • 清华软件源:Server = http://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/$arch/$repo
  • 中科大软件源:Server = http://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo

更新软件源:

pacman -Syyu

安装SUDO

安装sudo:

 pacman -S sudo

输入 visudo 去掉 #%wheel ALL=(ALL) ALL 此行注释,使wheel用户组可以临时使用sudo 提高权限.

visudo

参考资料

  1. http://archlinuxarm.org/platforms/armv6/raspberry-pi

转载自

http://www.jianshu.com/p/be4a44a54b65

20分钟理解并写出简易的网速监控API

这是一篇学习笔记。用于快速理解,并在Raspbian(或者其他Linux系统)上,利用Python的Flask框架快速写出一份简易的网速监控API。

0 序言

我目前成为了树莓派的重度使用者。平时Python的练习可以在上面做,同时它也是我的NAS(简易版)、离线下载机、无线路由器……

对于我来说,对某台机器网速的监控有很大的需求,因此之前尝试利用基于PHP的探针提供的API来监控实时网速

PHP探针在建站环境上的主机会非常方便。但是对于没有PHP环境的主机,专门为了一个探针而配置PHP,则过于臃肿。

今天写了这篇文章,同时也作为我自己的笔记,用Python的Flask框架快速写出一份简易的网速监控API。

进行操作后,不只是网速监控API,可以根据自身需求推广到其他API的快速搭建。

我们最终的目标是,HTTP访问目标ip:端口,得到json形式的返回结果:

{
"interface": "eth0",
"rx": "58829838538",
"time": "1506500429.11",
"tx": "59272128479"
}

包含网口名,rx和tx字节数,此时的时间戳(api提供端无状态,只提供时间戳。网速信息在api获取端运算)。

注:JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

1 了解 /proc

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

pi@raspberrypi:/proc $ ls
1     1158  1323  1452  1673  2057  2474  45   576  66    77    8032  904        bus          interrupts   modules        timer_list
10    1180  1336  146   1674  2058  25    46   579  67    7791  8035  912        cgroups      iomem        mounts         timer_stats
1009  1184  1350  1460  1691  21    26    47   58   670   7797  8097  915        cmdline      ioports      net            tty
104   1187  1356  148   1695  2122  27    48   580  68    78    8134  916        consoles     irq          pagetypeinfo   uptime
1076  124   1357  1482  17    2126  273   49   582  69    7804  8136  917        cpu          kallsyms     partitions     vc-cma
1077  1259  1358  15    1736  22    28    5    59   6948  7811  82    918        cpuinfo      keys         sched_debug    version
1078  1260  1361  1536  1742  222   29    50   60   7     7813  83    919        crypto       key-users    self           vmallocinfo
1079  1269  1363  1585  1777  223   3     51   61   70    79    85    922        devices      kmsg         slabinfo       vmstat
108   1272  1364  1625  1780  224   31    52   619  71    7901  879   932        device-tree  kpagecgroup  softirqs       zoneinfo
1081  1290  1365  1626  18    228   32    53   62   72    7936  88    933        diskstats    kpagecount   stat
1085  1291  1378  1646  1813  2288  322   54   63   73    7940  89    937        driver       kpageflags   swaps
1097  13    1379  1648  1871  23    33    55   64   738   8     892   946        execdomains  loadavg      sys
11    1309  14    1651  19    238   34    56   65   75    80    898   960        fb           locks        sysrq-trigger
1108  1312  1402  1652  2     239   35    57   658  7669  8025  9     asound     filesystems  meminfo      sysvipc
1154  1321  1442  1668  2056  24    44    575  659  7691  8030  90    buddyinfo  fs           misc         thread-self

详情可参考 Linux下/proc目录简介 [1]

对于状态监控,我们一般关心的信息如下:
/proc/cpuinfo cpu的信息
/proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态
/proc/meminfo RAM使用的相关信息
/proc/uptime 系统已经运行了多久
/proc/net 网卡设备信息
/proc/net/dev 显示网络适配器及统计信息
/proc/diskstats 取得磁盘信息

这样,我们就可以各取所需。在本例中,我使用了/proc/net/dev 显示网络适配器及统计信息。

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
  tun0: 3852102709 17680346    0    0    0     0          0         0 1974345633 21150157    0 182375    0     0       0          0
 wlan0: 7886340   51924    0    4    0     0          0       248 15654713   23263    0    0    0     0       0          0
    lo: 1109576    6222    0    0    0     0          0         0  1109576    6222    0    0    0     0       0          0
  eth0: 1357382867 17758879    0 32317    0     0          0         0 354351259 21157222    0    0    0     0       0          0
  eth1: 145114110 1581538    0    0    0     0          0         0 2151465834 4647523    0    0    0     0       0          0

/proc/net/dev就是我们流量监控的数据来源。

我关心eth0的网卡流量。因此我只要抓出eth0(第六行)行的RX字节数和TX字节数即可,再在api中返回此时的时间戳。

对于 /proc/net/dev 文件中我关心的信息,我使用的部分Python代码如下。

f = open('/proc/net/dev','r')
 for x in range(5):
       f.readline()
 line = f.readline()
 strline = line.split(' ')
 strline2 = []
 for a in strline:
         if a != ' ':
                 if a !='':
                         strline2.append(a)

至此,我们得到的strline2就是eth0行中包含的数据列表。根据/proc/net/dev 格式,rx数据量是strline2[1],tx数据量是strline2[9]。当然,你也可以用正则表达式来实现。

毕竟是自己使用的简易API,如果不是特别在意的话,实现方法不优雅也无妨。

至此我们就能把自己需要的信息提取出来了。

2 熟悉 flask 框架

Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask使用BSD授权。 Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。

Flask有提供文档 http://docs.jinkan.org/docs/flask/

用简单的话说,Flask可以让你快速搭建起来一个web服务端,而省去一些技术细节。

不要误解,Flask的能力足以支撑大型的商业项目。但由于其轻量易上手,使得我们也可以在自己的项目中轻松使用。我们来看一下其helloworld代码。

from flask import Flask
app = Flask(__name__)
 
@app.route("/")
def hello():
    return "Hello World!"

如你所见,短短几行代码实现了基本的web静态服务。

我们将上面获取网速的代码加入,就可以实现我们的API功能。

具体操作如下:

安装flask

sudo pip3 install flask

在我们的目录下新建一个app.py并编辑

#!flask/bin/python
from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def index():
    return "Hello, World!"
 
if __name__ == '__main__':
    app.run(host='0.0.0.0',port='5050',debug=True)

注意,相比helloworld,最后一行代表的含义是:在0.0.0.0(本地/不检查ip)上开放,端口5050,开启调试,然后执行。

此时访问 http://localhost:5050 或者 http://目标机器ip:5050 即可返回HelloWorld。(访问失败,注意防火墙设置)

具体特性如调试、路由等等使用方法,本文不多提及,请参照官方文档。

3 写出服务端

我们最终的目标是,HTTP访问目标ip:端口,得到json形式的返回结果:

{
"interface": "eth0",
"rx": "58829838538",
"time": "1506500429.11",
"tx": "59272128479"
}

接下来将上面两部分结合,写出服务端即可。我的代码如下:

#!flask/bin/python
from flask import Flask, jsonify
import time
 
app = Flask(__name__)
 
net =   {
                'interface':'eth0',
                'rx':'0',
                'tx':'0',
                'time': '0'
        }
 
 
@app.route('/')
def index():
    try:
                f = open('/proc/net/dev','r')
                f.readline()
                f.readline()
                f.readline()
                f.readline()
                line = f.readline()
                strline = line.split(' ')
                strline2 = []
                for a in strline:
                        if a != ' ':
                                if a !='':
                                        strline2.append(a)
                net['rx']=strline2[1]
                net['tx']=strline2[9]
                net['time']=str(time.time())
 
        finally:
                if f:
                        f.close()
                strline=[]
                strline2=[]
        return jsonify(net)
 
 
if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5050,debug=True)

说明:
1 jsonify是flask提供的快速打包工具。使用jsonify(net),即可将net打包为json,然后直接返回即可。
2 成功实现后,请取消debug。

我提供一个示例:

http://sfo01.misaka.cc:5050/

访问得到

{
"interface": "eth0",
"rx": "58829838538",
"time": "1506500429.11",
"tx": "59272128479"
}

关于此api的利用,可以参阅我之前的文章。定期刷新获取json,解析后,两次请求数据量差与time时间戳之差之商即为网速。

4 持久运行与使用

可以使用一切使进程持续运行的方法。

可以使用tmux

开启新对话时使用 tmux

在新的会话中使用

sudo python app.py

终端即可直接关闭

5 小结

至此。我们使用flask完成了一个最简单的API的搭建。下一步可以考虑更广的用途。

最后,笔者为生活在一个不需要重复造轮子的时代而感到幸运。

6 相关阅读

[1] Linux下/proc目录简介 http://blog.csdn.net/zdwzzu2006/article/details/7747977
[2] 百度百科-JSON https://baike.baidu.com/item/JSON
[2] Flask框架中文文档 http://docs.jinkan.org/docs/flask/

原文来自 https://steinslab.xyz/archives/1275