Ubuntu-Tag Archive:

Page 1 of 212

Ubuntu 下使用蓝牙/USB连接黑莓8700上网

黑莓8700支持EDGE网络,用来做GPRS Modem是相当理想的,标准的mini usb接口,蓝牙2.0,完全足够EDGE的网络速度;

本来以为用蓝牙连接会很简单,在blueman里面连接即可,可是实际上,不行:

Failed: Modem Manager did not support the connection

之前用blueman连接Nokia的机,是没问题的,看来黑莓的Modem协议有点不同……Google了一下,找到了不少BB在Linux下的资料:
How use BlackBerry device with Linux【介绍了Linux对黑莓的配置、同步、安装软件、Modem、Java开发】
how to teather blackberry and linux via bluetooth【连BB蓝牙的完整过程,试验不成功】
Berry4all 通过USB连接BB Modem的专用程序

测试Berry4all终于能够连接上BB的GPRS,观察Berry4all其实也是建立了串口通信后,使用pppd的协议来建立数据链接的,要连接cmnet,还得修改其conf下的att-chat,即其中的“拨号”协议;

blueman虽然不能建立Modem链接,但是还是能够建立起/dev/rfcomm0,即通过蓝牙的串口链接;使用蓝牙教程,基本上都是使用hcitool等工具来配置的,使用起来真的好不方便,而blueman不是刚好帮忙搞定了蓝牙的配对连接等麻烦事情么……

于是把Berry4all的conf目录的att跟att-chat文件复制到/etc/ppp/peers,参照别的教程的配置,修改att,在开始115200那行前,加入nodetach跟/dev/rfcomm0两行,最后的connect调用chat文件的路径改成connect "/usr/sbin/chat -f /etc/ppp/peers/att-chat",att-chat里面修改一行:OK 'AT+CGDCONT=1,"IP","cmnet"' ,最后运行sudo pppd call att,终于用蓝牙连上了GPRS;

其实使用ppp连接modem的方法是最传统的,也是高度可定制(如连接后配置路由表、IP、DNS),不管是用Cable、USB、蓝牙还是红外,都可以这样完成,Of Linux, GPRS Phones, Serial Cable, Irda, Bluetooth and USB文章里面列举了好多这些例子;我修改了其中的三个脚本:gprs, gprs-connect-chat, gprs-disconnect-chat替代了上面Berry4all的att脚本,因为这脚本里面的注释非常详细,以防以后需要的调整;

这是我打包了修改好后(适用于移动CMNET上网的)gprs脚本,使用blueman连接了rfcomm0后,运行sudo pppd call gprs,就能连接上GPRS,ifconfig查看出现一个ppp0,可以直接上网了;

如果不使用blueman,完全使用bluez的工具的话,可以参照Blackberry Curve 8310 as Bluetooth Modem on Ubuntu Hardy,我没测试,不过按理说是可行的。

之所以这么折腾,其实可以说blueman的一个bug吧,似乎BB的Modem没啥特别,按通用的Modem都能连接到;有时间看看blueman的代码看能不能弄好……

Tags: , , , , ,

暂无评论

Acer Aspire 4736ZG 本本上安家Linux的小问题

早天在新蛋上入手了Acer Aspire 4736ZG本本一台,T4200、1G、NV105M、250G,带蓝牙摄像头等,3600,还送了一台水星无线路由。低端本本为了降低成本,很多都是不装Windows的,这款也是,本来以为原装系统都是Linux,应该对Linux兼容不错的啦,那天到提货点验本本时候,运行一看,傻了,那个什么Linpus,2.6.15的内核,没带X,lshw没有,lspci没有,hwinfo更没有,总之就没什么东西好看的,除了黑漆漆的画面告诉我屏幕没坏点,就匆匆打上包回来了。

第一件事就是用Arch 09.08的Live CD启动重新分区,顺便装好core,但是启动后又傻了,连不上有线网卡……这款机器的网卡是Atheros AR8132的千兆卡,不知道是太新还是太罕见。几经折腾后发现规律:完全关机重开后,Arch就能认到网卡,ipconfig -a能看到eth0,但是ifconfig eth0 up了之后,是这个样子的:

eth0      Link encap:Ethernet  HWaddr 00:26:18:80:C5:AB
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4294967293 errors:4294967278 dropped:4294967290 overruns:4294967293 frame:4294967281
          TX packets:4294967293 errors:4294967284 dropped:0 overruns:4294967293 carrier:4294967291
          collisions:4294967281 txqueuelen:1000
          RX bytes:4294967293 (4095.9 Mb)  TX bytes:4294967293 (4095.9 Mb)
          Interrupt:28

大堆奇怪的数字,这时候不管dhcp还是手动指定IP,都没法正常工作的,如果这时重启,好,完全认不了网卡了,又要完全关机再开一次。

这个问题在Arch论坛上面也有人碰到,他的是华硕eeePC 1005HA,也是上个月的帖子。[详细情况帖子里面比较完备,但是,未解决]

于是我就转战Ubuntu。Ubuntu 9.04的Live CD版本也是没能驱动好这块网卡的,但是这里找到解决方法,总之就是到Atheros官网下载网卡的驱动,编译,挂载驱动模块,幸好Ubuntu的Live CD跟初始系统都带了GCC和Make utils,编译安装过程倒没什么波折,很快就折腾好连上网了。呃,怎么这么简单?于是试试在台式机的Arch上面编译了这个atl1c.ko,哇,一开始就一屏幕的错误……后来发现这个是这个驱动跟内核兼容问题,Ubuntu好像专门有补丁搞定的,Ubuntu 9.04把内核升级到2.6.28.15-generic网卡就完全正常了,也顺便下载了9.10的Live CD,直接iso启动,发现虽然是31内核,但是网卡工作也正常……好吧……看来要么等kernel彻底搞定这块网卡的驱动,不然只能自己找Ubuntu的patch来编译才能跑Arch了……

Ubuntu很是省心,挂上受限驱动什么3D特效全都出来了,跑了下glxgears,大概2600fps,比台式机的集显好一点吧……7025只有1300左右的fps;更新了一下系统,用Ubuntu Tweak添加了一堆三方源后拉好一大堆软件,基本可用了,另外的问题是,声卡的耳机输出没声音!

本本的耳机问题好像从来都是老大难的,因为音频接口的硬件随意性很大,Linux驱动的很难做到通用;本本里面的是ALC888 HD声卡,装了最新的alsa-driver 1.0.21,情况依旧,喇叭有声音,但是耳机就是没反应,也没那个选项有效;后来查看了一些帖子才知道,虽然是同一款驱动,但是有不同的挂载模式的参数,通常就是用来指定这类变化很大的接口等,有些帖子给出一大堆参数列表,说,在/etc/modprbe.d/alsa-base.conf里面更换不同的参数,然后重启测试……天啊,起码上百条的参数,要重启到哪个年月阿……稍微看了下,所谓的挂载参数就是传给modprobe的参数嘛,比如modprobe snd_hda_intel model=ooxx,只需要用不同的参数重新挂载snd_hda_intel,完全没必要重启阿……在Linlap找到一个AudioTester脚本,专门用来测试不同的模块挂载参数的,但是在Ubuntu下用也挺麻烦,正常模式下不让删除snd_hda_intel模块,只好启动到recover mode,手动挂载后运行这个脚本;终于测试到"lenovo-sky"这个参数能让耳机出声,证明还不是残废……但是进入alsamixer里面看,使用这个参数之后,只有寥寥几个选项,连录音都不见了……而且耳机跟喇叭是同时发声的,不能关闭喇叭……

后来想到,这个参数列表应该不是固定的,新的alsa里面应该会有新的参数,不知道有没有专用Acer的参数呢?因为看到原来的列表里面有acer跟acer-aspire,虽然两个没合适这款机器;grep了一下alsa-driver的源代码目录,发现sound/pci/hda/patch_realtek.c里面有一大堆acer xxxx,试了acer-aspire-4730g跟acer-aspire-4730g,设置成4ch/6ch模式后,终于能通过设置Surround让耳机出声,通过Front调整外放喇叭的声音!

