树莓派怎么玩?

2019-03-06 38835092 0

树莓派是一个可运行完整Linux系统的ARM主机,关于树莓派的玩法,可以参考知乎:「树莓派」是什么以及普通人怎么玩?

以及 树莓派

如果安装Ubuntu桌面版系统(16.04),还是需要进行一些配置才能更方便的使用。

1. 关闭gdm,重启时进入命令行模式

Ubuntu 16.04 使用Systemd来管理系统服务,Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。

手动关闭桌面:

  1. sudo service lightdm stop

修改系统运行级别为multi-user.target,则系统启动时进入命令行模式。

  1. # 修改默认启动级别
  2. sudo systemctl set-default multi-user.target # 等价于 runelvel 3
  3. sudo systemctl set-default graphical.target # 等价于 runlevel 5
  4. # 直接切换运行级别
  5. sudo systemctl isolate multi-user.target

2. 开机启动ssh服务

Ubuntu 默认没有启动ssh服务,需要设置开机启动才可以使用ssh登录。

手动启动:

  1. sudo service sshd start

开机启动:

  1. sudo systemctl enable ssh

3. 开机启动ngrok服务

如果将树莓派放在家里,提供Web服务或者SSH登录需要有一个公网IP。

如果有公网IP,首先登录家里的路由器,给树莓派指定一个固定的静态内网IP地址。然后开启路由器里的DMZ功能,指向这个静态IP地址,这样通过公网IP就能访问到树莓派了。获取公网IP地址可以使用命令:

  1. curl http://members.3322.org/dyndns/getip

如果没有公网IP则需要使用一些内网穿透技术,如内网穿透技术:部署ngrok服务

4. NetworkManager和interfaces网络配置

在Ubuntu Server版本中,因为只存有命令行模式,所以要想进行网络参数设置,只能通过修改/etc/network/interfaces

在Desktop版本中,除了可以修改/etc/network/interfaces来进行配置以外;还可以直接在network-manager中配置。

系统默认使用interfaces文件内的参数进行网络配置。当系统内安装了 nm之后,nm默认接管了系统的网络配置,使用nm 自己的网络配置参数来进行配置。在/etc/NetworkManager/Network-manager.conf配置文件中有一项managed=false表示网络(比如lo和eth0)在/etc/network/interfaces中配置了,则NetworkManager就不会去配置它。如果为managed=true表示由NetworkManager接管所有网络配置。

5. 禁用eth0网卡

由于我们一直使用的是WiFi连接,禁用有线网卡可以加快系统启动速度。直接在/etc/network/interfaces中注释掉eth0的相关配置即可。

手动关闭:

  1. sudo ifconfig eth0 down

6. 开机自动连接WiFi

Ubuntu 桌面版在开机时不会自动连接WiFi,只有登录之后才会自动连接。要不登录用户即自动连接WiFi,可以参考如下配置:

6.1 需要的软件包

我们使用wireless-tools 或wpa_supplicant工具来配置无线网络,如果你输入iwlist或则iwconfig命令出错,需要手动安装:

  1. sudo apt-get install wireless-tools wpasupplicant

6.2 第一种配置方式

编辑/etc/network/interfaces文件,添加以下内容:

  1. auto wlan0
  2. iface wlan0 inet dhcp
  3. wpa-ssid 您的WiFi SSID
  4. wpa-psk 您的WiFi密码

如果不使用dhcp获取ip地址而是使用静态ip地址,配置示例如下:

  1. auto wlan0
  2. iface wlan0 inet static
  3. wpa-ssid Your_Wifi_SSID
  4. wpa-psk Your_Wifi_Password
  5. address 192.168.1.200 # 设定的静态IP地址
  6. netmask 255.255.255.0 # 网络掩码
  7. gateway 192.168.1.1 # 网关
  8. network 192.168.1.1 # 网络地址

使用这种方式比较简单,但是当网络断开之后不会自动重连,如果有多个无线网络也不能自动切换,我们一般使用下面一种配置方式。

6.3 第二种配置方式

编辑/etc/network/interfaces文件,添加以下内容:

  1. source-directory /etc/network/interfaces.d
  2. # Disable wlan1 by default (8723bs has two intefaces)
  3. iface wlan1 inet manual
  4. auto wlan0
  5. iface wlan0 inet dhcp
  6. wpa_conf /etc/wpa_supplicant/wpa_supplicant.conf

