使用dd命令制作启动盘

双十二期间因为有十几块钱的代金券用不出去剁手了一个树莓派2代为了二两醋买一斤螃蟹。货到了以后就要往micro SD卡里装一个系统。之前用Windows的时候一直用软碟通往U盘之类的介质中写入镜像文件,换了rMBP之后还没干过这类事,所以一时摸不着头脑。后来发现有dd这样一个命令可以用来制作启动盘。

在Unix上,硬件的设备驱动器和特殊设备文件就像普通文件一样,出现在文件系统中;只要在各自的驱动程序中实现了对应的功能,dd也可以读取或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在ASCII与EBCDIC编码间互换。

查询驱动器名

插入U盘或读卡器后首先需要知道其在当前系统下的驱动器名,可以使用diskutil list命令:

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.8 GB   disk1
                             Logical Volume on disk0s2
                             6507AD0A-D7FF-4641-AC5C-012CCD75AA23
                             Unlocked Encrypted
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *4.0 GB     disk2
   1:                 DOS_FAT_32 UNTITLED                4.0 GB     disk2s1

可以看到disk0当然是电脑的内置物理磁盘,disk1是内置虚拟磁盘,disk2才是要写入的U盘。然后卸载刚才插入的驱动器:

diskutil unmountDisk /dev/disk2

出现以下内容说明卸载成功:

Unmount of all volumes on disk2 was successful

写入镜像文件

使用命令:

sudo dd if=disk_image_file of=/dev/rdisk2 bs=1m

注意使用sudo,中间of参数中的盘符中记得改成rdisk(据我测试这里如果没加r写入过程会非常缓慢)。还有bs参数代表的是块大小学过体系结构的都知道,单位可以使用b、k、m、g等,默认是512字节,但不知道在这里不同大小会影响什么。

写入成功后会返回一个报告:

501+1 records in
501+1 records out
526260224 bytes transferred in 82.961110 secs (6343457 bytes/sec)

这里看到写入到一个2.0的U盘速度大概6兆/秒,如果上面of中没加r的话速度则不到1兆/秒:

526260224 bytes transferred in 552.306611 secs (952841 bytes/sec)

到这里写入完成,使用diskutil eject /dev/disk2弹出驱动器即可,出现:

Disk /dev/disk2 ejected

说明弹出成功,全部完成。

Read More +

OpenWrt路由器的IPv6代理

之前本来是想用路由器获取IPv6地址并使用双栈连接的代理服务器访问互联网。虽然之前网件自己的固件是有穿透模式并可以获取v6地址,但是无法安装ShadowSocks,所以才刷成了OpenWrt。但是这个固件默认是没有穿透模式的,所以需要自己配一发。

现在我们需要用到以下软件:

  • shadowsocks-libev-spec
  • luci-app-shadowsocks-spec
  • 6relayd

安装ShadowSocks

在OpenWrt上我们可以安装shdowsocks-libev版本,顺便搭配LuCI界面的luci-app使用,这个项目在sourceforge有发布,可以从这里下载最新的。下载完成后使用opkg命令安装:

opkg install shadowsocks-libev-spec_2.4.6-1_ar71xx.ipk
opkg install luci-app-shadowsocks-spec_1.4.0-1_all.ipk

安装完成后reboot命令重启路由器,再次进入LuCI界面可以看到多了一个Services-ShadowSocks

ShadowSocks

就说明安装正确,在里面输入ShadowSocks服务器信息就可以自动代理了,凡是连上这台路由器的设备获取到的都是代理后的网络了。

安装6relayd

由于现在即使通过代理上网也是消耗校内流量的,为了不走流量,我们只能借助IPv6网络。但是普通的路由器很少可以正常获取IPv6地址,即使路由器能获取到连接设备也很难获取,除了NETGEAR的部分路由器(包括WNR2200)的新版固件是有IPv6连接的,并且本人亲测使用穿透模式可以正常使用IPv6网络。所以我希望在OpenWrt上也能使用穿透模式,再通过ShadowSocks代理IPv6网络就可以免流量访问外网了。

要使用穿透模式就少不了6relayd这个软件。可是官方源如今没提供这个包,于是可以获取我的备份并安装:

wget https://www.shintaku.cc/files/6relayd_2013-10-21_ar71xx.ipk
opkg install 6relayd_2013-10-21_ar71xx.ipk

安装完成之后编辑/etc/config/6relayd文件在默认配置后面加一组:

1
2
3
4
5
6
config relay
option master 'wan'
option network 'lan'
option rd 'relay'
option dhcpv6 'relay'
option ndp 'relay'

保存后使用下面的命令开启服务并设置为开机启动即可:

/etc/init.d/6relayd start
/etc/init.d/6relayd enable

配置路由器

现在要到LuCI界面下找到Network-Interfaces并添加一个新的接口:

Add new interface