Tags: , , , , , , , , ,

评论 (1)

玩转libnotify

Ubuntu 9.04一个特性就是新的通知机制Notify OSD,让人一眼看上去很酷的样子,其实只是基于libnotify的调用,别看又DBUS又OSD那么复杂,其实一点都不神秘,跟PT来:

1
2
3
4
5
6
7
8
#!/usr/bin/python
#coding:utf-8
 
import pynotify
 
pynotify.init ("PT-Title")
n = pynotify.Notification ("PT的贺电", "PT再次发来贺电")
n.show ()

没看错,就是这么几句Python,保存成文件运行试试:

哈哈,很简单吧!

如果你安装了libnotify-bin包,shell里面会有notify-send这个工具:

notify-send "PT的贺电" "PT发来贺电"

差不多的效果,我就不抓图了,自己试试!

当然除了python,libnotify还能在很多种语言的库实现,我用aptitude search libnotify搜索了一下,很明显有libinotify-ruby,libnotify-dev,libnotifymm-dev分别是ruby、C、C++方式的绑定,不过,python的pynotify是Ubuntu 9.04里面默认安装的呢……

详细的开发还是看看Ubuntu的Notification Development Guidelines吧,注意在后部分有很多example的噢!!!

Tags: , , ,

评论 (9)

无损转换ext3到ext4,with Ubuntu Jaunty 9.04

Ubuntu Jaunty 9.04开始正式支持ext4文件系统,关于ext4,其优点应该早有听闻,对任何用户而言都具有难以拒绝的诱惑:对一般用户而言,有更好的磁盘性能,快速的预分配、删除,更可靠的日志,更迅速的磁盘检查(不会像ext3可能花几分钟来check,ext4经常是瞬间完成的)……更专业的描述可以看看IBM文库的这篇《Migrating to ext4》

从Ubuntu 8.10升级到9.04,一定程度上是看上其对ext4的支持,不过如果为此重新格式化分区重装系统,对于使用积累较多的系统来说代价太高了点(PT现在用的系统是去年的8.04,后来升级8.10,再到现在的9.04……),不过根据《Migrating to ext4》的说法,从ext3到ext4的无损转换是可能的,而且并不耗时间,就如Kernel Wiki里面的Ext4 Howto提到转换所用的命令,其实也很简单:

tune2fs -O extents,uninit_bg,dir_index /dev/DEV
e2fsck -fD /dev/DEV

查了下tune2fs的man页,uninit_bg是支持快速check的特性,dir_index则是创建二叉树散列的目录查找,至于extents在man页没提到,Kernel Wiki里面说是ext4专有的特性,完成后用e2fsck check一次,这样就完成ext4的转换了,整个过程的耗时并不多。

不过这样转换出来的分区有点不完美的地方是,原本存放在分区内的文件结构还是ext3的结构,由ext4的机制透明兼容,以后存放的文件才是ext4的格式。本来影响不大的,不过相信会影响众多完美主义者的精神状态,所以很多人宁愿把文件全复制出来,格式化了分区再复回去。

IBM的文章内提到,因为ext4支持了在线的碎片整理,对于转换的ext4,使用e4defrag整理一遍,就是纯种的ext4了,不过到目前为止,e4defrag并未完全可用。不过相信不久的将来,转换到纯种ext4完全可以一气呵成的。

最近有谣言说/boot不能是ext4,不然grub引导不了。事实上Ubuntu 9.04已经完全支持ext4,不然此前怎么会有ext4系统的9.04 21秒引导系统的新闻?不过对于升级过来的9.04,安装在/boot/grub里面的程序还是旧版的,没有自动升级,因此可能出现引导问题,相信这也是谣言的出处,所以升级过来的同学要注意了。可以使用grub-install来重新安装一次grub的文件,就如《Upgrade Ubuntu 8.10 to Ubuntu 9.04 and ext3 to ext4 in 10 Minutes》那样。不过grub-install有点要注意,grub-install复制的文件是以/为起始位置的(特别是使用了--root-directory=DIR参数的),如果boot单独分区,同时在livecd里面单独挂载了出来,很可能新复制过去的文件会多了一层boot目录,变成新旧版的引导文件共存以致没法引导grub……(我也感觉我说得一塌糊涂了……总之boot独立分区的同学使用grub-install注意它究竟安装到什么地方去了,看看相应文件的修改时间)。

