卡片电脑(树莓派)一代B+版配置1

第一次运行, 并配置wifi和AP热点


树莓派官方Raspbian系统下载:http://www.raspberrypi.org/downloads
按照步骤,下载操作系统镜像,写入到SD卡以后,加电启动开始第一次运行, 并配置wifi和AP热点。

第一次运行会出现配置界面,当然以后也可以通过sudo raspi-config再次进入配置。
配置中主要设定扩展可用空间,扩展SD卡剩余的空间给Raspberry使用,调整时区。
语言设置在下个章节,安装了中文字体后再设置。

我的应用场景是使用两个微型无线网卡,一个连接wifi,另一个做为无线接入点,变成一个路由器使用。

先接上网线,通过ssh登录上去,做几项初使化工作:

1.ROOT账号设置

如果你安装的是官方的 Raspbian 系统,那么默认的登录帐号为 pi 密码是 raspberry
为了方便折腾,建议第一时间启用 ROOT 账号吧~ 这个也很简单的,只需要执行一下两句命令即可:

设置root账号的密码,会让你输入两次新密码
sudo passwd root

启用 root 账号登录
sudo passwd --unlock root


2.系统升级

更改/etc/apt/source.list为:
#deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
deb http://mirrors.sohu.com/raspbian/raspbian/ wheezy main contrib non-free
deb-src http://mirrors.sohu.com/raspbian/raspbian/ wheezy main contrib non-free

sudo apt-get update
sudo apt-get upgrade

PS:关于如何理解upgrade和dist-upgrade的区别:
update更新软件列表信息,包括版本,依赖关系等
upgrade只是简单的更新包,不管这些依赖,它既不添加包,或是删除包。在不改变现有软件设置的基础上更新软件,不改变软件的依赖关系,当软件的依赖关系发生改变时,upgrade对此情形不处理。
dist-upgrade针对依赖关系改变的情形并作出处理,会改变配置文件,改变旧的依赖关系,添加包,删除包。
例如软件包 a 原先依赖 b c d,但是在源里面可能已经升级了,现在是 a 依赖 b c e。这种情况下,dist-upgrade 会删除 d 安装 e,并把 a 软件包升级,而 upgrade 会认为依赖关系改变而拒绝升级 a 软件包。
【个人习惯不用dist-upgrade,这个会被认为是有点风险的升级,弄不好把系统弄崩溃,除非迫切需要最新版本的情况。】

3.安装hostapd和dhcp服务器
修改/etc/sysctl.conf打开ipv4和ipv6转发
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

无线网卡硬件兼容列表:
http://elinux.org/RPi_USB_Wi-Fi_Adapters
列表中有国产Tenda的卡,购买了Tenda W311MI Wireless N Pico USB Adapter,芯片是Ralink RT5370。
某宝卖的RealTek rtl8188cu芯片的无线网卡,上网没问题,做为热点设置有问题。

pi@switch00:~$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
Bus 001 Device 005: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter

pi@switch00:~$ lsmod | grep mac80211
mac80211              329373  3 rt2x00lib,rt2x00usb,rt2800lib
cfg80211              211002  2 mac80211,rt2x00lib

rtl8188cu的驱动是8192cu,为防止进入节电模式而掉线
创建文件:/etc/modprobe.d/8188cu.conf

写入如下内容:
### 修复经常断线问题 #
### 取消节电模式 Disable power saving
options 8192cu rtw_power_mgnt=0 rtw_enusbss=1 rtw_ips_mode=1


测试无线信号:
sudo iwlist wlan0 scan

sudo apt-get install wpasupplicant

sudo apt-get install hostapd
sudo apt-get install hostap-utils
sudo apt-get install isc-dhcp-server

sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.orig
#修改/etc/network/interface和/etc/dhcp/dhcpd.conf
#修改/etc/default/isc-dhcp-server文件,将wlan1配置成为DHCP用的网口:
#INTERFACES="wlan1"

sudo vi /etc/default/hostapd
找到#DAEMON_CONF= "",修改为:
DAEMON_CONF="/etc/hostapd/hostapd.conf"

sudo service isc-dhcp-server restart
sudo service hostapd restart

4.我使用的8188cu无线网卡能被自动识别,也能连接wifi,但是做为热点使用,驱动报错,
Configuration file: /etc/hostapd/hostapd.conf
nl80211: 'nl80211' generic netlink not found
Failed to initialize driver 'nl80211'
rmdir[ctrl_interface]: No such file or directory

先移走系统中的hostapd,然后重新编译了针对这个网卡的hostapd的驱动。
sudo apt-get autoremove hostapd

