Home

Linux 下的无线 AP 配置

介绍在 Linux 下通过无线网卡配置无线的经验。

我使用的网卡是 TL-WN841N,这样的大牌子可以很好的得到内核的驱动支持。
TP-LINK 官方是有在维护他的产品针对 Linux 驱动的。

本文工作发行版使用ArchLinux,不保证其他发行可用,
但除了包管理器的差别外,大部分配置通常是可以通用的。

1) 启用驱动

使用如下命令启用驱动,需要重启:

1sudo modprobe ath9k

当然也可以不用重启,但是我这里推荐你所有配置完成以后,还是重启一下比较好。

2) 配置网卡设备名

/etc/udev/rules.d/10.network.rules

1SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="ff:ff:ff:ff:ff:ff", NAME="wlan1"

注意将上述配置中的 ff:ff:ff:ff:ff:ff 替换为你的无线网卡 MAC 地址。

这样配置是由于 systemd 的新命名机制,导致网卡命名不像以前 eth*,而是一串不容易记忆的名称。
这里我们统一配置为 wlan1,方便后面使用。

3) 配置 dhcpd 服务器

因为无线 AP 需要提供 DHCP 服务,供无线设备使用,因此这里需要安装 DHCP。

首先安装 dhcpd 软件包:

1sudo pacman -S dhcp

然后我们做一个简单的子网配置:
/etc/dhcpd.conf

1subnet 192.168.100.0 netmask 255.255.255.0 {
2  range 192.168.100.100 192.168.100.199;
3  option routers 192.168.100.1;
4  option domain-name-servers 8.8.8.8;
5  option ip-forwarding off;
6  option broadcast-address 192.168.100.255;
7}

4) 配置 wireless-ap 服务

这是一个自定义 systemd 服务,用于配置无线网卡并绑定到 dhcp。
最后为其配置 iptables 转发规则。

配置文件如下:
/etc/systemd/system/wireless-ap.service

 1# Powered by Zealic, Visit : https://github.com/zealic
 2[Unit]
 3Description=Wireless AP
 4Wants=network.target
 5Before=network.target
 6
 7[Service]
 8Type=oneshot
 9RemainAfterExit=yes
10EnvironmentFile=/etc/conf.d/wireless-ap
11ExecStart=/sbin/ip link set dev ${interface} up
12ExecStart=/sbin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev ${interface}
13ExecStart=/sbin/dhcpd -q ${interface}
14ExecStart=/sbin/iptables -t nat -A POSTROUTING -o ${target_interface} -j MASQUERADE
15
16ExecStop=/sbin/ip addr flush dev ${interface}
17ExecStop=/sbin/ip link set dev ${interface} down
18
19[Install]
20WantedBy=multi-user.target

针对服务的环境配置:
/etc/conf.d/wireless-ap

1interface=wlan1
2target_interface=net1
3address=192.168.100.1
4netmask=24
5broadcast=192.168.100.255

记住,target_interface 指的是你可以接入互联网的网卡,你的这个网卡名可能是 eth0 之类的。

完成服务配置以后,我们需要启用服务。

1sudo systemctl enable wireless-ap

5) 安装配置 hostapd

hostapd 就是可以让无线网卡工作在 master 模式下的工具了。

首先安装软件包:

1sudo pacman -S hostapd

配置 hostapd
/etc/hostapd/hostapd.conf

 1ssid=YOUR-AP-SSID
 2driver=nl80211
 3hw_mode=g
 4channel=11
 5interface=wlan1
 6auth_algs=1
 7wpa=1
 8wpa_passphrase=YOUR-AP-PASSWORD
 9wpa_key_mgmt=WPA-PSK
10wpa_pairwise=CCMP TKIP
11rsn_pairwise=CCMP
12ht_capab=[HT40-][SHORT-GI-40][DSSS_CKCK-40]

别忘了把 YOUR-AP-SSIDYOUR-AP-PASSWORD 换成你自己的 SSID 和密码。