对于从ext3升级到ext4的系统,还有重要的一点就是fstab,完成上述的操作后,先运行blkid查看分区的新UUID,用编辑器打开/etc/fstab,替换转换了的分区的UUID,当然还有挂载类型改成ext4。

Tags: , , , ,

评论 (3)

通过Wine使用Sogou浏览器的教育网加速代理

此前用wireshark嗅探研究过Sogou浏览器的代理功能,没什么头绪,有访客留言说用Process Explorer瞧瞧Sogou的进程,今天有空看了下,果然,有一个子进程是用-proxy参数启动的,打开了本地的8081和8082端口在监听,用其他浏览器连8081,发现就是普通的透明代理,而8082则是一个自动配置代理的PAC(Javascript)。

虽然现在我的Ubuntu下已经有了一堆翻墙用的代理软件(没边、门、eTunnel……),但经常速度不甚理想,而且学校校园网的电信出口经常被挤爆,而教育网出口是空的,所以使用Sogou提供的免费教育网代理是个不错的解决办法。

把Sogou弄到Ubuntu下的Wine环境没有任何难度,把Sogou的安装文件夹全部复制到~/.wine/drive_c/sogou下,运行的很正常:

pentie@pentie-desktop:~$ wine "C:\sogou\SogouExplorer.exe" -proxy
fixme:win:EnumDisplayDevicesW ((null),0,0x32f3c4,0x00000000), stub!
fixme:wtsapi:WTSRegisterSessionNotification Stub 0x1002a 0x00000000
fixme:mountmgr:harddisk_ioctl unsupported ioctl 74080
fixme:mountmgr:harddisk_ioctl unsupported ioctl 2d1400
fixme:mountmgr:harddisk_ioctl unsupported ioctl 2d0c10
PID:8
PORT:8081
CPORT:8082
PAC:http://127.0.0.1:8082/proxy.pac?t=626
RET:SUCCESS

在配置Firefox的FoxyProxy,可以像平常那样添加127.0.0.1:8081作为代理,但既然提供了PAC,不妨试试:在Automatic proxy configuration URL内添入“http://127.0.0.1:8082/”,按Test,说找到PAC,解析成功!确定后右下角也出现FoxyProxy的提示。此时在Firefox中打开的网页都是通过Sogou的免费代理了!不过发觉现在的代理速度没此前那么快了。

Ubuntu中有一个工具可以配置全局代理,gnome-network-preferences,运行它可以轻松的让apt-get、telnet之类的程序通过代理来连接外网。

再一次提醒的是,Sogou浏览器代理是“透明代理”,它会转发你的真实IP,没有任何匿名功能,因为他们的服务器也在国内(北京),因此也不会有翻墙功能。

参考了别人的网志:http://dan.febird.net/2008/12/firefox.html

已知缺陷:在流量和连接数比较大时(比如刷开Google Reader),wine出来的SogouExplorer进程占用大量CPU资源,可能是某链接库匹配问题,以致这个方法的实用性不是很高。

Tags: , , , , , , ,

评论 (7)

初尝Linux下的AVR单片机开发

此前接触过AVR单片机,发现无论是书店里面的教材,还是网上一大堆的中文资料,无一例外都是说windows下使用WinAVR、ICCAVR之类的,Linux方面的简直只字不提,难道这就是传说中的中国国情?外国情况可很不一样,玩单片机的Geek一般都很哈Linux,做单片机开发的软件一应俱全,当然还是开源的。

昨天从淘宝重新买了条USB的下载线,回来一看是USBasp的设计,附送的光盘当然也是win下的驱动和说明了,忽略。

插上下载器,lsusb,认倒是认出来了,叫做VOIT,那怎么用呢?上网一搜,原来USBasp是德国人的设计http://www.fischl.de/usbasp/,GPL的,其中提到AVRDUDE支持USBasp,当然也有源码下载。不过我用的是Ubuntu,发挥超级牛力的时候到了:sudo apt-get install avrdude,恩,几秒钟搞定,让他们去编译吧!

