Category Archives: linux

Linux下HiDPI 4k显示器和普通显示器双显示器设置

经受不住诱惑,败了一个4k显示器,比较经典的 DELL P2415Q,亚马逊价格2799,还算便宜,京东至少也是28xx的价格。顺便吐槽一下亚马逊,越来越不靠谱了,东西不全,以前觉得配送还可以,这次说周末到,也是冲着周末到才这么快下单的,结果周一才到。亚马逊的购物券花完了,以后转京东试试。

要用4k显示器现在都是需要设置HiDPI的,要不然字体太小,根本没法用。参考这篇Arch的wiki,试了几个桌面环境。我当前主力用的Mate环境还不支持HiDPI设置。首先试了Cinnamon,果然支持的很不错,都自动处理好了。可惜的是主题很难看,尤其浏览器里看文字输入框,都是黑黑的一片,输入的文字也不清晰,折腾了半天也没弄好,放弃了。又先后试了Fedora26里带的几个桌面环境,lxde、xfce等,都对HiDPI支持不好。最后不得不尝试gnome,因为自从gnome3之后我就放弃使用gnome了,实在是不习惯。

惊喜的是,gnome3有个gnome-classic模式,使用习惯上基本根gnome2类似,而且对HiDPI支持很好,也是自动都设置好了,字体果然比我之前 1680×1050 的显示器好看多了(用了快8年的显示器,当时还特意买的16:10的)。下一步就是设置双显示器,因为启用了HiDPI之后,非高清的显示器上的图标和文字都变的非常大。现在就想让非高清显示器是正常的DPI,4k显示器才是HiDPI。

正好,Arch的wiki上也有关于多显示器设置这么一节,基本就是使用xrandr命令直接设置两个显示器的位置,然后把非高清显示器用 –scale 参数放大,但实际屏幕还是那么大,所以效果就是图标和文字都变小正常了。但我照着wiki上的信息和其他google来的xrandr命令照猫画虎,怎么也不对,我觉得应该设置正常了的时候,非高清显示器一开始还能正确显示,但过几秒种之后显示器就又黑屏了,很奇怪。折腾了很久,调各种参数也不对,最后想到,我的非高清显示器只有dvi和vga接口,我现在的显卡没有vga口,我用的是vga转hdmi的转接线,是不是这个转换不稳定呢?就把hdmi口拔掉,直接用DVI口,重启再重新设置,副显示器终于不黑屏了……

下面是我的具体环境和命令。Dell 4k显示器分辨率是 3840×2160,作为主显示器,菲利普显示器分辨率是 1680×1050,作为副显示器,在主显示器的左边。命令是

xrandr –output DVI-D-0 –auto –scale 2×2 –output DP-0 –auto –pos 3360×0

–output DVI-D-0: 设置副显示器,各个显示器的名称可以通过 xrandr 命令的输出看到
–auto: 自动设置模式,一般就是最大分辨率
–scale 2×2: 把宽和高都放大两倍,原来是1680×1050,那么放大之后这块屏幕的大小就变成了 3360×2100,这点很重要

–output DP-0:现在开始设置主显示器
–auto: 同上
–pos: 设置显示器位置,因为主显示器在副显示器右边,那主显示器的起始位置就是副显示器的宽度,正常的话是1680,但经过scale之后就是3360了,y轴位置不变还是0

这个设置其实根arch wiki上的很类似,就是那里的例子是主显示器在副显示器的左边,而且没有 –pos 参数(虽然下边例子里也提到了)。没有–pos参数直接用的时候,在我这里主副显示器之间会有重合,也就是有那么一块地方在两个显示器上都显示,说明两个显示器之间的位置关系没设置对,就需要用–pos参数来指定了。

这个thread对我也有一些帮助,帮我更好的理解–pos参数,–fb参数,两个显示器之间的位置关系和那些数值怎么计算等等。到此4k显示器折腾了一天加一个晚上,算是告一段落。有好显示器了是不是要写一些好代码出来啊……