cd /opt
sudo wget https://github.com/segersjens/RTL8188-hostapd/archive/v1.1.tar.gz
sudo tar -zxvf v1.1.tar.gz
cd RTL8188-hostapd-1.1/hostapd
sudo make
sudo make install

sudo apt-get install bridge-utils

sudo service hostapd restart
[ ok ] Stopping advanced IEEE 802.11 management: hostapd.
[ ok ] Starting advanced IEEE 802.11 management: hostapd.

5.
客户端使用HOSTAPD无线AP时,网速不稳定,导致某些时刻无法打开网页或者其它因为网络超时导致的网络不可访问故障。

该问题主要是因为无线数据传输校验中随机种子数较少导致的无线网络数据传输时延过大导致的。
查看具体数值:
cat /proc/sys/kernel/random/entropy_avail
该值一般小于1000。
安装随机数生成器(haveged)
sudo apt-get install haveged
sudo insserv /etc/init.d/haveged

启动随机数生成器(haveged)提高entropy_avail数值
/etc/init.d/haveged start
这样无线网络时延将恢复到正常状态。网络不在出现以上描述的问题。

6.重新启动
sudo reboot

【PS:第一次启动无线热点时的信息:
root@Mina:~# hostapd -B -P /var/run/hostapd.pid /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
Using interface wlan1 with hwaddr c8:8a:88:e1:99:66 and ssid "RaspII"
random: Only 15/20 bytes of strong random data available from /dev/random
random: Not enough entropy pool available for secure operations
WPA: Not enough entropy in random pool for secure operations - update keys later when the first station connects
wlan1: interface state UNINITIALIZED->ENABLED
wlan1: AP-ENABLED
】

【PS:hostapd.conf配置
公共部份

# Basic configuration
interface=wlan1
ssid=Rasptest
channel=1
#bridge=br0

# WPA and WPA2 configuration
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
#wpa=3
wpa=2
wpa_passphrase=jeanisagirl
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

硬件配制
第一个RaspberryPi一代B+版,用了Rtl8188cu无线usb网卡,为了用上这块卡做热点,必须从源码编译了hostapd:
# Hardware configuration
driver=rtl871xdrv
ieee80211n=1
hw_mode=g
device_name=RTL8192CU
manufacturer=Realtek

第二个RaspberryPi二代B版,用了RT5370无线usb网卡,芯片产商是Ralink:
# Hardware configuration
driver=nl80211
ieee80211n=1
hw_mode=g
device_name=RT5370
manufacturer=Ralink

修改配置文件/etc/default/hostapd
将这一行
#DAEMON_CONF=""
改为
DAEMON_CONF="/etc/hostapd/hostapd.conf"

】




安装看门狗程序让树莓派永不死机


开源的BCM2708芯片让树莓派拥有了硬件看门狗芯片功能,加上linux内核编译好了的bcm2708_wdog模块

加载模块
modprobe bcm2708_wdog

更改配制文件,让系统每次启动都加载
sudo vi /etc/modules
#加入一行 "bcm2708_wdog"

pi@switch00:~$ lsmod | grep bcm2708_wdog
bcm2708_wdog            3613  1

sudo apt-get install watchdog

#设置watchdog每次随系统而启动
sudo apt-get install chkconfig
sudo chkconfig watchdog on

sudo vi /etc/watchdog.conf

取消掉 watchdog-device = /dev/watchdog 前的注释#号,让他监控的设备指向CPU的硬件看门狗
取消掉 max-load-1 = 24 前的注释#号,当1分钟load进程超过24个的时候(一般5个就是超高负载了,再高可以认为是死机)就触发重启

#/sys/class/thermal/thermal_zone0/temp记录的是实时的温度,单位为千分之一摄氏度.
temperature-device = /sys/class/thermal/thermal_zone0/temp
#设置最高温度75℃
max-temperature = 75000

sudo /etc/init.d/watchdog start





安装vi


1.安装vi
卸载原来的vi
sudo apt-get remove vim-common
安装新的
sudo apt-get install vim





时钟同步问题

树莓派主板上没有电池,不能保存时间,因此每次重启动后需要对时。

1.使用rdate:
sudo apt-get install rdate
sudo /usr/bin/rdate -s time.nist.gov

2.我写了个通过http方式对时的程序在每次开机时运行:
因为http延时对时后的有误差,由ntpd服务接管再做精确对时。(一定误差范围内,ntpd才能正常校正)

/sbin/everyday_gettime.sh &

#!/bin/bash

### 开机十分钟后运行 #
proc_start=600

### 运行1分钟后检查是否僵住(连不上网,进程没退出), 如果是就kill #
chk_run=60

### 然后隔“24小时减去前面的时间”运行 #
proc_re_run=`expr 86400 - $proc_start - $chk_run`

