[vagrant]解决vagrant up启动太慢的问题

在vagrant上使用Ubuntu时经常会出现启动过慢的问题。我的环境是MacBook Pro Mid 2015, OS X 10.11,vagrant上是Ubuntu 14.04, 使用一段时间后发现执行vagrant up时速度特别慢,查看控制台发现启动时经常出现这条消息:

cloud-init-nonet[14.57]: waiting 120 seconds for network device

搜了下发现原因是Ubuntu与Virtual Box带的Intel网卡驱动不兼容所致,改成AMD网卡驱动即可解决。 在Vagrantfile中添加以下配置即可解决(来源):

config.vm.provider "virtualbox" do |vb|
    ### Change network card to PCnet-FAST III
    # For NAT adapter
    vb.customize ["modifyvm", :id, "--nictype1", "Am79C973"]
    # For host-only adapter
    vb.customize ["modifyvm", :id, "--nictype2", "Am79C973"]
end

(Read More)

在Netgear R7000上定制dd-wrt

启用jffs

打开Web界面,进入Administration -> Management,找到”JFFS2 Support”节。默认状态下”Internal Flash Storage”应该是”Disable”的。

  1. 设置”Internal Flash Storage”为”Enable”,点击”Save”,再点击”Apply Settings”
  2. 设置”Clean Internal Flash Storage”为”Enable”,点击”Apply Settings”
  3. 此时应该能看到”Total / Free Size”处显示出了容量,例如”93.75MB / 91.33MB”
  4. 将”Clean Internal Flash Storage”改回”Disable”,点击”Save”再”Apply Settings”

启用USB

首先将USB盘插入R7000背面的USB2.0口中。我用的是一个256MB的小优盘。

打开Web界面,进入”Service” -> “USB”。然后进行以下设置:

  1. 设置”Core USB Support”为”Enable”,点击”Apply Settings”。
  2. 设置”USB Storage Support”为”Enable”,点击”Apply Settings”。
  3. 设置”Automatic Drive Mount”为”Enable”,点击”Apply Settings”。

此时通过ssh进入命令行,输入mount命令应该能看到优盘(通常为/dev/sda1)被mount到了/tmp/mnt/sda1。如果优盘不是ext2系统,可以通过fdiskmke2fs命令重新分区并格式化。

最后回到Web界面,将/dev/sda1的UUID(在Web界面上可以看到)填入”Mount this partition to /opt”中,以便路由器启动时能够自动挂载。

安装opkg

Kong的dd-wrt已经自带了opkg,只不过需要在启用USB之后安装一下。将USB挂载到/opt之后,运行

bootstrap

简单回答几个问题即可完成opkg的安装。

安装结束之后,打开/opt/etc/opkg.conf,填写以下内容:

src/gz base http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/base
src/gz kernel http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/kernel
src/gz luci http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/luci
src/gz management http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/management
src/gz packages http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/packages
src/gz routing http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/routing
src/gz targets http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/targets
src/gz telephony http://downloads.openwrt.org/snapshots/trunk/bcm53xx/generic/packages/telephony
dest root /opt
dest ram /tmp
lists_dir ext /opt/var/opkg-lists
option overlay_root /overlay
option check_signature 1

然后执行:

# opkg update
# opkg list

安装时opkg可能会报告找不到libc,只需要加上--force-depends强制安装即可。

# opkg install vim --force-depends

推荐的opkg packages

我只装了两个:

# opkg install vim
# opkg install htop

htop在执行时会报告terminal错误,可以通过以下命令解决:

export TERMINFO=/opt/usr/share/terminfo

我建了个/tmp/root/.profile文件如下:

alias vi='vim'
export TERMINFO=/opt/usr/share/terminfo

为避免重启路由器时内容丢失,可以将这个文件保存到/jffs/profile/.profile,然后通过Web界面添加一条启动命令(”Administration” -> “Commands” -> “Save Startup”):

# copy profile for shell
cp /jffs/profile/.* /tmp/root

(Read More)

Linksys E4200v2刷OpenWRT小记

几年前买过一台Linksys E4200。E4200有两个版本:rev1和rev2。熟悉dd-wrt的人可能知道, E4200v1使用的是Broadcom芯片,支持dd-wrt,但到了rev2就换成了Marvell芯片,不再支持dd-wrt,因此没法刷固件了。 很可惜,我购买时rev1已经断货,只好买了无法刷固件的rev2。

今天偶然查到,OpenWRT已经提供了E4200v2的支持,于是决定尝试一下。

刷机很容易,去设备页面上给出的链接下载openwrt-kirkwood-linksys-viper-squashfs-factory.bin, 然后连到路由器的固件升级页面升级即可。