启用 hostapd 服务:

1sudo systemctl enable hostapd

6) 重启系统

到这里我们已经配置完成无线网卡的 AP,重启系统即可开始使用。

1sudo reboot

当然如果你是高级 Linux 用户,完全知道自己在做什么,也可以自己控制卸载网卡并启动服务。

7) 问题

我配置完成可以正常的使用,但是发现使用一段时间后无线 AP 就消失了,整个系统也有些问题,内核经常性的挂起。

关键性报错如下:

长时间工作后 tty 不停的刷如下日志:

1kernel: DMA: Out of SW-IOMMU space for 16 bytes at device 0000:00:1d.0

在 tty 中运行任何命令都可能会导致长时间挂起,超时后输出如下错误:

1INFO: task blocked for more than 120 seconds.

这句忘了怎么来的了:

1ath: Unable to remove station entry for: ff:ff:ff:ff:ff:ff

发生这个问题的原因是由于 Intel 的 64 位支持不太好的原因,
只需要在内核启动参数加上 intel_iommu=off 选项即可。

更新:2013-08-08

确认以上问题不仅仅是内核选项的问题,而是由于我的配置项不完整导致的,
只需要在 hostapd 配置中加入

1ht_capab=[HT40-][SHORT-GI-40][DSSS_CKCK-40]

这样以正确的设定其工作模式就没有问题了。

我已经在上面的配置中加入了此配置选项。

实验下来 AP 运行良好,没有出现导致内核挂起的问题。

参考

View Comments

实战 Gollum

前言

之前就说过想尝试 Gollum,GTD 精神引导我立刻就做。
以下就是我尝试的过程。

安装 Gollum

本来想安装到 Windows 之上的,但是尝试之后,虽然 Gollum 可以安装到 Windows 之上(需要 MinGW 环境)。
但是由于其依赖的 Grit 无法在 Windows 之上工作,参考这里
我也尝试了进行补丁,但是无果~

没办法,只好在 *nix 上尝试 Gollum。 个人习惯使用 Debian,运行以下 shell 代码即可。

1apt-get install ruby1.9.1-full
2# Gollum 依赖的 nokogiri 需要这些才能编译
3apt-get install libxml2-dev libxslt-dev
4# 最新版本的 redcarpet 无法工作在 gollum 之上,参考本文结尾的:
5#   Stackoverflow : Gollum Wiki - undefined method 'new' for Redcarpet:Module
6gem install redcarpet --version=1.17.2
7gem install gollum

如此即安装完成,这里我新建一个示例仓库来维护:

1git init mywiki
2cd mywiki
3gollum

然后访问 http://localhost:4567 即可访问 gollum 托管的 Wiki。

结语

按照我的设想,Gollum 是用来作为项目开发的文档工具来使用的,并不仅仅作为个人知识管理工具来使用。 至于实际效果么,就得看以后啦~

参考

View Comments

整理一下最近的思路

关于博客

自从年后了解到 Jekyll 以后,就琢磨着把博客完全迁移到这个平台上面。
上月中旬已经迁移完成,顺便实现了大体的模板框架,利用一些前端 JS 及 HTML5 来改善浏览体验。
此后断断续续的对内容做整理及改进,统一了格式等等,还把一些写心情的文章移走,此博以后就专门发布技术文章及相关内容了。

用上了 Jekyll 的感觉真好,其实之前还看过 Octopress,但是其是按照 Github 的要求来做的,不支持 Jekyll 的插件,而我有很多想要自己做的功能,入博客分页,标签功能等等。
因此就直接在 Jekyll 建博客,写了一些自定义插件,如分页标签什么的,毕竟以前学过一些 Ruby,弄些这个还是小 CASE。

目前还剩下我在博客园的一部分文章没有移过来,弄完就应该了事了。

Amazon Cloud