接口名叫wan6,协议选择DHCPv6 client,接口自定义为@wan

wan6

保存应用后重启路由器,就会发现多了一个WAN6接口,并且WAN口获取到IPv6地址了:

IPv6地址

这时回到ShadowSocks的配置界面,将服务器地址改为VPS的IPv6地址就可以了:

ShadowSocks设置

记得要开全局代理,因为毕竟PPPoE拨着号呢,在校园网11月30日改革后有线网拨号后不用登录就能上网让我很慌啊,路由器一直连着网终归是有偷跑流量的风险,所以打开IPv6全局代理最为保险,使得能通过代理的IPv6网络可以使用而IPv4网络因为通不过代理无法使用。2016年春季学期开学后发现即使拨号路由器也无法获取IPv6地址了。

于是现在得到的效果就是任何连接到这台路由器的设备无需任何登录即可访问外网,而且不消耗校内网流量,网络还自带科学上网Buff,从此妈妈再也不用担心我流量不够用了。

Read More +

路由器刷入OpenWrt固件

暑假剁手了一台rMBP但没有以太网接口,为了省钱就需要一个无线路由器,之前曾了解到路由器可以刷OpenWrt后装上ShadowSocks实现自动科学上网,于是就在集训的时候从马云家买了一个二手的TP-Link TL-WR703N刷上OpenWrt在机房给笔记本供网。

TL-WR703N

由于这货只有一个网口,当路由器自动获取IP地址后,就进不去192.168.1.1的管理界面了,虽然能上网,但每次换网线接头的时候都要捅菊花抹掉原来的设置。因此只有使用静态IP时才能正常使用这种路由器。这学期开学后发现家里有一个Netgear WNR2200在吃灰,于是就把它拿到学校刷上了OpenWrt放宿舍给各种无线设备供网。

WNR2200

刷入固件

OpenWrt是一个适合于嵌入式设备的Linux发行版。它提供了一个可添加软件包的可写的文件系统,使用者可以自由的选择应用程序和配置,并且可以使用一些适合某方面的应用的软件包来定制设备。

准备工作

路由器

首先你要拥有一台可以刷入OpenWrt的路由器,至于OpenWrt支持那些设备,请到Supported Devices页面查看。本文以WNR2200为例。

固件

前往Download下载最新的对应设备的固件。注意固件列表里一半会有两种后缀:squashfs-factory.imgsquashfs-sysupgrade.img,如果是从原厂固件刷到OpenWrt请用前者,如果是从OpenWrt升级请用后者。还有一种可能文件名以NA结尾,可能是代表North America,基本上与不带NA的没什么区别。

环境

还需要一台有以太网接口的电脑和一根网线,电脑操作系统不限,但是Windows需要提前开启TFTP(因为这个功能系统默认是关闭的),具体操作就是进入控制面板-程序-程序和功能

开启TFTP

打开打开或关闭Windows功能窗口,在里面把TFTP挑上钩,之后就可以开始了。

刷入固件

刷机有风险,操作需谨慎!
刷机有风险,操作需谨慎!
刷机有风险,操作需谨慎!
重要的事说三遍

首先要将路由器与电脑用网线相连(在后面的设置中网线是必要的),然后进入到路由器管理界面。

有的原厂固件是可以直接升级成OpenWrt的,因此首先进入路由器管理界面,找到固件升级的选项,选择下好的OpenWrt固件上传就可以了,我之前刷TL-WR703N时是可以直接上传的,上传完成重启后就算是刷完了。但我后来刷WNR2200时遇到了不认固件的情况(可能是因为原厂固件的版本问题),于是只好用TFTP的方式上传固件,这就是之前为什么要打开Windows中TFTP功能的原因。

如果从原厂管理界面中直接上传固件成功,请直接进入下一节;若不认固件,请执行以下步骤:

  • 关闭路由器电源,用笔尖捅住“Restore Factory Settings”菊花键不放。

  • 打开路由器电源,这时电源黄灯开始闪烁,这时依然不要松开RESET键,直到电源灯变为绿色长亮(或闪烁?)才可松手(可能有的路由器的表现不一样,达到类似效果即可),这时路由器已经进入了tftp模式。

  • 将电脑的IP设为192.168.1.2,子网掩码设为255.255.255.0,将电脑与路由器的1号LAN口用网线相连。

  • 从终端进入到要刷的固件所在目录中,假设固件名叫openwrt.img,如果在Windows下则使用命令:

      tftp -i 192.168.1.1 PUT "openwrt.img"
    

    如果在OS XLinux下则在终端里键入tftp,之后使用以下命令:

      connect 192.168.1.1
      binary
      rexmt 1
      timeout 60
      put "openwrt.img"
    

    稍等片刻,路由器的灯会出现各种变化,直到电源灯又恢复长绿状态(不同路由器或许不同),说明上传完成了。

  • 重启路由器,不出意外之后应该可以通过网页访问192.168.1.1LuCI管理界面了。

