header image

折腾香橙派

这里说的香橙派并不是食物,而是树莓派的国产模仿版。都属于ARM平台开发版,当然,装上Linux之后就是一台小电脑了,可以发挥的地方很多,就看你怎么利用了。

我是由于Xbox One网络实在太糟糕,而它又不支持VPN,所以必须要通过代理网关来转发,我又不想买新的路由器,所以便宜小巧的香橙派就成了我的首选了。

香橙派比树莓派价格更便宜,配置也更给力,就是不知道耐不耐用了。官方网站上都有详细介绍,我购买的是Orange Pi PC这一款,使用后发现系统在Micro SD卡上还是太慢(即使是UHS-I,当然,很可能香橙派根本不支持UHS总线,只能用更慢的总线模式读取),所以如果对速度有要求的场合(比如说做电视盒子)还是买Orange Pi PlusOrange Pi 2这些板载eMMC Flash ROM的版本。

没玩过树莓派,不知道树莓派的系统支持怎么样,但是香橙派的系统是非常丰富的,官网上可以看到AndroidLubuntuUbuntu with MATEFedoraDebianRaspbianOpenSUSEKali LinuxArch Linux等等系统,进论坛还能找到GentooOpenWRT等系统,总有一款适合你。最终我在中文论坛上找了一款Ubuntu 15.10 with MATEMATE是一个轻量级的桌面,自然没有Ubuntu官配的Unity那样的体验了,不过我要的是丰富软件包,并不用桌面。

然而在一切开始之前,却遇到了一个问题,居然不能用USB OTG那个接口供电,只好又重新买了变压器,这才用上。

下面我的操作都是在Ubuntu上进行的,Windows下的话工具有所不同,在官网和论坛上都有说了,就不另外说了。

系统安装

在树莓派官网和论坛上都有详细的步骤,这里就不细说了。就是把下载得到的系统包先解压出来,得到类似ubuntu_wily3.4.39_CN.img这样的磁盘镜像文件,然后写入到SD卡上。注意Ubuntu会自动挂载移动磁盘,所以必须先卸载(不能直接在文件管理器里卸载,这样会直接把设备都卸载掉了,必须用命令,这里我的SD卡是/dev/sdc):

sudo umount /dev/sdc*

然后就是写入系统:

sudo dd if=ubuntu_wilu3.4.39_CN.img of=/dev/sdc oflag=direct bs=4M

如果4M的块无法启动,要改成1M重新写入。

然后就会在文件管理器里见到两个新的分区了,挂载BOOT分区,然后根据需要把对应的屏幕分辨率的文件重命名为script.binuImage是内核,因为我用的是Orange Pi PC所以不用改了,如果是Orange Pi Plus要把uImage-OPI-PLUS重命名为uImageOrange Pi 2也不用改)。我选择的是1080p60的分辨率:

mv script.bin.OPI-PC_1080p60 script.bin

如果无法启动,在另一个linux分区下的boot目录里还有更多的内核文件,根据需要移动到BOOT分区并重命名就行了。

启动并配置

插上HDMI、鼠标键盘、网线和电源,然后按下开机按钮,香橙派就这么启动了。进到桌面后,登录名和密码都是orangepi,后面可以自己改。我下的系统SSH服务器默认是启用的,所以也可以不登录桌面,直接SSH过去操作。

首先要重新设定分区的大小,否则就没法利用SD卡的所有空间了:

sudo fs_resize

重启之后就可以了。

配置本来没啥好说的,虽然桌面环境不同,但本质都是Ubuntu,所以算是大同小异。但还是有一样得说一说,就是软件源。国内的镜像基本都没有ARM的源,包括官方的中国镜像(实际是指向阿里云的镜像)。不过最终还是发现中国科技大学的镜像有ARM的源。参考电脑上的source.list,把/etc/apt/source.list改为如下内容:

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily main restricted
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily main restricted

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-updates main restricted
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-updates main restricted

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-updates universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-updates universe

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-updates multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-updates multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-backports main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-security main restricted
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-security main restricted
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-security universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-security universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-security multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ wily-security multiverse

deb http://archive.canonical.com/ubuntu wily partner
deb-src http://archive.canonical.com/ubuntu wily partner

然后就是照例的更新升级:

sudo apt-get update
sudo apt-get dist-upgrade