云计算已经是时代趋势,我也开始在最近跑起了 Amazon EC2,不得不说国外月亮真的很圆,最起码网络如此,在 EC2 上的做 Debian APT 更新时,下载网速峰值能达到 4MB!
因此打算将 Linode 上的 VPS 停掉,以后就用 EC2 了。关于云计算,还需要学很多~

前段时间也试着在 EC2 上面搭建 PPTP、L2TP VPN,由于 EC2 网关只支持 TCP、UDP及ICMP协议,因此工作在第二层的 L2TP 无法工作,而 PPTP 所用的 GRE 协议也在 EC2 上时好时坏,虽然搭起,却是不太稳定,因此又干脆的搭个 OpenVPN 好了,然后自己对 OpenVPNPortable 做了一些改造,并升级到最新的 OpenVPN 2.2.2,绿色版滴哟,现在用起来灰常舒服~

兴趣

现在对 Windows Phone 非常感兴趣,当前用的手机也是这个,已经注册了 Apphub 帐号,打算将自己脑海中的一些应用实现。

然后对于 Qt5 的也非常感兴趣,想要进一步学习,如果 Qt5 有 Python Binding 的话再好不过了, QML 真的是太美了~

文档、WIKI、PKM !?

一直以来想要一个 WIKI 来维护自己的个人知识,先后试过以下软件:

但是上述软件一直都不尽如意,期间也有利用 VCS 来做知识管理的想法,也用 SVN 实施过,但是也放弃了。因此到现在知识想法什么的一直都很散乱。
后来接触到了 Git,了解到了 ikiwikigit-wikiolelo 之后,就觉得这是我一直想要的,简单、方便、直观、自主控制的版本管理;太完美了~
但是却一直没有实施这个想法,现在打算在最近用 Gollum 部署起来,并慢慢把以前散乱在 WinOrganizer、Google Notebook、OneNote 和 Dropbox 中的数据迁移进去~

Git

现在使用 Git 渐入佳境,认为这个最完美的版本控制工具了,哪怕在公司用 SVN 都不爽,要用 git-svn 协同工作才舒服。
自己的各种练手作品和项目也用 Git 管理起来,以及一些环境脚本,常用软件等等。
现在完全不怕数据丢失什么的了,哪怕个人电脑完全毁坏,也就是损失一些无关紧要的数据,关键数据我都用 Git 管理器来,比如常用软件。用 Git 管理并放到 bitbucket,我个人又有绿色软件强迫症,因此仓库中的软件都是精心制作,转为绿色才放进去的,以下就是一些大部头:

  • Cygwin
  • MinGW32
  • VB6、VC6、VC71、VC80、VC90、VC100 的编译环境
  • Python
  • Java
  • Ruby
  • Perl
  • Git

这些在到新环境的时候,都不用到处下载安装,只要 pull 下来仓库,运行其中的部署脚本而已。家里和公司中可以随时同步成相同的工作环境。

结语

这篇文章完全使用 Notepad2-mod 写的,纯文本写文章的感觉真好,脱离了 Live Writer,整个世界都清新了起来!

此博近乎两年未更新,很多学到的东西都没记录下来,以后要勤于写博,总结经验,以前常听好记性不如烂笔头,这个确实是真的~

View Comments

Windows 下使用 Nginx+Mono 部署 ASP.Net

自 Mono 1.9 以来,ASP.Net 也能通过 Mono 的 fastcgi-mono-server2 在 FastCGI 下运行了,更为可贵的是,Mono 兼容 Windows ;我们可以在 Windows 下利用 lighttpd、nginx 或 Apache 等服务器上部署 ASP.Net。

我将 Mono for Windows 的 FastCGI-Mono-Server 提取出来,你可以 猛击这里 下载。

而 Nginx 目前也支持 Windows,是部署 Web 服务器的一个非常不错的选择,你可以在 Nginx 的官方网站找到下载。