开启无线

较新的OpenWrt应该已经自带LuCI图形化界面了,因此直接浏览器打开192.168.1.1就可以看到类似如下界面:

LuCI

当然咯,第一次登入肯定是要先设密码的,毕竟也算是一个Linux系统:

更改密码

OpenWrt默认是关闭无线网络的,所以到Network-Wifi下面启用即可:

启用Wifi

之后设置SSID和密码就可以通过无线方式连接了。

基本设置

既然要装上软件,自然要从互联网获取,那么路由器当然要联网咯。先到Network-Interfaces设置WAN口的上网方式,这点和普通路由器没有什么差别,这里不再赘述。

如果觉得英文LuCI使用不便,也可以到System-Software下找到一个叫luci-i18n-base-zh-cn的包装上就行了,当然首先要Update lists一下,之后到System-System下切换成普通话再刷新一下就变成中文界面了。

设置中文

当然,以后要装的部分软件也可以通过上面这种方式安装,但由于有的包官方源里没有,我们在下面使用一种更通用的方法——从命令行安装。

OpenWrt归根结底还是一个Linux发行版,所以Linux命令在这里依然适用。

我们还是通过SSH登录:

ssh [email protected]

输入之前设置的密码后,就会看到OpenWrt特有的终端界面:

BusyBox v1.23.2 (2015-07-25 15:09:46 CEST) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 CHAOS CALMER (15.05, r46767)
 -----------------------------------------------------
  * 1 1/2 oz Gin            Shake with a glassful
  * 1/4 oz Triple Sec       of broken ice and pour
  * 3/4 oz Lime Juice       unstrained into a goblet.
  * 1 1/2 oz Orange Juice
  * 1 tsp. Grenadine Syrup
 -----------------------------------------------------
root@OpenWrt:~# 

先更新一下软件源(和LuCI中的软件包刷新列表是一样的):

opkg update
opkg list-installed
opkg list

然后就可以按照自己的需求安装要用的软件了。

Read More +

使用aria2多线程下载

aria2是一款轻量级多线程的命令行下载工具,支持HTTP/HTTPSFTPSFTPBitTorrentMetalink等多种下载方式。程序支持Mac OS X、Linux、Windows等多平台。

这个下载器最大的优点就是多线程。最开始接触它的时候是因为在Mac下下载百度云的资源非常不方便,不借助其他工具只能通过浏览器下载,而且一个线程速度超慢,一不小心就会下载失败。后来从知乎上看到这个神器,用了金坷垃速度一千八

下载安装

首先到GitHub下载对应系统的安装文件进行安装;如果在macOS下也可以通过homebrew安装:

brew install aria2

配置文件

先新建一个配置文件叫aria2.conf

mkdir ~/.aria2
vi ~/.aria2/aria2.conf

放在这个目录下的主要原因是可以在启动时不再指定其配置文件的位置。然后编辑它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Basic Options
dir=/Users/$USER/Downloads
input-file=/Users/$USER/.aria2/session.dat
log=/Users/$USER/.aria2/aria2.log
max-concurrent-downloads=15
max-connection-per-server=15
check-integrity=true
continue=true

# BitTorrent/Metalink Options
bt-enable-lpd=true
bt-max-open-files=16
bt-max-peers=8
dht-file-path=/opt/var/aria2/dht.dat
dht-file-path6=/opt/var/aria2/dht6.dat
dht-listen-port=6801
#enable-dht6=true
listen-port=6801
max-overall-upload-limit=0K
seed-ratio=0

# RPC Options
enable-rpc=true
rpc-allow-origin-all=true
rpc-listen-all=true
rpc-listen-port=6800
#rpc-secret=123456
#rpc-secure=true

# Advanced Options
daemon=true
disable-ipv6=true
#enable-mmap=true
force-save=true
file-allocation=none
log-level=warn
max-overall-download-limit=0K
save-session=/Users/$USER/.aria2/session.dat
always-resume=true
split=10
min-split-size=10M

# Pan.baidu.com
user-agent=netdisk;5.2.6;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJia
referer=http://pan.baidu.com/disk/home

配置文件中所有$USER要改成自己的用户名,dir参数设置的是下载路径,也可以按自己的习惯更改;input-filesave-session参数是指定session(保存下载进度)的存储位置,如果没有那个文件可以手动创建:

touch session.dat

log参数指定log路径,会自动生成。这时可以通过aria2c命令启动服务了。可以通过ps aux | grep aria2c命令检查是否启动成功。如果没有正常启动可以检查一下log。

开机启动

若要配置macOS开机启动,可以在~/Library/LaunchAgents下创建一个plist文件homebrew.mxcl.aria2.plist,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>homebrew.mxcl.aria2</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>Program</key>
<string>/usr/local/opt/aria2/bin/aria2c</string>
</dict>
</plist>

