Tuesday, August 12, 2014

来自舟山的回忆图片: 舟山 沈家门码头
来自舟山的回忆  图片: 舟山 沈家门码头

  三月的烟雨 飘摇的南方
  你坐在你空空的米店
  你一手拿着苹果 一手拿着命运
  在寻找你自己的香
  窗外的人们 匆匆忙忙
  把眼光丢在潮湿的路上
  你的舞步 划过空空的房间
  时光就变成了烟
  爱人 你可感到明天已经来临
  码头上停着我们的船
  我会洗干净头发 爬上桅杆
  撑起我们葡萄枝嫩叶般的家
  周云蓬说,米店这首歌,应该被舟山或者泉州这样的海边小城买去,作为市歌, 在细雨如斯的清晨广场上播放,整个小城都能隐隐地听到。人们懒洋洋地吃上早点,悠闲美好的一天即将开始。

Monday, January 13, 2014


figured out the simplest way to run Linux on a Mac


the latest Mac boots EFI way, it's much simpler than the legacy way of master boot record / boot sector:

here are the steps for Ubuntu studio, can be applied with any Debian / Ubuntu based distro (including Mint)

1) make sure a usb stick in FAT format;
2) get ubuntustudio-13.10-dvd-amd64.iso (officially from http://cdimages.ubuntu.com/ubuntustudio/releases/saucy/release/), open this iso with any Archive manager, copy boot/ and EFI/ to the root of usb stick; the EFI directory contains files of EFI/Boot/bootx64.efi and bootgrub.efi; the boot/ contains grub modules and conf files;
3) mkdir /ubuntustudio/ on the root of usb stick (can be any other names if you want), copy /casper/{vmlinuz,intrd.lz} from the iso to this studio/capser/; this is linux kernel and initrd to boot with;
4) copy the ubuntustudio-13.10-dvd-amd64.iso to /ubuntustudio/ of the usb stick;
5) edit /boot/grub/grub.conf, add this as first menuentry:

enuentry "Start Linux Ubuntu-Studio 13.10 (Saucy Salamander)" {
set gfxpayload=keep
linux /ubuntustudio/vmlinuz  file=/cdrom/preseed/mint.seed boot=casper iso-scan/filename=/ubuntustudio/ubuntustudio-13.10-dvd-amd64.iso quiet splash --
initrd /ubuntustudio/initrd.lz
}


Plugin this usb stick, boot mac with holding Option key, till boot manager shows up with a new EFI boot, that is for the usb stick boot option, choose it boot!




References:

  1. http://www.makeuseof.com/tag/how-to-boot-a-linux-live-usb-stick-on-your-mac/
  2. https://help.ubuntu.com/community/UEFI
  3. https://wiki.archlinux.org/index.php/Boot_Loaders


Tuesday, January 07, 2014

goodbye thinkpad welcome macbook, was running archlinux64 + debian, this is ubunto studio 13


Monday, December 16, 2013

Sunday, October 27, 2013


我已读完了Rachael 写的很多篇章,有种让人身临其境之感,试译一段如下:
 
2013年9月22日。Tahoe湖之南
 
清晨醒来时,碰上了今年的第一场雪,那真是一个完美的早晨。天空是明丽的蓝,整个世界都在闪闪发亮。云层消散后我看到了一个广阔的世界,周围的岩石峭壁,它们只是被一层薄薄的积雪覆盖着。地面积下的清新雪迹让我们得以察知是与谁为邻:有鹿、有兔子、有小灰狼、还有美洲豹、还有熊经过的印迹。看起来像是有位熊妈妈与它的两只幼崽在这儿嬉闹过,它们在这个早晨还真是有一段愉快的时光啊。这清新的薄雪给这大山带来的,是完全不一样的、绝对是令人赞叹的景象哪。白天里我们穿越瑰丽的高山,傍晚时分天空又闪耀着金黄的云彩,就像是在火焰上舞蹈一般。太阳下山后不久,我们听到一群丛林小灰狼的歌唱,那真是美丽得令人流连忘返。在星空下露营,看着月亮升起时我们正在分食着豌豆汤。夜晚很冷,但在任何有选择的时候我总是喜欢露营,看见星光闪耀,世上再没有比这更好的方式入眠了。
 
http://rachelandbennyhikethepct.blogspot.com/2013/10/south-lake-tahoe-to.html

Wednesday, September 25, 2013

Hybrid Running 32bit applications with 64bit OS kernel

对于浏览器内经常开到40以上的标签页来说,64位程序的浏览器占用内存太多,动辙数G的物理内存消耗。 浏览器内的Flash插件也是消耗内存的大户。

解决办法是以32位浏览器来代替运行,但在64位OS下又要安装multilib库,同样的库文件安装两份, 对于SSD硬盘的容量来说又要消耗不少空间。

正好硬盘上另一分区有以前残存的一个32位Ubuntu,借壳来运行32位程序倒是不错。

# mount /dev/sda6 /mnt/sda6
# mount -o bind /home /mnt/sda6/home
# mount ... for proc sysfs /dev ...
sudo chroot /mnt/sda6 su -l user
/opt/google/chrome-26/google-chrome --extra-plugin-dir=tmp/firefox/browser/plugins

最终得到一个浏览器UA如下:

User-Agent: Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31

说起32位程序它不能利用64位CPU的所有寄存器,效率又有所不足,理想的解决方案应该是x32,目前看起来这个方案Intel也是也出台好几年了,但似乎没什么发行版跟进,毕竟重编译所有的库所有的应用程序这工作量实在不小,虽然它能被证明比纯32位和纯64位运行都快,但市场容量有限哪,人们对PC的兴趣转移走了也是重要的原因。现有的64位和32位能work就行。

Thursday, February 07, 2013