下面是我对 Nginx nginx.conf 的配置,第 25 行属于关键内容。

 1worker_processes  1;
 2error_log  logs/error-debug.log info;
 3
 4events {
 5  worker_connections  1024;
 6}
 7
 8http {
 9  include         mime.types;
10  default_type    text/plain;
11  sendfile        on;
12
13  keepalive_timeout 65;
14  index  index.html index.htm;
15
16  server {
17    listen       80;
18    server_name yourdomain.com;
19    index index.aspx default.aspx;
20
21    location / {
22      root   D:/www/yourwebapp;
23
24      fastcgi_pass   127.0.0.1:8000;
25      fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
26      include       fastcgi_params;
27    }
28  }
29}

然后将上面的 FastCGI-Mono-Server 提取出来,所有文件全部注册到 GAC(否则 Web 应用会找不到他们,当然你也可以直接放到 webapp/bin),然后解压到某个文件夹,这里假设为 D:/FastCGI-Mono-Server。

之后我们就可以按下列命令运行 FastCGI:

1fastcgi-mono-server2 /socket=tcp:127.0.0.1:8000 /root="D:/www/yourwebapp" /applications=yourdomain.com:/:. /multiplex=True

最后执行运行 Nginx 服务器,我们的 ASP.Net 程序就能脱离 IIS 这个臃肿的家伙运行啦!!!

View Comments

一种版本化的数据库脚本管理机制

现今开发的软件当中,多数系统的数据都是基于数据库存储的,但是由于软件变化的复杂性,相对于维护代码,数据库架构的版本并不是那么好维护。

这里本人针对实际情况,理想化出一种可以清晰理解的数据库架构脚本的版本控制机制。

请先看目录树:

 1Example.DataSchema
 2├─V1.0
 3│  ├─Common
 4│  │      001.Create.Table.Product.sql
 5│  │      002.Create.Table.User.sql
 6│  │      003.Create.Table.Feedback.sql
 7│  │      004.Create.Table.Role.sql
 8│  │      005.Create.Function.FN_GetlProductCode.sql
 9│  │      006.Create.Function.USP_CleanFeedback.sql
10│  │
11│  ├─Enterprise
12│  │      001.Create.Table.Highland.sql
13│  │
14│  └─Professional  
15│          001.Create.Table.Lowend.sql
1617├─V1.1
18│  ├─Common
19│  │      001.Alter.Table.User.sql
20│  │      002.Alter.Function.FN_GetlProductCode.sql
21│  │      003.Drop.Function.USP_CleanFeedback.sql
22│  │
23│  ├─Enterprise  
24│  │      001.Alter.Table.Highland.sql
25│  │  
26│  └─Professional
27│          001.Alter.Table.Lowend.sql
2829└─V2.0
30    ├─Common
31    │      001.Alter.Table.Product.sql
32    │      002.Alter.Table.User.sql
33    │      003.Create.Function.USP_CheckProduct.sql
3435    ├─Enterprise
36    │      001.Create.Table.Overland.sql
3738    └─Professional
39            001.Alter.Table.Lowland.sql
40            002.Create.Table.Notebook.sql

相信上面的目录结构还算明了,我们可以根据软件的版本追溯数据库,而不是通过版本控制工具来追溯原始数据库,而数字序号的前缀,更指明了脚本执行顺序,再也不用因为在建立数据库时受到依赖/外键关系的原因而运行脚本失败了。整个层次非常清晰,头脑通透的 Coder 相信可以一看便明了。

版本目录下有三个文件夹:Common, Professional, Enterprise,分别代表一个产品的三个定制化版本,因为软件中可能有这样的需求,软件基本结构不变,但是使用提供者模式提供了多个定制化版本,每个提供者的数据库结构基本相同,但是又有极少的差异。通过上面的这种管理机制,可以避免在源代码控制系统中开分支来维护,从某种程度上来说,提高了一定的可维护性。

这种管理机制类似于 ROR,不过 ROR 更 OO 一些,还能够隔离特定数据;通过这种机制,我们可以结合 RikMigrationsMigrator.NET 进行自动化的数据库升级(需要编码)。

View Comments