配置GUI

由于aria2是一个命令行工具,所以在没有其他辅助的情况下需要通过命令行来操作。具体使用方法请参阅aria2.github.io

为了更加便于使用,GitHub上的ziahamza开发了一个WebUI,可以通过网页界面来操作aria2:

WebUI

简单来说就是打开http://ziahamza.github.io/webui-aria2/就能使用了。也可以将项目源码下载下来放到本地或者放到自己的服务器上来用,比如http://aria.shintaku.cc/

打开以后如果右上角出现:

连接成功

就说明连接成功了,这时就可以直接输入下载链接下载了。

如果连接不成功请到Setting-Connection Setting检查端口是不是6800,并且确保6800端口没被别的服务占用:

连接设置

百度网盘插件

百度网盘如果使用普通下载的话可能得到的是一个临时的链接?不能断点续传,所以需要一个叫BaiduExporter的Chrome插件像百度云的客户端一样获取地址。如果Chrome商店被墙了也可以到GitHub上直接下载crx文件手动添加。

添加成功后再打开百度云会发现多了一个导出下载按钮:

导出下载

打开设置,按照如下设置:

导出设置

其中User-agent需要设置为netdisk;5.2.7;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJiareferer设置为http://pan.baidu.com/disk/home,将aria2伪装成百度云管家来解除限速。

应用后选择百度云上的文件,通过导出下载-ARIA2 RPC

下载成功

这时再通过WebUI查看应当已经有新添加的任务以一千八的速度在下载了。

Read More +

VPS搭建ShadowSocks服务

由于校园网的资费坑得一逼,况且有流量限制,这种感觉甚是让人不爽。之前曾看到郑老湿和陈老湿在VPS搭上VPN免流量上网,后来又在开源课上受到杜老师的启发,决定通过ShadowSocks代理后的IPv6教育网实现免流量上网

ShadowSocks是一个安全的socks5代理,它通过客户端以指定的密码、加密方式和端口连接服务器,成功连接到服务器后,客户端在用户的电脑上构建一个本地socks5代理。使用时将流量分到本地socks5代理,客户端将自动加密并转发流量到服务器,服务器以同样的加密方式将流量回传给客户端,以此实现代理上网。

服务器端

搭建服务

SSH登录到VPS服务器后要使用pip安装ShadowSocks,所以先装pip

如果服务器是基于Red Hat的系统(CentOS等等),使用命令:

yum install python-setuptools && easy_install pip

如果是基于Debian的系统(Ubuntu等等),使用命令:

apt-get install python-pip

之后通过pip安装ShadowSocks:

pip install shadowsocks

安装完成后,在/etc/下新建一个叫shadowsocks.json的配置文件,内容如下:

1
2
3
4
5
6
7
8
9
{
"server" : "::",
"server_port" : 8388,
"local_address" : "127.0.0.1",
"local_port" : 1080,
"password" : "PASSWORD",
"timeout" : 300,
"method" : "rc4-md5"
}

其中"server"一栏之所以填"::"是为了同时监听IPv4/v6两个端口,因为本文的需求中我们需要双栈连接,如果VPS没有IPv6功能或仅是为了搭梯子用,这里面填写一个IPv4的地址就可以了。"password"栏填写自己要设置的密码。至于"method"加密方式一栏,主流的有rc4-md5aes-256-cfb等等,据说前者速度快,后者更安全,可以根据个人喜好自行权衡。

如果有多个用户需要使用而不想都使用一套端口和密码,可以如下写成多端口配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"server" : "::",
"local_address" : "127.0.0.1",
"local_port" : 1080,
"port_password":
{
"8388":"PASSWORD0",
"8389":"PASSWORD1",
"8340":"PASSWORD2"
},
"timeout" : 300,
"method" : "rc4-md5"
}

启动服务

保存配置文件后就可以通过以下命令启动和停止ShadowSocks服务了:

ssserver -c /etc/shadowsocks.json --fast-open -d start
ssserver -d stop

如果发现开启服务后连接不上,可以停用防火墙试一下。

要是觉得以上命令太长难于记忆,可以在~/.bashrc里加入alias:

1
2
alias ssstart='ssserver -c /etc/shadowsocks.json --fast-open -d start'
alias ssstop='ssserver -d stop'

保存后记得使用source ~/.bashrc命令应用配置,这样就可以每次通过ssstartssstop命令启动或停止服务了。

在CentOS7以后可以用systemd的方式启动Shadowsocks,先新建启动脚本/etc/systemd/system/shadowsocks.service

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Shadowsocks

[Service]
TimeoutStartSec=0
ExecStart=/usr/bin/ssserver -c /etc/shadowsocks.json
ExecStop=/usr/bin/ssserver -d stop

[Install]
WantedBy=multi-user.target

然后就可以通过systemctl start shadowsocks启动了,并通过systemctl enable shadowsocks设置开机自启。