Linux下做单片机开发当然首选GCC,就如这些英文教程说的,下载源码?No,No,APT has Super Cow Powers,继续sudo apt-get install gcc-avr binutils-avr avr-libc

几分钟装完,很好,估计那些下载源码回来编译的同学要去喝两个小时茶才能用了。

万事俱全,先写个单片机的HelloWorld,借用micahcarrick的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define F_CPU 1000000UL  /* 1 MHz CPU clock */
 
#include <util/delay.h>
#include <avr/io.h>
 
int
main (void)
{
        DDRC = _BV (PC0);               /* PC0 is digital output */
 
        while (1)                       /* loop forever */
        {
                /* set PC0 on PORTC (digital high) and delay for 500mS */
                PORTC &= ~_BV(PC0);                
                _delay_ms(500);
 
                /*  PC0 on PORTC (digital 0) and delay for 500mS */
                PORTC |= _BV(PC0);
                _delay_ms(500);
        }
 
        return (0);
}

....保存为toggle_led.c

命令时间:

avr-gcc -mmcu=atmega48 -Wall -Os -o toggle_led.o toggle_led.c

是不是似曾相识?平时用gcc就这么用的,这里除了把gcc改成avr-gcc,没多大区别。-mmcu定义了目标CPU的类型,我用的是atmega48;-Os是优化选项,减少程序的大小。这就是传说中的交叉编译。

接着把目标代码翻译成可以烧录到芯片上的hex文件:

avr-objcopy -j .text -j .data -O ihex toggle_led.o toggle_led.hex

avr-objcopy的-j参数限定转换的程序段,-O设定hex的输出格式,ihex即Intel Hex file

[Update: 本例子中,-j .data这个选项没作用,因为.data区根本没有数据;.data是存放初始化数组、字符串等数据的段,如果程序用到了,记得加上]

搞定,开烧:

sudo avrdude -p m48 -c usbasp -e -U flash:w:toggle_led.hex

因为直接读写USB接口,所以不给权限的话会提示找不到编程器,当然配置USB权限最好,这里暂时用sudo。avrdude的-p指定目标CPU,-c指定下载器,如果不知道所用的下载器是什么型号,敲avrdude -c会列出所有支持的下载器型号及其描述。-e即烧录前清空,-U参数指定刷写类型以及刷写文件。

[Update:可参考virtualbox使用usb的配置,把当前用户加入usbfs组,就可以直接使用avrdude了]

回车后下载器的指示灯闪了下,跟着单片机上的小灯开始闪烁,Hi, Hello World.

当然问题不是完全没有,我用avrdude下载完后默认的校验老是无法通过,说读取错误,只好加个-V来跳过校验。可能跟个别机器有关。

当然实际开发很少这样敲一大堆命令来编译程序,一般都用Make搞定。

对比起Win下满是GUI的程序,我第一次接触WinAVR都搞了半天,如何如何配置一个Project,哇那个属性窗口真让人眼花缭乱,使用gcc来开发,则可以循序渐进,未了解到的参数就不用,简洁,明了,但不失其功能强大。

资源:

Tags: , , ,

评论 (6)

让Ubuntu更新内核时自动编译官方版Nvidia驱动模块

目前Ubuntu 8.10中提供的最新Nvidia显卡驱动依然是180.11,除了不支持一些新的显卡,缺乏一些功能,在有些平台上也不稳定,容易Crash。很多人都用上Nvidia官网版的驱程,可是每当系统更新内核的时候,不得不回到console重新安装一次Nvidia,虽然不是很复杂,但长久如此,也挺麻烦的。