SVLUG talk on Feb6, 2013

http://distrowatch.com/dwres.php?resource=popularity 昨天有人提到 Ubuntu老矣,是因为 Canonical 已经走了歧途, 并举例 distrowatch 为证,最近一个月、最近三个月、最近六个月、最近12个月,关注度最高的一直保持在 Linux Mint, 这个发行版做得不错, 两年坚持使用 Gnome3的体会:桌面还是不错的,坚持使用, every single day 的使用,工作以及生活只启动此系统;我喜欢常按 Super键,给大家做会议演示时呼出平铺的窗口,从 Applications 中找出需要的应用程序,界面华丽。不过 gnome-shell 还是有泄露内存的嫌疑,每日使用只 suspend/resume 从来不关机的情况下,在连续七天以上之后 gnome-shell 在RSS中显示使用超过500M物理内存,这是 x86_64 的情况,可能是内存指针用得疯狂啊。workaround 是kill掉再启一个 gnome-shell. 下一次安装时,桌面还是用 i686 比较省点内存吧,64位模式下连 Xorg 也常常用到100多M内存,而32位下只需40M;有了4G物理内存,一般不用swap,但Chromium中的网页开到40个以上时,有点紧张,可以选择性kill掉一部分chromium进程 $ ps u -e --sort rss $ ps u -e --sort pcpu Arch/Gentoo 用到一定程度时,该安装的程序都装好了,渐渐地不再滚动,只能定时去 refresh 新的 distro, 不过两年不短了,这是一个定时强迫去接受和发现新的发行、新的应用的好时机;短暂地离开,是为了更好的前行,了解熟悉到一定程序,随时都可以回来的 最后提到 freebsd dying, 因为 fund 逐渐消失,开发人员都逐渐 廉颇老矣、、 sigh ...

Monday, August 06, 2012


Got an eSATA / USB3.0 Dual Bay HDD Dock:
  1. http://www.vantecusa.com/en/product/view_detail/494
  2. http://www.amazon.com/gp/product/B007XJIYRC/
The first impression is incredibly both bay cannot work at same time, then I found it's actually because of CONFIG_SCSI_MULTI_LUN not default enabled: under USB mode, the dock is assuming having 2 luns, SCSI-3 standard has REPORT_LUN command but seems this device doesn't responds REPORT_LUN query, so it assumes only 1 lun, found 1 drive only; we can do a manual scan:

echo '- - 1' >/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.0/host12/scsi_host/host12/scan

After that the kernel scsi_mod middle layer would scan lun 1, found the 2nd drive; or could learn from Linux USB Frequently Asked Questions: or add scsi_mod.max_luns=2 to kernel boot parameter

