Install Linux(Arch) to Thinkpad Helix

新买了个 Helix,当然要装 Linux

Debian

Helix 只能使用 UEFI 方式启动,没有 Legacy 模式,Debian 的安装盘都无法启动,实在没有办法了,只好下载了个 Arch,顺利启动安装。实际上后来证明 Debian 8.0 的安装盘是可以 UEFI 启动的,但为什么当时没有在 Helix 上启动成功就不知道了。

Arch

Arch 的安装过程按照官网上的步骤也没有问题,但有几个地方还是让我花了一些功夫。

  1. 安装的 fluxbox 无法设定缩放壁纸,必须安装 feh
  2. gnome-terminal 启动失败,显示 Error constructing proxy for org.gnome.Terminal,原来还必须设置 locale.conf 用:localectl set-locale LANG="en_US.UTF-8"
  3. 很多软件不是缺省安装,费了周折的同时也学了很多八百年用不到的命令
  4. 电磁触摸屏 Wacom digitizer 好不容易配置可以使用了,但定位却不太准,在 .xprofile 里面加上 xsetwacom 的参数设置触摸屏的区域搞定

硬件支持

Linux 对 Helix 的硬件支持一直是我的痛,但经过了几个月的折腾,也算是差强人意了。电容屏直接就支持,电磁屏最开始必须要给内核打一个补丁才可以,到了 4.2 的内核,终于补丁被接受,打补丁的日子也就结束了。

显卡的支持原来也不太好,总会有屏幕闪烁的情况出现,但随着更新内核和 xf86-video-intel 的更新,问题也不知不觉的消失了。

声卡的支持是足足花了四个多月才最终搞定,一直都是内核不支持,只有 hdmi 的输出。后来在升级内核的时候忽然发现多了个声卡设备 broadwell-rt286,但配置了好久也是无法发生。今天(2015-09-30)决定和它死磕,通过 aplay 命令选择第二个声卡来播放,然后不断的用 alsamixer 设置不同的通道开关组合,结果终于听到了声音。然后就是找到 PulseAudio 设置缺省声卡的方法,在 /etc/pulse/default.pa 里增加了 set-default-sink 1 搞定。只是音量略低,不过好像 Windows 下也是如此就没有多理了。差点忘记一点,dmesg 命令曾经提示缺少一个固件,最后从 Windows 版的驱动里面拷贝了 IntcPP01.bin 过去搞定。选择声卡的方法也试了半天,最后用的是:

$ aplay Ring05.wav -D sysdefault:CARD=broadwellrt286

Use bluetooth under debian

一直有个蓝牙键盘闲置,今天在 Debian 系统中尝试使用……

网上找到的资料都比较老,用起来经常达不到必要的效果。首先是要确定主机的蓝牙模块正常。

$ hcitool dev
Devices:

如果 Devices 下面的列表是空的,就表明无法识别主机设备,说明内核驱动没有正确加载。编译内核的时候花了好长时间找 bluetooth 相关选项,很意外发现竟然在 Networking 条目下,对应的驱动模块是 btusb。

加载了驱动之后,使用 bluetooth-wizard 可以连接到键盘,并能正常使用。不过重启之后还需要重新连接,这非常不方便。网上存在一些脚本可以自动连接键盘,但最后都被证明并不是必须的。

至少以下几个说法在我的情况下都不是必须的:

  1. 增加 /etc/bluetooth/hcid.conf
  2. 修改 /etc/default/bluetooth 设置 HID2HCI_ENABLED=0

需要做的只是:

bluez-simple-agent hci0 xx:xx:xx:xx:xx:xx
bluez-test-device trusted xx:xx:xx:xx:xx:xx yes
bluez-test-input connect xx:xx:xx:xx:xx:xx

如果第一步出错:org.bluez.Error.AlreadyExists: Already Exists 只要在第一条命令后面加上 remove 然后重新执行就可以了。这样设置好之后,重启依然有效,键盘可以自动连接。