性能优化

现在我们要祭出TCP加速神器——锐速了。

锐速是一款免费的TCP底层加速软件,可以便捷地完成服务器网络的优化,配合ShadowSocks效果甚好。

首先要去锐速官网注册。然后在服务器上通过以下命令下载安装:

wget http://my.serverspeeder.com/d/ls/serverSpeederInstaller.tar.gz
tar xzvf serverSpeederInstaller.tar.gz
bash serverSpeederInstaller.sh

安装过程中需要填写刚注册的账号密码等,一路回车安装结束。

之后还要编辑配置文件/serverspeeder/etc/config,修改以下参数:

1
2
3
4
advinacc="1"
maxmode="1"
rsc="1"
gso="1"

保存后重启服务就可以了:

service serverSpeeder restart

目前锐速不再开放使用,想用的同学可以到91云寻找新大陆。

本地客户端

首先确定你可以获取到IPv6地址,最简便的方法就是打开六维空间测试一下,如果可以打开就说明没问题。

Windows

Shadowsocks for Windows

macOS

ShadowsocksX

Linux

Shadowsocks-Qt5

也可以按照类似服务端的命令行方式进行启动,将ssserver改成sslocal即可。

Android

Shadowsocks for Android

如果能上Google Play也可以从应用商店直接安装。

OpenWrt

shadowsocks-libev

各种平台上的服务器配置按照之前服务器端的设置填写即可,但是server地址记得填写IPv6的,然后设成全局代理。

这时Google一下自己的IP,如果地址确实是VPS的地址,就可以开始愉快的上网了。

Read More +

Digital Ocean开通VPS

目前使用体验较好的VPS服务商大概有LinodeConoHaDigital OceanVultr等等,由于GitHub的Student Developer Pack有DO家的50美刀优惠,但到了三个月后才申请下来,由于注册时已经输过优惠码所以就坑了,于是本文使用的是DO的服务。

注册DO帐号

通过邀请地址注册的新账户将获得10美刀的优惠。

按照步骤填完个人信息后,需要绑定支付方式并往新账户里充5美元来激活DO账户。个人建议先绑定PayPal账户,至于PayPal如果没有信用卡的话,绑定储蓄卡也是可以的,个人亲测学校办的交行卡可用。

激活账户后,如果你有GitHub教育优惠就使用它给的优惠码,如果没有可以搜一个最近的10美元或20美元优惠码,注意这样的优惠码只能输一次

输入优惠码

账户余额基本就有15美元了,这足够使用最便宜的套餐3个月了。

新建服务器

首先要给服务器取一个Hostname,按个人喜好随意命名。

然后选择套餐,我选择的是最便宜的$5套餐,包含512M的内存、20G的SSD和1000G流量每个月。

选择配置

数据中心任意选择,考虑到国际光缆的走向,建议选择位于美国西海岸或者亚太地区的,我选择的是旧金山机房。

选择镜像的时候选一个自己熟悉的系统就可以了,也可以选择带一键安装应用的,按需选择即可。

选择配置

附加选项里记得选上IPv6,因为在本文的需求中这是必不可少的。

SSH公钥可以现在添加,也可以以后再添加。之后点创建就可以等着创建完成了。DO宣传最少只用55秒就可以创建完成,但是我好像用了几分钟的样子?

创建成功后,就会进入到这个VPS的管理界面,从设置中可以看到你的公网地址。同时DO会发送首次登录的密码到你的邮箱中,请注意查收。姑且将这台服务器的地址记作IP,然后就可以在DO提供的网页版控制台或本地终端SSH登录了:

ssh root@remote_host

成功登录后,首先要求更改root密码。如果希望以后本机登录不再输入密码,可以将本地的公钥上传到服务器端:

cat ~/.ssh/id_rsa.pub | ssh root@remote_host 'cat >> .ssh/authorized_keys'

如果本地~/.ssh目录下没有id_rsa这样的文件,可以使用ssh-keygen命令在该目录下生成。这样以后每次ssh连接时就不用再输密码了,然后就可以随意折腾了。

Read More +

Qt5.5程序的打包与发布

因为要做C++软件实习的大作业,所以选择了易于上手的Qt作为图形化界面程序开发框架,IDE自然就是Qt Creator了。但是Qt程序的打包发布却是不接地气,因为依赖实在是太多了。有的时候加好依赖后在自己的开发环境上可以运行,但脱离开发环境却依旧报

This application failed to start because it could not find or load the Qt platform plugin “windows”.

无法加载qwindows

甚至

Runtime
于是现在亟待解决的问题就是如何能够找到所有所需依赖并能够将其打包引用。

查找依赖工具

通过阅读官方文档发现,Qt里面内置了一个dll依赖性检查工具——windeploy.exe。这个程序应当在~/Qt/Qt5.5.0/5.5/mingw492_32/bin/下,通过命令提示符执行它可以得到使用方法:

C:\Users\Shintaku>C:\Qt\Qt5.5.0\5.5\mingw492_32\bin\windeployqt.exe
Please specify the binary or folder.

Usage: C:\Qt\Qt5.5.0\5.5\mingw492_32\bin\windeployqt.exe [options] [files]
Qt Deploy Tool 5.5.0

The simplest way to use windeployqt is to add the bin directory of your Qt installation 
(e.g. <QT_DIR\bin>) to the PATH variable and then run:
  windeployqt <path-to-app-binary>
If ICU, ANGLE, etc. are not in the bin directory, they need to be in the PATH variable. 
If your application uses Qt Quick, run:
  windeployqt --qmldir <path-to-app-qml-files> <path-to-app-binary>

Options:
  -?, -h, --help             Displays this help.
  -v, --version              Displays version information.
  --dir <directory>          Use directory instead of binary directory.
  --libdir <path>            Copy libraries to path.
  --debug                    Assume debug binaries.
  --release                  Assume release binaries.
  --release-with-debug-info  Assume release binaries with debug information.
  --force                    Force updating files.
  --dry-run                  Simulation mode. Behave normally, but do not
                             copy/update any files.
  --no-plugins               Skip plugin deployment.
  --no-libraries             Skip library deployment.
  --qmldir <directory>       Scan for QML-imports starting from directory.
  --no-quick-import          Skip deployment of Qt Quick imports.
  --no-translations          Skip deployment of translations.
  --no-system-d3d-compiler   Skip deployment of the system D3D compiler.
  --compiler-runtime         Deploy compiler runtime (Desktop only).
  --no-compiler-runtime      Do not deploy compiler runtime (Desktop only).
  --webkit2                  Deployment of WebKit2 (web process).
  --no-webkit2               Skip deployment of WebKit2.
  --json                     Print to stdout in JSON format.
  --angle                    Force deployment of ANGLE.
  --no-angle                 Disable deployment of ANGLE.
  --list <option>            Print only the names of the files copied.
                             Available options:
                              source:   absolute path of the source files
                              target:   absolute path of the target files
                              relative: paths of the target files, relative
                                        to the target directory
                              mapping:  outputs the source and the relative
                                        target, suitable for use within an
                                        Appx mapping file
  --verbose <level>          Verbose level.

Qt libraries can be added by passing their name (-xml) or removed 
by passing the name prepended by --no- (--no-xml). Available libraries:
bluetooth clucene concurrent core declarative designer designercomponents
enginio gui qthelp multimedia multimediawidgets multimediaquick network nfc
opengl positioning printsupport qml qmltooling quick quickparticles quickwidgets

script scripttools sensors serialport sql svg test webkit webkitwidgets
websockets widgets winextras xml xmlpatterns webenginecore webengine
webenginewidgets 3dcore 3drenderer 3dquick 3dquickrenderer 3dinput geoservices

Arguments:
  [files]                    Binaries or directory containing the binary.

发现当windeploy有一个参数为二进制文件时,会在其所在目录下生成该文件所依赖的所有文件。

提取依赖文件

于是我们可以在任意目录下新建一个文件夹,然后将Qt编译生成的可执行文件复制到新文件夹下。
接下来在命令提示符里执行windeploy yourProgram.exe便可以将其所需依赖加入到新文件夹中了。

> C:\Qt\Qt5.5.0\5.5\mingw492_32\bin\windeployqt.exe Library.exe
Library.exe 32 bit, release executable
Adding Qt5Svg for qsvgicon.dll
Direct dependencies: Qt5Core Qt5Gui Qt5Sql Qt5Widgets
All dependencies   : Qt5Core Qt5Gui Qt5Sql Qt5Widgets
To be deployed     : Qt5Core Qt5Gui Qt5Sql Qt5Svg Qt5Widgets
Updating Qt5Core.dll.
Updating Qt5Gui.dll.
Updating Qt5Sql.dll.
Updating Qt5Svg.dll.
Updating Qt5Widgets.dll.
Updating libGLESV2.dll.
Updating libEGL.dll.
Updating D3Dcompiler_47.dll.
Creating directory iconengines.
Updating qsvgicon.dll.
Creating directory imageformats.
Updating qdds.dll.
Updating qgif.dll.
Updating qicns.dll.
Updating qico.dll.
Updating qjp2.dll.
Updating qjpeg.dll.
Updating qmng.dll.
Updating qsvg.dll.
Updating qtga.dll.
Updating qtiff.dll.
Updating qwbmp.dll.
Updating qwebp.dll.
Creating directory platforms.
Updating qwindows.dll.
Creating directory sqldrivers.
Updating qsqlite.dll.
Updating qsqlmysql.dll.
Updating qsqlodbc.dll.
Updating qsqlpsql.dll.
Creating C:\Users\Shintaku\Desktop\release\translations...
Creating qt_ca.qm...
Creating qt_cs.qm...
Creating qt_de.qm...
Creating qt_fi.qm...
Creating qt_fr.qm...
Creating qt_hu.qm...
Creating qt_it.qm...
Creating qt_ja.qm...
Creating qt_ko.qm...
Creating qt_lv.qm...
Creating qt_ru.qm...
Creating qt_sk.qm...
Creating qt_uk.qm...