#echo $proc_start $chk_run $proc_re_run

sleep $proc_start

sudo date -s "$(curl -sI http://www.baidu.com/ | grep ^Date: | cut -d' ' -f3-7)Z" > /dev/null 2>&1

sleep $chk_run

tmp1=`ps -eo user,pid,etime,cmd | grep -v grep | grep "curl -sI http://www.baidu.com/" | awk '{print $2}' `
if [ "aaa" != "aaa$tmp1" ]
then
    sudo kill -9 $tmp1
fi

sleep $proc_re_run

### 执行完成后回调自已,准备下次执行 #
$0 &





如何让树莓派显示中文


系统里没有预装中文字库,所以即使在locale中改成中文,也不会显示中文,只会显示一堆方块。

安装中文字体和输入法
sudo apt-get install ttf-wqy-zenhei
sudo apt-get install scim-pinyin

再次运行
sudo raspi-config
配制时区和语言
选择change_locale,在Default locale for the system environment:中选择zh_CN.UTF-8

重启后生效





安装谷歌的开源浏览器Chromium


cd /opt
sudo wget http://goo.gl/go5yx -O install.sh
sudo chmod a+x install.sh
sudo ./install.sh

启动远程桌面管理后,在终端里运行chrome -disable-ipv6 &
或者点击菜单后启动chrome





配置文档config.txt说明,HDMI制式,usb供电问题


1.
树莓派并没有传统意义上的BIOS, IO配置参数通常被存在"config.txt"这个文本文件中.
树莓派的config.txt文件会在ARM内核初始化之前被GPU读取.
这个文件存在引导分区上, 路径通常是/boot/config.txt

详细配置说明见这个网址:
http://elinux.org/RPi_config.txt

翻译:
http://www.shumeipai.net/thread-19043-1-1.html

通常不用去管它,当在一些显示器上没有输出时,去修改这个文件,以匹配显示器的制式。

对于在一些电视上没有输出,参考这篇文章
http://elinux.org/RPi_VerifiedPeripherals#Display_adapters

HDMI->DVI-D cables
you may need to change config.txt hdmi_force_hotplug=0 to =1 if your display does not receive DVI signal (the analog output is likely active).

2010版苹果MAC Mini自带的适配器可用!
The HDMI to DVI-D cable provided by Apple with the 2010 Mac Mini worked.

注意潜规则:
选择自带电源输入的HDMI->VGA converter boxes,树莓派只提供50毫安给HDMI给DVI-D显示器,200毫安是最大阀值,超过易损坏。
as the PI only is designed to provide about 50mA to the (HDMI or DVI-D) monitor, and these adapters use >200mA, while the absolute maximum the PI can let through is 200mA. These adapters also thus use about half the energy that the PI (without USB devices) uses. Therefore its much better to use an adapter that has an external power input.


配置内容可能参考如下:
hdmi_safe=1
overscan_left=-30
overscan_right=-30
overscan_top=-30
overscan_bottom=-30
hdmi_group=2
hdmi_mode=4
hdmi_drive=2
config_hdmi_boost=4

2.
分辨率模式看这个地址:
http://elinux.org/RPiconfig#Video_mode_options

hdmi_mode=4    640x480    60 Hz
hdmi_mode=16   1024x768   60 Hz
hdmi_mode=42   1400x1050  60 Hz
hdmi_mode=47   1440x900   60 Hz
hdmi_mode=60   1680x1050  85 Hz
hdmi_mode=80   2560x1600  120Hz reduced blanking

3.
### USB供电不足解决 #
max_usb_current=1
safe_mode_gpio=4






安装蓝牙适配器


硬件选择支持蓝牙4.0的适配器,和相关的键盘、鼠标、音箱,可以复用通道。

sudo apt-get install bluetooth bluez-utils bluez-compat blueman

启动蓝牙服务
service bluetooth status

root@raspberrypi:/home/pi# service bluetooth status
[ ok ] bluetooth is running.
正常的话应该是
[ ok ] bluetooth is running.

切换到图形界面
startx


在蓝牙图标右击

单击setup new Device

双击蓝牙图标看到连接设备


将设备成信任,下次进入系统后会自动匹配关联设备






服务自启动方法,远程控制


1.服务自启动方法

方案1

sudo apt-get install chkconfig

sudo chkconfig --add hostapd
sudo chkconfig --add isc-dhcp-server

方案2

让服务openvpn.client2开机启动
sudo update-rc.d openvpn.client2 defaults

取消服务openvpn.client2的开机自动启动
sudo update-rc.d -f openvpn.client2 remove

方案3

sudo insserv /etc/init.d/openvpn.client2 #添加服务
sudo insserv -r /etc/init.d/openvpn.client2 #删除服务