(http://www.linux-usb.org/), "options scsi_mod max_luns=2" (updated to latest linux kernel v3.5)
$ dmesg
[15011.760697] usb-storage 2-1.1:1.0: usb_probe_interface
[15011.760709] usb-storage 2-1.1:1.0: usb_probe_interface - got id
[15011.760806] scsi12 : usb-storage 2-1.1:1.0
[15012.762244] scsi 12:0:0:0: Direct-Access     ST910006 40NS             CC01 PQ: 0 ANSI: 5
[15012.762847] sd 12:0:0:0: Attached scsi generic sg2 type 0
[15012.763368] sd 12:0:0:0: [sdb] 1953525168 512-byte logical blocks: (1.00 TB/931 GiB)
[15012.763787] scsi 12:0:0:1: Direct-Access     WDC WD16 00AAJS-00YZCA0   01.0 PQ: 0 ANSI: 5
[15012.764013] sd 12:0:0:1: Attached scsi generic sg3 type 0
[15012.764584] sd 12:0:0:0: [sdb] Write Protect is off
[15012.764587] sd 12:0:0:0: [sdb] Mode Sense: 23 00 00 00
[15012.765111] sd 12:0:0:1: [sdc] 312581808 512-byte logical blocks: (160 GB/149 GiB)
[15012.765865] sd 12:0:0:0: [sdb] No Caching mode page present
[15012.765871] sd 12:0:0:0: [sdb] Assuming drive cache: write through
[15012.766619] sd 12:0:0:1: [sdc] Write Protect is off
[15012.766625] sd 12:0:0:1: [sdc] Mode Sense: 23 00 00 00
[15012.767612] sd 12:0:0:1: [sdc] No Caching mode page present
[15012.767618] sd 12:0:0:1: [sdc] Assuming drive cache: write through
[15012.769723] sd 12:0:0:0: [sdb] No Caching mode page present
[15012.769726] sd 12:0:0:0: [sdb] Assuming drive cache: write through
[15017.751786] sd 12:0:0:1: [sdc] No Caching mode page present
[15017.751795] sd 12:0:0:1: [sdc] Assuming drive cache: write through
[15022.187904]  sdc: sdc1 sdc2 < sdc5 >
[15022.216575] sd 12:0:0:1: [sdc] No Caching mode page present
[15022.216580] sd 12:0:0:1: [sdc] Assuming drive cache: write through
[15022.216584] sd 12:0:0:1: [sdc] Attached SCSI disk
[15022.222847]  sdb: sdb1 sdb2 sdb4 sdb5
[15022.227795] sd 12:0:0:0: [sdb] No Caching mode page present
[15022.227800] sd 12:0:0:0: [sdb] Assuming drive cache: write through
[15022.227802] sd 12:0:0:0: [sdb] Attached SCSI disk
Well recognized:
$ lsscsi -gv
[12:0:0:0]   disk    ST910006 40NS             CC01  /dev/sdb   /dev/sg2
[/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.0/host12/target12:0:0/12:0:0:0]
[12:0:0:1]   disk    WDC WD16 00AAJS-00YZCA0   01.0  /dev/sdc   /dev/sg3 
[/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.0/host12/target12:0:0/12:0:0:1]
When attached to USB 2.0 ports, it archives 30MB/s sequential read/write performance, not as optimal as eSATA 100MB/s; This USB is actually "Mass Storage" / "SCSI" / "Bulk-Only" should be able to use uas (USB Attached SCSI) protocol, but not sure why uas drive not attached, a forced bind neither work

$ lsusb -d 174c:55aa -v
Bus 002 Device 003: ID 174c:55aa ASMedia Technology Inc. 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x174c ASMedia Technology Inc.
  idProduct          0x55aa 

[...]
  Configuration Descriptor:
    Interface Descriptor:

      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk-Only
# echo 2-1.1:1.0 > /sys/bus/usb/drivers/usb-storage/unbind
# echo 2-1.1:1.0 > /sys/bus/usb/drivers/uas/bind
write error: No such device
need another time to figure out why.

Monday, June 25, 2012


一月份去洛杉矶的时候顺便walk in进加拿大领事馆办签证,隔天取到。

六月份最近Southwest飞Seattle, 玩一天再Amtrak火车赴Vancouver, 四小时到达,住与 US
Consulate Vancouver (1075 W Pender St) 只隔一条街的 Days Inn (921 W Pender
St); 第二天一早去US Consulate; VO只问了学位情况,我确实没有北美的学位,只能
如实回答 Bachelor from China Mainland, 他说没关系,看了一会材料最后说
Approved, 3工作日取,实际上第二天晚就收到Loomis来信说ready for pickup; 这三
天实际上租车往Banff去了,但没有到达,在Kamloops折返。回来在机场附近 5001
Miller Rd 的 Loomis 办事处取了护照,然后还车去机场租车处。在YVR机场里面找到
了 Pacific Coach 大巴去了Victoria; 再玩一天然后乘 Clipper Ferry 回 Seattle并
入境美国。边境官只把I94移到了新的visa页上;没有换I94, 应该就是传说中的 Auto
Revalidation 吧。最后乘Southwest离开。
整个行程不一定是最优惠的,但在陌生的地方想体验一下各种不同的交通方式:飞机、火车、市内地铁、大巴、轮渡、自驾车。

在加拿大租车期间算是见识了加国有着最疯狂的 truck drivers, 这些大货车经常跑过
来在超车道行驶,当我在双车道山路上(限速100km/h)以120km/h行驶时发现还有truck
试图在左道超过我,我估计它有130km/h; 换Mile算,也就是此truck试图在左道以80迈
超过小车的75迈。我算了让他过吧,在国内老是记得有小车被大卡压住让我有心理阴影
,我减速一点让它快点过吧。最终在 1 West 让我看到了一辆横躺在路中间的大卡。右
边就是急流飞涧哪,还好算它有运气没有掉河里,也没有小车倒霉被它压住。不过整个
路面被阻住了半小时多。

Monday, May 21, 2012

gimp-2.8-screenshoting-is-great.html


Friday, May 18, 2012


一个行尾逗号引发的悲剧

一个设备上运行的http管理界面的online help, 其中有一个help.js定义help页面名称,用于链接管理界面上随处可见的"?", 点击"?"即可直接打开online help并跳转到对应help页面;

var helpMap = {
        none:                                           "Overview.html",
        SystemSummary:                          "SystemSummary.html",
        InventoryCPU:                           "InventoryCPU.html",
        [...]
        ClearConfigs:               "ClearConfigs.html"
};

上个月在这张查找表中添加最末一项,一不小心多写了个逗号;这在C语言数组中很常见,最后一项的行尾逗号可有可无,但写起来比较美观、一致


        ClearConfigs:               "ClearConfigs.html",

本人常用Firefox/Chrome用起来都没问题;直到一个月后某Windows用户用IE打开管理界面,这个也没问题,但尝试online help的时候悲剧了。我记得二月中的一个版本当时为修正支持Chrome问题时测试过IE没问题,为些只能从那一个 good build 开始了二分查找,过程类似于git bisect

最后定位问题在于这个行尾逗号,必须删除。怎么都不敢相信,IE6,IE7,IE8,IE9全都如此脆弱

Sunday, February 12, 2012

从 Santa Clara County 图书馆借来的最新《The Linux Programming Interface》2010年出版




p1







p1

Wednesday, September 28, 2011

四月的暖風吹過,遠方傳來了爺爺過世的消息。今年硅谷的春天似乎來得特別早,立春才過這裡的櫻花樹就已經含苞待放了。❀
  群山黛如墨色,從太平洋來的風吹過如風鈴,不斷重複放送著遠方已經落幕的故事。
  
  
(一 )
  爷爷走得很突然。正如他一直所希望的那樣,無病無災,乍然離世。
  民國十三年出生,在那個軍閥割據的年代。出生在大別山區的一隻餘脈,現在是六零年代所築成的一個水庫之底。少時家裏頗有幾分田產,除了自家人耕種之外,需另僱短工才能完成全部的收成。但這些也注定了解放以後成為被批鬥階層的厄運。那個大山裏的稻田其實都是薄田,就我年少時曾經回鄉拜祭祖爺爺靈位時所見,那山裡的稻田跟平原上現代農業耕種的田野全然不同,它沒有平原上那樣大塊的一望無垠,而是山溝裡十分小塊的梯田,日出勞作都十分辛苦,需要翻越很多道山嶺才能到達;山溝裡只有半日陽光,莊稼普遍都長不太好,還需要擔心野獸的出沒,一旦有野豬的光顧,那毫無辦法,整條山溝的莊稼都會毀個大半。這樣的田地其實不適合耕種,近些年隨著農業政策的改變,那裡已經逐步退耕還林了,重建的是大別山國家森林。
  爺爺一家兄弟四人,排行第四,外有一位小妹。許多年後我曾唯一一次碰到他們相遇,那時前三位兄長已逝,我聽到她親切的叫了一聲『四哥…』 不知道他們在一起談了有多久,那個下午有知了一直在歌唱,少年在爺爺的腳下睡著了。爺爺曾說起小時候最大的樂趣就是看過兵了,兄弟幾人一起趴在某一處山頭,遠遠的看那些路過的部隊,有時候看得呆了,那些兵士就沒日沒夜的過,彷彿就沒得完的,從清晨到黃昏,日落後又點上火把繼續行軍從夜幕到天明。我猜想那應該是蔣介石的北伐,又或者是中原大戰的前夕。在那樣奼紫嫣紅的時局,誰人又會去關心躲在遠山上幾位好奇觀察的少年呢。那裡有一座山在當地遠近聞名,名曰查兒山,年少的我曾隨爺爺和爸爸爬過一次,山勢陡峭,但那時已年過六十的爺爺仍然走在前面健步如飛,一邊給我講起那座山的得名,大約是古代一位將軍打仗經過此山丟失幼子又返回搜尋而不得的故事,四月的清明時節,留給我的記憶只有滿山的落英繽紛。
  到了四十年代開始在農閒季節跟隨長輩出門行走,到安徽霍山挑鹽,或是到漢口漢正街淘點貨迴響賣,都是走去走回,一二百里地;但那個年代其實沒多少貨,無非火柴、鐵釘(那時的爺爺輩稱其為洋火、洋釘);也可以買點膠鞋襪子回去,但那時山里人消費不起。膠質雨鞋是大部分山裏人所夢寐以求的,他們長年穿的是草鞋,也沒有穿襪子的必要。爺爺常和我描述起解放前漢正街的繁華。與我日後曾在武漢專程前往漢正街所見也許不同:時過境遷,漢正街曾經的風雨,和歷史地位,在全國的聲望,也許再也不會回來了。
  二十岁婚配,娶妻段氏。段氏在婚后似乎一直在多病的状态,年出三十竟然病故,無所出。這是我在家譜上能找到的關於段氏的唯一記載。但既然無所出,當然就不會是我的奶奶,我的親生奶奶在我此生也從未記得,因為她在我出生的第一年就已經離我們而去了。關於段氏我曾問過爺爺,但爺爺留給我的只有嘆息。
  
  
(二)
  五十年代土改,打成地主阶层,被周围贫苦的农民分走了土地,长年处于被批斗的状态,自此日子就很艰难了;六十年代因建设水库的需要,四面凡山坳都被築成水壩,中間一塊僅剩的平地本是村子自古以來的住屋地基,也變成了水庫之池底,数百被淹住户被搬迁至周围邻镇邻乡邻县插队安家。爷爷便是其中之一,带着奶奶和儿女转移至鄰縣一个完全陌生的村子继续生活。搬家有当年的移民办联络新的生产队给协助砌好两间砖房,除此之外只有自家随迁的几样家具,一切是从赤贫重新开始。所幸新的村子新的环境下周围居民并不知底细,不似贫农批斗地主那般关系紧张,反而眼见同样贫寒的家境,乐得和睦相处。
  我想那次水庫移民也許正好是上天給安排我的爺爺和奶奶相遇的機會。
  我的祖母劉氏,出生是大家閨秀,所嫁也是大戶人家,在解放後短短幾年的社會運動中便經歷人生命運的逆轉:從原本平淡安逸的生活中突然跌至谷底:眼見自己的丈夫離世,人生有幾人能承受起這樣的打擊?而暴力就來源於周圍這裡世世代代和睦相處的鄉親們,這是為什麼?奶奶這一生都沒能想通這個問題,即使到八十年代後人們被允許迴響探親時她這一生也再也沒有回去過。從日後大姑的口述裡,我知道了奶奶自己當時也沒少受委曲,拳打腳踢是常事,而且還被吊起來兩三天不給飯吃,就靠大姑省下來的飯糰度日。許多年後當我向大姑問起這一段歷史時,大姑仍然是不由自主地泣不成聲。我猜想當時的奶奶也許想過隨夫而去吧,但轉眼看一旁大姑帶隊的幾個娃娃,又如何忍心呢。改嫁的念頭在她心裡從未想過,直到族裡有人提議讓她和我爺爺重新結合時,她還堅決反對而作罷。轉機就出現在幾年後的水庫移民。也許是嘗試了獨立帶大幾個孩子確實不易,也許是即將遷移至陌生的環境能讓她稍稍減輕良心的不安,這次她答應了與我的爺爺一起搬去嶄新的環境。
  
  爺爺曾描述解放前的社會關係其實沒有這麼複雜,人心遠沒有這般兇險,人們和睦相處,大部分村民都是多多少少有份自己的田產,完全以做工維生的佃農是相當少的,為富不仁的事情在他所知的那個範圍根本沒有發生,那些只在如楊白勞黃世仁一般的戲文裡出現;在災荒年都有人們自發的互相救助,而且有宗族祠堂和神明約束,也沒有什麼偷盜和殺人越貨的故事發生。這麼說來,彼時的民國似乎是一個溫情脈脈的時代?又或許是大山的阻隔,讓那個時代的兵連禍結無所殃及?當我從歷史課本裡找到四十年代的抗戰、接著是內戰,然後幾年的國民政府濫發紙幣通貨膨脹,爺爺所親身經歷的歷史裡似乎都未曾有過?『打仗?是聽說過』但那時不知道在哪裡,至少不在我們那裡,日本人甚麼摸樣也未曾見過,那我問道那時沒有什麼事情需要報告官府的嗎,縣城裡也許有呢。『還真沒什麼事要驚動官府。』一個縣裏面就是縣衙一個公家單位,裡面也沒幾個人,鄉鎮級只有鄉約,只在過年時由村里幾個大戶人家補貼些米糧,算是一些微不足道的實物工資吧。至於紙幣,住在山裡連需要用到錢的機會都很少。
  
  
(三)
  五六十年代開始疯狂的"大集体"农庄:從大炼钢铁同时开大锅饭,每户的锅碗瓢盆凡铁器都被收归集体用於煉鋼鐵,誓要超英趕美,粮食也全收归集体,集体大食堂做饭、集体劳动回来集体吃饭、秋收后的那个季节开始集体大吃大喝、对集体的仓库开始吃用无度、憧憬着美好共产主义的提前实现。实际上次年春即揭不开锅了、生产队预留一年的粮食被人们提前吃完了。也可能是前一年上缴过多,预留的部分预计错误,总之就是集体的仓库被吃空了。开始有人饿死。不知道后来这几个月他们是怎么过来的。再后来就是年复一年的集体劳动,所有人被要求集体劳动,挣工分。再以一定工分换取人民币。我所记得的来自爷爷的亲口表述是曾有一个月他挣到了一角二分钱。当然是领不到现钱,而是记在帐上,至于何时兑换成现钱,大概是年底吧。
  
  在六零年代的水庫移民以及後來的大生產中我的爺爺也逐漸自己琢磨一些機會,在建設中缺少足夠有訓練的尼瓦匠,或稱砌匠,我的爺爺在觀察了幾天別人砌房子後便謊稱自己以前就是砌匠,從此開始了自學的砌匠生涯,幾年之後還能帶出徒弟,鄉村裡至今還有他們師徒當年的作品。
  
  
(四)
  似乎一直到了七零年代末。
  
  革新之聲傳遍神州大地,爺爺是最早響應的一個。恢復高考和承包責任田,讓社會又重新找回對這個國家的希望。爺爺一家也比從前更忙碌了。人們開始被允許迴響祭祖,也包擴遠在海峽之外的舅公,那是我的祖母劉氏的親兄弟。解放前曾在武漢上學,誤打誤撞就被加入了國民黨,一個只能隨國軍遠赴台灣,一個留下來的就是莫名其妙的三十年把牢底坐穿。人生能有幾個三十年,奶奶似乎就是在那次前往農場監獄探監回來後一病不起。說是風寒,自此就在床上躺了大半年再也沒有起來。
  
  
(五)
  革新之後的社會才真正有如天地初開,爺爺此時畢竟已經慢慢爬不動牆了,砌匠活就完全交給徒弟們了,又開始做石匠雕刻,都是無師自通,還和釋放歸來的舅公一起合資經營小賣部。都是從社會發展中,細心的人去觀察需求中發現的機會。另一面又在迴響祭祖的過程中找回了當年私藏的古書,一套《象吉通書》五卷本全。能經歷文革破四舊的瘋狂年代而依然大部分完好,不得不說是一個奇蹟。據我的研究此書出於清朝康熙年間,薄薄的竹紋紙質,讓人擔心似乎一戳就會破,雕版印刷,內容方面只能算是編纂之集大成者,上至天文下至地理、人情世故、婚喪嫁娶,居家風水,內容無所不包,在清朝時期發行量很大,應該算得上是一部家喻戶曉的藏書,但能保存至今也極為不易,因為在破四舊的年代中,紅小兵們衝進每家每戶,凡舊時代繁體字著作皆搜羅殆盡付之一炬。
  爺爺找回了這套書認真研究,又從開放後的社會逐漸回歸的祭祖、嫁娶、安門儀式上發現了新的需求,此時的他開始留起了長長的白鬚,加上清瘦的外型,常戴著做石匠時習慣的黑框平視眼鏡,回想起來,還真是飄飄然有道骨仙風之感。不出幾年竟又成為了名震一方的風水先生。業務範圍包擴新屋安門定向、墓碑立向,還有為新人們選擇與生辰八字相匹配的黃道吉日等等。有時也非正式的跟大家算一算命理。爺爺並未正式包含這一項業務是因為在農村的約定俗成:算命是留給那些因先天或後天原因致盲的人的一項正式職業,雖然不是每個盲人都可以走上這項職業,這還要看個人天賦。我曾向爺爺介紹了一些來自西方的流行命理,就是關於星座,或稱西洋占星术。
  『你說西洋人算命,只根據月份就算出來了?』
  『這不科學呀。在中國要看出生年月日、還要有時辰,合為生辰八字,天道甲子六十年為一循環…』
  『其實現在西洋人自己都不信這個了,在中國反而會談點星座的越來越多了…』
  有時我也會嚷嚷說這是迷信,以後的人有文化有知識學科學,就不會有人再來看風水了。爺爺會假裝生氣的說,不可能吧,現在還是有很多人信啊,你看,省裡的大官有知識吧,也都派車來接我去看屋。我說這些大官迷信,爺爺說越是大官越相信這個,不是你說不信別人就不信的。是啊,這個社會的發展不是個人喜好所能預測的,有人回歸祖製想從風水中去尋一份心靈的安寧便自然有人去研究風水理論,這個行業師從戰國時代鬼谷子先生為祖師,歷朝歷代不斷有人添磚加瓦,早已成為中國傳統文化的一部分,又豈是個人能去杞人憂天的。像這舶來的星座理論,在西方早已式微,也不妨礙可以繼續在中國發揚光大。
  
  
  
  爺爺常說『人生七十古來稀,你們看我都活到八十多了還健健康康,在我們這個家族還從來沒有過的,已經知足了吧……』
  
  
(六)
  太平洋的風在持續的吹過,氤氳的霧氣中傳過來的是大洋彼岸的氣息吧。人們常說人去如燈滅,我在想的是人生命運無常。余光中在給初生才三天就亡故的幼子作了一篇《鬼雨》,描寫太平洋上無時無盡、無晝無夜的雨,傾灑在小島上,只有無盡的哀思。我記起了魔戒中鄧不利多墜堐的場景,一位清瘦白鬚的長者形象,在時代變遷面前不斷輾轉求存,從不向命運低頭,直至最終殞落。
  東臨米慎峰(MissionPeak),我見到初升的旭日冉冉升起,在人們的歡呼聲中冉冉升起,給林海間的蒼翠在剎那間披上了金色的光芒,我知道在這太陽的背後如果有一個天國,我的爺爺在那條路上一定不會悲傷,繼續做一個執著而樂觀的人。

Wednesday, September 14, 2011

run MegaCli under Linux kernel 3.0 with LD_PRELOAD a fake uname


the MegaCli tool seems doesn't recognize the kernel 3.0; even the latest 8.02.16_MegaCLI
http://www.lsi.com/products/storagecomponents/Pages/MegaRAIDSAS9240-8i.aspx#misc

Since lsi only provides its binary, we cannot know what is lsi internally doing, what we can do is only to strace it,

Gentoo-11 tmp # env -i strace -v -e execve,open,ioctl,uname ./opt/MegaRAID/MegaCli/MegaCli64 -adpCount
execve("./opt/MegaRAID/MegaCli/MegaCli64", ["./opt/MegaRAID/MegaCli/MegaCli64", "-adpCount"], []) = 0
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib64/libpthread.so.0", O_RDONLY) = 3
open("/lib64/libncurses.so.5", O_RDONLY) = 3
open("/lib64/libdl.so.2", O_RDONLY)     = 3
open("/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.2/libstdc++.so.6", O_RDONLY) = 3
open("/lib64/libm.so.6", O_RDONLY)      = 3
open("/lib64/libgcc_s.so.1", O_RDONLY)  = 3
open("/lib64/libc.so.6", O_RDONLY)      = 3
                                     
open("/proc/devices", O_RDONLY)         = 3
open("/dev/megaraid_sas_ioctl_node", O_RDONLY) = 3
open("/proc/devices", O_RDONLY)         = 4
uname({sysname="Linux", nodename="Gentoo-11", release="3.0.0-gentoo-r1", version="#1 SMP Mon Aug 1 02:33:28 UTC 2011", machine="x86_64"}) = 0
open("/proc/scsi/megaraid_sas/hba_map/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/proc/scsi/megasr/hba_map/", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
ioctl(3, MCE_GET_RECORD_LEN or MEMGETINFO or MFB_SET_CHROMA_KEY or MTRRIOC32_SET_ENTRY or MTRRIOC_SET_ENTRY, 0x790880) = -1 ENODEV (No such device)

Controller Count: 0.
open("MegaSAS.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 4

Exit Code: 0x00
open("MegaSAS.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 4

we found it tried a uname to get system info, then try to read the driver's proc file "/proc/scsi/megaraid_sas/hba_map/", but the current system has megaraid_sas driver but doesn't provide that proc file; through searching online I found that proc file was provided by a megaraid legacy driver in Linux-2.4 kernel, so the problem is probably here, the MegaCli doesn't recognize the kernel release "3.0.0-gentoo-r1" from uname system call, and judged it as Linux-2.4; dam it;

What I clearly remember is several months ago in last Gentoo-11.1 livedvd (surely with linux kernel 2.6) the MegaCli was still working, so the following is how can we fool MegaCli's uname system call as Linux kernel 2.6?

The answer is to fake a uname syscall via LD_PRELOAD;

Gentoo-11 tmp # cat fake-uname.c
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/utsname.h>

#include <stdio.h>
#include <string.h>

int uname(struct utsname *buf)
{
 int ret;

 ret = syscall(SYS_uname, buf);

 printf("uname release: \"%s\"\n", buf->release);
 strcpy(buf->release, "2.6.40");
 printf("uname release set to: \"%s\"\n", buf->release);
 printf("uname version: \"%s\"\n", buf->version);

 return ret;
}

Save it as fake-uname.c, and compile it with

Gentoo-11 tmp # gcc -Wall -fPIC -c fake-uname.c
Gentoo-11 tmp # gcc -Wall -shared -o libfake-uname.so fake-uname.o

Now we get libfake-uname.so, use LD_PRELOAD=./libfake-uname.so to preload it, over uname from glibc:

Gentoo-11 tmp # LD_PRELOAD=./libfake-uname.so LD_LIBRARY_PATH=./opt/lsi/3rdpartylibs/x86_64 ./opt/MegaRAID/MegaCli/MegaCli64 -adpCount
                                     
uname release: "3.0.0-gentoo-r1"
uname release set to: "2.6.40"
uname version: "#1 SMP Mon Aug 1 02:33:28 UTC 2011"

Controller Count: 1.

Exit Code: 0x01

Found the controller! And the strace log:
...
open("/lib64/libc.so.6", O_RDONLY)      = 3
                                     
open("/proc/devices", O_RDONLY)         = 3
open("/dev/megaraid_sas_ioctl_node", O_RDONLY) = 3
open("/proc/devices", O_RDONLY)         = 4
uname({sysname="Linux", nodename="Gentoo-11", release="3.0.0-gentoo-r1", version="#1 SMP Mon Aug 1 02:33:28 UTC 2011", machine="x86_64"}) = 0
uname release: "3.0.0-gentoo-r1"
uname release set to: "2.6.40"
uname version: "#1 SMP Mon Aug 1 02:33:28 UTC 2011"
open("./opt/lsi/3rdpartylibs/x86_64/tls/x86_64/libsysfs.so.2.0.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./opt/lsi/3rdpartylibs/x86_64/tls/libsysfs.so.2.0.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./opt/lsi/3rdpartylibs/x86_64/x86_64/libsysfs.so.2.0.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./opt/lsi/3rdpartylibs/x86_64/libsysfs.so.2.0.2", O_RDONLY) = 4
open("/sys/class/scsi_host", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/sys/class/scsi_host", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
open("/sys/devices/pci0000:00/0000:00:1f.2/host0/scsi_host/host0/proc_name", O_RDONLY) = 4
open("/sys/devices/pci0000:00/0000:00:1f.2/host1/scsi_host/host1/proc_name", O_RDONLY) = 4
open("/sys/devices/pci0000:00/0000:00:1f.2/host2/scsi_host/host2/proc_name", O_RDONLY) = 4
open("/sys/devices/pci0000:00/0000:00:1f.2/host3/scsi_host/host3/proc_name", O_RDONLY) = 4
open("/sys/devices/pci0000:00/0000:00:1f.1/host4/scsi_host/host4/proc_name", O_RDONLY) = 4
open("/sys/devices/pci0000:00/0000:00:1f.1/host5/scsi_host/host5/proc_name", O_RDONLY) = 4
open("/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/host7/scsi_host/host7/proc_name", O_RDONLY) = 4
ioctl(3, MCE_GET_RECORD_LEN or MEMGETINFO or MFB_SET_CHROMA_KEY or MTRRIOC32_SET_ENTRY or MTRRIOC_SET_ENTRY, 0x790420) = 0

Controller Count: 1.
open("MegaSAS.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 4

Exit Code: 0x01
open("MegaSAS.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 4

Monday, August 29, 2011

http://www.linuxpicnic.org/twiki/bin/view/Picnix20/

Picn*x 20 - The Linux 20th Anniversary Picnic 简单回顾

硅谷地区一年一度的 Linux 周年纪念日野餐活动照例在 Sunnyvale Baylands Park.举办,上周六8月27日上午11点到下午4点;这个活动自2001年的Linux十周年纪念开始到现在已经是第十个年头了;地点所在公园其实是沿着 SF Bay 从 Palo Alto, Mountain View, Sunnyvale, Santa Clara, 到 Milpitas 很长的海湾公园的其中一段,刚好这一段在 Sunnyvale 而已;公园的网站上有写明禁止宠物入内,主要是保护海湾公园的珍稀动植物,号召 Commute 拼车或乘公交前往,我就乘坐VTA轨道线到Crossman车站并下车步行了二十分钟到达;


这里是VTA轨道线Crossman车站、硅谷一带到处都是知名公司、这里背后是NetApp

路过NetApp的超小型四座送货车

到达了会场,远观真是声势浩大,有上百人吧
登记后每人贴上贴纸姓名便于聊天时互相可以知道姓名;近观看到很多都是Family一同前来的,甚至还带着刚出生的Baby就放在桌子上玩

Fedora组的OLPC、上面是Fedora15的Sugar界面;和手摇发电机、背后还有一块是太阳能电池板,能在野外有日光的情况下给电脑充电

Ubuntu组的情况在哪里都是人最多的、不过这次我都没有时间去近观

左边是家长带着他的小孩前来学习OLPC;
背后的白帽大叔是SFLUG的活跃成员,他们城区的活动比较多;
我在里面问到什么时候会用上 Wayland Default; 以及 Multi Pointer 特性有没有;
好像人们普遍误区把 Multi Pointer 理解成 Multi Mouse 支持了,我仔细解释了一下现有的 Linux 桌面上插多个 Mouse 还是只能控制同一个 Cursor; 而真正的 Multi Pointer 是指屏幕上会出现多个 Cursor, 每个 Mouse 分别控制一个;虽然这个概念很早就有了,在Xorg上也有人在实做,但我不知道进行到什么进度了
会场有人也是第一次听到这个吓了一跳,这能干什么呀?为什么需要多个 Cursor ?
我举例说多人在用多个鼠标在同一个电脑上玩游戏,应该是 More fun

和白帽大叔聊了比较多、他说到十天后他会再次起程前往 非洲 Tanzania 内罗毕 进行下一期三个月的Volunteering
我说 Vim Author 有一段提到 Uganda 的情况,确实需要很多的志愿者

(在vim里面可以 :help iccf)

还有最近看过的2007年电影 Hotel Rwanda, 描述1994年的 Rwanda Genocide
大叔说他一直在 freenode #vim channel 里面,回答了人们关于Uganda的很多问题
佩服!

对了,硅谷的人一般都叫城区就是SF,才算City, 只有City里面才有点像样的高楼; 而硅谷这边MV, Sunnyvale,  ... 什么的都是一排排小平房、最多就两三层,公司楼说好听也叫做写字楼,但其实都叫厂房

这个其实说的是 Twiki 的 web app,  与LEGO好像没有看到

SVWUX 组部署完成的室外 Wifi  Repeater;  作为Wifi热点提供给大家Wifi上网
这里的Wifi流量是通过这个 Repeater 转发到周围山上的多个Wifi接收机再到 Internet 的
我在现场用Android试过了此Wifi发送图片Twitter速度不错!
现场还有另外的人使用自己的3G数据卡将自己的Linux笔记本设置成Router,再通过无线路由器给大家提供冗余的Wifi 热点,很不错
现场得益于公园良好的环境、设施,电源、水源、烧烤场都是免费使用,有洗手间,作为固定设施的很多桌子底下都是电源插座

-

生态环境真不错,还长出了大蘑菇、想起了老家的群山哪

- -
玩 Amateur Radio 业余无线电的一组人、或者又叫做 HAM 火腿族

美少女、和父亲一块儿来都是 RedHat Volunteer (T-shirt) ;  健谈,谈到其父亲德国裔、母亲来自南美Columbia;  乐于分享自己的暑期项目住在 Costa Rica / Panama 火山 Hotel 的情形,期盼着 Christmas 假期可以去(另一个南美国度) 第一次见到 Grandmother、团聚;父亲向大家介绍她13岁、人多的时候还会 Camera Shy
其父亲会多国语言,甚至包括 Chinese Mandarin, 和我直接中文对话了一会儿


Friday, August 19, 2011

Step 2: boot livedvd-amd64-multilib-11.2.iso from hard disk (with grub2)

After a few days experience of the gentoo livedvd run from usb, I think the usb drive should be saved for some other important data; I decided to copy the iso and run it from hard disk; usually a hard disk has large enough space, people could just copy all files inside /image.squashfs to a local partition, like the way on gentoo-wiki, but this computer assigned to me has a SSD drive default, has only 120G, furthermore, it's already partitioned long time ago, I don't have more space to back up all data on it and don't want to risk re-partition it; so I'd still like the way of loop mount iso on the fly, for saving disk space;
http://www.gentoo-wiki.info/HOWTO_Lightning_fast_install_from_LiveCD

/dev/sda3       240277504   250068991     4895744   83  Linux
/dev/sda5       129341440   132855807     1757184   82  Linux swap / Solaris
/dev/sda6       132857856   152387583     9764864   83  Linux LABEL=UBUNTU
/dev/sda7       152389632   210980863    29295616   83  Linux LABEL=HOME
/dev/sda8       210982912   211372031      194560   83  Linux LABEL=DEBIAN

The ubuntu partition already has grub2 default installed and home partition has a lot of remaining space, so I mkdir /gentoo under /home, put livedvd-amd64-multilib-11.2.iso there, rename or hardlink a short name gentoo.iso there; extract kernel/initramfs from the iso and put into /boot of the ubuntu partition, create a new entry there and no need to install another grub;

Notice that grub2 (version 1.9*) has slightly different syntax with grub1 (version 0.9*):
  1. disk partition order, counter from 1, same as Linux partitions;
  2. better not to change (append entries) in grub.cfg directly, use /boot/grub/custom.cfg instead; because every time later ubuntu upgrade or install new kernels would call update-grub2 that would overwrite grub.cfg; you could change /etc/grub/40_custom (that support script smart calculation) or /boot/grub/custom.cfg on that ubuntu partition; here I use custom.cfg;
Gentoo-11 ~ # cat /mnt/sda6/boot/grub/custom.cfg
menuentry "Gentoo11-Live Linux-3.0.0 (on /dev/sda7 {gentoo/gentoo.iso})" {
	  linux (hd0,6)/boot/gentoo/gentoo aufs_mem=2G cdroot=/dev/sda7 cdroot_type=ext4 isoboot=gentoo/gentoo.iso vga=791 splash=silent,theme:livecd-10 console=tty1 quiet nodetect doload=ahci dox
	  initrd (hd0,7)/gentoo/gentoo-initramfs.gz
}

Compared to previous menuentry in syslinux.cfg, here I removed some unused parameters (like "root=/dev/ram0 init=/linuxrc" because that is the default, I think I should recommend the Gentoo-Ten team to remove that, but not sure if any other computer need it, at least my computer doesn't need it, it could boot, as granted; the only useful parameters here are:
  1. aufs_mem=2G, it means how large of tmpfs layered on top of squashfs by aufs; default it's 420M tmpfs, enough if you don't modify/install too many applications in live mode;
  2. cdroot=/dev/sda7, specify a parameter saves parsing during booting; specify cdroot_type the same way;
  3. isoboot=gentoo/gentoo.iso, you need to specify where do you save that iso inside that partition; it's required;
  4. nodetect doload=ahci dox; depends on if you know your hardware, if no idea, autodetect is best, but I know my hardware, specifying it could save booting time;
The default gentoo kernel/initramfs should work this way I thought originally, but it doesn't, I have to look at the init script and change it a little, here is the diff: http://paste.pocoo.org/show/460334/

the initramfs is just cpio (newc format) + gz; extract and reconstruct in this way;
$ mkdir -vp gentoo-initramfs
$ zcat gentoo.igz |(cd gentoo-initramfs; cpio -d -i)
$ emacs -nw gentoo-initramfs/...; modify /init and /etc/init.scripts
$ (cd gentoo-initramfs/; find |cpio -H newc -o) |gzip -v9 >gentoo-initramfs.gz
Or
$ (cd gentoo-initramfs/; find |cpio -H newc -o) |xz -v9 >gentoo-initramfs.xz
Gentoo-11 ~ # (cd /home/gentoo/; ls -lh gentoo-initramfs.*)
-rw-r--r-- 1 root root 9.8M Aug 16 02:25 gentoo-initramfs.gz
-rw-r--r-- 1 root root 7.5M Aug 15 17:50 gentoo-initramfs.xz
The latest xz (aka. lzma2) could save 20% over "gzip -v9";

Update: use "xz --check=crc32" instead, because some latest xz support "none,crc32,crc64,sha256" or more types of integrity check, default as crc64; the kernel xz dec is "xz embedded" that only support "none or crc32",  kernel may report XZ_OPTIONS_ERROR, you could use "xz -vl ..." to check it, read Documentation/xz.txt for more;
/usr/src/linux-3.0-gentoo-r1/lib/decompress_unxz.c:
-=--:%%--F1  decompress_unxz.c   92% L364   (C/l Abbrev)

        case XZ_OPTIONS_ERROR:
                error("Input was encoded with settings that are not "
                                "supported by this XZ decoder");
                break;

# (cd gentoo-initramfs/; find |cpio -H newc -o) |xz --check=crc32 -v9 >../gentoo-initramfs.xz