树莓派怎么玩?
树莓派是一个可运行完整Linux系统的ARM主机,关于树莓派的玩法,可以参考知乎:「树莓派」是什么以及普通人怎么玩?
以及 树莓派
如果安装Ubuntu桌面版系统(16.04),还是需要进行一些配置才能更方便的使用。
1. 关闭gdm,重启时进入命令行模式
Ubuntu 16.04 使用Systemd来管理系统服务,Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。
手动关闭桌面:
sudo service lightdm stop
修改系统运行级别为multi-user.target,则系统启动时进入命令行模式。
# 修改默认启动级别
sudo systemctl set-default multi-user.target # 等价于 runelvel 3
sudo systemctl set-default graphical.target # 等价于 runlevel 5
# 直接切换运行级别
sudo systemctl isolate multi-user.target
2. 开机启动ssh服务
Ubuntu 默认没有启动ssh服务,需要设置开机启动才可以使用ssh登录。
手动启动:
sudo service sshd start
开机启动:
sudo systemctl enable ssh
3. 开机启动ngrok服务
如果将树莓派放在家里,提供Web服务或者SSH登录需要有一个公网IP。
如果有公网IP,首先登录家里的路由器,给树莓派指定一个固定的静态内网IP地址。然后开启路由器里的DMZ功能,指向这个静态IP地址,这样通过公网IP就能访问到树莓派了。获取公网IP地址可以使用命令:
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的相关配置即可。
手动关闭:
sudo ifconfig eth0 down
6. 开机自动连接WiFi
Ubuntu 桌面版在开机时不会自动连接WiFi,只有登录之后才会自动连接。要不登录用户即自动连接WiFi,可以参考如下配置:
6.1 需要的软件包
我们使用wireless-tools 或wpa_supplicant工具来配置无线网络,如果你输入iwlist
或则iwconfig
命令出错,需要手动安装:
sudo apt-get install wireless-tools wpasupplicant
6.2 第一种配置方式
编辑/etc/network/interfaces
文件,添加以下内容:
auto wlan0
iface wlan0 inet dhcp
wpa-ssid 您的WiFi SSID
wpa-psk 您的WiFi密码
如果不使用dhcp获取ip地址而是使用静态ip地址,配置示例如下:
auto wlan0
iface wlan0 inet static
wpa-ssid Your_Wifi_SSID
wpa-psk Your_Wifi_Password
address 192.168.1.200 # 设定的静态IP地址
netmask 255.255.255.0 # 网络掩码
gateway 192.168.1.1 # 网关
network 192.168.1.1 # 网络地址
使用这种方式比较简单,但是当网络断开之后不会自动重连,如果有多个无线网络也不能自动切换,我们一般使用下面一种配置方式。
6.3 第二种配置方式
编辑/etc/network/interfaces
文件,添加以下内容:
source-directory /etc/network/interfaces.d
# Disable wlan1 by default (8723bs has two intefaces)
iface wlan1 inet manual
auto wlan0
iface wlan0 inet dhcp
wpa_conf /etc/wpa_supplicant/wpa_supplicant.conf
编辑/etc/wpa_supplicant/wpa_supplicant.conf
,添加以下内容
ctrl_interface=DIR=/var/run/wpa_supplicant
update_config=1
country=CN
# 确保只有root用户能读取WPA的配置
ctrl_interface_group=0
# 使用wpa_supplicant来扫描和选择AP
ap_scan=1
# 对特定的SSID进行扫描(针对那些拒绝广播SSID的AP,也适用与手机创建的热点)
network={
ssid="example"
key_mgmt=WPA-PSK
psk="password"
priority=5
}
# 仅使用WPA-PSK方式。允许使用任何合法的加密方式的组合
network={
ssid="example"
proto=WPA
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40
psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee9
priority=2
}
# 企业级WPA2连接方式
network={
ssid="example"
key_mgmt=WPA-EAP IEEE8021X
eap=PEAP
identity="username"
password="password"
}
# 明文连接方式(不使用WPA和IEEE802.1X)
network={
ssid="example"
key_mgmt=NONE
}
# 共享WEP秘钥连接方式(不使用WPA和IEEE802.1X)
network={
ssid="example"
key_mgmt=NONE
wep_key0="abcde"
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
}
# 共享WEP秘钥连接方式(无WPA和IEEE802.1X),使用共享秘钥IEEE802.11验证方式
network={
ssid="example"
key_mgmt=NONE
wep_key0="abcde"
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
auth_alg=SHARED
}
# 在IBSS/ad-hoc网络中使用WPA-None/TKIP
network={
ssid="example"
mode=1
proto=WPA
key_mgmt=WPA-NONE
pairwise=NONE
group=TKIP
psk="password"
}
priority 是指连接优先级,数字越大优先级越高(不可以是负数)。
其中,psk可以有两种方式,一种是原始密码,需使用引号,另一种是使用
命令wpa_passphrase YourSSID YourPassword
生成的一长串密码,不加引号。
命令执行例子(查看配置是否有误):
sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
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
(如果没有这个目录则新建)
[Unit]
Description=Send IP Service
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/home/ubuntu/tools/opt/bin/sendip
Restart=on-failure
StandardOutput=syslog
StandardError=null
[Install]
WantedBy=multi-user.target
Alias=sendip.service
其中脚本sendip就是获取命令并发送到指定设备,如通过邮件或者短信等,如:
#!/usr/bin/env bash
# -*- coding: utf-8 -*-
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。
sudo systemctl enable sendip
编写sendip脚本并添加可执行权限后,可使用下面的命令来运行一次并查看输出。
sudo systemctl start sendip
sudo systemctl status sendip
如果修改了sendip.service文件,需要重新加载
sudo systemctl daemon-reload
systemd的入门教程请参考Systemd 入门教程:实战篇
8 其他优化设置
这一步可选,主要是对Ubuntu系统的一些优化。
8.1 更换apt源
在/etc/apt/sources.list
中注释掉默认源,增加ustc源,然后更新
sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get clean
8.2 增加swap
如果内存不够用,可以使用下面的命令创建一个swap文件作为交换分区。并且设置只有在内存不够用时才使用交换分区。
swapoff -a
dd if=/dev/zero of=/swapfile bs=1024 count=1024k
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile
echo "/swapfile none swap sw 0 0" >> /etc/fstab
echo 0 | tee /proc/sys/vm/swappiness
echo vm.swappiness = 0 | tee -a /etc/sysctl.conf
sysctl -p
刷新swap命令
# 刷新swap
swapoff -a && swapon -a
# 释放缓存
for i in `seq 0 3`; do sync; sleep 1; done
echo 3 > /proc/sys/vm/drop_caches