然后就是装各种需要的软件了,这个就不细说了。

编译安装shadowsocks-libev

这才是今日的重点,shadowsocks-libev是一个C语言版本的shadowsocks,依赖少功能强,比起原版的Python版本的更好用。

在它的README.md中已经详细介绍了安装方法了,这里就简单说一下(GitHub页面上显示的就是README.md格式化后的内容)。

工具和依赖

直接从软件源安装(在服务器上安装时发现还需要fakeroot这个包,不过我下载的这个系统已经有了):

sudo apt-get install git build-essential autoconf libtool libssl-dev gawk debhelper dh-systemd init-system-helpers pkg-config

下载源码

直接从GitHub仓库克隆就行了:

git clone https://github.com/shadowsocks/shadowsocks-libev.git

编译成软件包

shadowsocks-libev的开发者非常贴心,根本不用做复杂的配置工作,直接进入源码目录后一条命令就编译打包成deb了:

cd shadowsocks-libev
dpkg-buildpackage -us -uc -i

安装

deb打包在源码的上级目录,出来安装就行了:

cd ..
sudo dpkg -i shadowsocks-libev*.deb

配置shadowsocks-libev

安装好后默认启用的是服务器端ss-server,我们需要的是作为代理的客户端ss-local和作为网关的ss-redir。所以还需要一些工作。

配置文件

装好后应该在/etc/shadowsocks-libev/下有个config.json的配置文件,我们不管它,我们来分别建立用于ss-localss-redir的配置文件,分别命名为local.jsonredir.json

cd /etc/shadowsocks-libev
sudo touch local.json redir.json

然后根据需要修改如下内容保存到两个文件里:

{
  "server": "1.2.3.4",
  "server_port": 8388,
  "local_adress": "0.0.0.0",
  "local_port": 1080,
  "password": "givemefive",
  "method": "rc4-md5"
}

修改说明:

  1. server:是服务器的IP地址,把1.2.3.4改成实际的值。
  2. server_port:是服务器监听的端口,把8388改成实际的值。
  3. local_address:这里可以不用改,0.0.0.0表示监听香橙派的所有IP,其他场合配置中没有这项是因为那些只需要监听本机的IP(也就是127.0.0.1),而我的香橙派的不是给它自己用的,是提供给局域网里的其他主机用的,所以要监听所有IP。redir.json中可以配置为127.0.0.1或者删除此项。
  4. local_port:这里是要监听的香橙派的端口,注意local.jsonredir.json要设置不同的端口以免冲突,我设置的分别是108023232
  5. password:服务器的密码。
  6. method:加密方法,根据需要修改。

配置服务

以下所有服务的配置都是基于systemd,只适用于Ubuntu 15.04以后版本(其他系统的支持情况请参见维基百科systemd)。

首先要停止默认的ss-server

sudo systemctl disable shadowsocks-libev

然后配置ss-local使用local.json

sudo systemctl enable shadowsocks-libev-local@local

同样地配置ss-redir

sudo systemctl enable shadowsocks-libev-redir@redir

@后面的字符就是配置文件的文件名.json前的部分。由此可见我们可以建立多个配置文件同时连接多个不同服务器,只要监听的本地端口不冲突就行了。这只有systemd才能做到,过去的System V就必须建立多个初始化脚本不同的才行。

当然别忘了启动服务:

sudo systemctl start shadowsocks-libev-local@local
sudo systemctl start shadowsocks-libev-redir@redir

设置转发

ss-local现在已经可以使用了,比如我监听的是1080的端口,我只要在Firefox中使用Autoproxy插件设置SOCKS5代理的为香橙派的IP和1080端口,然后订阅gfwlist就可以自动根据访问的网站使用或者不使用代理了。

但我的终极目标是给Xbox One用,所以还需要设置转发才行。这里就要用到Linux内置的iptables功能了(可能需要安装iptables软件包)。

感谢好心人,这里已经有了一份配置方法了。因为给Xbox One用不需要考虑过滤国内流量,所以直接参照最开始的部分配置就行了。

下面所有的命令都需要root权限,所以先切换为root:

sudo su

首先要新建一个链SHADOWSOCKS:

iptables -t nat -N SHADOWSOCKS

然后添加shadowsocks服务器的IP到不转发的规则里(将1.2.3.4修改为实际的值):