刷机之后需要注意的几点(给熟悉dd-wrt的人):

  • OpenWRT的默认地址是192.168.1.1
  • OpenWRT默认不提供Web界面,首次登录只能通过SSH方式。用户名为root,无密码。请在登录之后使用passwd命令设置密码。
  • 连上Internet之后(我通过已有router使用DHCP连的,若需要PPPoE请参考OpenWRT官方文档),即可用以下命令安装web界面:

    opkg update
    opkg install luci               # 安装Web界面
    opkg install luci-ssl           # 安装SSL
    /etc/init.d/uhttpd start        # 启动Web界面
    /etc/init.d/uhttpd enable       # 设置Web界面自动启动
    
  • 该固件仅支持802.11n,不支持a/b/g。如果出现Wifi接口无法启动的故障,请自行编辑/etc/config/wireless,在相应的wifi-device节中添加option hwmode '11n'以强行设置网卡为802.11n。

(Read More)

A script that changes MAC address

Here is a script that can change your MAC address automatically. Just save it as ~/bin/macchange and add ~/bin to your path. Tested on Mac OSX Yosemite.

Type macchnage to change MAC address to a random one. Type macchange restore to restore MAC address to origin.

if [[ $1 == 'restore' ]]
then
  action='restored'
  mac=$(cat ~/bin/mac.origin)
else
  action='changed'
  mac=$(openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//')
fi

sudo ifconfig en0 ether $mac

echo $action MAC to $mac

ifconfig en0

(Read More)

[python]cx_Oracle安装笔记

要安装cx_Oracle包,需要首先下载Oracle的客户端库文件和头文件。访问OTN,下载相应操作系统的Instant Client Basic Package和SDK Package。64位Linux对应的文件名分别为instantclient-basic-linux.x64-12.1.0.2.0.zipinstantclient-sdk-linux.x64-12.1.0.2.0.zip

(Read More)

[js]奇怪的Grunt问题

不知何时起我的构建CSS Sprite的grunt task突然不能运行了。CSS Sprite是利用grunt-spritesmith构建的。原本以为是配置文件的问题,于是反复删改Gruntfile.js中的sprite段配置,无果;又以为是引擎的问题,于是反复安装、删除各种图形处理模块,也无果。最后偶然读到grunt-spritesmith的源代码,发现它注册了一个名叫sprite的任务。突然想起我自己好像也注册了同名任务:

grunt.registerNpmTask('sprite', ['sprite']);

原来如此!我本想用我注册的sprite任务去调用grunt-spritesmithsprite任务,结果两个正好同名,导致死循环调用。。。解决方法,把这行删掉就可以了。

记录下来引以为戒。

(Read More)

[Oracle]How to Unlock Expired Account

If you ever get this error in your dev then you should consider unlock your oracle account and set it to never expire.

ORA-28001: the password has expired

Login with your system account and run the following SQLs.

-- find out your profile name
SELECT profile FROM DBA_USERS WHERE username='<username>';

-- check password limit
SELECT resource_time, limit FROM DBA_PROFILES WHERE profile='<profile_name>';

-- reset password and unlock account
ALTER USER <username> IDENTIFIED BY <new_password> ACCOUNT UNLOCK;

-- disable expiration
ALTER PROFILE <profile_name> LIMIT password_life_time UNLIMITED;

-- disable password policy
ALTER PROFILE <profile_name> LIMIT password_verify_function NULL;

Then your account should be ready to use.

(Read More)

[python]避免SqlAlchemy的TypeError: can't compare offset-naive and offset-aware datetimes错误

SqlAlchemyDateTime字段有个问题,就是如果数据库本身不支持timezone,并且app中的datetime对象为timezone aware的话,向数据库中存储数据时会报告如下错误:

TypeError: can't compare offset-naive and offset-aware datetimes

虽然DateTime提供了timezone选项,但这个选项仅在数据库支持时区时才有效。对于常用的MySQL甚至SQLite,这个选项无能为力。

解决方法就是自定义一个timezone aware的数据类型(来源):

(Read More)

Gollum: 轻量级基于Git的Wiki系统

最近准备搭建一个wiki,看了维基百科上的wiki软件列表后觉得可用的实在太少。我希望架设一个轻量级的wiki,至少能满足以下条件:

其实GitHub自带的wiki系统能很好满足我的需求。后来看到GitHub用的wiki叫做Gollum,简单试用了一下发现效果很不错,能满足绝大部分需求,并且还有额外赠送的基于git的存储。

其实Gollum本身的安装很简单,一个gem install就能搞定,不过想支持OAuth2认证以及服务器配置比较麻烦。所以下面着重从这两方面介绍。

(Read More)

[linux]在笔记本上安装CentOS 6.6

禁用ACPI,这样关闭盖子时系统就不会休眠(否则硬盘会休眠,造成访问错误)。方法是编辑/boot/grub/grub.conf,在kernel一行末尾添加acpi=off

启动时自动启用网卡。编辑/etc/sysconfig/network-scripts/ifcfg-eth0,将其中的ONBOOT=no改成ONBOOT=yes

禁用IPV6。编辑/etc/sysctl.conf,增加以下两行然后重新启动:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

(Read More)