一、簡介 1.1 個人簡介 1.2 樹莓派簡介 樹莓派是什麼? 誰在玩樹莓派? 我們可以用樹莓派做什麼? 1.3 ARM簡介 在學習任何嵌入式開發之前,最先要瞭解的就是嵌入式終端的CPU架構。 樹莓派是典型的嵌入式開發板,其CPU架構自然是ARM,先來看下樹莓派3B+的硬體配置: ARM概念 CPU ...
一、簡介
1.1 個人簡介
Taylor
80後程式員,熱愛技術、追求極致,愛玩、愛折騰,10年.NET開發,熟悉.NET、Java、Python等技術。
1.2 樹莓派簡介
樹莓派是什麼?
樹莓派(Raspberry Pi),是一款只有一張信用卡大小的開源單板電腦, 它由英國的樹莓派基金會開發,目的是以低價硬體及自由軟體刺激在學校的
基本的電腦科學教育,在經歷幾代版本的更新迭代後,樹莓派不僅支持Linux以及Linux的衍生版本系統,還支持Windows 10 IoT Core等全新的系統平臺,
並且融入了眾多的AI元素,是目前全球應用最廣、最受電子愛好者、工程師、學生喜愛的開源單板電腦。
誰在玩樹莓派?
通過上文的介紹我們可以瞭解到,樹莓派最初的目的是致力於在校學生的電腦教育,無論是小學生、中學生還是大學生,都可以零基礎入門。
隨著樹莓派的不斷迭代、性能提升,其作用也在發生變化,除了電腦教育的應用,還被眾多的嵌入式開發工程師、軟體開發工程師等用來做各種實驗項目。
如果你對樹莓派或者編程感興趣,無論你是否學過電腦編程,都可以零基礎入門。
PS:《Taylor的樹莓派》系列教程會陸續發佈,希望熱愛技術的你和我一起學習!
我們可以用樹莓派做什麼?
Linux系統學習
利用樹莓派學習Linux系統的基本操作和命令
Git伺服器
利用樹莓派搭建區域網/外網的Git伺服器,方便個人或小團隊的代碼管理
FTP伺服器
利用樹莓派搭建區域網/外網的FTP伺服器,建立個人或小團隊的FTP站點
消息隊列伺服器
利用樹莓派搭建消息隊列伺服器,如:部署RPC服務端或消費者端進行消息處理等
爬蟲伺服器
利用樹莓派搭建分散式爬蟲伺服器,如:Python+RabbitMQ+redis的高併發分散式爬蟲等
微服務部署
利用樹莓派部署基於Docker的微服務架構API,如.NET Core、Spring Boot等
物聯網開發
利用樹莓派的串口連接各類感測器(如:溫濕度感測器、光照感測器、煙霧感測器等)進行物聯網開發
1.3 ARM簡介
在學習任何嵌入式開發之前,最先要瞭解的就是嵌入式終端的CPU架構。
樹莓派是典型的嵌入式開發板,其CPU架構自然是ARM,先來看下樹莓派3B+的硬體配置:
博通BCM2837B0 SoC,集成四核ARM Cortex-A53(ARMv8)64位@ 1.4GHz CPU,集成博通 Videocore-IV GPU
記憶體:1GB LPDDR2 SDRAM
有線網路:千兆乙太網(通過USB2.0通道,最大吞吐量 300Mbps)
無線網路:2.4GHz和5GHz 雙頻Wi-Fi,支持802.11b/g/n/ac
藍牙:藍牙4.2&低功耗藍牙(BLE)
存儲:Micro-SD
其他介面:HDMI,3.5mm模擬音頻視頻插孔,4x USB 2.0,乙太網,攝像機串列介面(CSI),
顯示器串列介面(DSI),MicroSD卡座,40pin擴展雙排插針
尺寸:82mmx 56mmx 19.5mm,50克
ARM概念
ARM首先是一個公司,這家公司設計CPU並向各個CPU製造商授權許可,所以ARM公司是一家CPU設計公司。同時,ARM也是ARM公司主導設計的CPU系列的簡稱。
ARM版本區分
ARM版本號可以分為三類:
· 內核版本號,例如ARMv5,ARMv7,ARMv7a,ARMv8a...
· Soc版本號,例如Cortex-A8,Cortex-A9...
· 晶元型號,例如2410,2440,6410,S5PV210...
CPU設計原理和匯流排
CPU主要包括運算器,控制器,存儲器通過匯流排與Flash與記憶體連接。
匯流排就類似於CPU中的道路,數據通過匯流排在CPU和外設之間傳輸,CPU也通過內部匯流排與SOC中的其他外設連接,例如UART設備,內部匯流排由於在晶元內部,
抗干擾能力強,運算速度更快。
匯流排分為兩種,地址匯流排和數據匯流排:
地址匯流排用於傳輸地址,CPU通過地址匯流排定址,告訴設備要取的數據在哪個地址中,地址匯流排的位數決定了定址範圍
數據匯流排用於傳輸數據,CPU通過數據匯流排與外部交換信息,將設備要的數據通過該匯流排發送給對方,數據匯流排的位數決定了CPU單次通信能交換的信息數量
匯流排的速度決定了CPU和外設互換信息的速度
CPU的地址匯流排和數據匯流排的位數可以不同,CPU的位數就指的是數據匯流排的位數
32位CPU的定址範圍是4G所以最多支持4G記憶體,數據匯流排是32位的,那麼傳輸一個int和傳輸一個char的效率是一樣的。
在64位系統下運行32位軟體,唯一的差別就是32位軟體仍然是32定址機制,所以只有64位系統才能原生支持超過4G記憶體的定址。
樹莓派3B+使用的CPU為四核ARM Cortex-A53(ARMv8)64位,通過上文我們瞭解到32位的定址空間有限,並不能真正發揮64位CPU的性能,有實驗證明,64位CPU的樹莓派比32位的效率提高近30倍。
支持ARM的系統
瞭解了樹莓派的CPU,再來說下支持樹莓派的系統,目前支持樹莓派的系統有以下幾種:
Raspbain Stretch 樹莓派官方操作系統(圖形界面版)
Raspbain Stretch Lite 樹莓派官方操作系統(命令行版)
Ubuntu Mate Ubuntu標準系統(圖形界面版)
......
Ubuntu Server Ubuntu伺服器系統
Windows 10 IoT Core Windows 10的物聯網核心系統
CentOS-armhfp Centos arm32位版
CentOS-AArch64 Centos arm64位版
說明:Centos系統官方只提供32位版本的img鏡像下載,64位版系統提供.iso的鏡像下載,樹莓派無法燒錄.iso鏡像
Centos從ARMv8開始使用AArch術語表示,AArch是ARMv8的官方Linux體繫結構名稱
詳見官方說明:https://seven.centos.org/2015/03/building-centos-linux-7-for-armv8/
官方鏡像地址32位:http://mirror.centos.org/altarch/7/isos/armhfp/
官方鏡像地址64位:http://mirror.centos.org/altarch/7/isos/aarch64/
更多系統,詳見 http://rpifans.cn/pages/imgdown/index.html
二、材料清單
樹莓派3B+(2.5V電源 + USB線)x 1 約230-250元
閃迪TF卡(64G)x 1 約80-100元
TF卡讀卡器 x 1 約10元
材料總價約300元
三、燒錄系統
鏡像文件
樹莓派的鏡像文件為.img,下載的操作系統鏡像為.img文件或raw.xz文件
本文使用CentOS for AArch64作為樹莓派的操作系統,由於Centos官方未提供64位的img鏡像下載,所以本文采用移植版的CentOS for AArch64
鏡像下載地址:https://github.com/chainsx/centos64-rpi
使用工具
SDFormatter:TF卡格式化工具,用於格式化TF卡
下載地址:https://www.sdcard.org/chs/downloads/formatter_4/eula_windows/index.html
Win32DiskImager:鏡像燒錄工具,用於燒錄img鏡像
下載地址:https://sourceforge.net/projects/win32diskimager/
putty:SSH連接工具,用於ssh連接樹莓派
下載地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/
四、基礎配置
4.1 擴展磁碟分區
系統燒錄完成之後的系統分區為根分區+Linux分區,也就是TF卡的磁碟大小僅為系統鏡像的大小,很顯然這是不能接受的,我們要對磁碟進行重新分區,找回失去的磁碟空間
關於燒錄分區
img鏡像是一種可引導的分區文件,系統燒錄完成後,磁碟被分為兩個區。
一個是FAT16可讀寫的根分區,用來存放鏡像引導文件和系統內核等文件。
一個是Linux的只讀分區,用來存放Linux文件系統。
重新分區的目的就是將只讀分區的剩餘空間擴展出來,最大化磁碟剩餘空間,用來存儲其他文件
查看磁碟大小
[root@localhost ~]# df -h
進入分區工具
[root@localhost ~]# fdisk /dev/mmcblk0
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
磁碟分區
#刪除分區(命令:d)
Command (m for help): d
#選擇分區(刪除預設分區)
Partition number (1,2, default 2): 輸入2或直接回車
#列出分區表(命令:p)
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 * 2048 131072 64512+ e W95 FAT16 (LBA)
#新建分區(命令:n)
Command (m for help): n
#選擇分區類型(選擇預設類型,輸入p)
Select (default p): p
#選擇分區(選擇預設分區)
Partition number (2-4, default 2): 輸入2或回車
#選擇第二分區起始位置(使用預設)
First sector (131073-124735487, default 133120): 回車
#選擇第二分區結束位置(使用預設)
Last sector, +sectors or +size{K,M,G} (133120-124735487, default 124735487): 回車
#列出分區表(命令:p)
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 * 2048 131072 64512+ e W95 FAT16 (LBA)
/dev/mmcblk0p2 133120 124735487 62301184 83 Linux
#把分區寫進分區表,保存並退出(命令:w)
Command (m for help): w
重啟系統
[root@localhost ~]# reboot
重啟後調整分區大小(重要步驟!!!)
#要調整的分區為第二分區
[root@localhost ~]# resize2fs /dev/mmcblk0p2
查看磁碟大小
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 59G 2.3G 54G 5% /
devtmpfs 454M 0 454M 0% /dev
tmpfs 459M 0 459M 0% /dev/shm
tmpfs 459M 12M 448M 3% /run
tmpfs 459M 0 459M 0% /sys/fs/cgroup
/dev/mmcblk0p1 63M 63M 2.0K 100% /boot
tmpfs 92M 0 92M 0% /run/user/0
4.2 升級系統內核
由於移植版本的系統內核未提供無線網路、藍牙等擴展功能的驅動,所以需要升級系統內核,否則無法開啟樹莓派的無線網卡
查看內核版本
#查看內核版本
[root@localhost ~]# cat /proc/version
Linux version 4.13.16-chainsx-edition-CX-v5 (root@ubuntu) (gcc version 5.4.0 20160609
(Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.6)) #1 SMP PREEMPT Tue Feb 20 18:45:58 CST 2018
配置hosts
#編輯hosts
[root@localhost ~]# vi /etc/hosts
#輸入以下內容(或參考 常見問題及解決 使用DNS檢測網站檢測最新的IP)
192.30.253.112 github.com
151.101.113.194 github.global.ssl.fastly.net
克隆項目
#從git克隆項目
[root@localhost ~]# git clone https://github.com/chainsx/firmware64-rpi
Cloning into 'firmware64-rpi'...
remote: Counting objects: 2928, done.
remote: Total 2928 (delta 0), reused 0 (delta 0), pack-reused 2928
Receiving objects: 100% (2928/2928), 65.13 MiB | 2.82 MiB/s, done.
Resolving deltas: 100% (517/517), done.
Checking out files: 100% (2895/2895), done.
進入目錄
[root@localhost ~]# cd /root/firmware64-rpi
安裝內核
[root@localhost ~]# cd install && sh install.sh
Install Image,dtbs
cp: cannot overwrite directory ‘/boot/overlays’ with non-directory
cp: error writing ‘/boot/vmlinuz-4.16.0-chainsx-edition-chainsx+v7’: No space left on device
Remove old modules
OK
Install modules
OK
Install firmware
OK
Install kernel_headers
OK
Configure files
#uncomment to overclock the arm. 700 MHz is the default.
arm_freq=700# NOOBS Auto-generated Settings:
hdmi_force_hotplug=1
config_hdmi_boost=4
overscan_left=24
overscan_right=24
overscan_top=16
overscan_bottom=16
disable_overscan=0
core_freq=250
sdram_freq=400
over_voltage=0
OK
You can reboot to use this new kernel.
重啟系統
[root@localhost ~]# reboot
查看內核版本
[root@localhost ~]# cat /proc/version
Linux version 4.16.0-chainsx-edition-chainsx+v7 (root@ubuntu) (gcc version 5.4.0 20160609
(Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.6)) #3 SMP PREEMPT Thu Mar 22 02:32:13 CST 2018
4.3 更改系統語言
查看語言配置
[root@localhost ~]# cat /etc/locale.conf
LANG="en_US.UTF-8"
查看系統語言包
[root@localhost ~]# locale -a
修改語言配置
[root@localhost ~]# vi /etc/locale.conf
#更改為簡體中文
LANG="zh_CN.utf8"
重啟系統
[root@localhost ~]# reboot
查看語言配置
[root@localhost ~]# cat /etc/locale.conf
LANG="zh_CN.utf8"
4.4 配置無線網路
查看IP地址
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.0.104/24 brd 192.168.0.255 scope global noprefixroute dynamic eth0
valid_lft 6935sec preferred_lft 6935sec
inet6 fe80::ba27:ebff:fee1:2a28/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
#註意:查看wlan0的狀態是否為UP,當前wlan0的狀態沒有UP,說明沒有開啟,執行下一條命令開啟wlan0
開啟wlan0
[root@localhost ~]# ip link set wlan0 up
查看IP地址
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.0.104/24 brd 192.168.0.255 scope global noprefixroute dynamic eth0
valid_lft 6912sec preferred_lft 6912sec
inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link
valid_lft forever preferred_lft forever
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
#註意:查看wlan0的狀態是否為UP,當前wlan0的狀態為UP,說明已經開啟
安裝wifi管理工具
[root@localhost ~]# yum -y install NetworkManager-wifi
配置文件設置wifi
[root@localhost ~]# cd /etc/sysconfig/network-scripts
創建配置文件
#ifcfg-後面的名稱與下文NAME參數對應
[root@localhost ~]# vi ifcfg-taylor
#輸入內容如下:
HWADDR=xx:xx:xx:xx:xx:xx #無線網卡MAC地址(本例以x號代替,可以使用 ip addr 命令查看 wlan0 的MAC地址)
ESSID=xxxxxx #wifi名稱(無線網的名稱,本例以x號代替)
MODE=Managed
KEY_MGMT=WPA-PSK
SECURITYMODE=open
MAC_ADDRESS_RANDOMIZATION=default
TYPE=Wireless
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none #啟用靜態IP
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=taylor #網路連接的名稱
UUID=ff0af7a2-aac8-45b7-bf21-894d571c9b2a
ONBOOT=yes #開機自動啟動
IPADDR=192.168.0.110 #靜態IP
PREFIX=24 #子網掩碼24位
GATEWAY=192.168.0.1 #預設網關
DNS1=192.168.1.1 #DSN 1
DNS2=192.168.0.1 #DNS 2
創建密鑰文件
#keys-後面的名稱與上文NAME參數對應
[root@localhost ~]# vi keys-taylor
#輸入內容如下(本例以x號代替)
WPA_PSK=xxxxxx #wifi密碼
重啟系統
[root@localhost ~]# reboot
#系統重啟後使用ip addr 命令查看wlan0是否正確分配ip,如果正確分配ip,此時可拔掉網線,斷開ssh連接。
使用靜態ip連接ssh,即使用wifi連接樹莓派
4.5 安裝基礎工具
安裝下載工具
[root@localhost ~]# yum -y install wget
安裝epel源
#下載(清華大學鏡像站地址)
[root@localhost ~]# wget https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm
#安裝
[root@localhost ~]# rpm -vih epel-release-latest-7.noarch.rpm
#查看
[root@localhost ~]# cd /etc/yum.repos.d
[root@localhost yum.repos.d]# ls
CentOS-Base.repo CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo epel.repo
CentOS-Base.repo.rpmnew CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo epel-testing.repo
#更新源
[root@localhost ~]# yum clean all && yum makecache
安裝開發工具包
[root@localhost ~]# yum groupinstall "Development Tools"
4.6 升級系統版本
查看系統版本
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (AltArch)
備份重要數據
備份過程略(或不備份直接升級)
運行yum命令升級
#清除yum緩存
[root@localhost ~]# yum clean all
#更新所有包
[root@localhost ~]# yum -y update
重啟系統
[root@localhost ~]# reboot
查看系統版本
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (AltArch)
4.7 設置系統時區
查看時區設置
[root@localhost ~]# timedatectl
Local time: Sat 2018-07-07 13:51:00 UTC
Universal time: Sat 2018-07-07 13:51:00 UTC
RTC time: n/a
Time zone: Etc/UTC (UTC, +0000)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
設置時區
[root@localhost ~]# timedatectl set-timezone Asia/Shanghai
查看時區設置
[root@localhost ~]# timedatectl
Local time: 日 2018-06-24 21:29:14 CST
Universal time: 日 2018-06-24 13:29:14 UTC
RTC time: n/a
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
4.8 修改系統密碼
修改root密碼(密碼輸入無任何回顯,摸黑輸入)
#若提示 無效的密碼: 密碼包含用戶名在某些地方 請忽略該提示,再次輸入密碼即可更改成功
#英文版
[root@localhost ~]# passwd root
Changing password for user root.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.
#中文版
[root@localhost ~]# passwd root
更改用戶 root 的密碼 。
新的 密碼:
無效的密碼: 密碼包含用戶名在某些地方
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經成功更新。
重啟系統
[root@localhost ~]# reboot
五、常見問題及解決
5.1 ifconfig命令無效
描述:輸入ifconfig命令後顯示 -bash: ifconfig: command not found 或 -bash: ifconfig: 未找到命令
原因:缺少net-tools包(net-tools包提供了ifconfig命令)
解決:安裝net-tools
yum install net-tools
拓展:
1、CentOS 7最小化系統,使用 ip addr 和 ip link 命令來查找網卡詳情,要知道統計數據,可以使用 ip -s link
2、如果你不知道在哪裡可以找到ifconfig命令,請按照以下簡單的步驟來找到它。
首先,讓我們找出哪個包提供了ifconfig命令。要完成這項任務,輸入以下命令:
yum provides ifconfig
或者你也可以使用以下命令
yum whatprovides ifconfig
“provides”或者“whatprovides”開關用於找出某個包提供了某些功能或文件
5.2 GitHub訪問/下載太慢
使用(站長工具-Dns檢測)
http://tool.chinaz.com/dns/
或(IP檢測網站)
https://www.ipaddress.com/
分別檢測
github.com
github.global.ssl.fastly.net-tools
codeload.github.com
寫入hosts(Windows):
C:\Windows\System32\drivers\etc\hosts
192.30.253.113 github.com
151.101.73.194 github.global.ssl.fastly.net
cmd 執行 ipconfig /flushdns 命令,刷新 DNS 緩存
寫入hosts(Linux):
vi /etc/hosts
192.30.253.112 github.com
151.101.113.194 github.global.ssl.fastly.net