Update BIOS for X1 Carbon

忽然想给用了一年多的 X1 Carbon 升级一下 BIOS,但没有 Windows 系统让这个任务变得有点难。

缘起

原来的 BIOS 版本号是 2.56,现在最新的已经是 2.69,而且看到 Changelog 中有好多不错的更新,总是喜欢刷机的我自然不会放过这次升级。下载下来的升级包一种是在 Windows 下面直接运行的,一种是启动光盘。自然后者是较好的选择,剩下的问题就是如何启动这个光盘映像了。

启动盘

grub-imageboot

最先尝试的一种方法就是 grub-imageboot,因为我知道 GRUB 自己就支持启动 ISO 影响,这种方法应该没有什么问题。

$ sudo apt-get install grub-imageboot
$ sudo mkdir -p /boot/images
$ sudo cp /your/downloads/my.iso
$ sudo update-grub

这样就可以在 GRUB 启动菜单里面增加一个启动项,重启选择这个启动项就应该可以了。可这种方法启动后竟然提示无法识别命令 linux16。原来在 UEFI 的环境下,GRUB 根本不知道 linux16 命令,也就是无法运行 16 位的代码,自然这条路就走不通了。

El Torito

现在只好把系统的启动模式设置为 Legacy/UEFI 双模式,然后想办法用 USB 盘启动。一种方法就是将光盘中的 El Torito 记录读出来写入 USB 盘,然后用 USB 启动。

$ geteltorito my.iso > biosupdate.img
$ sudo dd if=biosupdate.img of=/dev/sdb bs=512K

可这种方法读出来的 img 文件只有 512K,感觉并不对,而且也无法启动。那个 ISO 文件不知道是什么格式,使用 mount 命令也看不到里面的内容。只好再换别的办法

grub4dos

只好拿出了久违的 grub4dos,先是对 USB 盘进行分区,然后用 sudo ./bootlace.com /dev/sdx 来写入引导记录,然后拷贝过去 grldr,并编写一个 menu.1st 文件:

title thinkpad-bios
map (hd0,0)/my.iso (hd32)
map --hook
chainloader (hd32)
boot

可惜刚开始的时候我一直把 /dev/sdb 写成了 /dev/sdb1,结果一直报错说不正确的分区表,害的我浪费了很多时间。最后终于写对了,然后成功启动了光盘映像。

更新 BIOS,恢复 Linux 启动

更新 BIOS 的过程并不复杂,可到了最后重启前的一个提示让我出了一些冷汗:将光盘留在光驱里面,按回车启动电脑。我使用的是虚拟的光盘,难道重启还需要使用光盘的内容?不过事实是并不再需要那个光盘,BIOS 会在下一次启动的时候更新 BIOS 和 ECP 的固件。

BIOS 更新成功后继续重启,结果还是出了问题,系统自动进入了 Windows 的系统恢复,原因是我的恢复分区没有删除,而 BIOS 只能找到这唯一的启动条目。此时我还没有意识到更新了 BIOS 后,UEFI 的启动列表就没有了,而缺省的启动程序是 EFI/Boot/bootx64.efi,而它只会启动 Windows 类型的操作系统。

此时我只好关机想办法如何能启动到 Linux 系统中。好在我还有一台 Ubuntu 的主机,我用它做了个 Ubuntu 的安装启动 USB 盘,不过这个启动盘是 i386 架构的,启动之后也无法运行我原来系统的程序,efibootmgr 也显示找不到 UEFI 的信息。这时候我没有意识到的是在非 UEFI 下启动,无论如何也访问不到 UEFI 信息。

之后的想法是在 USB 盘上安装 grub,用这个 grub 引导我原来系统的 Linux 操作系统。用到的 grub 命令如下:

# grub-install --force --no-floppy --boot-directory=/mnt/USB/boot /dev/sdx

自然在别的机器上安装的 grub 无法启动 X1 的系统,直接进入命令行界面