UbuntuForums上面一个Howto介绍了解决方法,下面简述之:

  • 本方法不适合使用EnvyNG安装的驱动。
  • 确保你全手动安装过Nvidia驱动并确定你所用的版本正常工作。

  1. 把NV的驱动安装文件复制到/usr/src,同时建立一链接。

    sudo mv NVIDIA-Linux-x86-180.37-pkg1.run /usr/src
    sudo ln -s /usr/src/NVIDIA-Linux-x86-180.37-pkg1.run /usr/src/nvidia-driver

    我安装的是180.37版本,注意不同版本的文件名不同。链接的作用是以后如果换一个新版的驱动进来,修改该链接即可,不用修改下面的脚本。

  2. 保存下面的代码为文件update-nvidia

    #!/bin/bash
    #
    
    # Set this to the exact path of the nvidia driver you plan to use
    # It is recommended to use a symlink here so that this script doesn't
    # have to be modified when you change driver versions.
    DRIVER=/usr/src/nvidia-driver
    
    # Build new driver if it doesn't exist
    if [ -e /lib/modules/$1/kernel/drivers/video/nvidia.ko ] ; then
        echo "NVIDIA driver already exists for this kernel." >&2
    else
        echo "Building NVIDIA driver for kernel $1" >&2
        sh $DRIVER -K -k $1 -s -n 2>1 > /dev/null
    
        if [ -e /lib/modules/$1/kernel/drivers/video/nvidia.ko ] ; then
            echo "   SUCCESS: Driver installed for kernel $1" >&2
        else
            echo "   FAILURE: See /var/log/nvidia-installer.log" >&2
        fi
    fi
    
    exit 0

  3. 把该脚本复制到/etc/kernel/postinst.d

    sudo mkdir -p /etc/kernel/postinst.d
    sudo install update-nvidia /etc/kernel/postinst.d

    install命令作用跟cp差不多,只是自动修改文件的权限为rwxr-xr-x

  4. OK,完成了。如果想测试一下是否已经成功,试试装个旧内核

    sudo apt-get install linux-image-2.6.27-10-generic

    稍候应该会看到最后会有一下停顿,然后看到SUCCESS: Driver installed for kernel ...
    再把这个包puege掉即可:

    sudo apt-get purge linux-image-2.6.27-10-generic

Tags: , , , ,

暂无评论

HOWTO: Compile jpcap 0.7 for amd64

As was introduced in it's project home, Jpcap is a Java library for capturing and sending network packets.  However, this project hadn't been updated for quite a long time, and NO any 64bit platform version was provided.

In the Google Discussion Group, "Tri" tried to compile jpcap in Ubuntu 8.04 64bit, and failed, giving such infomation:

/usr/bin/ld: /tmp/cc7mzY1t.o: relocation R_X86_64_32 against `a localsymbol'
can not be used when making a shared object; recompile with -fPIC


/tmp/cc7mzY1t.o: could not read symbols: Bad value

collect2: ld returned 1 exit status

make: *** [libjpcap.so] Error 1

In fact this's not a big problem, can be fixed easily.

Edit the Makefile, find such pragaph:(if you compile for Linux)

ifeq ($(PLATFORM), Linux)
JNI_INCLUDE2 = $(JAVA_DIR)/include/linux
COMPILE_OPTION = -shared -L.
SUFFIX = .so

Insert -fPIC to COMPILE_OPTION as reminded:

ifeq ($(PLATFORM), Linux)
JNI_INCLUDE2 = $(JAVA_DIR)/include/linux
COMPILE_OPTION = -fPIC -shared -L.
SUFFIX = .so

OK, try to make it, it should be done in seconds, and you get a 64 version of libjpcap.so.

The -fPIC option told the gcc emit position-independent codes for dynamic linking. I think this should be added whatever system you use, but somehow it works all right without -fPIC in 32bit Linux.

The java part of jpcap didn't need to compile again anyway, for the java platform indepentdence.

Then, copy it to /usr/lib/libjpcap.so, and /usr/java/packages/lib/ext/jpcap.jar, I bet every thing goes fine.

I already packed a deb and it works perfectly in Ubuntu 8.10 amd64, it should also be compatible to the whole Debian serious. Also, I correct the deb depent form sun-jave6-jdk to sun-jave6-jre, in fact, it even works OK with OpenJDK.

Download it here : http://ptcoding.googlecode.com/files/jpcap0.7_amd64.deb

Tags: , ,

评论 (2)

Page 1 of 212