杂记mutt, GPG和邮件签名

最近由于工作需要,折腾了一阵mutt的多帐号支持和GPG key的签名,和给邮件签名。比较乱,随便记一下吧。

1. mutt的多帐号支持。
这个其实以前一直也在用,只不过是用起两个mutt实例,通过不同配置文件来区分的,比如默认的工作邮箱就直接 mutt 启动,个人的gmail邮箱就做了一个alias

alias mutt-gmail="mutt -y -F ~/.mutt/muttrc.gmail

在 ~/.mutt/muttrc.gmail 中配置好gmail的信息就可以了。

但是这次的情况不太一样,申请了一个 kernel.org 的邮箱,发往这个邮箱的邮件会转发给工作邮箱,所以我想最好能在回复的时候自动判断是发给哪个帐号的,自动用正确的帐号回复。不行的话能方便的用快捷键切换帐号也可以。搜索了一下”mutt multiple account”之类的,找到一些文章,但最后发现还是这篇文章最符合我的口味。大意就是用esc-1, esc-2快捷键,通过设置 “from=<user@domain>” 来选择帐号,同时因为用的是msmtp发送邮件,所以msmtp会自动根据这个域来判断该用哪个帐号发送邮件。同时设置不同的 status_line,来显示不同的帐号信息用来做区分。最后我的设置就是

macro generic "\e1" ":set from=account@company.com\n:set status_format=\"-%r-Company: %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p?Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---\"\n" "Switch to Company account"
macro generic "\e2" ":set from=account@kernel.org\n:set status_format=\"-%r-Kernel.org: %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---\"\n" "Switch to kernel.org account"

这样就方便多了,虽然kernel.org的邮箱可能会很少机会用到……

2. GPG签名
折腾这个也是为了申请kernel.org的帐号,要找一些牛来来背书。如何生成自己的公私钥对等等网上信息很多,就不说了。这里就记一下怎么把别人给你签名过的公钥里的签名和其他签名合并到一起。事情是这样的,我分别找了Dave和Eric给我签名,但他们都是下载的我在keyserver上的公钥,因为是远程认证的,所以他们分别签名&加密之后发给我,我需要把他俩的签名和之前的签名都合并到一起,然后上传到keyserver上,这样这两个新签名就增加上去了。看过了gpg的manpage之后发现其实挺简单的,就是用到一个 import-options 参数

gpg --import --import-options merge-only signature.asc
gpg --send-keys <KEYID>

3. mutt中发送签名的邮件
其实这个相对简单,正常写完邮件之后,在发送之前确认按“y”之前,先按“p”,开启 “pgp-menu”,里边会有选项和提示,是签名还是去掉签名,用哪个key签名等,签好了正常发送就可以了。

4. msmtp中发送签名的邮件
因为我有一个利用msmtp的脚本,用来在命令行下发送邮件。发普通txt邮件没什么问题,只是想给邮件签名再发送的话就得好好研究下这个邮件文件该怎么写了。

正常情况下,发送一个txt邮件,需要先写好一个邮件,包括From/To/Cc等信息,比如

$ cat >email.txt <<EOF
From: someone@somewhere
To: someoneelse@somewhere

This is a test email
EOF
$ msmtp -t <email.txt

这样在配置好msmtp的情况下,用 -t 参数告诉msmtp从stdin里读取收件人信息,直接就这么发出去了。

经过查看用mutt发给自己的带签名的邮件发现,签名信息其实就是一个附件,附在正文之后,只不过类型是”multipart/signed”和”multipart/pgp-signature”。不过仿造了几次带附件的邮件正文之后,发出去的邮件都报签名无法验证,也就是签错了……网上搜了好半天也没找到怎么把一个gpg签名附在一个邮件正文之后,最后还是去查标准吧,也就是RFC3156。里边对邮件哪部分是签名的信息,哪部分是后添加的header信息都做了说明,而且更主要的一点是,被签名的部分必须是 “CRLF” 结尾的,不能是单纯的 “LF” (也就是 \n)结尾,所以需要对正文进行一次 unix2dos 的转换……折腾了10次之后,终于发出了签名正常的邮件。