强烈建议在此文件夹下运行一下程序试试,因为这个工具并不一定能将所有必需的依赖加进来,这时运行极有可能还会报
系统错误
如果这样,请移步~/Qt/Qt5.5.0/5.5/mingw492_32/bin下找到缺少的.dll文件将它们移到新文件夹下。经过这步检查,在开发环境下应该可以正常运行可执行文件了。

修改引用路径

这时请把这个文件夹拷贝到其他运行环境上测试程序是否能成功运行:如果可以成功运行,那么请跳过这一步;如果不能成功运行,而且依旧报

This application failed to start because it could not find or load the Qt platform plugin “windows”.

则说明程序没有成功引用到动态链接库,这时应当修改源代码。
找到工程中的main.cpp文件,在主函数开头中加入一句

1
QApplication::addLibraryPath(".");

重新编译并替换新文件夹中的.exe文件,再放到其他运行环境上就应该可以成功引用到链接库了。

打包程序发布

这时我们就可以打包程序了。我使用的是一款叫做Enigma Virtual Box的封装工具,这个软件的名字和当年图灵破译的英格玛机一样。
软件装好后运行,从主界面选择输入目标文件和输出文件的路径,然后在下面Files里添加所有需要的链接库
添加文件
然后有一个Files Options里可选是否压缩文件,压缩后会比较小,然后点Process就行了
压缩文件
不久后会在选择的输出路径中生成最终打包好的程序,大功告成。

Read More +

GoAgent科学上网攻略

目前该项目已停止维护,并被开发者删除。有兴趣的童鞋请参考我fork下来的3.2.3版本

翻出长城,我有思想准备。是要触及一些人的利益,是会触及一些人的利益,是会有不同的观点和看法的,而且,已经形成防火长城的这些机构社会联系蛮广泛的,是有舆论能力的。我们敢于翻墙,也就是说呀,像古人讲的,“敢同恶鬼争高下,不向霸王让寸分”,就是要有这种精神。在此呢,你比如说,也有不少人给Google泼脏水,包括给Twitter、给Facebook泼脏水。甚至,说到一〇四师从广场上路过,怎么开59式坦克,一派胡言!我感到非常气愤,啊,一派胡言。

嗯,方滨兴,啊,本来是,这个工程院,这个很早以前就认可的院士,在北邮期间,当时当校长就当得很成功。清华著名教授唐泽圣,啊,那是他的老师,啊,对他非常欣赏。结果,有的这些头衔,就是怕说,担心会不会有人给人家造谣,说他通过当校长还想出点名,把他的几个职位一朝就全辞掉了,啊那是前年的事儿了,就全不干了。现在就几乎啊,嗯,在工程院,就是与病魔做一做斗争,啊,我对他做出的这种牺牲我都很感动的,啊。

具体GoAgent怎么用呢,请参照以下步骤:

创建GAE应用

登录GAE

GoAgent是使用跨平台语言Python开发、基于GPL自由软件协议的代理软件。它利用Google App Engine (GAE)的服务器充当代理。因此要使用GoAgent就需要一个Google帐户,前往GAE登录(有Google账号或者关联Google的账号直接登录即可,比如我的Google帐号就是hotmail的邮箱,深藏功与名)。

其实这一步就是需要翻墙的,有些人到这一步就因为无法翻墙登陆不了GAE,从而无法使用GoAgent,陷入了死循环。

创建应用

成功登录后就可以点击上图中的Create Application创建新应用。每个账户可以创建至多25个应用(现在网上说10个的都是几年前的版本了)。

首次创建还要验证一下手机号,格式为+86XXXXXXXXXXX,不久会收到一条验证短信,把验证码填进去就可以激活GAE账号了。

接下来就可以创建应用了,填入二级域名的Appid和应用名称。Appid要求为6~30个字符,可以包含小写字母、数字和-,必须以字母开头,不得以-结尾。[your_appid].appspot.com就是你的应用地址了。Appid一定要牢牢记住。

创建新应用

每一个应用提供1GB的流量,月流量是60GB(传出带宽是1GB/天,传入带宽1GB/天),虽然有如此的限制,但只是上网页用起来毫无压力,从来没有用超过呢。如果觉得一个应用的每天1G不够用,可以多创建几个。

本地配置

下载GoAgent客户端

GoAgent的项目主页已经从Google Code转移到GitHub了,但是GitHub上的项目也被移除了,所以还想尝试的童鞋请到我fork的分支上下载GoAgent 3.2.3