grub> insmod part_gpt
grub> set root='(hd1,gpt3)'
grub> linux /boot/vmlinuz root=/dev/sda3
grub> initrd /boot/initrd.img
grub> boot

系统成功启动,但依然是无法使用 efibootmgr 命令更新 UEFI 信息,唯一的办法就是把 grubx64.efi 复制到 EFI/Boot/bootx64.efi 然后重启,终于看到了原来的系统启动菜单,登录后再运行 update-grub2,加入了 UEFI 的启动项。更新 BIOS 的工作才算最终完成。

Using TinyVZ

买了 15 刀一年的 VPS,基于 OpenVZ 技术

购买

购买 TinyVZ 需要有国际支付手段,我使用 Paypal,自动兑换汇率,还是比较方便的。支付完成后需要 3 个工作日才可以获得登录的密码,通过他们提供的 IP 地址用 vz:vz 登录,然后再输入用户名和密码就可以获得 VPS 的 root 终端。

安装操作系统

初次登录安装的操作系统是 Debian 6.0,喜欢追新的我立刻给换成了 Debian 7.0,但由于是基于 OpenVZ 技术,Linux 内核还只能是 2.6.26。更新操作系统的过程是使用网页上的 Web Console,选择 Reload OS,此时可供选择的有多个操作系统,选定后 60 秒内就可以安装完毕。

配置服务

ssh 服务

# apt-get install openssh-server

使用 ssh 服务不但可以直接登录到 VPS 中,而不需要通过 vz:vz 那个服务器的中转,还可以实现端口的动态转发,搭建一个 SOCKS 服务器。

pptpd 服务

SOCKS 服务器只能给浏览器使用,最好能实现个 VPN 服务器,第一个实现方案是用 PPTPD 服务。安装和配置过程还比较简单,只要安装 pptpd 和 iptables,并修改 ppp 的几个配置文件就可以了。具体的设置方法网上有很多,但安装完毕却一直出现如下错误:

GRE: read(...) from PTY failed...
CTRL: PTY read or GRE write failed (pty,gre)=(6,7)

我在自己的主机上配置 PPTPD 竟然也出现同样的错误,有人说是 GRE 穿透路由的问题,也许是目前的网络环境不允许 GRE 包通过。这个有时间再慢慢检查一下。

openvpn 服务

OpenVPN 的服务已经搭过多次了,家里的路由器就使用 OpenVPN 实现与实验室电脑的共享上网。但在 VPS 中还是出了问题。建立隧道连接没有问题,但通信过程非常不稳定,只是偶尔可以 ping 通远程的服务器,基本属于不可用状态。

而且 iptables 的 MASQUERADE 好像不好使,必须使用 SNAT,例如:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to MYVZIP 

其它 服务

apache 服务安装后就不能启动,说是 ports.conf 中语法错误,但实际的原因是 libapr1 使用了比较新的内核接口,必须重新编译安装 libapr1 才可以。

# apt-get source libapr1
# cd apr-1.4.6/
# dpkg-buildpackage

编译失败在最后的 test 部分,不理它,直接进入到 build-i386 目录然后 make install 安装成功,然后就可以启动 apache 了。

不过 apache 运行过程还是不顺利,错误信息为:Resource temporarily unavailable: apr_thread_create: unable to create worker thread,好像是 VZ 环境下不允许开太多的 Thread。当然这点也要继续确认,不过还是放弃了使用 apache,正好可以试用一下 nginx。

nginx 的安装还是比较顺利了,直接 apt-get 安装好就可以正常使用了。

OpenWRT, wireless freedom

OpenWRT 是一款开源的 Linux 发行版,主要用于各种无线路由器

Tp-link WR703N

入手

入手流行的 TL-WR703N 当前软件版本是 3.15.2 Build 130321 Rel. 37153n,硬件版本 v1。直接用 web 界面升级 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin。然后在主机上执行 dhclient eth1 没有反应,重启硬件 dhclient eth1 还是没有反应,由于 OpenWRT 网站上说过成砖的先例,以为这次悲剧了。直接