基本思路是,先把需要签名的正文写到一个临时文件里,然后用 unix2dos 转换格式,然后签名,得到签名信息。然后组装邮件头,模仿正常的签名邮件的格式就好,最后附上签名信息就可以了。把最后组装好的邮件文件写到指定的文件里。一个组装好的邮件文件的例子(里边的^M表示 \r\n,也就是需要签名的正文部分)

From: <from>
To: <to>
Subject: <subject>
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha1;
        protocol="application/pgp-signature"; boundary="x8WrEFNkdXnc"
Content-Disposition: inline


--x8WrEFNkdXnc
Content-Type: text/plain; charset=us-ascii^M
Content-Disposition: inline^M
^M
This is a test^M

--x8WrEFNkdXnc
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQIcBAABAgAGBQJYQ+hsAAoJECZSqilcj+djEUMQAJoDOM6lWX0sebjEZ/fgREAh
va/xKtYl3arD6BGrzuro2OdLrfWH0W+FM+/iNlOcGxmrECGv7QCQAD2okW+jbAes
hpeAlvGYQmS4l67y31nhY6lK5F2Uc2rzOqFOGOWiU4o/XKyueOYWJAdQzBm8hYG4
G042drLfE4Vvf81lReky9ElBoDpLzz+c7ExG2GVOs/4Ry8KabxyjtIPZelfOTNh+
8rZ+RWYHzBO9VLlImVK/z4p8+jutn9Dko6l2YkYnOcoZypChUA+/uFBLtxZe8cup
BJVrPkUaxrq+wik1abRCi97UAPw420EaiY9AjDZXZR7sy1cT9QLQ69BjOS1T4icb
RiEhoIvN4ctBxaN/Jq4mA7J2O2aYto9Kq2fRwLaNtWJwZpOmUFr8fQ9q4hcY/6K/
kiYAjp+L4A8DHXk4mhzaXJP1rJVhDITnnowel1FWirG7gPUCGe1ThGFoaqmrDF3o
PUJ6rmpcHn+sH6ppG5JjeHj3PantLIhzCA0VqQ+HxrlJ/E94G+BmrVo7Rvoj5p0v
omhSNiE7FTrvw6tKeDlyM8G59qCrsJ7ITTSL6oiHbCK8IFw938Jns/QaRnrDaFIo
C3l7zjZXrMqQQqbTeO1+LjeNntD2ggY9YmR83H3g3U5YFAfHdTtON7QUY/XtMQhG
LVKbouYC9D1r3/EULPnm
=fwZa
-----END PGP SIGNATURE-----

--x8WrEFNkdXnc--

Linux下恢复误删文件

周五篮球群里有人问误删文件了怎么恢复,得知是ext4文件系统之后我推荐了ext4magic这个工具,然后又有人提到了xfs的话怎么办,正好前几天看到Dave Chinner在邮件列表里提到了这个问题,他推荐的工具是xfs_irecover。这里就稍微总结一下Linux下误删文件如何恢复。

1. 当发现误删了文件之后,立即把文件系统卸载掉,或者remount成ro状态,就是不要再写了,让数据不要被其他数据覆盖。因为大部分文件系统在删除文件的时候只是把这个文件标记成删除,把文件所使用的数据块标记成可用,但是上边的数据还没有被清除,数据还是在的。那么这个时候不再写硬盘也就保证了数据块不会被其他数据覆盖掉,也就还有希望找回来。

2. 这一步是可选的。最好把要恢复的分区做一个镜像,dd if=/dev/sda5 of=/path/to/image/file bs=4k,这样在恢复的时候在镜像上尽兴,就算恢复出错数据被毁掉了,那也是镜像。

3. 根据不同的文件系统,选用不同的工具来找回删除的文件。ext3推荐用ext3grep,ext4用ext4magic,其实ext4magic是基于ext3grep的,而且ext4magic也能处理ext2/3文件系统;xfs用xfs_irecover,xfs_irecover的manpage在这里