iptables -t nat -A SHADOWSOCKS -d 1.2.3.4 -j RETURN

然后添加为私有网络保留的IP地址段到不转发规则里:

iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN

转发到ss-redir监听的23232端口:

iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 23232
iptables -t nat -A SHADOWSOCKS -p udp -j REDIRECT --to-ports 23232

还要应用转发规则到PREROUTING链:

iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
iptables -t nat -A PREROUTING -p udp -j SHADOWSOCKS

因为iptables规则重启后会丢失,所以我们还要保存下来让他开机自动应用,不用麻烦,安装一个软件包就解决了:

sudo apt-get install iptables-persistent

安装过程中会询问是否保存当前规则,确定就行了。

规则保存在/etc/iptables/rule.v4(因为我们用的是IPv4的iptables)。如果以后修改了规则,需要手动保存,用下面的命令就行了。注意这条命令必须先切换到root(sudo su)之后才能运行,在命令前加sudo是不行的。

iptables-save > /etc/iptables/rule.v4

Xbox One以及其他设置

设置好了转发之后,我们只要在Xbox One或者其他需要转发的设备上修改网络设置就行了。先查看通过DHCP自动获取的网络参数,然后手动设置参数,保持其他参数不变,把网关修改成香橙派的IP就行了。

比如:

  • IP地址(IP address):192.168.11.36(不变)
  • 子网掩码(netmask):255.255.255.0(不变)
  • 网关(gateway):192.168.11.1(改成香橙派IP
  • 主要DNS(primary DNS):192.168.11.1(不变)
  • 次要DNS(secondary DNS):8.8.8.8(不变)

总结

由于shadowsocks的特性,连接是按需建立的,并不是VPNSSH tunnel那样需要持续保持连接的,所以可以让它一直运行而不用担心连接断开。

如果更进一步,还可以在香橙派上建立DNS服务和DHCP服务,代替无线路由器的功能,给不同的设备分配不同的网络参数(比如给电脑就分配路由器为网关,给Xbox One就分配香橙派为网关)。或者给香橙派插上无线网卡(2和Plus的话自带无线网卡),作为AP使用,让连上香橙派AP的使用转发,连上无线路由器的不转发(本来我是想这样搞的,无奈香橙派的内核不支持我的USB无线网卡)。玩法是多种多样的,就看你能不能想到了。

总之,妈妈再也不用担心我玩Xbox One无法下载更新了。

如何删除有特殊字符的文件或目录

最近在NAS上遇到了一个头痛的问题,由于NAS的Shell功能有限,SSH连过去之后虽然能显示中文,但是却无法输入,复制粘贴也不行。于是上网到处找,没想到中文搜索竟一无所获,最终找到了英文的,在这里搬运翻译一下。

虽说我的情况是删除中文文件,但其实这些情况适用于任何特殊字符(比如还有>(输出重定向)、*(通配符)、-(命令选项)、$(变量引用)、(空格,分隔参数和选项)等),也可以举一反三用在其他操作上。

把文件名放到引号中

这可以说是最基本的方法了,Shell中引号表示字符串,所以有些字符放到引号中就不具有本来在Shell命令中的功能了。单引号'或者双引号"都可以,但注意要配对。例如删除名为my file的文件:

rm "my file"

用反斜杠转义

用反斜杠\转义字符相信编写过程序的都不陌生,有的特殊字符是可以用反斜杠转义的,转义之后就失去在Shell命令中的功能了。实际上如果经常用Tab来自动完成命令的话就会发现,自动完成的就是用反斜杠来转义的。例如删除名为[my file]的文件:

rm \[my\ file\]

在文件名前加上./

./表示当前目录,有的字符如果出现在空格后面就有特殊含义(比如-表示命令选项),但加上./之后就不是了。比如删除名为-my-file的文件:

rm ./-my-file

在文件名前加上--

--表示结束命令选项,在其之后的字符都被视为参数。当然,--两边要加上空格,而且只对文件开头的是-的有效,其他特殊字符还是要用其他办法。比如删除名为-my-file的文件:

rm -- -my-file

用inode编号删除

上面的方法只能针对某些特殊字符,对于我在本文开头说到的情况无能为力,但是我们还有最终解决方案。关于什么是inode就不详细说了,反正这里只要知道在一个文件系统上每个文件或目录都有一个inode编号。这个编号可以通过ls-i选项来查看,为了看得清楚,我们再加上选项-1来让一项结果占一行。

li -i1

比如我这里有三个特殊文件名的文件file-file$file的结果如下:

63184461  file
63181495 -file
63184295 $file

文件名前面的数字就是inode编号了。

可是rm并不支持用inode来删除,怎么办呢,这里就要请出另一个命令了,这就是find。这是个查找文件的命令,它有个选项-inum可以指定inode编号,还有个选项-delete可以直接删除文件。

find . -inum 63181495 -delete

.表示在当前目录查找,-inum 63181495就是查找inode编号为63181495的文件,-delete就是将找到的文件删除。

-delete选项只能删除文件和空目录,要删除有文件的目录怎么办呢,这个时候就要另一个选项出场了——-exec,表示将查找到的文件放到其后的命令中。在命令中{}会用查找到的文件代替。

find . -inum 63181495 -exec rm -ri {} \;

rm的选项-r表示递归删除目录和里面的内容,-i表示删除每一个项之前都弹出提示询问以免误删。

于是,目录被我快乐地删除掉了。

Ubuntu Server 14.04 LTS上编译安装PHP7

由于是在服务器上安装,所以都是命令行,下面就列出命令不给出结果了,如果出现错误请自行查找原因。

本文是在Ubuntu Server 14.04 LTS上编译的,因为15.04之后Ubuntu换用了systemd来管理服务,所以本文的内容并不适用。

本文章编译的是FPMNginxApache2都可以使用,如果要编译Apache2的模块,请不要参考本文。

由于PHP7废弃了很多功能,所以一些依赖这些功能的程序可能无法运行,尝鲜前请三思。比如很多国产软件都在依赖的mysql相关函数,如果自己开发php应用请用mysqli代替。不过WordPress是没有问题的,尽情使用吧。

read more…

在WordPress中使用Markdown

Markdown是一种非常好的格式化纯文本文件的方式,具有很好的可读性,也可以方便地转换为HTML。GitHub的README等地方都是使用Markdown语法的,简洁高效。

可以说,学会了Markdown之后,你就不会想去编辑麻烦的HTML了。要想学习Markdown,可以参考这里:Markdown语法说明

当然,Markdown并不能完全代替HTML,但是没关系,Markdown是完全兼容HTML的,你可以在其中任意插入HTML标签,实现Markdown之外的功能。

这么好用的东西,WordPress居然不支持(其实WordPress.com是支持的,但是WordPress程序本身却没有),那我们只有自食其力了。

插件里搜Markdown,能搜到不少工具,各有各的特点,但试用了几个之后,我最终决定使用JP Markdown。第一,它没有明显的Bug,对语法支持比较完善。第二,它没有多余的东西,编辑完全是在WP自带的编辑器里进行。而且Markdown只是在编辑器中使用,保存进数据的文章还是HTML的,所以即使以后停用了插件也不会有任何影响。

当然,可视化编辑器会干扰Markdown的使用(在可视化和代码之间切换会丢失格式),所以我们最好关掉,WP自带了选项,隐藏得有点深,在后台的用户我的个人资料里有个撰写文章时不使用可视化编辑器的选项,勾上就可以了。

最后还有一点,纯文本编辑使用非等宽字体实在太难看了,这里我们需要另一个插件,Admin Font Editor,安装之后会在后台的设置下面多出同名的选项页面,进去之后设置Font Size(字号,我设置的是14)和Font Family(字体,选择Select font from list or type a font name below之后在下面的输入框中输入Inconsolata, monospaceInconsolata是一个不错的等宽字体,需要在电脑上自行安装),然后Save Changes就行了。

PS:安装了插件之后,评论中也支持Markdown语法了。

禁用Firefox附加组件签名验证

曾经,我们禁用过附加组件的兼容性检查,然而Mozilla并不想让我们好过,于是现在又搞了签名。

然而我使用的开发版的插件,并没有经过签名。要等插件作者去弄签名,那估计得好一段时间没法用了。

于是,我们依旧要禁用这个签名检查。

还是老样子,在地址栏中输入about:config,然后搜索找到xpinstall.signatures.required,双击一下把值改为false

当然,签名是为了保证不会有恶意插件被安装,如果你无法保证插件来源的安全,还是老老实实地开着验证吧。