$ ifconfig eth0 192.168.1.100

ping 有反应,telnet 没有问题

telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
=== IMPORTANT ============================
 Use 'passwd' to set your login password
 this will disable telnet and enable SSH
------------------------------------------
BusyBox v1.19.4 (2013-03-14 11:28:31 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.
 _______                     ________        __
|       |.-----.-----.-----.|  |  |  |.----.|  |_
|   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
|_______||   __|_____|__|__||________||__|  |____|
         |__| W I R E L E S S   F R E E D O M
-----------------------------------------------------
ATTITUDE ADJUSTMENT (12.09, r36088)
-----------------------------------------------------
 * 1/4 oz Vodka      Pour all ingredients into mixing
 * 1/4 oz Gin        tin with ice, strain into glass.
 * 1/4 oz Amaretto
 * 1/4 oz Triple sec
 * 1/4 oz Peach schnapps
 * 1/4 oz Sour mix
 * 1 splash Cranberry juice
-----------------------------------------------------
root@OpenWrt:/#

初始配置

缺省情况下 WLAN 是关闭的,而且 bridge 到了 lan 端口(Bridged AP Mode) ,想设成常见的路由模式(Routed AP Mode),在它的 WEB 界面上配置了半天也没有搞定,最后还是直接修改配置文件。参考 http://wiki.openwrt.org/doc/recipes/routedap

允许 ssh 访问 wan 端口

It is real simple, just add to following to /etc/config/firewall:

#open ssh on wan interface
config rule
       option src              wan
       option dest_port        22
       option target           ACCEPT
       option proto            tcp

And restart the firewall:

# /etc/init.d/firewall restart

安装 NFS

703N 的 Flash 只有 4M,我又不想在上面接个 U盘,于是只有使用 NFS

# opkg install nfs-utils kmod-fs-nfs
# mount.nfs ip:/path /mnt

安装完 NFS 剩余的空间就只有300K左右了,以后的东西必须都要安装到 NFS 上,于是修改 opkg.conf 增加

dest mnt /mnt

以后就可以用 -d mnt 安装到 /mnt 目录了。

安装 openvpn

安装的过程比较简单

# opkg install kmod-tun
# opkg -d mnt install openvpn

配置就比较麻烦了,折腾了一天半,记得的主要如下:

1.增加一个接口

config interface 'vpn'
       option ifname 'tun0'
       option proto 'none'

2.配置防火墙

config zone
       option name 'vpn'
       option network 'vpn'
       option input 'ACCEPT'
       option output 'ACCEPT'
       option forward 'ACCEPT'
       option masq '1'
config forwarding
       option dest 'vpn'
       option src 'wlan'

3.配置文件 把 wrt.crt, wrt.key, ca.crt 放到路由器上,openvpn 配置文件如下

package openvpn
config openvpn custom_config
    option enabled 1
    option client 1
    option dev tun
    option proto udp
    list remote "ip地址 1194"
    option resolv_retry infinite
    option nobind 1
    option persist_key 1
    option persist_tun 1
    option ca /mnt/etc/openvpn/ca.crt
    option cert /mnt/etc/openvpn/wrt.crt
    option key /mnt/etc/openvpn/wrt.key
    option comp_lzo 1
    option verb 3
    option mute 20

4.将 mount.nfs 命令和 /etc/init.d/openvpn start 写到 /etc/rc.local 里面

改装 MW151RM

wr-703n 在家里一直用,不能拿来玩,出差的时候买了个 MW150RM,结果被我弄成砖了,后来一直不死心,就买了个 MW151RM。这个 MW151RM的电路板和 wr-703n 一模一样(后来发现接上串口线后显示的信息都还是 tp-link),只是没有焊 USB host相关的器件。

改装的过程并不复杂,不过由于技术不精却没少了波折。主要过程如下:

  1. 将 DDR 内存从8M换成64M
  2. 将 Flash 从 2M 换成 8M
  3. 写入新版的固件

其中 DDR 内存的来源是海龙淘来的内存条,把内存芯片吹下来,再焊到路由器上。可把内存从路由器上吹下来的时候好几个焊盘都翘起来了,好在没有断,还可以修补,最终焊好内存顺利启动。

把 Flash 焊下来之后去找张老师读取里面的内容,结果发现读出来的数据不对,怀疑芯片坏了。然后再把这个 2M Flash 焊上去的时候发现板子无法启动了,以为芯片果然坏掉了。这样里面的 ART 数据岂不是读不出来了?按照 openWRT 网站上的说法,这个路由器就废了。

不过我还没有死心,利用家里 wr703n 的固件,直接写到 8M Flash 上面,然后焊到 151RM 上,结果依然无法启动,串口也没有任何输出。

再把原来的固件 Flash 焊上去,依然无法启动,抱着死马当活马医的态度,把 64M 内存重新用烙铁烫了一遍,结果奇迹出现,板子可以启动了,无线也正常。

再把 8M 的 Flash 焊上去,同样可以启动,而且由于利用了家里 wr703n 的固件,手机直接就连上了。看来用同型号的 ART 也没有问题。

先把板子装回盒子,玩几天再说

修改 MAC 地址

由于使用了 wr-703n 的固件,目前 MAC 地址和 703n 一样,通过分析 u-boot.bin 发现 MAC 地址写在 0x1fc00,这也通过网络获得了证实。不过修改 MAC 之后重写 flash 却无法启动 wifi。重新读取了原 flash,总算把 ART 读了出来,换上去之后还是无法启动 wifi。通过多方组合,发现只有 703n 的 MAC 可以启动 wifi,其它的都不行,于是开始怀疑固件。

因为固件是从路由器里面 dump 出来的,所以一些配置信息也被复制过来,原来是 /etc/config/wireless 的配置文件的问题。将里面的 mac 地址同步修改了之后就可以正常启动了。

TTL 串口

对路由器的调试必须有串口的支持,板子上的 TP_OUT 就是串口的 TXD,TP_IN 就是 RXD,在启动路由器的早期快速输入 tpl 可以进入 u-boot 界面。 增加 USB Host

硬件改动:

  1. 加焊usb接口
  2. R101 R102 焊 22ohm 电阻(0402 的还是挺难焊的)
  3. R112 焊 0ohm 电阻

软件改动:

# opkg install kmod-usb-storage block-mount block-hotplug kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1 kmod-nls-utf8

然后还装了 3G 和摄像头的驱动,有空可以试试

# opkg install kmod-video-uvc kmod-usb-serial-wwan

编译安装 trunk

首先下载最新代码

$ git clone git://git.openwrt.org/openwrt.git

配置界面和 buildroot 类似,选择了 tl-703n 的缺省配置,直接 make 就可以生成最后的 bin 包。把 sysupgrade 包拷贝到路由器的 /tmp 目录,然后执行

# sysupgrade openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin

升级非常顺利:

BusyBox v1.22.1 (2014-08-13 11:11:21 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 CHAOS CALMER (Bleeding Edge, r42131)
 -----------------------------------------------------
  * 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:~#

Hands on Launchpad G2

前两天的 FPGA 展会上拿到了 TI 的“口袋实验室”,其中包含基于 MSP430 的 Launchpad。

工具

TI 的首要工具自然是 CCS,但我还是喜欢免费的跨平台解决方案。TI 提供了 energia 这个开源工具,有点类似于 Arduino 的开发环境,打开界面就是编写 Setup 和 Loop 两个函数,这个也不太对我的胃口。

sf.net 有一个 mspgcc 的开源项目,但提供的只是补丁,集成起来比较麻烦。好在 github 上有人写了一个安装脚本,只要克隆这个项目并执行 install-all 就可以了。mspgcc 会被缺省安装到 /usr/local/msp430 目录。

$ git clone https://github.com/jlhonora/mspgcc-install.git
$ cd mspgcc-install
$ ./install-all

编程和调试工具是 mspdebug,直接 make 就可以安装,然后执行

$ sudo mspdebug rf2500

可以得到一个交互界面,运行 prog blinky 把我写的 blinky 代码写入到处理器,然后运行 run 就可以运行程序。或者也可以直接运行下面语句进行编程:

$ sudo mspdebug  rf2500 "prog ./blinky"

硬件

Launchpad 的硬件资源不多,只有两个 LED 灯和一个用户按键,但另外一块“口袋实验室”的硬件资源就丰富多了,比较醒目的就是它的那个 128 段液晶显示器了。不过这个液晶并不是 CPU 自己控制,而是通过 I2C 控制的一个 IO 扩展芯片来控制 LCD 控制器。呜呼,好麻烦。

Hands-on the BeagleBone Black

刚刚购买了 BeagleBone Black 中国版,安装和调试的过程记录

初上手

在淘宝上购买了包含 4.3 寸 LCD 的 BeagleBone Black(以后称作 BBB)开发板,到手后直接上电,发现板子运行的是 Debian 系统,而且运行了 avahi 服务,可以直接使用下面的命令登录,其中 root 的密码是空,同时板子的网口也必须接好网线。

接上 USB Client 接口之后会识别出一个 U 盘和一个串口,通过 U 盘可以非常方便的和开发板交换文件。

预安装的发行版是 BeagleBone 的官方版本,并不支持这次购买的一系列外设,因此根据淘宝上提供的资料,下载了商家提供的文件系统。商家提供的是一个 img 文件,通过 dd 命令可以写入到 TF 卡中,然后按着“启动选择”按钮接通电源,系统就可以从 TF 卡启动(否则是从板载的 eMMC 存储器启动)。

为了使用 LCD 屏,还必须更换启动时使用的 dtb 文件,商家提供了一个 test_lcd4.3 命令来完成。重启开发板后,LCD 还是没有亮,突然意识到可能是 USB 供电不足,接上一个 5V 电源之后再启动就没有问题了。

文件系统结构

无论是 eMMC 存储还是 TF 卡,文件系统的组织结构都是类似的。首先 mmc 必须分成两个分区:一个是 VFAT 格式,保存了 MLO,u-boot 和 uImage;另一个是 Linux 格式,是最终的 root 文件系统。

官方支持的文件系统安装方式是从网站下载文件名带 flasher 的 img 映像,写入 TF 卡并用这个卡启动后就会自动把文件系统写入到 eMMC 中,如果做自己的写入工具,就必须对这个映像进行修改。网上可以找到一个 emmc_prepare.sh 脚本做这件事,实际上就是更新第二个分区里面 build 目录中的 MLO 等文件,并更新脚本中的 MD5 校验。

BBB 板的启动过程是首先内部的 ROM 执行,然后会根据 Boot 管脚的设置按照一定的顺序查找启动介质(通过启动按钮可以改变这个顺序,也就是使用 TF 卡启动的原理),如果是 MMC 卡启动就会从里面的 VFAT 分区里面找到 MLO(称为 x-loader)加载到 SRAM 中执行;而 MLO 会进一步加载 U-Boot 到 DDR 内存启动;最后才会由 U-Boot 启动 Linux 操作系统。

使用 buildroot 生成文件系统

官方的文件系统无论是基于 Debian 的还是基于 Angstrom 的,都要超过 1G 空间,给出的映像文件都大于 2G,因此至少要 4G 的 TF 卡才能安装。而如果使用 buildroot 就要精简多了。生成的文件系统只有几兆大小,比较适合教学使用。

首先下载了 buildroot-2014.05 的稳定版,里面就有对 beaglebone 的支持,因此只要执行:

$ make beaglebone_defconfig

就可以获得一个基本的配置,只要在这个基础上修改就可以了。

  1. 首先使用了 Linaro_2014.02 版本的工具链,减少下载和编译工具链的时间
  2. 文件系统设置为读写方式
  3. 增加了 dropbear 等软件
  4. 选择 tar.gz 格式的文件系统

最后生成的包括 MLO,u-boot,zImage,dtb 文件 和 root.tar.gz。

清空 TF 卡两个分区的内容,把 MLO,u-boot.img,zImage,dtb 文件放到 vfat 分区,再把 root.tar.gz 解压到 ext2 分区。

还缺少的是 uEnv.txt 文件,这个是 U-Boot 的配置文件,里面可以写入 U-Boot 的配置信息,这个配置文件所涉及到的命令不是很熟悉,最后好不容易修改好后的样子是这样的:

console=ttyO0,115200n8

kernel_file=zImage

loadaddr=0x82000000
fdtaddr=0x88000000
fdt_high=0xffffffff

loadkernel=load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${kernel_file}
loadfdt=load mmc ${mmcdev}:${mmcpart} ${fdtaddr} /dtbs/${fdtfile}

loadfiles=run loadkernel; run loadfdt
mmcargs=setenv bootargs console=tty0 console=${console} ${optargs}\
${kms_force_mode} root=${mmcroot} rootfstype=${mmcrootfstype} noinitrd

uenvcmd=run loadfiles; run mmcargs; bootz ${loadaddr} - ${fdtaddr}

主要是根据 Debian 发行版带的 uEnv.txt 修改,去掉 initrd 部分得到的。

freedos hand-on

虽然不是第一次用 FreeDos 了,但……

简介

2012 年 FreeDos 推出了 1.1 版本,我就立刻把它装到了实验室的电脑上,但却发现了 Turbo C 2.01(免费版)不能正常使用,要么速度很慢(感觉比用 386 的时候都慢),要么就直接重启(使用某个内存驱动的时候)。一直没有找到真正的原因。

今天偶然的机会发现只要不加载任何驱动程序,TC 的运行就正常(奇怪当初没有尝试),看了一下 autoexec.bat,觉得加载的 FDAPM 有些不顺眼,就立刻将其注释掉,没想到问题就解决了,看来是 Turbo C 和 FDAPM 的冲突,不过要怎么解决呢?

后来在 freedos 的 maillist 上面询问了一下,Eric Auer 建议调用 FDAPM 的时候使用ADV:REG 参数,这样可以保证 FDAPM 不会过分的将 CPU 置于 IDLE 模式,对普通应用程序的影响就最小。这个改变的确解决了前面遇到的问题。

monitor the interface other than 802.3

从前只用 wireshark 监听过有线以太网,这次尝试一下其它接口。

问题描述

监听有线以太网比较简单,不需要特殊的设置,只要启动 wireshark 就可以自动把网卡设置在混杂模式下,可以监听到网线上的一切信息。但对于 wifi 就不一样了,一般情况下监听到只是用户数据,连以太网头部都是伪造的。

使用 aircrack

首先需要下载 aircrack,编译安装不在话下。之后的过程就比较简单了。

# ifconfig wlan0 down
# airmon-ng start wlan0

此时会多了一个 mon0 网络接口,启动 wireshark 监听这个接口就可以看到 802.11 协议的内容了。

如果能监听到握手数据包,再配合密码本,就可以使用 aircrack 来破解网络密码了,这个可以使用 aircrack 自带的示例报文 wpa.cap 来测试,如果要实际运用可能需要一个比较好的密码本。

恢复 wifi 功能

如果要恢复 wifi 上网,还需要执行下面的命令

# ifconfig mon0 down
# airmon-ng stop wlan0
# ifconfig wlan0 up

监听 USB 接口

USB 接口的监听(sniffer or monitor)在 Linux 操作系统中有很好的支持,只要加载 usbmon 模块(在 Driver/USB 下面)就可以了,不过需要内核支持 DEBUG_FS(CONFIG_DEBUG_FS 在 Kernel Hacking/Compiler options/Debug Filesystem 下面,这个太容易让人误解为对文件系统的调试了)。关于 usbmon 在内核文档中有详细的说明,我们只需要执行下面两步,就可以通过 wireshark 监听了。

# mount -t debugfs none_debugs /sys/kernel/debug
# modprobe usbmon

通过 lsusb 命令可以知道要监听的设备在哪条 USB 总线上,然后在 wireshark 中的接口列表中选择相应的总线即可。

使用 wireshark 监听到的并不是真正在 USB 总线上传输的电信号,而是从操作系统角度看到的 USB 的协议交互过程。比如可以看到读取描述符,读取配置信息,和对 USB 的配置进行设置等。最重要的是可以看到主机与 USB 的各个端点的通信过程,这对协议分析是最重要的。

需要注意的是,有时候可以看到 0 字节的 BULK IN 请求,这应该是主机软件提出了异步的输入请求,这样就可以同时进行两个方向的传输,提高 USB 总线的效率。

Install EmDebian to DIM3517

在闲置的 DIM3517 开发板上安装 Debian

开发板简介

DIM3517 是 SEED 公司推出的 AM3517 开发板,闲置很长时间了,今天准备拿它玩玩……

主机准备

由于使用了 multistrap 工具,所以主机上必须安装:

$ sudo apt-get install multistrap dpkg-dev

之后需要准备 multistrap 的配置文件,目前我的配置文件是这样的:

[General]
noauth=true
unpack=true
debootstrap=Grip
aptsources=Grip
[Grip]
# space separated package list
packages=netbase ifupdown iproute net-tools apt
source=http://www.emdebian.org/grip
suite=wheezy-grip

由于我参考的网页并没有 packages 那一行,结果生成的文件系统没有网络配置工具,也没有 apt 工具,造成接下来的安装非常麻烦,必须手工使用 dpkg 安装缺少的包。如果采用上面的设置就应该没有问题了。

接下来运行:

$ multistrap -a armel -d $PWD/debian -f multistrap.conf

就可以从网上下载并在 debian 目录下生成初始的文件系统了。

运行 Debian 系统

上面的过程仅仅是把安装文件展开,所有的包都还没有配置。为了完成配置过程,我把生成的文件系统复制到了 SD 卡上,然后重新启动开发板,希望可以登录到新的文件系统上。由于系统并没有配置,所以要在启动参数上加上 init=/bin/sh。可结果还是启动失败,系统显示:

warning: unable to open initial console

这是一个比较熟悉的问题,原因是 /dev/ 目录下没有 console 文件,建立好这个文件之后系统就可以正常启动了,之后需要运行:

# mount -t proc nodev /proc
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  dpkg --configure -a

可是这个过程也不顺利,dash 和 bash 都没有成功配置,通过网络搜索,找到了解决办法,需要先执行下面的命令:

# /var/lib/dpkg/info/dash.preinst install

终于都配置好了。但在重启系统之前还要再修改几个系统配置文件,这个过程是在另外一台电脑上直接修改 SD 卡上的文件的方法实现的。需要修改的文件如下:

  1. inittab 文件,增加在串口终端上的登录功能,即增加如下内容:
T0:23:respawn:/sbin/getty -L ttyS2 115200 vt100
  1. 去掉 root 用户的密码

再次启动的时候仍然失败,错误消息类似如下:

udevd[45]: unable to receive ctrl connection: Function not implemented

这个问题明显是 udevd 造成,网上没有特别好的解决办法,好像要升级系统的内核,但鉴于我现在升级内核比较困难,我直接删除了 udevd 文件,这样就可以启动系统了,只是没有了自动生成设备文件的功能。

接下来的配置过程就比较简单了。只要安装好了 apt-get,一切就和一个普通的 Debian 系统没有什么区别,只要 apt-get install 就可以把一切搞定。