GitHub上的GoAgent项目

可以把这个项目clone到本地:

git clone https://github.com/liangzhenduo0608/goagent

或者Download ZIP并解压出来。

上传Python服务

进到server目录下,Windows用户以管理员身份运行uploader.bat,Mac/Linux用户用Python运行uploader.py,按照提示依次填入Appid、Email地址和口令(如果app创建时开启了两步验证,口令需要填入两步验证设置的密码,但现在创建的app基本上都跳过设置两步验证了,所以填邮Google帐户密码就行了)。上传成功会出现如下界面:

警告:建议先启动 goagent 客户端或者 VPN 然后再上传,如果您的 VPN 已经打开的话,请按回车键继续。

===============================================================
 GoAgent服务端部署程序, 开始上传 gae 应用文件夹
 Linux/Mac 用户, 请使用 python uploader.py 来上传应用
===============================================================

请输入您的appid, 多个appid请用|号隔开
注意:appid 请勿包含 ios/android/mobile 等字样,否则可能被某些网站识别成移动设备。
APPID: your_appid
Application: your_appid
Host: appengine.google.com
Rolling back the update.
Email: your_google_account
Password for your_google_account: 
Application: your_appid; version: 1
Host: appengine.google.com

Starting update of app: your_appid, version 1
Scanning files on local disk.
Cloning 1 static file.
Cloning 3 application files.
Compilation starting.
Compilation completed.
Starting deployment.
Checking if deployment succeeded.
Deployment successful.
Checking if updated app verion is serving.
Completed update of app: your_appid, version 1

上传成功,请不要忘记编辑proxy.ini把你的appid填进去,谢谢。按回车键退出程序。

验证是否成功也可以打开https://[your_appid].appspot.com/_gh/查看状态,像下面一样就说明成功了:

GoAgent Python Server 3.2.0 works, deployed at 2015-01-08 23:33:33

这里请注意一下,如果你用的是老版本的goagent比如2.x.x的域名后缀应为*.appspot.com/2,而新版本的3.x.x的域名后缀应为*.appspot.com/_gh/,因此之前用老版本而现在更新到新版本的用户需要重新上传。

配置proxy.ini

这一步做的就是上一步终端中最后一行说的,修改/local/proxy.inigae下的appidpassword并保存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[gae]
enable = 1
appid = your_appid
password = your_password
path = /_gh/
mode = https
ipv6 = 0
sslversion = TLSv1
window = 7
cachesock = 1
headfirst = 1
keepalive = 0
obfuscate = 0
validate = 0
transport = 0
options =
regions =

启动服务

运行GoAgent

如果以上步骤都正确的话,Windows以管理员身份运行local下的goagent.exe了,Mac/Linux用户用Python运行proxy.py,应该会出现如下界面:

------------------------------------------------------
GoAgent Version    : 3.2.3 (python/2.7.1 gevent/1.0 pyopenssl/0.13.1)
Listen Address     : 127.0.0.1:8087
GAE Mode           : https (TLSv1)
GAE APPID          : your_appid
Pac Server         : http://192.168.1.101:8086/proxy.pac
Pac File           : file:///goagent-3.0/local/proxy.pac
------------------------------------------------------ 

如果没有出现其他警告或错误,就说明配置成功了。

安装Chrome插件

GoAgent可以设置全局代理,也可以设置浏览器代理。因此下面提供的是使用Chrome浏览器插件代理的方法。

从Chrome浏览器打开Proxy SwitchyOmega并添加到浏览器。如果被墙了就到GitHub下载crx文件手动添加。在其配置界面Import/Export里把/local/SwitchyOptions.bak导入进去:

导入配置

可以从浏览器右上角小圈圈插件那切换各种模式:

  • Direct是不通过代理直接连接
  • GoAgent是完全通过代理访问
  • Auto Switch是自动切换,根据设置判定哪些网站通过代理,哪些网站不通过代理。

个人比较倾向使用自动切换模式,也比较省流量,也防止有些内地的网站因为代理而打不开。也可以在Switch rules里添加需要自动代理的网站。

导入证书

打开chrome设置-管理证书-受信任的根证书颁发机构,将/local/CA.crt导入到进去:

导入证书

至此,以后每次需要代理的时候只要运行goagent.exeproxy.py就行了,此时你就可以通过Google公司加州山景城的服务器畅游墙外的世界了。

这个大家啊,如果,对翻墙有什么想法,有什么看法,尽可以提。我觉得,我相信,广大记者朋友,是客观的。这个也欢迎大家,有机会,到墙外去,墙外人非常热心,而且这些年的这个发展,这个大家团结一致、同心同德,已经取得了很大的进步。我相信,我们这些这个记者朋友们,你们对今天翻墙,放出干货的报道,会是客观的,准确的。好,谢谢大家。

Read More +