最近換了一台工作機,但我發現在 Ubuntu 14.04.3 上,有時候會休眠失敗。 在失敗的時候,機器有 suspend 成功,但是過2秒後機器就會自動醒來。查看了 /var/log/kern.log, /var/log/syslog, /var/log/pm-suspend.log 沒有太異常的訊息。後來上網查了一下,這可能是有 BIOS 有問題或 device 不正常運作。

在 /proc/acpi/wakeup 中,列出了數種 wakeup event, 以下面的表來說,代表了機器開放了 EHC1, EHC2, PWRB, LID0 這幾種 wakeup event

RP06      S4    *disabled
PXSX      S4    *disabled
RP07      S4    *disabled
PXSX      S4    *disabled
EHC1      S0    *enabled   pci:0000:00:1d.0
EHC2      S4    *enabled  pci:0000:00:1a.0
PWRB      S4    *enabled   platform:PNP0C0C:00
LID0      S4    *enabled   platform:PNP0C0D:00

試著開關 wakeup trigger 來找出問題

# ignore XHC device wakeup event
echo "XHC" > /proc/acpi/wakeup
# try suspend, still failed

# ignore EHC1 device wakeup event
echo "EHC1" > /proc/acpi/wakeup
# try suspend, still failed

# ignore EHC1 device wakeup event
echo "EHC2" > /proc/acpi/wakeup
# try suspend. Bingo!! It suspend successfully!

發現只要關閉 EHC2 wakeup trigger, 機器就能正常 suspend。可以放罝一個 upstart script,讓每次開機時,都自動關閉 EHC2 wakeup trigger

# /etc/init/disable-EHC2.conf
start on started dbus
stop on stopping dbus

script
   sudo -u root sh -c "echo 'EHC2' > /proc/acpi/wakeup"
end script

Ref: - Ubuntu 14.04 wake up immediately after suspend - Ask Ubuntu - UnderstandingSuspend - Ubuntu Wiki - Power management/Suspend and hibernate - ArchWiki - acpitool(1) - Linux man page - Best practice to debug Linux* suspend/hibernate issues | 01.org

Addressing global exploration effectively is only one of the significant challenges between what is well known now and what needs to be addressed for what I would consider a real AI.

Ref: AlphaGo is not the solution to AI

今天發現可以透過 Canonical Ltd. 的 linuxcontainer image 快速的在 NAS 上建立一個 chroot 環境。我的機器 cpu 是 armhf ,下面示範建立 Ubuntu 15.04 Vivid 的 chroot 環境。

步驟1:下載 Image,解開後進入 rootfs,並修改 nameserver

wget http://images.linuxcontainers.org/images/ubuntu/vivid/armhf/default/20151008_03:49/rootfs.tar.xz
mkdir rootfs
tar xvf rootfs.tar.xz -C rootfs
cd rootfs
echo "nameserver 8.8.8.8" > etc/resolv.conf

步驟2:mount 需要的 sysfs

mount -t proc proc proc/
mount -t sysfs sys sys/
mount -o bind /dev dev/
mount -t devpts pts dev/pts/

步驟3:chroot

chroot . su -l

backports driver
2015-09-17

git clone git://git.kernel.org/pub/scm/linux/kernel/git/backports/backports.git
git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
cd backports/
./gentree.py --clean --git-revision next-20150525 ../linux-next/ release

cd release/
make menuconfig
make

手上有一支 UPMOST DVB193 數位電視棒,最近測試了它是不是能在 Ubuntu 14.04 下運作。原本以為需要自己編譯 driver,不過把數位電視棒插入筆電, lsusb 後發現其實 driver 已被 Kernel 收錄成為 built-in driver。 Driver 的訊息如下

filename:       /lib/modules/3.19.0-28-generic/kernel/drivers/media/tuners/it913x.ko
license:        GPL
author:         Antti Palosaari <crope@iki.fi>
description:    ITE IT913X silicon tuner driver
srcversion:     3A631200871E9FCB4913859
alias:          i2c:it913x
depends:        
intree:         Y
vermagic:       3.19.0-28-generic SMP mod_unload modversions 
signer:         Magrathea: Glacier signing key
sig_key:        29:4D:C0:12:70:6F:48:B7:CD:DF:63:74:E2:D7:9F:E1:B0:60:92:69
sig_hashalgo:   sha512

Firmware 也已經被收進 Ubuntu 的 linux-firmware

$ dpkg -L linux-firmware| grep it9135
/lib/firmware/dvb-usb-it9135-02.fw
/lib/firmware/dvb-usb-it9135-01.fw

所以接下來只要處理好看數位電視的軟體就可以。以 apt-get 安裝好 vlc ,再用 vlc 開啟 channels.conf

channels.conf

中視數位台:533000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1001:1002:100
中視新聞台:533000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1011:1012:101
中視綜藝台:533000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1021:1022:102
中視 HD 台:533000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1031:1032:103
公共電視 PTS:545000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:2011:2012:201
公視 2 台 PTS2:545000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:2021:2022:202
客家電視 HTV:545000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:2031:2032:203
民視綜合台:557000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:3001:3002:300
民視交通台:557000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:3011:3012:301
民視新聞台:557000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:3021:3022:302
民視資料廣播:557000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:303
民視 HD 台:557000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:3041:3042:304
公視 HD:569000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:2001:2002:200
台灣電視台:581000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4001:4002:400
台視財經台:581000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4011:4012:401
台視綜合台:581000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4021:4022:402
台視 HD 台:581000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:4031:4032:403
華視 CTS:593000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:5011:5012:501
華視教育台:593000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:5021:5022:502
華視新聞資訊台:593000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:5031:5032:503
華視 HD:593000000:INVERSION_AUTO:BANDWIDTH_6_MHZ:FEC_2_3:FEC_2_3:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:5041:5042:504