编辑/etc/wpa_supplicant/wpa_supplicant.conf,添加以下内容

  1. ctrl_interface=DIR=/var/run/wpa_supplicant
  2. update_config=1
  3. country=CN
  4. # 确保只有root用户能读取WPA的配置
  5. ctrl_interface_group=0
  6. # 使用wpa_supplicant来扫描和选择AP
  7. ap_scan=1
  8. # 对特定的SSID进行扫描(针对那些拒绝广播SSID的AP,也适用与手机创建的热点)
  9. network={
  10. ssid="example"
  11. key_mgmt=WPA-PSK
  12. psk="password"
  13. priority=5
  14. }
  15. # 仅使用WPA-PSK方式。允许使用任何合法的加密方式的组合
  16. network={
  17. ssid="example"
  18. proto=WPA
  19. key_mgmt=WPA-PSK
  20. pairwise=CCMP TKIP
  21. group=CCMP TKIP WEP104 WEP40
  22. psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee9
  23. priority=2
  24. }
  25. # 企业级WPA2连接方式
  26. network={
  27. ssid="example"
  28. key_mgmt=WPA-EAP IEEE8021X
  29. eap=PEAP
  30. identity="username"
  31. password="password"
  32. }
  33. # 明文连接方式(不使用WPA和IEEE802.1X)
  34. network={
  35. ssid="example"
  36. key_mgmt=NONE
  37. }
  38. # 共享WEP秘钥连接方式(不使用WPA和IEEE802.1X)
  39. network={
  40. ssid="example"
  41. key_mgmt=NONE
  42. wep_key0="abcde"
  43. wep_key1=0102030405
  44. wep_key2="1234567890123"
  45. wep_tx_keyidx=0
  46. priority=5
  47. }
  48. # 共享WEP秘钥连接方式(无WPA和IEEE802.1X),使用共享秘钥IEEE802.11验证方式
  49. network={
  50. ssid="example"
  51. key_mgmt=NONE
  52. wep_key0="abcde"
  53. wep_key1=0102030405
  54. wep_key2="1234567890123"
  55. wep_tx_keyidx=0
  56. priority=5
  57. auth_alg=SHARED
  58. }
  59. # 在IBSS/ad-hoc网络中使用WPA-None/TKIP
  60. network={
  61. ssid="example"
  62. mode=1
  63. proto=WPA
  64. key_mgmt=WPA-NONE
  65. pairwise=NONE
  66. group=TKIP
  67. psk="password"
  68. }

priority 是指连接优先级,数字越大优先级越高(不可以是负数)。

其中,psk可以有两种方式,一种是原始密码,需使用引号,另一种是使用
命令wpa_passphrase YourSSID YourPassword生成的一长串密码,不加引号。

命令执行例子(查看配置是否有误):

  1. sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
  2. dhclient wlan0

-B参数表示后台运行。一般 Wifi 的 IP 地址获取都使用了 DHCP 协议,因此我们还需要手动dhclient wlan0来自动协商获取 IP 地址。

要验证是否能连接上,使用命令ifdown wlan0关闭WiFi,然后使用ifup wlan0打开WiFi。如果提示ifdown: interface wlan0 not configured,可以使用ifconfig wlan0 down/up,

7. 自动发送IP地址

创建文件 /usr/lib/systemd/system/sendip.service(如果没有这个目录则新建)

  1. [Unit]
  2. Description=Send IP Service
  3. Wants=network-online.target
  4. After=network-online.target
  5. [Service]
  6. Type=simple
  7. ExecStart=/home/ubuntu/tools/opt/bin/sendip
  8. Restart=on-failure
  9. StandardOutput=syslog
  10. StandardError=null
  11. [Install]
  12. WantedBy=multi-user.target
  13. Alias=sendip.service

其中脚本sendip就是获取命令并发送到指定设备,如通过邮件或者短信等,如:

  1. #!/usr/bin/env bash
  2. # -*- coding: utf-8 -*-
  3. ifconfig | grep -A1 'wlan0' | grep 'inet' | awk -F ':' '{print $2}' | awk '{print $1}' | xargs -I {} curl 'https://sc.ftqq.com/${SCKEY}.send?text={}'

发送命令服务使用Server酱,其中的KEY来自 http://sc.ftqq.com/?c=code

然后使用下面的命令安装服务,它将会在/etc/systemd/system下创建一个软链接指向/usr/lib/systemd/system下的文件,同时设置开机启动。如果报错:Failed to execute operation: Too many levels of symbolic links,说明已经安装过,需先disable。

  1. sudo systemctl enable sendip

编写sendip脚本并添加可执行权限后,可使用下面的命令来运行一次并查看输出。

  1. sudo systemctl start sendip
  2. sudo systemctl status sendip

如果修改了sendip.service文件,需要重新加载

  1. sudo systemctl daemon-reload

systemd的入门教程请参考Systemd 入门教程:实战篇

8 其他优化设置

这一步可选,主要是对Ubuntu系统的一些优化。

8.1 更换apt源

/etc/apt/sources.list中注释掉默认源,增加ustc源,然后更新

  1. sudo apt-get update -y
  2. sudo apt-get dist-upgrade -y
  3. sudo apt-get autoremove
  4. sudo apt-get autoclean
  5. sudo apt-get clean

8.2 增加swap

如果内存不够用,可以使用下面的命令创建一个swap文件作为交换分区。并且设置只有在内存不够用时才使用交换分区。

  1. swapoff -a
  2. dd if=/dev/zero of=/swapfile bs=1024 count=1024k
  3. chmod 0600 /swapfile
  4. mkswap /swapfile
  5. swapon /swapfile
  6. echo "/swapfile none swap sw 0 0" >> /etc/fstab
  7. echo 0 | tee /proc/sys/vm/swappiness
  8. echo vm.swappiness = 0 | tee -a /etc/sysctl.conf
  9. sysctl -p

刷新swap命令

  1. # 刷新swap
  2. swapoff -a && swapon -a
  3. # 释放缓存
  4. for i in `seq 0 3`; do sync; sleep 1; done
  5. echo 3 > /proc/sys/vm/drop_caches