4. 至于能够恢复多少数据出来,那就看人品了

这里用ext4做个例子

# create ext4 fs and copy some files there
fallocate -l 16m ext4.img
losetup -f --show ext4.img
mkfs -t ext4 /dev/loop0
mount /dev/loop0 /mnt/ext4
cp  /mnt/ext4/
sync

# delete some files
rm /mnt/ext4/*

# umount the ext4 fs, this is important!
umount /dev/loop0
# make a copy of the fs
dd if=/dev/loop0 of=ext4-copy.img bs=4k
# run ext4magic on the image
ext4magic -m -d outputdir ext4-copy.img
# some sample output from the command
eguan@localhost:~/workspace/src/kernel$ sudo /home/eguan/bin/ext4magic -m ext4.img -d testdir
Warning: Activate magic-scan or disaster-recovery function, may be some command line options ignored
"testdir"  accept for recoverdir
Filesystem in use: ext4.img

Using  internal Journal at Inode 8
Activ Time after  : Sun Jun  7 22:43:54 2015
Activ Time before : Sun Jun  7 23:02:18 2015
Inode 2 is allocated
Unknown code ext2 45 #0 for block bitmap for ext4.img
Warning: error-NR 2133571363 can not found file: /
MAGIC-1 : start lost directory search
MAGIC-2 : start lost file search
--------        testdir/MAGIC-2/image/jpeg/I_0000000012.jpg
--------        testdir/MAGIC-2/image/jpeg/I_0000000013.jpg
--------        testdir/MAGIC-2/image/jpeg/I_0000000014.jpg
MAGIC-2 : start lost in journal search
MAGIC-3 : start ext4-magic-scan search
ext4magic : EXIT_SUCCESS

更多使用方法看ext4magic的manpage吧,就在源码包里。

Fedora 22上guake的双屏幕问题

Fedora22明天应该就要GA了,周末先升级到了f22,整体感觉还不错,比较显著的更改就是由yum转到dnf,但是继续用yum也是可以的。

但每次升级Fedora,都要跟guake的双屏幕问题斗争一番。不是失去焦点回不来就是只能在一个屏幕上显示。这次又是只能在第一次启动guake的屏幕上显示,不跟随鼠标来选择屏幕,虽然在配置里已经勾选了”Appear on mouse display”。曾经一度想过换一个下拉式的terminal,试了tilda和yakuake,还有xfce4-terminal的新drop-down特性(xfce4-terminal –drop-down),但都不能满足我的需求,不是不能全屏就是不能跟随鼠标移动,xfce4-terminal的下拉特性还是实验性质的,全屏之后还会变回原来的样子。最后还是继续折腾guake吧。

经过一番debug发现,选择屏幕的函数set_final_window_rect()在切换屏幕之后根本没有调用到,当然就不能跟随鼠标了。找到函数调用者,发现原来是全屏的影响

        if not self.is_fullscreen:
            window_rect = self.set_final_window_rect()

也就是说,在全屏模式下,不会切换屏幕。这个修改是因为在全屏的时候不需要给terminal发送resize信号,这个信号会导致terminal上的内容重排,有时很烦人。一个小patch去掉全屏判断就解决这个问题了,虽然需要继续忍受resize信号,但也比不能双屏幕好。

user@dhcp-13-216:~/guake$ git diff
diff --git a/src/guake/guake_app.py b/src/guake/guake_app.py
index 9b89c33..b1c4da7 100644
--- a/src/guake/guake_app.py
+++ b/src/guake/guake_app.py
@@ -663,8 +663,7 @@ class Guake(SimpleGladeApp):
         self.hidden = False

         # setting window in all desktops
-        if not self.is_fullscreen:
-            window_rect = self.set_final_window_rect()
+        window_rect = self.set_final_window_rect()
         self.get_widget('window-root').stick()

         # add tab must be called before window.show to avoid a

走SOCKS代理收发gmail邮件

自从gmail的smtp server被干掉之后我还没用gmail发过邮件和patch,由于偶尔还是能收到邮件的,也就没仔细折腾。今天要发一个patch,发现果然是发不出去啊。找办法绕道走吧。google被封的完全残废了啊。

我用的是mutt邮件客户端,用fetchmail收邮件,用msmtp发邮件,自己有个vps,那就走ssh隧道吧。只要找到这两个软件走socks代理的方法就行了。

google fetchmail socks proxy,找到了,大意就是用fetchmail的plugin功能,通过socat来转发邮件内容,最后 ~/.fetchmailrc 的内容如下

poll imap.gmail.com
protocol imap service 993
plugin "socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=8888"
user username
password yourpassword
keep ssl
sslcertfile /etc/pki/tls/certs/ca-bundle.crt
mda "/usr/bin/procmail ~/.mutt/procmailrc.gmail"

注意两点,plugin那一句好像要放在考前的地方,我一开始放在了password下边,结果启动fetchmail报错,没细看原因。第二是协议用SOCKS4A,我先用了5,好像是收不到信。总之现在这个配置是能正常收信的。

再google msmtp socks proxy,发现msmtp自带了 proxy_host/proxy_port 功能,赶紧配置了一下,结果不认……最后发现是1.6.2版本才有的,Fedora 21上自带的还是1.4.32版本,那只好自己编译msmtp了。(14年12月才加进来的socks proxy支持。)现在msmtprc配置如下

defaults
logfile ~/.msmtp.log

# Gmail account
account gmail
host smtp.gmail.com
port 587
proxy_host 127.0.0.1
proxy_port 8888
tls on
tls_trust_file /etc/pki/tls/certs/ca-bundle.crt
from yourname@gmail.com
auth on
user yourname@gmail.com
password yourpassword

这样一来,mutt和git send-email又都能正常工作了,只不过要一直开一个ssh tunnel了。(用了shadowsocks,好像和fetchmail/msmtp都结合不好,收发不到邮件。)

网络信息时代,要身手矫健,各种爬墙搭梯子,心里念念不忘老校长,我会一直祝福他老人家的……

Linux下通过mame玩模拟器游戏

其实之前也在Linux下玩过模拟器游戏的,不过用的是xmame,mame的X前端吧。不过随着Debian的升级,不知道什么时候xmame这个包没了,只有mame,其实都差不多了。

首先要有ROM文件,也就是游戏。比如把所有ROM都放在了$HOME/games/roms目录下,那么就配置$HOME/.xmame/xmamerc这个文件(虽然用的是mame,但xmame的配置依然有效……),把rompath变量换成$HOME/games/roms或其他任意你放ROM的目录。然后直接运行mame应该就没什么问题了,能看到游戏列表,进入游戏后按TAB键能够配置键盘的输入。

我还尝试使用手柄,但是一直没配置成功,这里就不细说了。

我以前有一些rom的,比如kof97,1945,合金弹头等等,但是基本上在运行的时候都提示说缺少一些相关的bin文件。网上搜了一下,跟rom的版本也有关系。然后发现了rom hustler,重新下载了kof97,合金弹头5,s1945/s1945ii/s1945iii/gunbird/gunbird2,还有双节龙……其实有很多下载ROM的网站,但至少这几个从rom hustler上下载的游戏在我机器上都能顺利玩起来了。

玩了一晚上拳皇97,找找本科在宿舍和同学一起砸键盘的感觉,只是手指已经生疏,好多招也忘了怎么发了。

Linux下通过键盘快捷键在双屏幕之间切换焦点

在办公室一直在用synergy,在两台电脑之间共享鼠标键盘,而且配置了快捷键能方便的在两台电脑之间切换(文章一文章二文章三)。但是一直没有找到一个好方法能方便快捷的在双屏幕之间切换焦点,必须手离开键盘移动一下鼠标,很不爽……

针对这个问题以前也搜索过,但是没找到什么好方法。这两天不死心继续搜索,发现一个叫做dualscreen-mouse-utils的工具,但是在我的Fedora21系统上却工作不正常。那个mouse-switchscreen一直报错,我不懂X编程,无能为力了……

Opening display :0.0
Window ID is 360002e, focus is 1
Saving /home/eguan/.pointer-0
Moving to screen 1, x = 0, y = 0
X Error of failed request:  BadWindow (invalid Window parameter)
  Major opcode of failed request:  41 (X_WarpPointer)
  Resource id in failed request:  0x18
  Serial number of failed request:  9
  Current serial number in output stream:  12

继续不死心,man -k mouse了一下,看看能否发现模拟鼠标操作的工具,结果还真发现了一个,xdotool。看了一下manpage,很强大,能够通过命令行输入组合键,移动鼠标,点击鼠标,获取活动窗口,获取鼠标位置等等。于是想了一个不完美,但是能用的方法。

先把鼠标移动到主屏幕某个最大化的窗口的标题栏上,获取鼠标坐标,比如X=760 Y=32,同样把鼠标移动到次屏幕某个最大化的窗口的标题栏上,获取坐标,比如X=2450 Y=15,然后写这样一个脚本

$ cat ~/bin/switch-screen.sh 
#!/usr/bin/bash
if [ "$1" == "-l" ]; then
        xdotool mousemove 760 32
        xdotool click 1
elif [ "$1" == "-r" ]; then
        xdotool mousemove 2450 15
        xdotool click 1
else
        echo "Usage: $0 "
fi

于是用-l参数运行脚本的时候,xdotool把鼠标移动到主屏幕预设的位置,然后点一下鼠标左键,相当于移动鼠标过去并获取了焦点。用-r参数运行的时候同样,只不过移动到次屏幕上获取焦点。

这样做的缺点是,换了屏幕大小和位置这些坐标都得重新获取一个合适的值。不过对我现在来说够用了。接下来就是用xbindkeys配置键盘快捷键。

$ cat ~/.xbindkeysrc 
"$HOME/bin/switch-screen.sh -l"
  Control + 3

"$HOME/bin/switch-screen.sh -r"
  Control + 4
$ xbindkeys # run xbindkeys as daemon

这个配置就是说把ctrl+3绑定到把焦点移动到左边屏幕,ctrl+4绑定到把焦点移动到右边屏幕。到此,在两个电脑之间移动焦点和在两个屏幕之间移动焦点都能通过键盘来完成了,也早就把mutt/irssi扔到screen里,并通过guake呼来唤去,firefox有vimperator插件,这样使用鼠标的机会越来越少了。

RHEL6上用virt-install在终端下安装kvm guest

首先配置host上的网桥,这样guest通过网桥链接网络,能够从dhcp得到一个从外部访问的IP。这部分我是参考这个.

配置网桥之前先确保bridge-utils已经装好了。

cp /etc/sysconfig/network-scripts/ifcfg-eth0{,.bak}
echo "BRIDGE=br0" >> /etc/sysconfig/network-scripts/ifcfg-eth0
cat > /etc/sysconfig/network-scripts/ifcfg-br0 <<EOF
DEVICE="br0"
BOOTPROTO="dhcp"
ONBOOT="yes"
TYPE="Bridge"
EOF
service network restart

这样之后应该能看到一个br0设备,host现在也是通过这个设备在链接网络。

然后安装系统

virt-install -r 8192 --vcpus=4 --location=http://example.com/rhel7/os \
--disk path=/path/to/imagedir/rhel7.img,size=300,format=qcow2 \
--network bridge=br0 --virt-type=kvm --extra-args="console=ttyS0,115200" \
--name name

最后的–extra-args是给内核启动的额外参数,能够让guest的终端输出到当前终端上,方便安装。从这里搜索到的结果.

如果用RHEL7做host,命令行是

virt-install -r 2048 --vcpus=4 --location=http://example.com/rhel7/os/ \
--disk path=/path/to/fs.img,size=150,format=qcow2 --network bridge=br0 \
--virt-type=kvm --extra-args="console=ttyS0,115200n8 serial" --name name \
--console pty,target_type=serial --graphics none

然后进入rhel7的安装过程,这个时候系统已经能够自动获取ip,然后选择通过vnc安装,用vncviewer连接anaconda给出的地址和端口就可以开始安装过程了。

系统装好之后,可以用virsh来启动,也可以通过virsh里的console命令来看guest的console输出,看dmesg输出和debug就比较方便了。

Debian下使用TP-LINK WN722N USB无线网卡

搬家了,但是网络布线很失败,虽说现在基本都用无线了,但是布线的失败还是让我很不爽。不爽归不爽,网还是要想办法上的。

笔记本无所谓了,一直都是无线上网的,我的台式机就有麻烦了。于是网上搜了下Linux下使用外接无线网卡的内容,基本有两种选择,一是用USB外接无线网卡,二是买一个笔记本的mini pcie网卡,再买一个转接口插到机箱里。第一种的好处是,产品成熟,不用折腾,坏处是Linux下的驱动可能不完善,可能会不能在Linux下使用。第二种的好处是Linux下kernel基本都带驱动了(一般笔记本装好系统无线就是能用的),坏处就是需要自己买两种东西拼在一起,还不一定什么时候到货。我为了马上能用上无线,就不折腾了。

既然要买USB无线网卡,那么一定要选一个Kernel里有驱动支持的。水木上有人推荐TP-LINK的这个WN722N,固件是AR9271,Linux上是免驱的。上wikidevi查这个网卡的驱动也能看到是ath9k_htc,查看modules.alias文件也能看到ath9k_htc驱动,我就放心买了。今天凌晨下单,上午就到货,amazon的物流速度很不错。

Widnows下装光盘自带的驱动就好了,linux下还是需要一些工作的……google “debian ar9271″,能找到这个链接,发现只要安装firmware-atheros这个包就好了。但是没有网络,又要安装包,只好在笔记本上下载下来优盘传过去了……重启之后网卡就能正常使用了。

顺便说一下,我的系统X系统挂掉了,这些设置都是在console下完成的,需要iwconfig命令(在wireless-tools这个包里,依然用优盘copy过来)

iwconfig wlan0 essid "your essid"
/etc/init.d/network-manager stop
dhclient wlan0

这里需要注意的是要关闭network-manager,否则网卡处在network-manager管理之下,dhclient不会得到ip地址。因为我隐藏了essid,并设置了MAC地址过滤,所以没设置密码。

systemtap初学者小记两笔

一直对systemtap挺感兴趣的,但是一直也没怎么好好用过,一些简单的东西也是用过就忘。最近有稍微看了下,记录两笔吧,省着以后又忘了。

现在我对systemtap的使用还是很初级的,基本就是看看函数的参数值,某个变量的值。

首先要看一个函数都有什么是可以查看的。比如我想看ext4_unlink这个函数。这个时候可以使用stap -L来列出systemtap可以查看的函数参数。

# stap -L 'module("ext4").function("ext4_unlink")'
module("ext4").function("ext4_unlink@fs/ext4/namei.c:2177") $dir:struct inode* $dentry:struct dentry* $__func__:char[] const

以 $ 开头的变量都是在systemtap脚本里查看的,比如以下stp脚本对 $dir->i_ino的引用

probe module("ext4").function("ext4_unlink")
{
        printf("%s: comm %s, pid %d, dirinode = %d\n", probefunc(), execname(),
                pid(), $dir->i_ino);
}

函数的参数知道怎么看了,那么函数的自动变量呢?我用statement这个probe point。比如我想看fs/namei.c:2663初一个叫error的自动变量的值

probe kernel.statement("*@fs/namei.c:2663")
{
        printf("%s: comm %s, pid %d, error = %d\n", probefunc(), execname(),
               pid(), $error);
}

可以参考systemtap的文档