就可以收看了。過程相當順利。

如果未來台灣有新增或更新頻道,想要自己產生頻道列表,那可以這樣做:

sudo apt-get install -y dvb-apps
sudo apt-get install vlc
scan /usr/share/dvb/dvb-legacy/dvb-t/tw-All >channels.conf

這個 channels.conf ,就可以用 vlc 打開收看。

Update for Debian 9.0 Stretch

Debian 預設並沒有安裝 it9135 的 firmware,必須開啟 non-free repository ,並安裝 firmware-misc-free

# enable non-free repository, then
sudo apt install -y firmware-misc-non-free

Ref: - Ubuntu 12.04 使用大通USB電視棒AD-525 - http://git.linuxtv.org/cgit.cgi/dtv-scan-tables.git - github.com/oliv3r/dtv-scan-tables Digital TV scan tables

有時在機器上會遇到 system hang 的狀況,特別是在 enable 新硬體時。遇到這種情況,可以試著 blacklist 可疑的 kernel module

以 mwifiex_sdio 為例

# Do not load the 'mwifiex_sdio' module on boot.
echo > /etc/modprobe.d/debug.conf <EOF
blacklist mwifiex_sdio
EOF

再重開機即可

如果這個 module 仍會被其它 module depends 而載入,可以再進一步的 blacklist

# Do not load the 'mwifiex_sdio' module on boot.
echo > /etc/modprobe.d/debug.conf <EOF
install mwifiex_sdio /bin/false
EOF

Using files in /etc/modprobe.d/

最近在工作上遇到一個 bug,在某些狀況下執行 lshw (02.16-2ubuntu1.2) 會 segmentation fault。找了 lshw 最新的 code 編譯執行後發現沒有這個問題。於是就開始了 git bisect。最後找到是 d048d300b5daeb44887a7fc06ddeb120119cac8a 這筆修改在 src/core/scsi.cc 上面的 commit 解決了這個問題

順著這筆 commit,找到了 lshw project 的 bug report lshw segfaults, with some 16GB USB-3 sticks from Patriot 。也了解是 USB3.0 stick plugged 時會出現問題。在手上的機器上試了一下,果然是這樣沒錯。原本沒有頭緒的 random segmentation fault,現在則是有了 root cause 的 issue。

既然找到了 Solution,就開始要加 patch 進 Ubuntu source 了。為了將 patch 加到 Ubuntu 14.04 (Trusty) 目前的 lshw (02.16-2ubuntu1.2) 裡,我們還必須加上 src/core/scsi.cc 的前一個 commit b79f299319f61bc80e8d38e61631cfee7521a729

# clone upstream
git clone https://github.com/lyonel/lshw lshw-lyonel
# clone ubuntu source
bzr branch lp:ubuntu/trusty-proposed/lshw

# make patch from upstream git tree
cd lshw-lyonel/
git format-patch b79f299^..b79f299
git format-patch d048d30^..d048d30
cd ..

# import patches to ubuntu source
cd lshw/
dquilt push -a # apply existing patches
dquilt import ../lshw-lyonel/0001-use-a-different-approach-for-scanning-SCSI-generic-d.patch
dquilt import ../lshw-lyonel/0001-presumably-fix-653.patch

# edit changelog
dch -v 02.16-2ubuntu1.3 -D trusty

# local commit
debcommit

這樣就完成了,最後這一包 source 就可以拿來做 debian package 的打包,並且開始跑 Ubuntu package propose 的流程。

Ref: 1. how to add upstream git patches to an existing debian package 2. Chapter 3. Modifying the source 3. How To Survive With Many Patches or Introduction to Quilt

bloxp, rss to ebook
2015-07-05

今天用了一個很棒的服務,Bloxp, the blog to ebook exporter,可以把 blog 透過 rss 轉成 ebook (epub)。很方便,推薦給大家。

在一些工作站上,有時需要用到一些 python package,但不具有 root 權限時。Python 設定了一個方法,可以安裝在家目錄下的 .local/ 資料夾中

Alternate installation: the user scheme — Python 2.7.10 documentatio

python setup.py install --user

之後再設定 PYTHONPATH, PATH 變數即可

export PYTHONPATH=$HOME/.local/lib/python2.7/site-packages:$PYTHONPATH
PATH=$PATH:$HOME/.local/bin
export PATH

剛在 python 遇到 subprocess 的問題,處理一陣子後突然想到,如果是 C++ 的話要怎麼用 GDB 來 debug. 查了文件後發現有2個方式:

  1. 讓 child sleep 一段時間,手動取得 PID 後,再讓 GDB attach 上去

這個方式可以想的到,有點暴力解的感覺。看來處理 multi-process 真的沒什麼好方法。 2. 設定 follow-fork-mode

GDB 預設只會 attach 在 parent process 上,而不會控制 child process。但如果將 follow-fork-mode 設為 child,那在 fork() 之後,parent process 將不受 GDB 控制,只有 child process 在 GDB 的控制中。換句話說,同一時間只有一個 process 會被 attached。

set follow-fork-mode parent
# The original process is debugged after a fork. The child process runs unimpeded. This is the default. 
set follow-fork-mode child
#The new process is debugged after a fork. The parent process runs unimpeded.

由 folow-fork-mode 還延伸出 detach-on-fork,預設值開啟代表沒被 attached 的 process 會獨立的運作。關閉代表沒被 attached 的 process 會被 suspend。

Ref: Forks - Debugging with GDB