2.远程控制

安装VNC远程控制
sudo apt-get install tightvncserver

测试
vncserver -geometry 1440x900

安装xrdp远程控制
sudo apt-get install xrdp

这个图是通过手机上的rdp客户端连接到Pi的截图


这个图是通过电脑上的windows远程连接连接到Pi的截图

图上的右下角显示刚安装上去的蓝牙适配器






让树莓派自动识别windows格式的U盘和移动硬盘

■

1.挂载NTFS格式的硬盘(读写方式挂载)

#安装所需软件包
sudo apt-get install fuse-utils ntfs-3g

#加载内核模块
modprobe fuse

为每次开机运行,在/etc/modules文件增加一行:
fuse

#编辑fstab让移动硬盘开机自动挂载
sudo vi /etc/fstab
#在最后一行添加如下内容
/dev/sda1 /mnt/myusbdrive ntfs-3g defaults,noexec,umask=0000 0 0

#保存重启,即可生效

2.挂载FAT32格式的硬盘

#创建挂载点
sudo mkdir /mnt/myusbdrive
#编辑fstab让移动硬盘开机自动挂载
sudo vi /etc/fstab
#在最后一行添加如下内容
/dev/sda1 /mnt/myusbdrive auto defaults,noexec,umask=0000 0 0
#保存重启,即可生效

3.挂载exFAT格式的硬盘
sudo apt-get install exfat-fuse

4.
如果想开机自动挂载,而不是每次手工执行,可以编辑 /etc/fstab 文件。比如在末尾添加一行:
/dev/sda1 /mnt/usbdisk vfat rw,defaults 0 0

5.当前用的方案——

确认在/etc/modules文件有一行:
fuse

通过给linux下的设备管理服务udev添加规则配置文件,可以实现命令行下USB存储设备自动挂载

sudo vi /etc/udev/rules.d/10-usbstorage.rules

复制粘贴这个脚本到编辑窗口

KERNEL!="sd*", GOTO="media_by_label_auto_mount_end"
SUBSYSTEM!="block",GOTO="media_by_label_auto_mount_end"
IMPORT{program}="/sbin/blkid -o udev -p %N"
ENV{ID_FS_TYPE}=="", GOTO="media_by_label_auto_mount_end"
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="Untitled-%k"
ACTION=="add", ENV{mount_options}="relatime,sync"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", ENV{mount_options}="iocharset=utf8,umask=000"
ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", ENV{mount_options}="iocharset=utf8,umask=000"
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name}"
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}"
LABEL="media_by_label_auto_mount_end"

保存退出

再次插入usb存储设备 会自动挂载到/media目录下面的目录 并且支持utf8格式的中文文件名。





VPN全局代理和路由表

服务器端centos搭建的openvpn因为兼顾MikroTik的RouteOS的连接,使用tap方式(可以加入网桥,并且能对其它连入设备dhcp),使用tcp方式。
认证改为"用户名"和"密码方式",因此取消tls-auth ta.key认证.

【PS:
# ta.key, This file is secret # SSL/TLS额外提供的HMAC防火墙,打开会更安全 #
# The server and each client must have a copy of this key.
# The second parameter should be '0' on the server and '1' on the clients.
tls-auth ta.key 0

# 启用tls-auth,需要用到从服务端拷贝过来的ta.key
# If a tls-auth key is used on the server
# then every client must also have the key.
tls-auth ta.key 1
】


vi /sbin/a2.z._set_tap0_proxy.sh

#!/bin/bash

checkip()
{
    # ipv4地址
    echo $1 | grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" > /dev/null
    if [ $? = 1 ]; then
        return 1;
    fi
    return 0
}

tmp1=`route -n | grep wlan0 | grep UG | grep -v 255.255.255.255 | awk '{print $2}'`

### 当wlan0的IP是default路由时 ###
if checkip "$tmp1"; then

    #sudo route del -host 12.34.56.78
    ### 特别解释:因为小区宽带对VPN的封锁,我将VPN通过ssh穿透的方法连到VPN服务器 ###
    ### 让“通向VPN服务器的路由”指向原wlan0的网关, 不然VPN会断开 ###
    sudo route add -host 12.34.56.78 gw $tmp1
    sudo route add -host 8.8.8.8 gw $tmp1
    sudo route add -host 8.8.4.4 gw $tmp1

    ### 网通的dnsserver #
    sudo route add -host 202.106.0.20 gw $tmp1
    ### www.ip.cn #
    sudo route add -host 211.55.86.186 gw 192.168.253.1

    ### 删除原来wlan0的默认网关 ###
    sudo route del default gw $tmp1

    ### 增加到隧道的网关 ###
    sudo route add default gw 192.168.253.1

fi