1 前言
目标:配置无线网卡,使可以通过ssh远程控制树莓派。
硬件:树莓派B+,TP-Link TL-WN725N v2无线网卡。
系统:Raspbian。
2 配置
2.1 基本配置
系统写入SD卡后,第一次加电,会出现一个配置界面。主要需要配置的,是扩展文件系统到整个SD卡(选项1)、是否默认进入图形界面(选项3)、区域及语言选项(选项4)、ssh(选项8)。建议不要默认进入图形界面,字符界面运行startx
也可进图形界面。可随时使用raspi-config
进入这一配置界面。
下图是在cygwin用ssh连接树莓派后,运行sudo raspi-config
后的截图。界面显示有些问题,但选项都是一致的。
2.2 网络配置
要远程访问树莓派,必须固定其IP地址。我这里的无线路由器是192.168.1.0/24子网,因此给有线和无线网卡分别分配了192.168.1.81和192.168.1.80两个IP。
我这里介绍的配置方法,被Debian参考手册称为“传统(legacy)”方法。
2.2.1 interfaces文件
树莓派没有用到Network Manager,网络接口是编辑/etc/network/interfaces设置的,下面是其内容:
auto lo iface lo inet loopback iface eth0 inet static address 192.168.1.81 netmask 255.255.255.0 gateway 192.168.1.1 allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp iface home inet static address 192.168.1.80 netmask 255.255.255.0 gateway 192.168.1.1
- auto lo
- “auto”用来识别以-a参数运行ifup时应该启用的物理接口(这一参数被用在系统启动脚本中)。每条“auto 接口”命令应占据一行,ifup根据列出的顺序依次启用接口。
- allow-hotplug wlan0
- “allow-”用来识别应从各种子系统启用的接口。“ifup --allow=hotplug eth0 eth1”只会启用列在“allow-hotplug”行中的eth0或eth1。注意“allow-auto”和“auto”是同义词。
- iface lo inet ...
- iface eth0 inet ...
- iface wlan0 inet ...
- iface default inet ...
- “iface”后是逻辑接口名。在最简单的情况下,如果不存在mapping配置,逻辑接口名与物理接口名相同。接口名后是接口所使用的地址族(address family),“inet”是TCP/IP,“inet6”是IPv6。
- ... inet loopback
- ... inet static
- ... inet manual
- ... inet dhcp
- “inet”后是用来配置接口的方法。“loopback”方法用来定义IPv4 loopback接口;“static”方法定义接口的静态IPv4地址,包含的选项有address、netmask、broadcast、metric、gateway、pointopoint、hwaddress、mtu、scope;“manual”方法默认不配置接口,需通过外部程序(ifupdown以外的程序)配置或手动配置;“dhcp”方法使用“dhclient、pump、udhcpc、dhcpcd”这些工具中任意一个,通过DHCP获取IP地址(这一方法的选项就不列出了,因为上述工具不一定会使用这里配置的信息)。
- iface default ...
- iface home ...
- 结合wpa_supplicant.conf的内容(见下节),配置无线网卡的具体参数。
2.2.2 wpa_supplicant.conf文件
当前最安全的无线加密标准是WPA2,主流无线设备都支持这一标准。Debian通过wpasupplicant软件包提供对WPA/WPA2的支持,其配置文件是/etc/wpa_supplicant/wpa_supplicant.conf。树莓派默认安装了此软件包,且配置为“漫游模式(roaming mode)”。
要让一个无线接口使用漫游模式,必须使用inet的manual方法,并用wpa-roam命令指出wpa_supplicant.conf配置文件的位置(见上一节interfaces文件中iface wlan0那两行内容)。下面是wpa_supplicant.conf的内容:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="Home_AP" psk="password" scan_ssid=1 key_mgmt=WPA-PSK id_str="home" }
- update_config=1
- 是否允许wpa_supplicant更新配置文件。这一选项用来允许wpa_supplicant在配置发生变化的时候覆盖配置文件(例如,使用wpa_cli或wpa_gui添加了新的网络配置信息块,或修改了密码)。若要让wpa_cli或wpa_gui所做的修改永久保存,需把它的值设置为1。
- ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
- 控制接口(control interface)的参数。若提供了这一参数,wpa_supplicant会打开一个控制接口,以便外部程序通过这个接口管理wpa_supplicant。这一参数只要存在,就表明启用了控制接口。“DIR=/var/run/wpa_supplicant”,Linux和BSD系统会使用这里提供的目录创建UNIX domain socket,用来监听外部程序的状态信息请求和配置请求,推荐使用/var/run/wpa_supplicant这一目录;“GROUP=netdev”,wpa_supplicant默认以gid 0(root)运行,若要允许非root用户使用控制接口,则使用GRUOP指出使用控制接口的用户组,并相应创建此用户组。
- network={
ssid="Home_AP"
psk="password"
scan_ssid=1
key_mgmt=WPA-PSK
id_str="home"
} - 配置无线网络参数。“ssid”,无线网名称;“psk”,无线网密码;“scan_ssid”,“1”表示扫描SSID-specific Probe Request帧(可用来查找不接受广播SSID或使用多个SSID的AP),“0”表示关闭这一功能(默认为0);“key_mgmt”,可接受的鉴定密钥管理协议(authenticated key management protocol)列表;“id_str”,用于外部脚本的识别字符,其值会通过wpa_cli以WPA_ID_STR这一环境变量的方式传递给外部脚本,方便用于网络配置(目前我把它的作用理解为虚拟网卡,“id_str=home”通知/sbin/wpa_action去“ifup home”,如果没有“id_str”,/sbin/wpa_action会“ifup default”)。
2.3 网卡驱动
一件很悲剧的事情,是树莓派默认不支持TP-Link TL-WN725N v2无线网卡,需要自行编译驱动;更悲剧的事情,是这款无线网卡所使用的Realtek 8188eu芯片在Realtek官网没有提供驱动下载;最最悲剧的,是当我找到了驱动源码,打算编译的时候,发现树莓派官网提供的Raspbian镜像中所包含的内核是树莓派基金会自己编译的内核,没有提供相应的kernel headers。于是,只有先换用Raspbian自带内核,再编译网卡驱动。步骤如下:
- 安装内核。linux-image-rpi-rpfv这一元软件包(metapackage)会根据树莓派基金会当前推荐的版本(3.12)来安装内核。目前用下面命令安装的是linux-image-3.12-1-rpi、linux-headers-3.12-1-rpi和linux-headers-3.12-1-common三个包。
$ sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv
- 让系统使用新安装的内核。编辑/boot/config.txt,在文件结尾添加下面几行内容。添加完成后保存,并重启系统。
# use Raspbian kernel for kernel module compile kernel vmlinuz-3.12-1-rpi initramfs initrd.img-3.12-1-rpi
- 系统重启后,下载网卡驱动源代码,解压缩。然后编译并安装驱动。
$ wget -c https://github.com/lwfinger/rtl8188eu/archive/master.zip $ unzip master.zip $ cd rtl8188eu-master $ make all $ sudo make install
- 加载网卡驱动。
sudo modprobe 8188eu
- 让系统启动时自动加载驱动,编辑/etc/modules文件,添加“8188eu”。添加后文件内容如下:
# /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. # Parameters can be specified after the module name. snd-bcm2835 8188eu
3 参考文档
3.1 TP-Link TL-WN725N V2 works out of the box on Raspbian
3.2 Howto get the Raspbian kernel installed with headers (solution)
3.3 man interfaces
3.4 /usr/share/doc/wpasupplicant/README.modes.gz
3.5 /usr/share/doc/wpasupplicant/examples/wpa_supplicant.conf.gz
Visits: 626