胡骊 发布的文章

上星期终于搞掂了办公室的CentOS备份。一开始,我们把硬盘A完全复制到硬盘B(用dd命令拷贝整个硬盘),产生了很多误会,也搞出不少问题,差点以为把硬盘A的数据搞丢了。

后来才发现,CentOS挂载硬盘分区时,根据分区的UUID来挂载的。由于两个硬盘的数据完全一致(包括各分区的UUID也一致),所以即使以硬盘A启动电脑,也可能挂载了硬盘B的分区。最后将错就错,按如下步骤解决问题:

1)修改硬盘B中所有分区的UUID
参考以下文章:
linux下硬盘uuid查看及修改设置
http://blog.csdn.net/rainday0310/article/details/6343038

Ext4的分区可以按照该文章,修改分区UUID:

uuidgen | xargs tune2fs /dev/sdb1 -U

但是swap分区不行,只能格式化一下,让其重新生成UUID:

#操作之前,先取消挂载
swapoff /dev/sdb2
#格式化swap分区
mkswap /dev/sdb2

修改后,可以下命令查看各分区的UUID:

blkid /dev/sdb1

2)修改硬盘B上的相关配置文件
此步骤是为了让硬盘B也能直接启动。就是说硬盘A出了什么故障,直接用硬盘B就可以启动服务器了。
a)修改分区挂载文件/etc/fstab,把对应分区的UUID改为新的。
b)修改grub配置文件/boot/grub/grub.conf,把根目录的分区UUID改为最新的。

3)同步两个硬盘的文件
这里采用rsync命令,把硬盘A的数据自动同步到硬盘B上。
a)把硬盘B的根目录挂载到/media/sdb3
b)创建文件/media/rsync_exclude文件,把要排除的文件夹或文件录进去,一行一个,参考内容如下:

/boot/*
/dev/*
/media/*
/lost+found
/proc/*
/sys/*
/tmp/*
/etc/fstab

c)执行以下命令,立即同步文件(以root用户执行):

rsync -avzP --delete --exclude-form=/media/rsync_exclude / /media/sdb3 >> /media/rsync.log

参考:
rsync官方man文档
https://download.samba.org/pub/rsync/rsync.html

CentOS 6.5下rsync服务器安装配置,rsync 客户端
https://segmentfault.com/a/1190000002502991#articleHeader5

4)优化
后面考虑把硬盘B做成USB移动硬盘,这样可以在需要时才接上电源。再考虑接上硬盘B后自动执行同步命令。

终于还是入手了Kindle3,200RMB的二手货,成色很新。由于带键盘,也有比较成熟的软件,所以非常喜欢。记录一下入手后的折腾经历吧。

1)升级最新固件(fireware)
从官网下载最新固件(目前最新是3.4.2):
Amazon.com Help: Kindle Keyboard Software Updates
http://www.amazon.com/gp/help/customer/display.html/ref=hp_left_v4_sib?ie=UTF8&nodeId=200529700

升级固件时,按照所需版本,一个一个地升。升级到最新版,最大的作用是可以注册美国亚马逊账号。其它的功能,包括阅读PDF(自动切除白边)、漫画等,都很方便。

2)越狱(Jailbreak)
Font, ScreenSaver & USBNetwork Hacks for Kindle 2.x, 3.x & 4.x
http://www.mobileread.com/forums/showthread.php?t=88004

详细操作,上面会详细记录。简单来说,就是下载对应的版本,然后刷进系统。本链接还包括修改默认屏保(ScreenSavers)、修改字体(Fronts)、USB有线网(USBNetwork)、Python等等。

3)快捷键(launchpad)
launchpad -- yet another hotkey manager for Kindle
http://www.mobileread.com/forums/showthread.php?t=97636

一个热键管理程序,可以把shell脚本,包括启动程序的脚本,做成热键,非常好用!

4)命令窗口(Terminal)
One more terminal emulator for kindle
http://www.mobileread.com/forums/showthread.php?t=154500

用launchpad启动,即可进入shell终端,然后就可用编写shell脚本、修改系统文件、ssh远程到其它机器等等。总之就是非常强大。

5)音乐播放器(MPlayer)
MPlayer for Kindle
http://www.mobileread.com/forums/showthread.php?t=119851

一边播放音乐,一边看书,也是不错的。特别要说的是,Kindle3自带的喇叭,音质比预想的好很多。

6)字典(Dictionary)
字典下载
http://kindlefere.com/dict

下载其它字典,并且可以替换系统默认的字典。

7)中文输入法
Kindle 3 原生系统3.4.2拼音输入法完美版安装包
http://terence2008.info/archives/kindle3_pinyin_input_method.html

8)其它
Kindle Hacks Information
http://wiki.mobileread.com/wiki/Kindle_Hacks_Information

这里都有汇总了几乎所有的软件,包括上面提到的。

曾经在“闲鱼”(淘宝二手)上看到有人卖NodeMCU的开发板,查了发现这东西很便宜(30RMB以下可以买到),而且自带WiFi,非常适合打开“物联网”的大门。直到前几天,跟经理说起关于怎样控制窗户的开关,才又提起这个,并买了个来玩。

详细介绍
ESP8266使用
http://suda-morris.github.io/blog/2015/12/06/esp8266/

针脚定义
NodeMCU Pin Map
请输入图片描述

官方文档
NodeMCU的API文档(英文) http://nodemcu.readthedocs.org/en/dev/

入门教程
官方网站(http://www.nodemcu.com/)上没有找到官方的入门教程,但是找这一些比较好的:
1)一个比较全面的教程(针对Windows) http://nodemcu-dev.doit.am/
2)NodeMCU 物联网开发快速上手(适合Linux用户) http://tinylab.org/nodemcu-kickstart/

官方论坛(http://bbs.nodemcu.com/)上也有一个系列的入门教程:
NodeMcu介绍:(一) 概述 http://bbs.nodemcu.com/t/nodemcujie-shao-gai-shu/25
NodeMcu介绍:(二)固件烧写 http://bbs.nodemcu.com/t/nodemcu/22
NodeMcu介绍:(三)启动文件init.lua http://bbs.nodemcu.com/t/nodemcu-init-lua/24
NodeMcu介绍:(四)下载*.lua文件 http://bbs.nodemcu.com/t/nodemcu-lua/26

Lua语言介绍
关于NodeMCU上使用的Lua,这里有个不错的教程
https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/main.html

项目需求,不同用户需要从各自有权限的一个字符串数组中,随机生成不同的组合。详细如下:
1)如果字符串数组长度超过4个,则最多取4个。
2)首先取没有生成过、且不管顺序的组合,如果用完,则从已经生成的组合中,取不同顺序的组合。例如:数组[a,b,c,d],先取组合[b,c,a,d]。下一次再取,由于没有不同的组合了,只能取不同顺序排列的组合,即:[c,a,b,d],[c,b,a,d]等等。
3)如果没有可用组合,则从已生成的组合中,随机抽取一个。
4)取可用组合之前,需要检查是否还有可用的组合。如没有,提示用户。

这里有几个问题:
1)需要记录已生成(用过)的组合。
2)如何随机取(生成)不同的组合?
3)检查是否有可用组合时,是否有快速或高效的方法?

逐个问题去解决吧。

1)记录已经使用的组合。肯定要把已经使用的组合记录到数据库,但是要考虑第一次取是无序的组合,即[a,b,c]与[b,a,c]是一样的。于是数据库需要生成一个编码,用于标记该记录。这里采用把所选字符串按顺序排列后,组成一个编码。例如[a,b,c]与[b,a,c]编码都是abc。如果生成的编码过长,可以考虑采用MD5加密,达到压缩的目的。但是每次查询前都要生成MD5,如果数据量不大的话,没必要耗费这些资源。

2)生成随机组合。最简单的就是,先把字符串数组随机排列,然后按数组顺序去生成不同的组合就可以了。具体的生成算法,可以参考:
排列组合生成问题的讨论(二)
http://shmilyaw-hotmail-com.iteye.com/blog/2108293

3)检查是否有可用组合,确实没有什么捷径,只能生成所有组合后才能确定。经过测试,所需时间勉强可以接受。

自从毕业以后,很少有机会写算法相关的程序了。所以,遇到这种工作,还是比较有冲劲去完成。

由于CentOS 6.6上的Tomcat 6采用了jsvc来启动,导致日志文件不能自动分割。Google找到相关文章,介绍采用系统自带的Logrotate来解决此问题:

How to rotate Tomcat catalina.out
http://www.vineetmanohar.com/2010/03/howto-rotate-tomcat-catalina-out/

Logrotate的相关介绍,还是看看中文的吧:
linux下logrotate 配置和理解
http://blog.csdn.net/cjwid/article/details/1690101

被遗忘的Logrotate
http://huoding.com/2013/04/21/246

一般来说,按照文章进行配置就完事了。Logrotate已经设置在/etc/cron.daily,每日自动执行。但是发现Logrotate仍不能正常工作。Google查到以下文章,才知道是服务器上启用了SELinux,权限问题没解决好:

I am getting 'logrotate: ALERT exited abnormally with [1]' messages in logs when SELinux is in the Enforcing mode
https://access.redhat.com/solutions/39006

关于CentOS上的SELinux操作,详见官方WiKi:
https://wiki.centos.org/zh/HowTos/SELinux

最后,关于权限问题,解决如下:
1)检查新增的配置文件的权限,是否跟原有的配置文件一致。如不一致,需修正。

ls -Zalh /etc/logrotate.d/

2)把需要切割的日志文件以及日志文件所在的目录,都设置SELinux的var_log_t类型权限(注意tomcat路径需改为实际路径),就解决权限的问题了:

chcon -t var_log_t /usr/local/tomcat/logs
chcon -t var_log_t /usr/local/tomcat/logs/*


注意:遇到Logrotate不能正常工作时(注意,本文的操作系统是CentOS 6.6),可以按照以下步骤排错:
1)Logrotate以Debug模式(只显示执行结果,不进行实际操作)执行一下,测试配置文件是否有误

/usr/sbin/logrotate -dv /etc/logrotate.conf

2)检查日志文件/var/log/messages,看Logrotate执行时是否有报错

cat /var/log/messages | grep logrotate

3)Logrotate每日操作的操作日志,会记录在/var/spool/mail/root,从该文件可以查看更详细的错误。

4)如第3点有权限相关的报错,检查权限记录日志/var/log/audit/audit.log,看有没有Logrotate的权限错误日志。通常会提示哪些日志文件是否存在权限不足导致不能访问。

cat /var/log/audit/audit.log | grep logrotate


本来树莓派(Raspberry Pi 2 Model B)在家中安静地连上Internet,并定时下载网盘上的电脑,就已经很实用了。但是发现花生壳推出针对树莓派的内网端口及socket5映射软件,就试玩了一下:

树莓派花生壳(内网版)攻略
http://service.oray.com/question/2680.html

该软件的作用就是把处于内网环境的树莓派的端口或socket5映射到外网,实现外网直接访问树莓派,可玩性一下子提高几个等级。但是由于是免费版,拥有N多限制,包括流量、响应时间、可映射端口数量等等。查了相关资料,有网友说其实是利用了ssh隧道来实现的,既然这样,为什么不自己部署一个?安全性及相关限制都可以自己设置的。

所需条件
1)外网可访问的服务器或VPS(下文简称VPS),并且可运行SSH服务,最好是Linux系统
2)可访问VPS的树莓派(下文简称RPi)
3)域名,非必须

原理
RPi通过ssh客户端主动连接VPS的ssh服务,并开启VPS上的端口,映射到PRi的端口。为了方便创建连接,VPS上的ssh服务需要无密码访问,这里采用了证书登录。由于网络断掉后,ssh客户端的连接也会断掉,所以采用autossh代替ssh客户端。

关于ssh服务
参考以下文章:

1)此文章说明了很多ssh服务的安全相关配置,可用作VPS上的ssh服务配置参考。
SSH 安全性和配置入门
https://www.ibm.com/developerworks/cn/aix/library/au-sshsecurity/

2)详细说明了如果配置证书登录ssh服务
ssh证书登录(实例详解)
http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646346.html

3)介绍ssh隧道的使用
SSH Tunnel解决无公网IP 80被封等问题
http://blog.bbzhh.com/index.php/archives/60.html

4)介绍用autossh的使用
autossh在Ubuntu上的配置 ssh 隧道
http://yuanxiao.sinaapp.com/pages/122/132/377/article_index.html

配置
1)RPi上,创建证书。需要输密码时,直接按回车跳过。

ssh-keygen -t rsa

这里采用了rsa方式,默认生成两个文件:公钥(id_rsa.pub)和私钥(id_rsa)。把公钥(id_rsa.pub)文件,上传到VPS。

2)VPS上,生成授权文件,把自制的公钥都放入去。

cat id_rsa.pub >> ~/.ssh/authorized_keys

3)VPS上,安装并配置sshd。配置文件路径/etc/ssh/sshd_config,比较重要的配置项如下:

# 禁用root账户登录,增加安全性,非必要
PermitRootLogin no

# 是否让 sshd 去检查用户家目录或相关档案的权限数据,
# 避免使用者将某些重要文件的权限设错,而可能导致一些问题发生。
# 例如使用者的 ~/.ssh/ 权限设错时,某些特殊情况下会不许用户登入
StrictModes no

# 是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys

# 禁用密码登录,增加安全性
PasswordAuthentication no

配置完成后,记得重启sshd服务,使配置生效。

4)VPS上,安装TCP Echo服务,供autossh判断网络隧道连通情况。默认运行端口为7。

apt-get install openbsd-inetd

安装后,需要修改配置文件/etc/inetd.conf,在文件末尾增加以下内容:

echo        stream    tcp    nowait    root    internal

然后就可以启动服务了。

5)RPi上,用autossh连接VPS并进行端口映射

# 安装autossh
sudo apt-get install autossh

# 创建port_forward.sh文件
cat >> port_forward.sh << EOF
#!/bin/bash
export AUTOSSH_PIDFILE=/var/run/autossh.pid
export AUTOSSH_POLL=60
export AUTOSSH_FIRST_POLL=30

# -f是后台运行
# -M 后台管理端口:VPS的echo服务端口
# -NR VPS端口:本机地址:本机端口,本例把RPi端口80映射到VPS端口8080
# 后面的就是登录相关信息
autossh -f -M 4567:7 -NR 8080:localhost:80 user@vps_name.net -p 22 -i /path/to/id_rsa 

# 设置可执行权限
chmod 755 port_forward.sh

# 运行
./port_forward.sh

6)最后就可以直接访问http://vps_name.net:8080就可以访问RPi端口80上的服务了。

经过一段时间的研究和实践,终于把树莓派(Raspberry Pi 2 Model B)作为家庭服务器用起来了。简单来说,就是树莓派作为无线路由、网盘下载机和提供DLNA服务,Chromecast作为播放器在电视机播放多媒体内容,用Android手机作为遥控器控制一切。

树莓派
1)无线路由
参考前面的Bolg
Setup Raspberry Pi 2 as Wireless Router
http://blog.foxail.org/index.php/archives/661/

2)网盘下载机
这里选择了百度盘,其空间足够大(免费2TB空间),有Linux的客户端(第三方开发的)。树莓派上安装客户端:
https://github.com/GangZhuo/BaiduPCS

然后设置个定时同步下载,就可以自动下载电影了。下载前,还会上传当前的下载状态及硬盘空间使用情况到网盘,方便查看。

3)安装USB存储设备
参考以下文章,增加自动挂载USB存储设备:
树莓派自动挂载usb移动存储设备
http://rpi.linux48.com/usbstorage.html

该脚本在Debian 8上有问题,修改了一下,如下:

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,uid=1000,gid=1000,umask=000"
ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", ENV{mount_options}="iocharset=utf8,uid=1000,gid=1000,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"

如果是U盘,直接插上就可以了。但如果是移动硬盘,要考虑树莓派的电流不足的问题,会导致硬盘mount不上,或者不能写入数据。不得不换了个2A的USB电源和有源USB Hub。现在算是能顺利运行了,但还是想简化电路和连接方式,后面再考虑。

4)DLNA服务
装个minidlna就可以了。如果需要识别rmvb文件,需要改源码并重新编译。参考这个:
Raspiberry Pi安装minidlna1.1.4并支持rmvb
http://raspi.vanabel.info/wordpress/?p=92

Chromecast
国内真的不推荐用这个,因为要连上google才能使用。为了连上google,花了很多时间去研究,最后采用简单的方案:设置某个固定ip采用代理。本文前面的“无线路由”配置中,包含了相关配置。

关于ROOT。感觉不获取ROOT权限,也不会影响使用。不过个人习惯,ROOT后会增加更多的可能性。并且,升级到最新版系统后,目前不能ROOT了。

检查是否可ROOT:[INFO] Rootable Serial Numbers
http://forum.xda-developers.com/showthread.php?t=2537022

ROOT教程,需要借助硬件Leonardo Pro Micro(基于芯片ATmega32U4):Chromecast ROOT
http://raspberrypihelp.net/motornavigatie-dutch/62-chromecast-root

Android手机
目前安装了connectbot,作为SSH客户端连接树莓派。项目源码:
https://github.com/connectbot/connectbot

DLNA方面,采用BubbleUPnP,可以用本机播放树莓派的多媒体内容,可以把树莓派的多媒体内容推送到Chromecast。Google Play下载:
https://play.google.com/store/apps/details?id=com.bubblesoft.android.bubbleupnp

上星期在公司的服务器上部署了OpenVPN,居然没有想象中的难。记录一下吧。

1)添加软件源
参考:CentOS推荐使用EPEL源
http://blog.51yip.com/linux/1337.html

添加软件源后就方便多了。N多软件直接yum安装。

2)安装OpenVPN
参考1:OpenVPN for CentOS
https://docs.ucloud.cn/software/vpn/OpenVPN4CentOS.html

参考2:CentOS6.4配置OpenVPN
http://www.chenshake.com/centos6-4-configuring-openvpn/

基本就是yum安装OpenVPN及相关软件,然后设置并生成相关证书。客户端使用相关证书即可。

3)设置SELinux
参考:Run OpenVPN on non-standard port with SELinux and Centos 6
http://www.jacobtomlinson.co.uk/2014/12/08/openvpn-non-standard-port-selinux-centos-6/

设置SELinux,使得OpenVPN的自定义端口可以访问。如运行了iptable的话,也要设置该端口可访问。

曾看到有文章介绍Nexus 5(d820)开启LET Band 3,即能使用联通4G,一直想试试。但联通4G套餐还是太贵了,只能作罢。直到上个月收到短信,说我的卡已开通4G网络,于是找了个机会,升级系统之余,顺便开启4G。

操作过程参考了这个文章:
Nexus 5 D820 Android Lollipop 5.1 美版破解band 3
http://hi-it.org/1335.html

总结一下我的经验及步骤吧:
1)手机端准备:
1.1)备份系统及数据。32G版的Nexus 5,备份起来很耗时间。
1.2)刷官方Android 5.0或5.1,并root,开启开发模式。
1.3)安装Recovery。TWRP或Clockworkmod的,都可以。个人比较习惯Clockworkmod。
1.4)安装 Nexus 5 Field Test Mode。
1.5)安装 franco.Kernel updater ,然后运行并安装最新的kernel。

2)电脑端准备:
2.1)最好使用windows7操作系统。windows8会涉及更多的操作步骤。
2.2)准备好电脑端adb。
2.3)安装LG驱动。
2.4)安装QPST。
2.5)准备好qcn文件。

3)开刷:
3.1)手机插上电脑,确认开发模式已开启。
3.2)手机命令行激活 diag mode 。在电脑端运行以下命令(手机端会提示root权限):

adb shell
su
setprop sys.usb.config diag,adb

然后打开 设备管理器 -> 端口(COM和LPT),应该看到“LGE AndroidNet USB Serial Port (COM4)”。COM口的数字,会根据实际情况而定。
3.3)获取SPC码。

首先,电脑端运行命令`adb logcat -s LG_SVC_CMD`。
接着,手机端运行 Nexus 5 Field Test Mode ,进入 Settings (View) -> LTE -> Edit。此时查看电脑端的输出,找到SPC码。在手机端输入该SPC码后,进入了EDIT界面。依次修改设置为“Disable”、“Disable”、“Enable”、“1”、“1”、“0”,然后手机端不要动。

3.4)刷入QCN文件。

电脑端,运行 QPST -> QPST Configuration ,点 Ports ,检查COM口是否已添加。若没有,则点“Add New Port”进行添加。
电脑端,运行 QPST -> Software Download ,点 Restore ,看到 Port 显示手机所在COM口。在 QCN File 点 Browse ,选择 QCN 文件中的“80XXXXXX_RF_QDART_band3 RxTx NV patch.qcn”。SPC填入手机的SPC码。然后点 Start 。
如果看到Errors显示 Could not Reset the Phone 的报错,就表示成功了。
最后重启手机就应该可以了。

相关软件下载地址:
http://yunpan.cn/cgyfsDMTARiY9 密码 56ea

开启4G后,用手机网络上网时确实快了很多。主要体现在打开微信朋友圈,一下子就用了几十MB流量。对于月套餐只有500MB的我来说,一下子就掉了两天的流量,真是悲喜交集。

垂涎于Raspberry Pi 2 Model B的四核性能及低廉的价格,待其跌到200RMB左右时,终于还是入手了一个。

装完Raspbian,立马试了XMBC/Kodi媒体中心。效果还是跟以前一样,不尽人意。无它的,就是视频和音频的编码支持不完善,导致很多视频格式都不支持。(为了解决电视机播放手机视频的问题,入手了Chromecast。但Chromecast也不是个省油的灯,后面再说吧。)于是Pi只能放在后台,作为路由和服务器来使用了。

需求:增强无线网络覆盖范围,即作为桥接的无线路由,手机和Chromecast可以通过其上网,特别Chromecast要可以访问Google。

硬件准备:
1)Raspberry Pi 2 Model B,1台。
2)16GB的TF卡,1个,刷上Raspbian。
3)无线网卡,2个(磊科NW338和水星MW150UH),并且有一个(水星MW150UH)支持Ad-hoc功能,即能开启无线热点功能。
4)USB风扇,1个,用于扇热。温度过高的话,会导致硬件性能下降,就是网络传输速度会变慢。

软件安装及设置:
1)初始化准备
参考以下文章,设置好无线网卡的接口名称。否则每次开机,每个无线网卡的接口名称都可能会改变。
Setting Network Interface Name on Raspbian
http://www.foxail.org/blog/index.php/archives/532/

我设置了“磊科 NW338”为wlan0,“水星 MW150UH”为wlan1,。wlan0用于连接无线路由,wlan1用于开启无线热点。

2)配置无线网卡
MW150UH 可能还需要第三方驱动,这里是已编译好的驱动文件:
(UPDATE) Drivers for TL-WN725N V2 - 3.6.11+ -> 4.1.xx+
https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=62371

确定网卡可以运行后,修改 /etc/network/interfaces 为以下内容:

auto lo
iface lo inet loopback
 
auto eth0
allow-hotplug eth0
iface eth0 inet manual
 
auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
 
auto wlan1
#allow-hotplug wlan1
iface wlan1 inet static
  address 192.168.11.1
  netmask 255.255.255.0

3)hostapd
安装命令:

sudo apt-get install hostapd

由于采用了 水星 MW150UH ,芯片为RTL8188EU,所以参考了以下文章,使用相关已编译的 hostapd 文件来替换原来的 /usr/sbin/hostapd 。
Access Point (AP) for TP-Link TL-WN725N V2
https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=54946

然后备份配置文件/etc/hostapd.conf,并改为如下内容:

interface=wlan1
driver=rtl871xdrv
ssid=rpi-ap
channel=1
hw_mode=g
auth_algs=1
wpa=2
wpa_passphrase=123456
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
#macaddr_acl=1
#accept_mac_file=/etc/hostapd/hostapd.accept

4)dnsmasq
安装命令:

sudo apt-get install dnsmasq

然后备份配置文件/etc/dnsmasq.conf,并改为如下内容:

interface=wlan1
bind-interfaces
#except-interface=lo
dhcp-range=192.168.11.100,192.168.11.150,255.255.255.0,6h
 
# chromecast bind ip
dhcp-host=aa:bb:cc:dd:ee:ff,my-chromecast,192.168.11.10

5)iptables
设置iptables,实现转发:

sudo iptables -F
sudo iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -s 192.168.11.0/24 -o wlan0 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.11.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -i wlan0 -j ACCEPT

保存iptables配置:

sudo iptables-save > /etc/iptables.rules

设置系统启动时自动加载iptables的配置。修改文件/etc/network/if-pre-up.d/iptables为以下内容:

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules

保存该文件后,设置其权限:

sudo chmod +x /etc/network/if-pre-up.d/iptables

6)设置转发
修改文件 /etc/sysctl.conf ,找到net.ipv4.ip_forward,改为:

net.ipv4.ip_forward=1

7)解决Chromecast连上google的问题
为解决这个问题,花了不少时间去探索和尝试。Chromecast就算ROOT了,也不能安装shadowsocks客户端。解决方法是,固定 Chromecast 的IP地址,该IP的所有连接走 Raspberry Pi 上 shadowsocks-libev 的客户端。由于国内支持 Chromecast 的应用几乎没有,所以没必要再考虑访问国内网站的问题。

具体部署步骤,shadowsocks-libev 的官方说明已经详细说明了:
https://github.com/shadowsocks/shadowsocks-libev#advanced-usage

简单记录一下我的操作:
a)安装shadowsocks-libev,主要用到 ss-redir 。直接去GitHub下载源码编译安装吧:
https://github.com/shadowsocks/shadowsocks-libev

b)设置iptables:

# 建立新的链路
sudo iptables -t nat -N SHADOWSOCKS

# 跳过Shadowsocks服务器IP,这里假设为123.123.123.123
sudo iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN

# 跳过内网IP地址
sudo iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN

# 其他IP跳转到 ss-redir 的代理端口
sudo iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345

# 设置 Chromecast 利用代理访问外网
sudo iptables -t nat -A PREROUTING -s 192.168.11.10/32 -p tcp -j SHADOWSOCKS

设置完,记得保存iptables配置:

sudo iptables-save > /etc/iptables.rules

c)配置并启动 ss-redir,记得本地端口要设置为与上面的一致。

ss-redir -u -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid

最后,重启一下Raspberry Pi ,应该所有配置都会生效了。